1 // RUN: %clang_cc1 -no-opaque-pointers -S -emit-llvm %s -triple x86_64-unknown-linux-gnu -o - | FileCheck %s 2 3 bool bar(); 4 void f(bool, bool); 5 void g(bool); 6 7 static int baz(int x) { 8 return x * 10; 9 } 10 11 [[clang::noinline]] bool noi() { } 12 13 void foo(int i) { 14 [[clang::noinline]] bar(); 15 // CHECK: call noundef zeroext i1 @_Z3barv() #[[NOINLINEATTR:[0-9]+]] 16 [[clang::noinline]] i = baz(i); 17 // CHECK: call noundef i32 @_ZL3bazi({{.*}}) #[[NOINLINEATTR]] 18 [[clang::noinline]] (i = 4, bar()); 19 // CHECK: call noundef zeroext i1 @_Z3barv() #[[NOINLINEATTR]] 20 [[clang::noinline]] (void)(bar()); 21 // CHECK: call noundef zeroext i1 @_Z3barv() #[[NOINLINEATTR]] 22 [[clang::noinline]] f(bar(), bar()); 23 // CHECK: call noundef zeroext i1 @_Z3barv() #[[NOINLINEATTR]] 24 // CHECK: call noundef zeroext i1 @_Z3barv() #[[NOINLINEATTR]] 25 // CHECK: call void @_Z1fbb({{.*}}) #[[NOINLINEATTR]] 26 [[clang::noinline]] [] { bar(); bar(); }(); // noinline only applies to the anonymous function call 27 // CHECK: call void @"_ZZ3fooiENK3$_0clEv"(%class.anon* {{[^,]*}} %ref.tmp) #[[NOINLINEATTR]] 28 [[clang::noinline]] for (bar(); bar(); bar()) {} 29 // CHECK: call noundef zeroext i1 @_Z3barv() #[[NOINLINEATTR]] 30 // CHECK: call noundef zeroext i1 @_Z3barv() #[[NOINLINEATTR]] 31 // CHECK: call noundef zeroext i1 @_Z3barv() #[[NOINLINEATTR]] 32 bar(); 33 // CHECK: call noundef zeroext i1 @_Z3barv() 34 [[clang::noinline]] noi(); 35 // CHECK: call noundef zeroext i1 @_Z3noiv() 36 noi(); 37 // CHECK: call noundef zeroext i1 @_Z3noiv() 38 [[gnu::noinline]] bar(); 39 // CHECK: call noundef zeroext i1 @_Z3barv() 40 } 41 42 struct S { 43 friend bool operator==(const S &LHS, const S &RHS); 44 }; 45 46 void func(const S &s1, const S &s2) { 47 [[clang::noinline]]g(s1 == s2); 48 // CHECK: call noundef zeroext i1 @_ZeqRK1SS1_({{.*}}) #[[NOINLINEATTR]] 49 // CHECK: call void @_Z1gb({{.*}}) #[[NOINLINEATTR]] 50 bool b; 51 [[clang::noinline]] b = s1 == s2; 52 // CHECK: call noundef zeroext i1 @_ZeqRK1SS1_({{.*}}) #[[NOINLINEATTR]] 53 } 54 55 // CHECK: attributes #[[NOINLINEATTR]] = { noinline } 56