xref: /aosp_15_r20/external/clang/test/CodeGenCXX/optnone-def-decl.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -triple %itanium_abi_triple -fms-extensions -emit-llvm -o - | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li // Test optnone on both function declarations and function definitions.
4*67e74705SXin Li // Verify also that we don't generate invalid IR functions with
5*67e74705SXin Li // both alwaysinline and noinline. (optnone implies noinline and wins
6*67e74705SXin Li // over alwaysinline, in all cases.)
7*67e74705SXin Li 
8*67e74705SXin Li // Test optnone on extern declaration only.
9*67e74705SXin Li extern int decl_only(int a) __attribute__((optnone));
10*67e74705SXin Li 
11*67e74705SXin Li // This function should be marked 'optnone'.
decl_only(int a)12*67e74705SXin Li int decl_only(int a) {
13*67e74705SXin Li   return a + a + a + a;
14*67e74705SXin Li }
15*67e74705SXin Li 
16*67e74705SXin Li // CHECK: define {{.*}} @_Z9decl_onlyi({{.*}}) [[OPTNONE:#[0-9]+]]
17*67e74705SXin Li 
18*67e74705SXin Li // Test optnone on definition but not extern declaration.
19*67e74705SXin Li extern int def_only(int a);
20*67e74705SXin Li 
21*67e74705SXin Li __attribute__((optnone))
def_only(int a)22*67e74705SXin Li int def_only(int a) {
23*67e74705SXin Li   return a + a + a + a;
24*67e74705SXin Li }
25*67e74705SXin Li 
26*67e74705SXin Li // Function def_only is a optnone function and therefore it should not be
27*67e74705SXin Li // inlined inside 'user_of_def_only'.
user_of_def_only()28*67e74705SXin Li int user_of_def_only() {
29*67e74705SXin Li   return def_only(5);
30*67e74705SXin Li }
31*67e74705SXin Li 
32*67e74705SXin Li // CHECK: define {{.*}} @_Z8def_onlyi({{.*}}) [[OPTNONE]]
33*67e74705SXin Li // CHECK: define {{.*}} @_Z16user_of_def_onlyv() [[NORMAL:#[0-9]+]]
34*67e74705SXin Li 
35*67e74705SXin Li // Test optnone on both definition and declaration.
36*67e74705SXin Li extern int def_and_decl(int a) __attribute__((optnone));
37*67e74705SXin Li 
38*67e74705SXin Li __attribute__((optnone))
def_and_decl(int a)39*67e74705SXin Li int def_and_decl(int a) {
40*67e74705SXin Li   return a + a + a + a;
41*67e74705SXin Li }
42*67e74705SXin Li 
43*67e74705SXin Li // CHECK: define {{.*}} @_Z12def_and_decli({{.*}}) [[OPTNONE]]
44*67e74705SXin Li 
45*67e74705SXin Li // Check that optnone wins over always_inline.
46*67e74705SXin Li 
47*67e74705SXin Li // Test optnone on definition and always_inline on declaration.
48*67e74705SXin Li extern int always_inline_function(int a) __attribute__((always_inline));
49*67e74705SXin Li 
50*67e74705SXin Li __attribute__((optnone))
always_inline_function(int a)51*67e74705SXin Li extern int always_inline_function(int a) {
52*67e74705SXin Li   return a + a + a + a;
53*67e74705SXin Li }
54*67e74705SXin Li // CHECK: define {{.*}} @_Z22always_inline_functioni({{.*}}) [[OPTNONE]]
55*67e74705SXin Li 
user_of_always_inline_function()56*67e74705SXin Li int user_of_always_inline_function() {
57*67e74705SXin Li   return always_inline_function(4);
58*67e74705SXin Li }
59*67e74705SXin Li 
60*67e74705SXin Li // CHECK: define {{.*}} @_Z30user_of_always_inline_functionv() [[NORMAL]]
61*67e74705SXin Li 
62*67e74705SXin Li // Test optnone on declaration and always_inline on definition.
63*67e74705SXin Li extern int optnone_function(int a) __attribute__((optnone));
64*67e74705SXin Li 
65*67e74705SXin Li __attribute__((always_inline))
optnone_function(int a)66*67e74705SXin Li int optnone_function(int a) {
67*67e74705SXin Li   return a + a + a + a;
68*67e74705SXin Li }
69*67e74705SXin Li // CHECK: define {{.*}} @_Z16optnone_functioni({{.*}}) [[OPTNONE]]
70*67e74705SXin Li 
user_of_optnone_function()71*67e74705SXin Li int user_of_optnone_function() {
72*67e74705SXin Li   return optnone_function(4);
73*67e74705SXin Li }
74*67e74705SXin Li 
75*67e74705SXin Li // CHECK: define {{.*}} @_Z24user_of_optnone_functionv() [[NORMAL]]
76*67e74705SXin Li 
77*67e74705SXin Li // Test the combination of optnone with forceinline (optnone wins).
78*67e74705SXin Li extern __forceinline int forceinline_optnone_function(int a, int b);
79*67e74705SXin Li 
80*67e74705SXin Li __attribute__((optnone))
forceinline_optnone_function(int a,int b)81*67e74705SXin Li extern int forceinline_optnone_function(int a, int b) {
82*67e74705SXin Li     return a + b;
83*67e74705SXin Li }
84*67e74705SXin Li 
user_of_forceinline_optnone_function()85*67e74705SXin Li int user_of_forceinline_optnone_function() {
86*67e74705SXin Li     return forceinline_optnone_function(4,5);
87*67e74705SXin Li }
88*67e74705SXin Li 
89*67e74705SXin Li // CHECK: @_Z36user_of_forceinline_optnone_functionv() [[NORMAL]]
90*67e74705SXin Li // CHECK: @_Z28forceinline_optnone_functionii({{.*}}) [[OPTNONE]]
91*67e74705SXin Li 
92*67e74705SXin Li // CHECK: attributes [[OPTNONE]] = { noinline nounwind optnone {{.*}} }
93*67e74705SXin Li // CHECK: attributes [[NORMAL]] =
94*67e74705SXin Li // CHECK-NOT: noinline
95*67e74705SXin Li // CHECK-NOT: optnone
96