1 // RUN: %clang_cc1 -Oz -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=Oz
2 // RUN: %clang_cc1 -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER
3 // RUN: %clang_cc1 -O1 -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER
4 // RUN: %clang_cc1 -O2 -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER
5 // RUN: %clang_cc1 -O3 -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER
6 // RUN: %clang_cc1 -Os -disable-llvm-optzns -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 __attribute__((minsize))
test1()11 int test1() {
12 return 42;
13 // Oz: @{{.*}}test1{{.*}}[[MINSIZE:#[0-9]+]]
14 // OTHER: @{{.*}}test1{{.*}}[[MS:#[0-9]+]]
15 }
16
test2()17 int test2() {
18 return 42;
19 // Oz: @{{.*}}test2{{.*}}[[MINSIZE]]
20 // Oz: ret
21 // OTHER: @{{.*}}test2
22 // OTHER-NOT: [[MS]]
23 // OTHER: ret
24 }
25
test3()26 int test3() {
27 return 42;
28 // Oz: @{{.*}}test3{{.*}}[[MINSIZE]]
29 // Oz: ret
30 // OTHER: @{{.*}}test3
31 // OTHER-NOT: [[MS]]
32 // OTHER: ret
33 }
34
35 // Check that the minsize attribute is well propagated through
36 // template instantiation
37
38 template<typename T>
39 __attribute__((minsize))
test4(T arg)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: [[MS]]
50
51 template
52 void test4<float>(float arg);
53 // Oz: define{{.*}}void @{{.*}}test4
54 // Oz: [[MINSIZE]]
55 // OTHER: define{{.*}}void @{{.*}}test4
56 // OTHER: [[MS]]
57
58 template<typename T>
test5(T arg)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: define{{.*}}void @{{.*}}test5{{.*}}[[MS]]
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: define{{.*}}void @{{.*}}test5{{.*}}[[MS]]
76
77 // Oz: attributes [[MINSIZE]] = { minsize{{.*}} }
78
79 // OTHER: attributes [[MS]] = { minsize nounwind{{.*}} }
80