1 | // RUN: %clang_cc1 -Oz -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s -check-prefix=Oz |
2 | // RUN: %clang_cc1 -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER |
3 | // RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER |
4 | // RUN: %clang_cc1 -O2 -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER |
5 | // RUN: %clang_cc1 -O3 -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER |
6 | // RUN: %clang_cc1 -Os -disable-llvm-passes -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)) |
11 | int test1() { |
12 | return 42; |
13 | // Oz: @{{.*}}test1{{.*}}[[MINSIZE:#[0-9]+]] |
14 | // OTHER: @{{.*}}test1{{.*}}[[MS:#[0-9]+]] |
15 | } |
16 | |
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 | |
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)) |
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> |
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{{.*}} } |
80 | |