xref: /aosp_15_r20/external/clang/test/CodeGen/attr-minsize.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -Oz -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=Oz
2*67e74705SXin Li // RUN: %clang_cc1     -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER
3*67e74705SXin Li // RUN: %clang_cc1 -O1 -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER
4*67e74705SXin Li // RUN: %clang_cc1 -O2 -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER
5*67e74705SXin Li // RUN: %clang_cc1 -O3 -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER
6*67e74705SXin Li // RUN: %clang_cc1 -Os -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER
7*67e74705SXin Li // Check that we set the minsize attribute on each function
8*67e74705SXin Li // when Oz optimization level is set.
9*67e74705SXin Li 
10*67e74705SXin Li __attribute__((minsize))
test1()11*67e74705SXin Li int test1() {
12*67e74705SXin Li   return 42;
13*67e74705SXin Li // Oz: @{{.*}}test1{{.*}}[[MINSIZE:#[0-9]+]]
14*67e74705SXin Li // OTHER: @{{.*}}test1{{.*}}[[MS:#[0-9]+]]
15*67e74705SXin Li }
16*67e74705SXin Li 
test2()17*67e74705SXin Li int test2() {
18*67e74705SXin Li   return 42;
19*67e74705SXin Li // Oz: @{{.*}}test2{{.*}}[[MINSIZE]]
20*67e74705SXin Li // Oz: ret
21*67e74705SXin Li // OTHER: @{{.*}}test2
22*67e74705SXin Li // OTHER-NOT: [[MS]]
23*67e74705SXin Li // OTHER: ret
24*67e74705SXin Li }
25*67e74705SXin Li 
test3()26*67e74705SXin Li int test3() {
27*67e74705SXin Li   return 42;
28*67e74705SXin Li // Oz: @{{.*}}test3{{.*}}[[MINSIZE]]
29*67e74705SXin Li // Oz: ret
30*67e74705SXin Li // OTHER: @{{.*}}test3
31*67e74705SXin Li // OTHER-NOT: [[MS]]
32*67e74705SXin Li // OTHER: ret
33*67e74705SXin Li }
34*67e74705SXin Li 
35*67e74705SXin Li // Check that the minsize attribute is well propagated through
36*67e74705SXin Li // template instantiation
37*67e74705SXin Li 
38*67e74705SXin Li template<typename T>
39*67e74705SXin Li __attribute__((minsize))
test4(T arg)40*67e74705SXin Li void test4(T arg) {
41*67e74705SXin Li   return;
42*67e74705SXin Li }
43*67e74705SXin Li 
44*67e74705SXin Li template
45*67e74705SXin Li void test4<int>(int arg);
46*67e74705SXin Li // Oz: define{{.*}}void @{{.*}}test4
47*67e74705SXin Li // Oz: [[MINSIZE]]
48*67e74705SXin Li // OTHER: define{{.*}}void @{{.*}}test4
49*67e74705SXin Li // OTHER: [[MS]]
50*67e74705SXin Li 
51*67e74705SXin Li template
52*67e74705SXin Li void test4<float>(float arg);
53*67e74705SXin Li // Oz: define{{.*}}void @{{.*}}test4
54*67e74705SXin Li // Oz: [[MINSIZE]]
55*67e74705SXin Li // OTHER: define{{.*}}void @{{.*}}test4
56*67e74705SXin Li // OTHER: [[MS]]
57*67e74705SXin Li 
58*67e74705SXin Li template<typename T>
test5(T arg)59*67e74705SXin Li void test5(T arg) {
60*67e74705SXin Li   return;
61*67e74705SXin Li }
62*67e74705SXin Li 
63*67e74705SXin Li template
64*67e74705SXin Li void test5<int>(int arg);
65*67e74705SXin Li // Oz: define{{.*}}void @{{.*}}test5
66*67e74705SXin Li // Oz: [[MINSIZE]]
67*67e74705SXin Li // OTHER: define{{.*}}void @{{.*}}test5
68*67e74705SXin Li // OTHER-NOT: define{{.*}}void @{{.*}}test5{{.*}}[[MS]]
69*67e74705SXin Li 
70*67e74705SXin Li template
71*67e74705SXin Li void test5<float>(float arg);
72*67e74705SXin Li // Oz: define{{.*}}void @{{.*}}test5
73*67e74705SXin Li // Oz: [[MINSIZE]]
74*67e74705SXin Li // OTHER: define{{.*}}void @{{.*}}test5
75*67e74705SXin Li // OTHER-NOT: define{{.*}}void @{{.*}}test5{{.*}}[[MS]]
76*67e74705SXin Li 
77*67e74705SXin Li // Oz: attributes [[MINSIZE]] = { minsize{{.*}} }
78*67e74705SXin Li 
79*67e74705SXin Li // OTHER: attributes [[MS]] = { minsize nounwind{{.*}} }
80