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 Liint 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 Liint 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 Liint 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 Liint 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 Liextern 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 Liint 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 Liint 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 Liint 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 Liextern 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 Liint 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