xref: /llvm-project/clang/test/utils/update_cc_test_checks/Inputs/basic-cplusplus.cpp.expected (revision 94c0db06ab8cf0897ff32884ea6f683f5fc5a7b9)
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