351 lines · plain
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --include-generated-funcs --version 52// Basic C++ test for update_cc_test_checks3// RUN: %clang_cc1 -triple=x86_64-unknown-linux-gnu -emit-llvm -o - %s | FileCheck %s4// RUN: %clang_cc1 -triple=x86_64-apple-macho -emit-llvm -o - %s | FileCheck %s --check-prefix=MACHO5// RUN: %clang_cc1 -triple=x86_64-windows-msvc -emit-llvm -o - %s | FileCheck %s --check-prefix=MSVC6// RUN: %clang_cc1 -triple=x86_64-windows-gnu -emit-llvm -o - %s | FileCheck %s --check-prefix=MINGW7 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 837// CHECK-NEXT: [[X_ADDR:%.*]] = alloca i32, align 438// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 839// CHECK-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 440// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 841// CHECK-NEXT: [[X2:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 042// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 443// CHECK-NEXT: store i32 [[TMP0]], ptr [[X2]], align 444// CHECK-NEXT: ret void45//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 851// CHECK-NEXT: [[X_ADDR:%.*]] = alloca i32, align 452// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 853// CHECK-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 454// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 855// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 456// CHECK-NEXT: call void @_ZN3FooC2Ei(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], i32 noundef [[TMP0]])57// CHECK-NEXT: ret void58//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 864// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 865// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 866// CHECK-NEXT: ret void67//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 873// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 874// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 875// CHECK-NEXT: call void @_ZN3FooD2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR2:[0-9]+]]76// CHECK-NEXT: ret void77//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 483// CHECK-NEXT: [[F:%.*]] = alloca [[CLASS_FOO:%.*]], align 484// CHECK-NEXT: store i32 0, ptr [[RETVAL]], align 485// 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 490// CHECK-NEXT: call void @_ZN3FooD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[F]]) #[[ATTR2]]91// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[RETVAL]], align 492// 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 899// CHECK-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4100// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8101// CHECK-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4102// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8103// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARG_ADDR]], align 4104// CHECK-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0105// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[X]], align 4106// 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 8114// CHECK-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4115// CHECK-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8116// CHECK-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4117// CHECK-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8118// CHECK-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0119// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[X]], align 4120// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARG_ADDR]], align 4121// 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 4129// CHECK-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4130// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARG_ADDR]], align 4131// 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 8138// MACHO-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4139// MACHO-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8140// MACHO-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4141// MACHO-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8142// MACHO-NEXT: [[X2:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0143// MACHO-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4144// MACHO-NEXT: store i32 [[TMP0]], ptr [[X2]], align 4145// MACHO-NEXT: ret void146//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 8152// MACHO-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4153// MACHO-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8154// MACHO-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4155// MACHO-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8156// MACHO-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4157// MACHO-NEXT: call void @_ZN3FooC2Ei(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], i32 noundef [[TMP0]])158// MACHO-NEXT: ret void159//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 8165// MACHO-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8166// MACHO-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8167// MACHO-NEXT: ret void168//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 8174// MACHO-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8175// MACHO-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8176// MACHO-NEXT: call void @_ZN3FooD2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR2:[0-9]+]]177// MACHO-NEXT: ret void178//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 4184// MACHO-NEXT: [[F:%.*]] = alloca [[CLASS_FOO:%.*]], align 4185// MACHO-NEXT: store i32 0, ptr [[RETVAL]], align 4186// 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 4191// MACHO-NEXT: call void @_ZN3FooD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[F]]) #[[ATTR2]]192// MACHO-NEXT: [[TMP0:%.*]] = load i32, ptr [[RETVAL]], align 4193// 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 8200// MACHO-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4201// MACHO-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8202// MACHO-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4203// MACHO-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8204// MACHO-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARG_ADDR]], align 4205// MACHO-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0206// MACHO-NEXT: [[TMP1:%.*]] = load i32, ptr [[X]], align 4207// 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 8215// MACHO-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4216// MACHO-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8217// MACHO-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4218// MACHO-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8219// MACHO-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0220// MACHO-NEXT: [[TMP0:%.*]] = load i32, ptr [[X]], align 4221// MACHO-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARG_ADDR]], align 4222// 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 4230// MACHO-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4231// MACHO-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARG_ADDR]], align 4232// 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 4239// MSVC-NEXT: [[F:%.*]] = alloca [[CLASS_FOO:%.*]], align 4240// MSVC-NEXT: store i32 0, ptr [[RETVAL]], align 4241// 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 4246// 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 4248// 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 8255// MINGW-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4256// MINGW-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8257// MINGW-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4258// MINGW-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8259// MINGW-NEXT: [[X2:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0260// MINGW-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4261// MINGW-NEXT: store i32 [[TMP0]], ptr [[X2]], align 4262// MINGW-NEXT: ret void263//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 8269// MINGW-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4270// MINGW-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8271// MINGW-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4272// MINGW-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8273// MINGW-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4274// MINGW-NEXT: call void @_ZN3FooC2Ei(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], i32 noundef [[TMP0]])275// MINGW-NEXT: ret void276//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 8282// MINGW-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8283// MINGW-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8284// MINGW-NEXT: ret void285//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 8291// MINGW-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8292// MINGW-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8293// MINGW-NEXT: call void @_ZN3FooD2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) #[[ATTR2:[0-9]+]]294// MINGW-NEXT: ret void295//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 4301// MINGW-NEXT: [[F:%.*]] = alloca [[CLASS_FOO:%.*]], align 4302// MINGW-NEXT: store i32 0, ptr [[RETVAL]], align 4303// 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 4308// MINGW-NEXT: call void @_ZN3FooD1Ev(ptr noundef nonnull align 4 dereferenceable(4) [[F]]) #[[ATTR2]]309// MINGW-NEXT: [[TMP0:%.*]] = load i32, ptr [[RETVAL]], align 4310// 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 8317// MINGW-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4318// MINGW-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8319// MINGW-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4320// MINGW-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8321// MINGW-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARG_ADDR]], align 4322// MINGW-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0323// MINGW-NEXT: [[TMP1:%.*]] = load i32, ptr [[X]], align 4324// 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 8332// MINGW-NEXT: [[ARG_ADDR:%.*]] = alloca i32, align 4333// MINGW-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8334// MINGW-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4335// MINGW-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8336// MINGW-NEXT: [[X:%.*]] = getelementptr inbounds nuw [[CLASS_FOO:%.*]], ptr [[THIS1]], i32 0, i32 0337// MINGW-NEXT: [[TMP0:%.*]] = load i32, ptr [[X]], align 4338// MINGW-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARG_ADDR]], align 4339// 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 4347// MINGW-NEXT: store i32 [[ARG]], ptr [[ARG_ADDR]], align 4348// MINGW-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARG_ADDR]], align 4349// MINGW-NEXT: ret i32 [[TMP0]]350//351