1*94c0db06SAlexander Richardson// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --include-generated-funcs --version 5 23ce0e92fSAlex Richardson// Basic C++ test for update_cc_test_checks 357c81917SNikita Popov// RUN: %clang_cc1 -triple=x86_64-unknown-linux-gnu -emit-llvm -o - %s | FileCheck %s 4*94c0db06SAlexander Richardson// RUN: %clang_cc1 -triple=x86_64-apple-macho -emit-llvm -o - %s | FileCheck %s --check-prefix=MACHO 5*94c0db06SAlexander Richardson// RUN: %clang_cc1 -triple=x86_64-windows-msvc -emit-llvm -o - %s | FileCheck %s --check-prefix=MSVC 6*94c0db06SAlexander Richardson// RUN: %clang_cc1 -triple=x86_64-windows-gnu -emit-llvm -o - %s | FileCheck %s --check-prefix=MINGW 73ce0e92fSAlex Richardson 83ce0e92fSAlex Richardsonclass Foo { 93ce0e92fSAlex Richardson int x; 103ce0e92fSAlex Richardson 113ce0e92fSAlex Richardsonpublic: 123ce0e92fSAlex Richardson explicit Foo(int x); 133ce0e92fSAlex Richardson ~Foo(); 14*94c0db06SAlexander Richardson inline int function_defined_inline(int arg) const { 15*94c0db06SAlexander Richardson return arg + x; 16*94c0db06SAlexander Richardson } 17*94c0db06SAlexander Richardson inline int function_defined_out_of_line(int arg) const; 18*94c0db06SAlexander Richardson}; 19*94c0db06SAlexander Richardson 20*94c0db06SAlexander Richardson[[clang::noinline]] static int static_noinline_fn(int arg) { return arg; } 21*94c0db06SAlexander Richardson 22*94c0db06SAlexander RichardsonFoo::Foo(int x) : x(x) {} 23*94c0db06SAlexander RichardsonFoo::~Foo() {} 24*94c0db06SAlexander Richardsonint Foo::function_defined_out_of_line(int arg) const { return x - arg; } 25*94c0db06SAlexander Richardson 26*94c0db06SAlexander Richardson// Call the inline methods to ensure the LLVM IR is generated: 27*94c0db06SAlexander Richardsonint main() { 28*94c0db06SAlexander Richardson Foo f(1); 29*94c0db06SAlexander Richardson f.function_defined_inline(2); 30*94c0db06SAlexander Richardson f.function_defined_out_of_line(3); 31*94c0db06SAlexander Richardson return static_noinline_fn(0); 32*94c0db06SAlexander Richardson} 33*94c0db06SAlexander Richardson// CHECK-LABEL: define dso_local void @_ZN3FooC2Ei( 34*94c0db06SAlexander Richardson// CHECK-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[X:%.*]]) unnamed_addr #[[ATTR0:[0-9]+]] align 2 { 35*94c0db06SAlexander Richardson// CHECK-NEXT: [[ENTRY:.*:]] 36*94c0db06SAlexander Richardson// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 37*94c0db06SAlexander Richardson// CHECK-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4 38*94c0db06SAlexander Richardson// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 39*94c0db06SAlexander Richardson// CHECK-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4 40*94c0db06SAlexander Richardson// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 41*94c0db06SAlexander Richardson// CHECK-NEXT: [[X2:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0 42*94c0db06SAlexander Richardson// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4 43*94c0db06SAlexander Richardson// CHECK-NEXT: store i32 [[TMP0]], ptr [[X2]], align 4 44*94c0db06SAlexander Richardson// CHECK-NEXT: ret void 45*94c0db06SAlexander Richardson// 46*94c0db06SAlexander Richardson// 47*94c0db06SAlexander Richardson// CHECK-LABEL: define dso_local void @_ZN3FooC1Ei( 48*94c0db06SAlexander Richardson// CHECK-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[X:%.*]]) unnamed_addr #[[ATTR0]] align 2 { 49*94c0db06SAlexander Richardson// CHECK-NEXT: [[ENTRY:.*:]] 50*94c0db06SAlexander Richardson// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 51*94c0db06SAlexander Richardson// CHECK-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4 52*94c0db06SAlexander Richardson// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 53*94c0db06SAlexander Richardson// CHECK-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4 54*94c0db06SAlexander Richardson// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 55*94c0db06SAlexander Richardson// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4 56*94c0db06SAlexander Richardson// CHECK-NEXT: call void @_ZN3FooC2Ei(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], i32 noundef [[TMP0]]) 57*94c0db06SAlexander Richardson// CHECK-NEXT: ret void 58*94c0db06SAlexander Richardson// 59*94c0db06SAlexander Richardson// 60*94c0db06SAlexander Richardson// CHECK-LABEL: define dso_local void @_ZN3FooD2Ev( 61*94c0db06SAlexander Richardson// CHECK-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 { 62*94c0db06SAlexander Richardson// CHECK-NEXT: [[ENTRY:.*:]] 63*94c0db06SAlexander Richardson// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 64*94c0db06SAlexander Richardson// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 65*94c0db06SAlexander Richardson// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 66*94c0db06SAlexander Richardson// CHECK-NEXT: ret void 67*94c0db06SAlexander Richardson// 68*94c0db06SAlexander Richardson// 69*94c0db06SAlexander Richardson// CHECK-LABEL: define dso_local void @_ZN3FooD1Ev( 70*94c0db06SAlexander Richardson// CHECK-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 { 71*94c0db06SAlexander Richardson// CHECK-NEXT: [[ENTRY:.*:]] 72*94c0db06SAlexander Richardson// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 73*94c0db06SAlexander Richardson// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 74*94c0db06SAlexander Richardson// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 75*94c0db06SAlexander Richardson// CHECK-NEXT: call void @_ZN3FooD2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR2:[0-9]+]] 76*94c0db06SAlexander Richardson// CHECK-NEXT: ret void 77*94c0db06SAlexander Richardson// 78*94c0db06SAlexander Richardson// 79*94c0db06SAlexander Richardson// CHECK-LABEL: define dso_local noundef i32 @main( 80*94c0db06SAlexander Richardson// CHECK-SAME: ) #[[ATTR1:[0-9]+]] { 81*94c0db06SAlexander Richardson// CHECK-NEXT: [[ENTRY:.*:]] 82*94c0db06SAlexander Richardson// CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 83*94c0db06SAlexander Richardson// CHECK-NEXT: [[F:%.*]] = alloca [[CLASS_FOO:%.*]], align 4 84*94c0db06SAlexander Richardson// CHECK-NEXT: store i32 0, ptr [[RETVAL]], align 4 85*94c0db06SAlexander Richardson// CHECK-NEXT: call void @_ZN3FooC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[F]], i32 noundef 1) 86*94c0db06SAlexander Richardson// CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @_ZNK3Foo23function_defined_inlineEi(ptr noundef nonnull align 4 dereferenceable(4) [[F]], i32 noundef 2) 87*94c0db06SAlexander Richardson// CHECK-NEXT: [[CALL1:%.*]] = call noundef i32 @_ZNK3Foo28function_defined_out_of_lineEi(ptr noundef nonnull align 4 dereferenceable(4) [[F]], i32 noundef 3) 88*94c0db06SAlexander Richardson// CHECK-NEXT: [[CALL2:%.*]] = call noundef i32 @_ZL18static_noinline_fni(i32 noundef 0) 89*94c0db06SAlexander Richardson// CHECK-NEXT: store i32 [[CALL2]], ptr [[RETVAL]], align 4 90*94c0db06SAlexander Richardson// CHECK-NEXT: call void @_ZN3FooD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[F]]) #[[ATTR2]] 91*94c0db06SAlexander Richardson// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[RETVAL]], align 4 92*94c0db06SAlexander Richardson// CHECK-NEXT: ret i32 [[TMP0]] 93*94c0db06SAlexander Richardson// 94*94c0db06SAlexander Richardson// 95*94c0db06SAlexander Richardson// CHECK-LABEL: define linkonce_odr noundef i32 @_ZNK3Foo23function_defined_inlineEi( 96*94c0db06SAlexander Richardson// CHECK-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[ARG:%.*]]) #[[ATTR0]] comdat align 2 { 97*94c0db06SAlexander Richardson// CHECK-NEXT: [[ENTRY:.*:]] 9857c81917SNikita Popov// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 993ce0e92fSAlex Richardson// CHECK-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4 100*94c0db06SAlexander Richardson// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 101*94c0db06SAlexander Richardson// CHECK-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4 10257c81917SNikita Popov// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 10357c81917SNikita Popov// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARG_ADDR]], align 4 10494473f4dSHari Limaye// CHECK-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0 10557c81917SNikita Popov// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[X]], align 4 1063ce0e92fSAlex Richardson// CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP0]], [[TMP1]] 1073ce0e92fSAlex Richardson// CHECK-NEXT: ret i32 [[ADD]] 1083ce0e92fSAlex Richardson// 1093ce0e92fSAlex Richardson// 110*94c0db06SAlexander Richardson// CHECK-LABEL: define linkonce_odr noundef i32 @_ZNK3Foo28function_defined_out_of_lineEi( 111*94c0db06SAlexander Richardson// CHECK-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[ARG:%.*]]) #[[ATTR0]] comdat align 2 { 112*94c0db06SAlexander Richardson// CHECK-NEXT: [[ENTRY:.*:]] 11357c81917SNikita Popov// CHECK-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 1143ce0e92fSAlex Richardson// CHECK-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4 115*94c0db06SAlexander Richardson// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 116*94c0db06SAlexander Richardson// CHECK-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4 11757c81917SNikita Popov// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 11894473f4dSHari Limaye// CHECK-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0 11957c81917SNikita Popov// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[X]], align 4 12057c81917SNikita Popov// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARG_ADDR]], align 4 1213ce0e92fSAlex Richardson// CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP0]], [[TMP1]] 1223ce0e92fSAlex Richardson// CHECK-NEXT: ret i32 [[SUB]] 1233ce0e92fSAlex Richardson// 1243ce0e92fSAlex Richardson// 125*94c0db06SAlexander Richardson// CHECK-LABEL: define internal noundef i32 @_ZL18static_noinline_fni( 126*94c0db06SAlexander Richardson// CHECK-SAME: i32 noundef [[ARG:%.*]]) #[[ATTR0]] { 127*94c0db06SAlexander Richardson// CHECK-NEXT: [[ENTRY:.*:]] 128*94c0db06SAlexander Richardson// CHECK-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4 129*94c0db06SAlexander Richardson// CHECK-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4 130*94c0db06SAlexander Richardson// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARG_ADDR]], align 4 131*94c0db06SAlexander Richardson// CHECK-NEXT: ret i32 [[TMP0]] 132*94c0db06SAlexander Richardson// 133*94c0db06SAlexander Richardson// 134*94c0db06SAlexander Richardson// MACHO-LABEL: define void @_ZN3FooC2Ei( 135*94c0db06SAlexander Richardson// MACHO-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[X:%.*]]) unnamed_addr #[[ATTR0:[0-9]+]] align 2 { 136*94c0db06SAlexander Richardson// MACHO-NEXT: [[ENTRY:.*:]] 137*94c0db06SAlexander Richardson// MACHO-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 138*94c0db06SAlexander Richardson// MACHO-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4 139*94c0db06SAlexander Richardson// MACHO-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 140*94c0db06SAlexander Richardson// MACHO-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4 141*94c0db06SAlexander Richardson// MACHO-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 142*94c0db06SAlexander Richardson// MACHO-NEXT: [[X2:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0 143*94c0db06SAlexander Richardson// MACHO-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4 144*94c0db06SAlexander Richardson// MACHO-NEXT: store i32 [[TMP0]], ptr [[X2]], align 4 145*94c0db06SAlexander Richardson// MACHO-NEXT: ret void 146*94c0db06SAlexander Richardson// 147*94c0db06SAlexander Richardson// 148*94c0db06SAlexander Richardson// MACHO-LABEL: define void @_ZN3FooC1Ei( 149*94c0db06SAlexander Richardson// MACHO-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[X:%.*]]) unnamed_addr #[[ATTR0]] align 2 { 150*94c0db06SAlexander Richardson// MACHO-NEXT: [[ENTRY:.*:]] 151*94c0db06SAlexander Richardson// MACHO-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 152*94c0db06SAlexander Richardson// MACHO-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4 153*94c0db06SAlexander Richardson// MACHO-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 154*94c0db06SAlexander Richardson// MACHO-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4 155*94c0db06SAlexander Richardson// MACHO-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 156*94c0db06SAlexander Richardson// MACHO-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4 157*94c0db06SAlexander Richardson// MACHO-NEXT: call void @_ZN3FooC2Ei(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], i32 noundef [[TMP0]]) 158*94c0db06SAlexander Richardson// MACHO-NEXT: ret void 159*94c0db06SAlexander Richardson// 160*94c0db06SAlexander Richardson// 161*94c0db06SAlexander Richardson// MACHO-LABEL: define void @_ZN3FooD2Ev( 162*94c0db06SAlexander Richardson// MACHO-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 { 163*94c0db06SAlexander Richardson// MACHO-NEXT: [[ENTRY:.*:]] 164*94c0db06SAlexander Richardson// MACHO-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 165*94c0db06SAlexander Richardson// MACHO-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 166*94c0db06SAlexander Richardson// MACHO-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 167*94c0db06SAlexander Richardson// MACHO-NEXT: ret void 168*94c0db06SAlexander Richardson// 169*94c0db06SAlexander Richardson// 170*94c0db06SAlexander Richardson// MACHO-LABEL: define void @_ZN3FooD1Ev( 171*94c0db06SAlexander Richardson// MACHO-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 { 172*94c0db06SAlexander Richardson// MACHO-NEXT: [[ENTRY:.*:]] 173*94c0db06SAlexander Richardson// MACHO-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 174*94c0db06SAlexander Richardson// MACHO-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 175*94c0db06SAlexander Richardson// MACHO-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 176*94c0db06SAlexander Richardson// MACHO-NEXT: call void @_ZN3FooD2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR2:[0-9]+]] 177*94c0db06SAlexander Richardson// MACHO-NEXT: ret void 178*94c0db06SAlexander Richardson// 179*94c0db06SAlexander Richardson// 180*94c0db06SAlexander Richardson// MACHO-LABEL: define noundef i32 @main( 181*94c0db06SAlexander Richardson// MACHO-SAME: ) #[[ATTR1:[0-9]+]] { 182*94c0db06SAlexander Richardson// MACHO-NEXT: [[ENTRY:.*:]] 183*94c0db06SAlexander Richardson// MACHO-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 184*94c0db06SAlexander Richardson// MACHO-NEXT: [[F:%.*]] = alloca [[CLASS_FOO:%.*]], align 4 185*94c0db06SAlexander Richardson// MACHO-NEXT: store i32 0, ptr [[RETVAL]], align 4 186*94c0db06SAlexander Richardson// MACHO-NEXT: call void @_ZN3FooC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[F]], i32 noundef 1) 187*94c0db06SAlexander Richardson// MACHO-NEXT: [[CALL:%.*]] = call noundef i32 @_ZNK3Foo23function_defined_inlineEi(ptr noundef nonnull align 4 dereferenceable(4) [[F]], i32 noundef 2) 188*94c0db06SAlexander Richardson// MACHO-NEXT: [[CALL1:%.*]] = call noundef i32 @_ZNK3Foo28function_defined_out_of_lineEi(ptr noundef nonnull align 4 dereferenceable(4) [[F]], i32 noundef 3) 189*94c0db06SAlexander Richardson// MACHO-NEXT: [[CALL2:%.*]] = call noundef i32 @_ZL18static_noinline_fni(i32 noundef 0) 190*94c0db06SAlexander Richardson// MACHO-NEXT: store i32 [[CALL2]], ptr [[RETVAL]], align 4 191*94c0db06SAlexander Richardson// MACHO-NEXT: call void @_ZN3FooD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[F]]) #[[ATTR2]] 192*94c0db06SAlexander Richardson// MACHO-NEXT: [[TMP0:%.*]] = load i32, ptr [[RETVAL]], align 4 193*94c0db06SAlexander Richardson// MACHO-NEXT: ret i32 [[TMP0]] 194*94c0db06SAlexander Richardson// 195*94c0db06SAlexander Richardson// 196*94c0db06SAlexander Richardson// MACHO-LABEL: define linkonce_odr noundef i32 @_ZNK3Foo23function_defined_inlineEi( 197*94c0db06SAlexander Richardson// MACHO-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[ARG:%.*]]) #[[ATTR0]] align 2 { 198*94c0db06SAlexander Richardson// MACHO-NEXT: [[ENTRY:.*:]] 199*94c0db06SAlexander Richardson// MACHO-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 200*94c0db06SAlexander Richardson// MACHO-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4 201*94c0db06SAlexander Richardson// MACHO-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 202*94c0db06SAlexander Richardson// MACHO-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4 203*94c0db06SAlexander Richardson// MACHO-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 204*94c0db06SAlexander Richardson// MACHO-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARG_ADDR]], align 4 205*94c0db06SAlexander Richardson// MACHO-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0 206*94c0db06SAlexander Richardson// MACHO-NEXT: [[TMP1:%.*]] = load i32, ptr [[X]], align 4 207*94c0db06SAlexander Richardson// MACHO-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP0]], [[TMP1]] 208*94c0db06SAlexander Richardson// MACHO-NEXT: ret i32 [[ADD]] 209*94c0db06SAlexander Richardson// 210*94c0db06SAlexander Richardson// 211*94c0db06SAlexander Richardson// MACHO-LABEL: define linkonce_odr noundef i32 @_ZNK3Foo28function_defined_out_of_lineEi( 212*94c0db06SAlexander Richardson// MACHO-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[ARG:%.*]]) #[[ATTR0]] align 2 { 213*94c0db06SAlexander Richardson// MACHO-NEXT: [[ENTRY:.*:]] 214*94c0db06SAlexander Richardson// MACHO-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 215*94c0db06SAlexander Richardson// MACHO-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4 216*94c0db06SAlexander Richardson// MACHO-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 217*94c0db06SAlexander Richardson// MACHO-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4 218*94c0db06SAlexander Richardson// MACHO-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 219*94c0db06SAlexander Richardson// MACHO-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0 220*94c0db06SAlexander Richardson// MACHO-NEXT: [[TMP0:%.*]] = load i32, ptr [[X]], align 4 221*94c0db06SAlexander Richardson// MACHO-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARG_ADDR]], align 4 222*94c0db06SAlexander Richardson// MACHO-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP0]], [[TMP1]] 223*94c0db06SAlexander Richardson// MACHO-NEXT: ret i32 [[SUB]] 224*94c0db06SAlexander Richardson// 225*94c0db06SAlexander Richardson// 226*94c0db06SAlexander Richardson// MACHO-LABEL: define internal noundef i32 @_ZL18static_noinline_fni( 227*94c0db06SAlexander Richardson// MACHO-SAME: i32 noundef [[ARG:%.*]]) #[[ATTR0]] { 228*94c0db06SAlexander Richardson// MACHO-NEXT: [[ENTRY:.*:]] 229*94c0db06SAlexander Richardson// MACHO-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4 230*94c0db06SAlexander Richardson// MACHO-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4 231*94c0db06SAlexander Richardson// MACHO-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARG_ADDR]], align 4 232*94c0db06SAlexander Richardson// MACHO-NEXT: ret i32 [[TMP0]] 233*94c0db06SAlexander Richardson// 234*94c0db06SAlexander Richardson// 235*94c0db06SAlexander Richardson// MSVC-LABEL: define dso_local noundef i32 @main( 236*94c0db06SAlexander Richardson// MSVC-SAME: ) #[[ATTR1:[0-9]+]] { 237*94c0db06SAlexander Richardson// MSVC-NEXT: [[ENTRY:.*:]] 238*94c0db06SAlexander Richardson// MSVC-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 239*94c0db06SAlexander Richardson// MSVC-NEXT: [[F:%.*]] = alloca [[CLASS_FOO:%.*]], align 4 240*94c0db06SAlexander Richardson// MSVC-NEXT: store i32 0, ptr [[RETVAL]], align 4 241*94c0db06SAlexander Richardson// MSVC-NEXT: [[CALL:%.*]] = call noundef ptr @"??0Foo@@QEAA@H@Z"(ptr noundef nonnull align 4 dereferenceable(4) [[F]], i32 noundef 1) 242*94c0db06SAlexander Richardson// MSVC-NEXT: [[CALL1:%.*]] = call noundef i32 @"?function_defined_inline@Foo@@QEBAHH@Z"(ptr noundef nonnull align 4 dereferenceable(4) [[F]], i32 noundef 2) 243*94c0db06SAlexander Richardson// MSVC-NEXT: [[CALL2:%.*]] = call noundef i32 @"?function_defined_out_of_line@Foo@@QEBAHH@Z"(ptr noundef nonnull align 4 dereferenceable(4) [[F]], i32 noundef 3) 244*94c0db06SAlexander Richardson// MSVC-NEXT: [[CALL3:%.*]] = call noundef i32 @"?static_noinline_fn@@YAHH@Z"(i32 noundef 0) 245*94c0db06SAlexander Richardson// MSVC-NEXT: store i32 [[CALL3]], ptr [[RETVAL]], align 4 246*94c0db06SAlexander Richardson// MSVC-NEXT: call void @"??1Foo@@QEAA@XZ"(ptr noundef nonnull align 4 dereferenceable(4) [[F]]) #[[ATTR2:[0-9]+]] 247*94c0db06SAlexander Richardson// MSVC-NEXT: [[TMP0:%.*]] = load i32, ptr [[RETVAL]], align 4 248*94c0db06SAlexander Richardson// MSVC-NEXT: ret i32 [[TMP0]] 249*94c0db06SAlexander Richardson// 250*94c0db06SAlexander Richardson// 251*94c0db06SAlexander Richardson// MINGW-LABEL: define dso_local void @_ZN3FooC2Ei( 252*94c0db06SAlexander Richardson// MINGW-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[X:%.*]]) unnamed_addr #[[ATTR0:[0-9]+]] align 2 { 253*94c0db06SAlexander Richardson// MINGW-NEXT: [[ENTRY:.*:]] 254*94c0db06SAlexander Richardson// MINGW-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 255*94c0db06SAlexander Richardson// MINGW-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4 256*94c0db06SAlexander Richardson// MINGW-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 257*94c0db06SAlexander Richardson// MINGW-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4 258*94c0db06SAlexander Richardson// MINGW-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 259*94c0db06SAlexander Richardson// MINGW-NEXT: [[X2:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0 260*94c0db06SAlexander Richardson// MINGW-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4 261*94c0db06SAlexander Richardson// MINGW-NEXT: store i32 [[TMP0]], ptr [[X2]], align 4 262*94c0db06SAlexander Richardson// MINGW-NEXT: ret void 263*94c0db06SAlexander Richardson// 264*94c0db06SAlexander Richardson// 265*94c0db06SAlexander Richardson// MINGW-LABEL: define dso_local void @_ZN3FooC1Ei( 266*94c0db06SAlexander Richardson// MINGW-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[X:%.*]]) unnamed_addr #[[ATTR0]] align 2 { 267*94c0db06SAlexander Richardson// MINGW-NEXT: [[ENTRY:.*:]] 268*94c0db06SAlexander Richardson// MINGW-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 269*94c0db06SAlexander Richardson// MINGW-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4 270*94c0db06SAlexander Richardson// MINGW-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 271*94c0db06SAlexander Richardson// MINGW-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4 272*94c0db06SAlexander Richardson// MINGW-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 273*94c0db06SAlexander Richardson// MINGW-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4 274*94c0db06SAlexander Richardson// MINGW-NEXT: call void @_ZN3FooC2Ei(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], i32 noundef [[TMP0]]) 275*94c0db06SAlexander Richardson// MINGW-NEXT: ret void 276*94c0db06SAlexander Richardson// 277*94c0db06SAlexander Richardson// 278*94c0db06SAlexander Richardson// MINGW-LABEL: define dso_local void @_ZN3FooD2Ev( 279*94c0db06SAlexander Richardson// MINGW-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 { 280*94c0db06SAlexander Richardson// MINGW-NEXT: [[ENTRY:.*:]] 281*94c0db06SAlexander Richardson// MINGW-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 282*94c0db06SAlexander Richardson// MINGW-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 283*94c0db06SAlexander Richardson// MINGW-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 284*94c0db06SAlexander Richardson// MINGW-NEXT: ret void 285*94c0db06SAlexander Richardson// 286*94c0db06SAlexander Richardson// 287*94c0db06SAlexander Richardson// MINGW-LABEL: define dso_local void @_ZN3FooD1Ev( 288*94c0db06SAlexander Richardson// MINGW-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] align 2 { 289*94c0db06SAlexander Richardson// MINGW-NEXT: [[ENTRY:.*:]] 290*94c0db06SAlexander Richardson// MINGW-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 291*94c0db06SAlexander Richardson// MINGW-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 292*94c0db06SAlexander Richardson// MINGW-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 293*94c0db06SAlexander Richardson// MINGW-NEXT: call void @_ZN3FooD2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR2:[0-9]+]] 294*94c0db06SAlexander Richardson// MINGW-NEXT: ret void 295*94c0db06SAlexander Richardson// 296*94c0db06SAlexander Richardson// 297*94c0db06SAlexander Richardson// MINGW-LABEL: define dso_local noundef i32 @main( 298*94c0db06SAlexander Richardson// MINGW-SAME: ) #[[ATTR1:[0-9]+]] { 299*94c0db06SAlexander Richardson// MINGW-NEXT: [[ENTRY:.*:]] 300*94c0db06SAlexander Richardson// MINGW-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 301*94c0db06SAlexander Richardson// MINGW-NEXT: [[F:%.*]] = alloca [[CLASS_FOO:%.*]], align 4 302*94c0db06SAlexander Richardson// MINGW-NEXT: store i32 0, ptr [[RETVAL]], align 4 303*94c0db06SAlexander Richardson// MINGW-NEXT: call void @_ZN3FooC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[F]], i32 noundef 1) 304*94c0db06SAlexander Richardson// MINGW-NEXT: [[CALL:%.*]] = call noundef i32 @_ZNK3Foo23function_defined_inlineEi(ptr noundef nonnull align 4 dereferenceable(4) [[F]], i32 noundef 2) 305*94c0db06SAlexander Richardson// MINGW-NEXT: [[CALL1:%.*]] = call noundef i32 @_ZNK3Foo28function_defined_out_of_lineEi(ptr noundef nonnull align 4 dereferenceable(4) [[F]], i32 noundef 3) 306*94c0db06SAlexander Richardson// MINGW-NEXT: [[CALL2:%.*]] = call noundef i32 @_ZL18static_noinline_fni(i32 noundef 0) 307*94c0db06SAlexander Richardson// MINGW-NEXT: store i32 [[CALL2]], ptr [[RETVAL]], align 4 308*94c0db06SAlexander Richardson// MINGW-NEXT: call void @_ZN3FooD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[F]]) #[[ATTR2]] 309*94c0db06SAlexander Richardson// MINGW-NEXT: [[TMP0:%.*]] = load i32, ptr [[RETVAL]], align 4 310*94c0db06SAlexander Richardson// MINGW-NEXT: ret i32 [[TMP0]] 311*94c0db06SAlexander Richardson// 312*94c0db06SAlexander Richardson// 313*94c0db06SAlexander Richardson// MINGW-LABEL: define linkonce_odr dso_local noundef i32 @_ZNK3Foo23function_defined_inlineEi( 314*94c0db06SAlexander Richardson// MINGW-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[ARG:%.*]]) #[[ATTR0]] comdat align 2 { 315*94c0db06SAlexander Richardson// MINGW-NEXT: [[ENTRY:.*:]] 316*94c0db06SAlexander Richardson// MINGW-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 317*94c0db06SAlexander Richardson// MINGW-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4 318*94c0db06SAlexander Richardson// MINGW-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 319*94c0db06SAlexander Richardson// MINGW-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4 320*94c0db06SAlexander Richardson// MINGW-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 321*94c0db06SAlexander Richardson// MINGW-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARG_ADDR]], align 4 322*94c0db06SAlexander Richardson// MINGW-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0 323*94c0db06SAlexander Richardson// MINGW-NEXT: [[TMP1:%.*]] = load i32, ptr [[X]], align 4 324*94c0db06SAlexander Richardson// MINGW-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP0]], [[TMP1]] 325*94c0db06SAlexander Richardson// MINGW-NEXT: ret i32 [[ADD]] 326*94c0db06SAlexander Richardson// 327*94c0db06SAlexander Richardson// 328*94c0db06SAlexander Richardson// MINGW-LABEL: define linkonce_odr dso_local noundef i32 @_ZNK3Foo28function_defined_out_of_lineEi( 329*94c0db06SAlexander Richardson// MINGW-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[ARG:%.*]]) #[[ATTR0]] comdat align 2 { 330*94c0db06SAlexander Richardson// MINGW-NEXT: [[ENTRY:.*:]] 331*94c0db06SAlexander Richardson// MINGW-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 332*94c0db06SAlexander Richardson// MINGW-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4 333*94c0db06SAlexander Richardson// MINGW-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 334*94c0db06SAlexander Richardson// MINGW-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4 335*94c0db06SAlexander Richardson// MINGW-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 336*94c0db06SAlexander Richardson// MINGW-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0 337*94c0db06SAlexander Richardson// MINGW-NEXT: [[TMP0:%.*]] = load i32, ptr [[X]], align 4 338*94c0db06SAlexander Richardson// MINGW-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARG_ADDR]], align 4 339*94c0db06SAlexander Richardson// MINGW-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP0]], [[TMP1]] 340*94c0db06SAlexander Richardson// MINGW-NEXT: ret i32 [[SUB]] 341*94c0db06SAlexander Richardson// 342*94c0db06SAlexander Richardson// 343*94c0db06SAlexander Richardson// MINGW-LABEL: define internal noundef i32 @_ZL18static_noinline_fni( 344*94c0db06SAlexander Richardson// MINGW-SAME: i32 noundef [[ARG:%.*]]) #[[ATTR0]] { 345*94c0db06SAlexander Richardson// MINGW-NEXT: [[ENTRY:.*:]] 346*94c0db06SAlexander Richardson// MINGW-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4 347*94c0db06SAlexander Richardson// MINGW-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4 348*94c0db06SAlexander Richardson// MINGW-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARG_ADDR]], align 4 349*94c0db06SAlexander Richardson// MINGW-NEXT: ret i32 [[TMP0]] 350*94c0db06SAlexander Richardson// 351