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