1 // RUN: %clang_cc1 -I %S/Inputs -x c++ -std=c++11 -triple x86_64-unknown-linux -emit-llvm -O2 < %s | FileCheck -allow-deprecated-dag-overlap %s
2 // RUN: %clang_cc1 -I %S/Inputs -x c++ -std=c++11 -triple x86_64-unknown-linux -emit-llvm -Os < %s | FileCheck -allow-deprecated-dag-overlap %s
3 // RUN: %clang_cc1 -I %S/Inputs -x c++ -std=c++11 -triple x86_64-unknown-linux -emit-llvm -Oz < %s | FileCheck -allow-deprecated-dag-overlap %s
5 #pragma clang optimize off
7 // This is a macro definition and therefore its text is not present after
8 // preprocessing. The pragma has no effect here.
9 #define CREATE_FUNC(name) \
10 int name (int param) { \
14 // This is a declaration and therefore it is not decorated with `optnone`.
15 extern int foo(int a
, int b
);
16 // CHECK-DAG: @_Z3fooii{{.*}} [[ATTRFOO:#[0-9]+]]
18 // This is a definition and therefore it will be decorated with `optnone`.
19 int bar(int x
, int y
) {
20 for(int i
= 0; i
< x
; ++i
)
24 // CHECK-DAG: @_Z3barii{{.*}} [[ATTRBAR:#[0-9]+]]
26 // The function "int created (int param)" created by the macro invocation
27 // is also decorated with the `optnone` attribute because it is within a
28 // region of code affected by the functionality (not because of the position
29 // of the macro definition).
31 // CHECK-DAG: @_Z7createdi{{.*}} [[ATTRCREATED:#[0-9]+]]
35 // The declaration of the method is not decorated with `optnone`.
39 // The definition of the method instead is decorated with `optnone`.
40 int MyClass::method(int blah
) {
43 // CHECK-DAG: @_ZN7MyClass6methodEi{{.*}} [[ATTRMETHOD:#[0-9]+]]
45 // A template declaration will not be decorated with `optnone`.
46 template <typename T
> T
twice (T param
);
48 // The template definition will be decorated with the attribute `optnone`.
49 template <typename T
> T
thrice (T param
) {
53 // This function definition will not be decorated with `optnone` because the
54 // attribute would conflict with `always_inline`.
55 int __attribute__((always_inline
)) baz(int z
) {
58 // CHECK-DAG: @_Z3bazi{{.*}} [[ATTRBAZ:#[0-9]+]]
60 // This function definition will not be decorated with `optnone` because the
61 // attribute would conflict with `minsize`.
62 int __attribute__((minsize
)) bax(int z
) {
65 // CHECK-DAG: @_Z3baxi{{.*}} [[ATTRBAX:#[0-9]+]]
67 #pragma clang optimize on
69 // The function "int wombat(int param)" created by the macro is not
70 // decorated with `optnone`, because the pragma applies its effects only
71 // after preprocessing. The position of the macro definition is not
74 // CHECK-DAG: @_Z6wombati{{.*}} [[ATTRWOMBAT:#[0-9]+]]
76 // This instantiation of the "twice" template function with a "float" type
77 // will not have an `optnone` attribute because the template declaration was
78 // not affected by the pragma.
79 float container (float par
) {
82 // CHECK-DAG: @_Z9containerf{{.*}} [[ATTRCONTAINER:#[0-9]+]]
83 // CHECK-DAG: @_Z5twiceIfET_S0_{{.*}} [[ATTRTWICE:#[0-9]+]]
85 // This instantiation of the "thrice" template function with a "float" type
86 // will have an `optnone` attribute because the template definition was
87 // affected by the pragma.
88 float container2 (float par
) {
91 // CHECK-DAG: @_Z10container2f{{.*}} [[ATTRCONTAINER2:#[0-9]+]]
92 // CHECK-DAG: @_Z6thriceIfET_S0_{{.*}} [[ATTRTHRICEFLOAT:#[0-9]+]]
95 // A template specialization is a new definition and it will not be
96 // decorated with an `optnone` attribute because it is now outside of the
98 template<> int thrice(int par
) {
99 return (par
<< 1) + par
;
101 int container3 (int par
) {
104 // CHECK-DAG: @_Z10container3i{{.*}} [[ATTRCONTAINER3:#[0-9]+]]
105 // CHECK-DAG: @_Z6thriceIiET_S0_{{.*}} [[ATTRTHRICEINT:#[0-9]+]]
108 // Test that we can re-open and re-close an "off" region after the first one,
109 // and that this works as expected.
111 #pragma clang optimize off
113 int another_optnone(int x
) {
116 // CHECK-DAG: @_Z15another_optnonei{{.*}} [[ATTRANOTHEROPTNONE:#[0-9]+]]
118 #pragma clang optimize on
120 int another_normal(int x
) {
123 // CHECK-DAG: @_Z14another_normali{{.*}} [[ATTRANOTHERNORMAL:#[0-9]+]]
126 // Test that we can re-open an "off" region by including a header with the
127 // pragma and that this works as expected (i.e. the off region "falls through"
128 // the end of the header into this file).
130 #include <header-with-pragma-optimize-off.h>
132 int yet_another_optnone(int x
) {
135 // CHECK-DAG: @_Z19yet_another_optnonei{{.*}} [[ATTRYETANOTHEROPTNONE:#[0-9]+]]
137 #pragma clang optimize on
139 int yet_another_normal(int x
) {
142 // CHECK-DAG: @_Z18yet_another_normali{{.*}} [[ATTRYETANOTHERNORMAL:#[0-9]+]]
145 // Check for both noinline and optnone on each function that should have them.
146 // CHECK-DAG: attributes [[ATTRBAR]] = { {{.*}}noinline{{.*}}optnone{{.*}} }
147 // CHECK-DAG: attributes [[ATTRCREATED]] = { {{.*}}noinline{{.*}}optnone{{.*}} }
148 // CHECK-DAG: attributes [[ATTRMETHOD]] = { {{.*}}noinline{{.*}}optnone{{.*}} }
149 // CHECK-DAG: attributes [[ATTRTHRICEFLOAT]] = { {{.*}}noinline{{.*}}optnone{{.*}} }
150 // CHECK-DAG: attributes [[ATTRANOTHEROPTNONE]] = { {{.*}}noinline{{.*}}optnone{{.*}} }
151 // CHECK-DAG: attributes [[ATTRYETANOTHEROPTNONE]] = { {{.*}}noinline{{.*}}optnone{{.*}} }
153 // Check that the other functions do NOT have optnone.
154 // CHECK-NOT: attributes [[ATTRFOO]] = { {{.*}}optnone{{.*}} }
155 // CHECK-NOT: attributes [[ATTRBAZ]] = { {{.*}}optnone{{.*}} }
156 // CHECK-NOT: attributes [[ATTRBAX]] = { {{.*}}optnone{{.*}} }
157 // CHECK-NOT: attributes [[ATTRWOMBAT]] = { {{.*}}optnone{{.*}} }
158 // CHECK-NOT: attributes [[ATTRCONTAINER]] = { {{.*}}optnone{{.*}} }
159 // CHECK-NOT: attributes [[ATTRTWICE]] = { {{.*}}optnone{{.*}} }
160 // CHECK-NOT: attributes [[ATTRCONTAINER2]] = { {{.*}}optnone{{.*}} }
161 // CHECK-NOT: attributes [[ATTRCONTAINER3]] = { {{.*}}optnone{{.*}} }
162 // CHECK-NOT: attributes [[ATTRTHRICEINT]] = { {{.*}}optnone{{.*}} }
163 // CHECK-NOT: attributes [[ATTRANOTHERNORMAL]] = { {{.*}}optnone{{.*}} }
164 // CHECK-NOT: attributes [[ATTRYETANOTHERNORMAL]] = { {{.*}}optnone{{.*}} }