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