xref: /llvm-project/llvm/test/CodeGen/X86/windows-seh-EHa-CppCondiTemps.ll (revision 6e83c0a1cbfdb0c0f13c282312c47c7945970f55)
1; RUN: llc -verify-machineinstrs < %s | FileCheck %s
2
3; CHECK-LABEL: $ip2state$main:
4; CHECK-NEXT:	.long	.Lfunc_begin4@IMGREL
5; CHECK-NEXT:	.long	-1                              # ToState
6; CHECK-NEXT:	.long	.Ltmp
7; CHECK-NEXT:	.long	0                               # ToState
8; CHECK-NEXT:	.long	.Ltmp
9; CHECK-NEXT:	.long	4                               # ToState
10; CHECK-NEXT:   .long	.Ltmp
11; CHECK:     	.long	5                               # ToState
12; CHECK-NEXT:	.long	.Ltmp
13; CHECK-NEXT:	.long	4                               # ToState
14; CHECK-NEXT:	.long	.Ltmp
15; CHECK-NEXT:	.long	0                               # ToState
16; CHECK-NEXT:	.long	.Ltmp
17; CHECK-NEXT:	.long	2                               # ToState
18; CHECK-NEXT:	.long	.Ltmp
19; CHECK-NEXT:	.long	3                               # ToState
20; CHECK-NEXT:	.long	.Ltmp
21; CHECK-NEXT:	.long	0                               # ToState
22; CHECK-NEXT:	.long	.Ltmp
23; CHECK-NEXT:	.long	1                               # ToState
24; CHECK-NEXT:	.long	.Ltmp
25; CHECK-NEXT:	.long	0                               # ToState
26; CHECK-NEXT:	.long	.Ltmp
27; CHECK-NEXT:	.long	-1                              # ToState
28
29; ModuleID = 'windows-seh-EHa-CppCondiTemps.cpp'
30source_filename = "windows-seh-EHa-CppCondiTemps.cpp"
31target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
32target triple = "x86_64-unknown-windows-msvc"
33
34%class.B1 = type { i32 }
35%class.B2 = type { %class.B1 }
36%class.B3 = type { %class.B2 }
37
38$"??1B1@@QEAA@XZ" = comdat any
39
40$"??1B2@@QEAA@XZ" = comdat any
41
42$"??0B2@@QEAA@XZ" = comdat any
43
44$"??0B3@@QEAA@XZ" = comdat any
45
46$"??1B3@@QEAA@XZ" = comdat any
47
48$"??0B1@@QEAA@XZ" = comdat any
49
50$"??_C@_0N@FMGAAAAM@in?5B1?5Dtor?5?6?$AA@" = comdat any
51
52$"??_C@_0N@GFONDMMJ@in?5B2?5Dtor?5?6?$AA@" = comdat any
53
54$"??_C@_0N@HCJGCIIK@in?5B3?5Dtor?5?6?$AA@" = comdat any
55
56@"?xxxx@@3HA" = dso_local global i32 0, align 4
57@"?ptr@@3PEAHEA" = dso_local global ptr null, align 8
58@"??_C@_0N@FMGAAAAM@in?5B1?5Dtor?5?6?$AA@" = linkonce_odr dso_local unnamed_addr constant [13 x i8] c"in B1 Dtor \0A\00", comdat, align 1
59@"??_C@_0N@GFONDMMJ@in?5B2?5Dtor?5?6?$AA@" = linkonce_odr dso_local unnamed_addr constant [13 x i8] c"in B2 Dtor \0A\00", comdat, align 1
60@"??_C@_0N@HCJGCIIK@in?5B3?5Dtor?5?6?$AA@" = linkonce_odr dso_local unnamed_addr constant [13 x i8] c"in B3 Dtor \0A\00", comdat, align 1
61
62; Function Attrs: noinline nounwind optnone mustprogress
63define dso_local i32 @"?foo@@YAHH@Z"(i32 %a) #0 {
64entry:
65  %a.addr = alloca i32, align 4
66  store i32 %a, ptr %a.addr, align 4
67  %0 = load i32, ptr @"?xxxx@@3HA", align 4
68  %1 = load i32, ptr %a.addr, align 4
69  %add = add nsw i32 %0, %1
70  ret i32 %add
71}
72
73; Function Attrs: noinline optnone mustprogress
74define dso_local i32 @"?bar@@YAHHVB1@@VB2@@@Z"(i32 %j, i32 %b1Bar.coerce, i32 %b2Bar.coerce) #1 personality ptr @__CxxFrameHandler3 {
75entry:
76  %b1Bar = alloca %class.B1, align 4
77  %b2Bar = alloca %class.B2, align 4
78  %j.addr = alloca i32, align 4
79  %ww = alloca i32, align 4
80  %coerce.dive = getelementptr inbounds %class.B1, ptr %b1Bar, i32 0, i32 0
81  store i32 %b1Bar.coerce, ptr %coerce.dive, align 4
82  %coerce.dive1 = getelementptr inbounds %class.B2, ptr %b2Bar, i32 0, i32 0
83  %coerce.dive2 = getelementptr inbounds %class.B1, ptr %coerce.dive1, i32 0, i32 0
84  store i32 %b2Bar.coerce, ptr %coerce.dive2, align 4
85  invoke void @llvm.seh.scope.begin()
86          to label %invoke.cont unwind label %ehcleanup7
87
88invoke.cont:                                      ; preds = %entry
89  invoke void @llvm.seh.scope.begin()
90          to label %invoke.cont3 unwind label %ehcleanup
91
92invoke.cont3:                                     ; preds = %invoke.cont
93  store i32 %j, ptr %j.addr, align 4
94  %0 = load i32, ptr %j.addr, align 4
95  %cmp = icmp sgt i32 %0, 0
96  br i1 %cmp, label %if.then, label %if.else
97
98if.then:                                          ; preds = %invoke.cont3
99  %data = getelementptr inbounds %class.B1, ptr %b1Bar, i32 0, i32 0
100  %1 = load i32, ptr %data, align 4
101  store i32 %1, ptr %ww, align 4
102  br label %if.end
103
104if.else:                                          ; preds = %invoke.cont3
105  %2 = bitcast ptr %b2Bar to ptr
106  %data4 = getelementptr inbounds %class.B1, ptr %2, i32 0, i32 0
107  %3 = load i32, ptr %data4, align 4
108  store i32 %3, ptr %ww, align 4
109  br label %if.end
110
111if.end:                                           ; preds = %if.else, %if.then
112  %4 = load i32, ptr %ww, align 4
113  %5 = load ptr, ptr @"?ptr@@3PEAHEA", align 8
114  %6 = load i32, ptr %5, align 4
115  %add = add nsw i32 %4, %6
116  invoke void @llvm.seh.scope.end()
117          to label %invoke.cont5 unwind label %ehcleanup
118
119invoke.cont5:                                     ; preds = %if.end
120  call void @"??1B1@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %b1Bar) #8
121  invoke void @llvm.seh.scope.end()
122          to label %invoke.cont6 unwind label %ehcleanup7
123
124ehcleanup:                                        ; preds = %if.end, %invoke.cont
125  %7 = cleanuppad within none []
126  call void @"??1B1@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %b1Bar) #8 [ "funclet"(token %7) ]
127  cleanupret from %7 unwind label %ehcleanup7
128
129invoke.cont6:                                     ; preds = %invoke.cont5
130  call void @"??1B2@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %b2Bar) #8
131  ret i32 %add
132
133ehcleanup7:                                       ; preds = %invoke.cont5, %ehcleanup, %entry
134  %8 = cleanuppad within none []
135  call void @"??1B2@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %b2Bar) #8 [ "funclet"(token %8) ]
136  cleanupret from %8 unwind to caller
137}
138
139; Function Attrs: nounwind readnone
140declare dso_local void @llvm.seh.scope.begin() #2
141
142declare dso_local i32 @__CxxFrameHandler3(...)
143
144; Function Attrs: nounwind readnone
145declare dso_local void @llvm.seh.scope.end() #2
146
147; Function Attrs: noinline nounwind optnone
148define linkonce_odr dso_local void @"??1B1@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %this) unnamed_addr #3 comdat align 2 {
149entry:
150  %this.addr = alloca ptr, align 8
151  store ptr %this, ptr %this.addr, align 8
152  %this1 = load ptr, ptr %this.addr, align 8
153  call void (...) @"?printf@@YAXZZ"(ptr @"??_C@_0N@FMGAAAAM@in?5B1?5Dtor?5?6?$AA@")
154  ret void
155}
156
157; Function Attrs: noinline nounwind optnone
158define linkonce_odr dso_local void @"??1B2@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %this) unnamed_addr #3 comdat align 2 personality ptr @__CxxFrameHandler3 {
159entry:
160  %this.addr = alloca ptr, align 8
161  store ptr %this, ptr %this.addr, align 8
162  %this1 = load ptr, ptr %this.addr, align 8
163  invoke void @llvm.seh.scope.begin()
164          to label %invoke.cont unwind label %ehcleanup
165
166invoke.cont:                                      ; preds = %entry
167  invoke void (...) @"?printf@@YAXZZ"(ptr @"??_C@_0N@GFONDMMJ@in?5B2?5Dtor?5?6?$AA@")
168          to label %invoke.cont2 unwind label %ehcleanup
169
170invoke.cont2:                                     ; preds = %invoke.cont
171  invoke void @llvm.seh.scope.end()
172          to label %invoke.cont3 unwind label %ehcleanup
173
174invoke.cont3:                                     ; preds = %invoke.cont2
175  %0 = bitcast ptr %this1 to ptr
176  call void @"??1B1@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %0) #8
177  ret void
178
179ehcleanup:                                        ; preds = %invoke.cont2, %invoke.cont, %entry
180  %1 = cleanuppad within none []
181  %2 = bitcast ptr %this1 to ptr
182  call void @"??1B1@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %2) #8 [ "funclet"(token %1) ]
183  cleanupret from %1 unwind to caller
184}
185
186; Function Attrs: noinline optnone mustprogress
187define dso_local void @"?goo@@YA?AVB1@@H@Z"(ptr noalias sret(%class.B1) align 4 %agg.result, i32 %w) #1 personality ptr @__CxxFrameHandler3 {
188entry:
189  %result.ptr = alloca ptr, align 8
190  %w.addr = alloca i32, align 4
191  %b2ingoo = alloca %class.B2, align 4
192  %0 = bitcast ptr %agg.result to ptr
193  store ptr %0, ptr %result.ptr, align 8
194  store i32 %w, ptr %w.addr, align 4
195  %call = call ptr @"??0B2@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %b2ingoo)
196  invoke void @llvm.seh.scope.begin()
197          to label %invoke.cont unwind label %ehcleanup
198
199invoke.cont:                                      ; preds = %entry
200  %1 = load i32, ptr %w.addr, align 4
201  %2 = bitcast ptr %b2ingoo to ptr
202  %data = getelementptr inbounds %class.B1, ptr %2, i32 0, i32 0
203  %3 = load i32, ptr %data, align 4
204  %add = add nsw i32 %3, %1
205  store i32 %add, ptr %data, align 4
206  %4 = bitcast ptr %b2ingoo to ptr
207  %5 = bitcast ptr %agg.result to ptr
208  %6 = bitcast ptr %4 to ptr
209  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %5, ptr align 4 %6, i64 4, i1 false)
210  invoke void @llvm.seh.scope.end()
211          to label %invoke.cont1 unwind label %ehcleanup
212
213invoke.cont1:                                     ; preds = %invoke.cont
214  call void @"??1B2@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %b2ingoo) #8
215  ret void
216
217ehcleanup:                                        ; preds = %invoke.cont, %entry
218  %7 = cleanuppad within none []
219  call void @"??1B2@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %b2ingoo) #8 [ "funclet"(token %7) ]
220  cleanupret from %7 unwind to caller
221}
222
223; Function Attrs: noinline optnone
224define linkonce_odr dso_local ptr @"??0B2@@QEAA@XZ"(ptr nonnull returned align 4 dereferenceable(4) %this) unnamed_addr #4 comdat align 2 personality ptr @__CxxFrameHandler3 {
225entry:
226  %this.addr = alloca ptr, align 8
227  store ptr %this, ptr %this.addr, align 8
228  %this1 = load ptr, ptr %this.addr, align 8
229  %0 = bitcast ptr %this1 to ptr
230  %call = call ptr @"??0B1@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %0)
231  invoke void @llvm.seh.scope.begin()
232          to label %invoke.cont unwind label %ehcleanup
233
234invoke.cont:                                      ; preds = %entry
235  %1 = bitcast ptr %this1 to ptr
236  %data = getelementptr inbounds %class.B1, ptr %1, i32 0, i32 0
237  %2 = load i32, ptr %data, align 4
238  %add = add nsw i32 %2, 222
239  %call2 = call i32 @"?foo@@YAHH@Z"(i32 %add)
240  invoke void @llvm.seh.scope.end()
241          to label %invoke.cont3 unwind label %ehcleanup
242
243invoke.cont3:                                     ; preds = %invoke.cont
244  ret ptr %this1
245
246ehcleanup:                                        ; preds = %invoke.cont, %entry
247  %3 = cleanuppad within none []
248  %4 = bitcast ptr %this1 to ptr
249  call void @"??1B1@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %4) #8 [ "funclet"(token %3) ]
250  cleanupret from %3 unwind to caller
251}
252
253; Function Attrs: argmemonly nofree nosync nounwind willreturn
254declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #5
255
256; Function Attrs: noinline norecurse optnone mustprogress
257define dso_local i32 @main() #6 personality ptr @__CxxFrameHandler3 {
258entry:
259  %retval = alloca i32, align 4
260  %b3inmain = alloca %class.B3, align 4
261  %m = alloca i32, align 4
262  %ref.tmp = alloca %class.B2, align 4
263  %cleanup.cond = alloca i1, align 1
264  %ref.tmp5 = alloca %class.B3, align 4
265  %cleanup.cond9 = alloca i1, align 1
266  %i = alloca i32, align 4
267  %agg.tmp = alloca %class.B2, align 4
268  %agg.tmp28 = alloca %class.B1, align 4
269  %b1fromgoo = alloca %class.B1, align 4
270  store i32 0, ptr %retval, align 4
271  %call = call ptr @"??0B3@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %b3inmain)
272  invoke void @llvm.seh.scope.begin()
273          to label %invoke.cont unwind label %ehcleanup50
274
275invoke.cont:                                      ; preds = %entry
276  %0 = load i32, ptr @"?xxxx@@3HA", align 4
277  %cmp = icmp sgt i32 %0, 1
278  store i1 false, ptr %cleanup.cond, align 1
279  store i1 false, ptr %cleanup.cond9, align 1
280  br i1 %cmp, label %cond.true, label %cond.false
281
282cond.true:                                        ; preds = %invoke.cont
283  %call2 = invoke ptr @"??0B2@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %ref.tmp)
284          to label %invoke.cont1 unwind label %ehcleanup50
285
286invoke.cont1:                                     ; preds = %cond.true
287  invoke void @llvm.seh.scope.begin()
288          to label %invoke.cont3 unwind label %ehcleanup21
289
290invoke.cont3:                                     ; preds = %invoke.cont1
291  store i1 true, ptr %cleanup.cond, align 1
292  %1 = bitcast ptr %ref.tmp to ptr
293  %data = getelementptr inbounds %class.B1, ptr %1, i32 0, i32 0
294  %2 = load i32, ptr %data, align 4
295  %call4 = call i32 @"?foo@@YAHH@Z"(i32 99)
296  %add = add nsw i32 %2, %call4
297  br label %cond.end
298
299cond.false:                                       ; preds = %invoke.cont
300  %call7 = invoke ptr @"??0B3@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %ref.tmp5)
301          to label %invoke.cont6 unwind label %ehcleanup21
302
303invoke.cont6:                                     ; preds = %cond.false
304  invoke void @llvm.seh.scope.begin()
305          to label %invoke.cont8 unwind label %ehcleanup
306
307invoke.cont8:                                     ; preds = %invoke.cont6
308  store i1 true, ptr %cleanup.cond9, align 1
309  %3 = bitcast ptr %ref.tmp5 to ptr
310  %data10 = getelementptr inbounds %class.B1, ptr %3, i32 0, i32 0
311  %4 = load i32, ptr %data10, align 4
312  %call11 = call i32 @"?foo@@YAHH@Z"(i32 88)
313  %add12 = add nsw i32 %4, %call11
314  br label %cond.end
315
316cond.end:                                         ; preds = %invoke.cont8, %invoke.cont3
317  %cond = phi i32 [ %add, %invoke.cont3 ], [ %add12, %invoke.cont8 ]
318  invoke void @llvm.seh.scope.end()
319          to label %invoke.cont13 unwind label %ehcleanup
320
321invoke.cont13:                                    ; preds = %cond.end
322  %cleanup.is_active = load i1, ptr %cleanup.cond9, align 1
323  br i1 %cleanup.is_active, label %cleanup.action, label %cleanup.done
324
325cleanup.action:                                   ; preds = %invoke.cont13
326  call void @"??1B3@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %ref.tmp5) #8
327  br label %cleanup.done
328
329cleanup.done:                                     ; preds = %cleanup.action, %invoke.cont13
330  invoke void @llvm.seh.scope.end()
331          to label %invoke.cont17 unwind label %ehcleanup21
332
333invoke.cont17:                                    ; preds = %cleanup.done
334  %cleanup.is_active18 = load i1, ptr %cleanup.cond, align 1
335  br i1 %cleanup.is_active18, label %cleanup.action19, label %cleanup.done20
336
337cleanup.action19:                                 ; preds = %invoke.cont17
338  call void @"??1B2@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %ref.tmp) #8
339  br label %cleanup.done20
340
341cleanup.done20:                                   ; preds = %cleanup.action19, %invoke.cont17
342  store i32 %cond, ptr %m, align 4
343  %call26 = invoke ptr @"??0B2@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %agg.tmp)
344          to label %invoke.cont25 unwind label %ehcleanup50
345
346invoke.cont25:                                    ; preds = %cleanup.done20
347  invoke void @llvm.seh.scope.begin()
348          to label %invoke.cont27 unwind label %ehcleanup38
349
350invoke.cont27:                                    ; preds = %invoke.cont25
351  %call30 = invoke ptr @"??0B1@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %agg.tmp28)
352          to label %invoke.cont29 unwind label %ehcleanup38
353
354invoke.cont29:                                    ; preds = %invoke.cont27
355  invoke void @llvm.seh.scope.begin()
356          to label %invoke.cont31 unwind label %ehcleanup36
357
358invoke.cont31:                                    ; preds = %invoke.cont29
359  %call32 = call i32 @"?foo@@YAHH@Z"(i32 0)
360  %coerce.dive = getelementptr inbounds %class.B1, ptr %agg.tmp28, i32 0, i32 0
361  %5 = load i32, ptr %coerce.dive, align 4
362  %coerce.dive33 = getelementptr inbounds %class.B2, ptr %agg.tmp, i32 0, i32 0
363  %coerce.dive34 = getelementptr inbounds %class.B1, ptr %coerce.dive33, i32 0, i32 0
364  %6 = load i32, ptr %coerce.dive34, align 4
365  invoke void @llvm.seh.scope.end()
366          to label %invoke.cont35 unwind label %ehcleanup36
367
368invoke.cont35:                                    ; preds = %invoke.cont31
369  invoke void @llvm.seh.scope.end()
370          to label %invoke.cont37 unwind label %ehcleanup38
371
372invoke.cont37:                                    ; preds = %invoke.cont35
373  %call40 = invoke i32 @"?bar@@YAHHVB1@@VB2@@@Z"(i32 %call32, i32 %5, i32 %6)
374          to label %invoke.cont39 unwind label %ehcleanup50
375
376invoke.cont39:                                    ; preds = %invoke.cont37
377  store i32 %call40, ptr %i, align 4
378  %7 = load i32, ptr %i, align 4
379  invoke void @"?goo@@YA?AVB1@@H@Z"(ptr sret(%class.B1) align 4 %b1fromgoo, i32 %7)
380          to label %invoke.cont41 unwind label %ehcleanup50
381
382invoke.cont41:                                    ; preds = %invoke.cont39
383  invoke void @llvm.seh.scope.begin()
384          to label %invoke.cont42 unwind label %ehcleanup48
385
386invoke.cont42:                                    ; preds = %invoke.cont41
387  %8 = load i32, ptr %m, align 4
388  %data43 = getelementptr inbounds %class.B1, ptr %b1fromgoo, i32 0, i32 0
389  %9 = load i32, ptr %data43, align 4
390  %add44 = add nsw i32 %8, %9
391  %10 = bitcast ptr %b3inmain to ptr
392  %data45 = getelementptr inbounds %class.B1, ptr %10, i32 0, i32 0
393  %11 = load i32, ptr %data45, align 4
394  %add46 = add nsw i32 %add44, %11
395  store i32 %add46, ptr %retval, align 4
396  invoke void @llvm.seh.scope.end()
397          to label %invoke.cont47 unwind label %ehcleanup48
398
399ehcleanup:                                        ; preds = %cond.end, %invoke.cont6
400  %12 = cleanuppad within none []
401  %cleanup.is_active14 = load i1, ptr %cleanup.cond9, align 1
402  br i1 %cleanup.is_active14, label %cleanup.action15, label %cleanup.done16
403
404cleanup.action15:                                 ; preds = %ehcleanup
405  call void @"??1B3@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %ref.tmp5) #8 [ "funclet"(token %12) ]
406  br label %cleanup.done16
407
408cleanup.done16:                                   ; preds = %cleanup.action15, %ehcleanup
409  cleanupret from %12 unwind label %ehcleanup21
410
411ehcleanup21:                                      ; preds = %cleanup.done, %cleanup.done16, %cond.false, %invoke.cont1
412  %13 = cleanuppad within none []
413  %cleanup.is_active22 = load i1, ptr %cleanup.cond, align 1
414  br i1 %cleanup.is_active22, label %cleanup.action23, label %cleanup.done24
415
416cleanup.action23:                                 ; preds = %ehcleanup21
417  call void @"??1B2@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %ref.tmp) #8 [ "funclet"(token %13) ]
418  br label %cleanup.done24
419
420cleanup.done24:                                   ; preds = %cleanup.action23, %ehcleanup21
421  cleanupret from %13 unwind label %ehcleanup50
422
423ehcleanup36:                                      ; preds = %invoke.cont31, %invoke.cont29
424  %14 = cleanuppad within none []
425  call void @"??1B1@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %agg.tmp28) #8 [ "funclet"(token %14) ]
426  cleanupret from %14 unwind label %ehcleanup38
427
428ehcleanup38:                                      ; preds = %invoke.cont35, %ehcleanup36, %invoke.cont27, %invoke.cont25
429  %15 = cleanuppad within none []
430  call void @"??1B2@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %agg.tmp) #8 [ "funclet"(token %15) ]
431  cleanupret from %15 unwind label %ehcleanup50
432
433invoke.cont47:                                    ; preds = %invoke.cont42
434  call void @"??1B1@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %b1fromgoo) #8
435  invoke void @llvm.seh.scope.end()
436          to label %invoke.cont49 unwind label %ehcleanup50
437
438ehcleanup48:                                      ; preds = %invoke.cont42, %invoke.cont41
439  %16 = cleanuppad within none []
440  call void @"??1B1@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %b1fromgoo) #8 [ "funclet"(token %16) ]
441  cleanupret from %16 unwind label %ehcleanup50
442
443invoke.cont49:                                    ; preds = %invoke.cont47
444  call void @"??1B3@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %b3inmain) #8
445  %17 = load i32, ptr %retval, align 4
446  ret i32 %17
447
448ehcleanup50:                                      ; preds = %invoke.cont47, %ehcleanup48, %invoke.cont39, %invoke.cont37, %ehcleanup38, %cleanup.done20, %cleanup.done24, %cond.true, %entry
449  %18 = cleanuppad within none []
450  call void @"??1B3@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %b3inmain) #8 [ "funclet"(token %18) ]
451  cleanupret from %18 unwind to caller
452}
453
454; Function Attrs: noinline optnone
455define linkonce_odr dso_local ptr @"??0B3@@QEAA@XZ"(ptr nonnull returned align 4 dereferenceable(4) %this) unnamed_addr #4 comdat align 2 personality ptr @__CxxFrameHandler3 {
456entry:
457  %this.addr = alloca ptr, align 8
458  store ptr %this, ptr %this.addr, align 8
459  %this1 = load ptr, ptr %this.addr, align 8
460  %0 = bitcast ptr %this1 to ptr
461  %call = call ptr @"??0B2@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %0)
462  invoke void @llvm.seh.scope.begin()
463          to label %invoke.cont unwind label %ehcleanup
464
465invoke.cont:                                      ; preds = %entry
466  %1 = bitcast ptr %this1 to ptr
467  %data = getelementptr inbounds %class.B1, ptr %1, i32 0, i32 0
468  %2 = load i32, ptr %data, align 4
469  %add = add nsw i32 %2, 333
470  %call2 = call i32 @"?foo@@YAHH@Z"(i32 %add)
471  invoke void @llvm.seh.scope.end()
472          to label %invoke.cont3 unwind label %ehcleanup
473
474invoke.cont3:                                     ; preds = %invoke.cont
475  ret ptr %this1
476
477ehcleanup:                                        ; preds = %invoke.cont, %entry
478  %3 = cleanuppad within none []
479  %4 = bitcast ptr %this1 to ptr
480  call void @"??1B2@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %4) #8 [ "funclet"(token %3) ]
481  cleanupret from %3 unwind to caller
482}
483
484; Function Attrs: noinline nounwind optnone
485define linkonce_odr dso_local void @"??1B3@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %this) unnamed_addr #3 comdat align 2 personality ptr @__CxxFrameHandler3 {
486entry:
487  %this.addr = alloca ptr, align 8
488  store ptr %this, ptr %this.addr, align 8
489  %this1 = load ptr, ptr %this.addr, align 8
490  invoke void @llvm.seh.scope.begin()
491          to label %invoke.cont unwind label %ehcleanup
492
493invoke.cont:                                      ; preds = %entry
494  invoke void (...) @"?printf@@YAXZZ"(ptr @"??_C@_0N@HCJGCIIK@in?5B3?5Dtor?5?6?$AA@")
495          to label %invoke.cont2 unwind label %ehcleanup
496
497invoke.cont2:                                     ; preds = %invoke.cont
498  invoke void @llvm.seh.scope.end()
499          to label %invoke.cont3 unwind label %ehcleanup
500
501invoke.cont3:                                     ; preds = %invoke.cont2
502  %0 = bitcast ptr %this1 to ptr
503  call void @"??1B2@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %0) #8
504  ret void
505
506ehcleanup:                                        ; preds = %invoke.cont2, %invoke.cont, %entry
507  %1 = cleanuppad within none []
508  %2 = bitcast ptr %this1 to ptr
509  call void @"??1B2@@QEAA@XZ"(ptr nonnull align 4 dereferenceable(4) %2) #8 [ "funclet"(token %1) ]
510  cleanupret from %1 unwind to caller
511}
512
513; Function Attrs: noinline nounwind optnone
514define linkonce_odr dso_local ptr @"??0B1@@QEAA@XZ"(ptr nonnull returned align 4 dereferenceable(4) %this) unnamed_addr #3 comdat align 2 {
515entry:
516  %this.addr = alloca ptr, align 8
517  store ptr %this, ptr %this.addr, align 8
518  %this1 = load ptr, ptr %this.addr, align 8
519  %data = getelementptr inbounds %class.B1, ptr %this1, i32 0, i32 0
520  store i32 90, ptr %data, align 4
521  %data2 = getelementptr inbounds %class.B1, ptr %this1, i32 0, i32 0
522  %0 = load i32, ptr %data2, align 4
523  %add = add nsw i32 %0, 111
524  %call = call i32 @"?foo@@YAHH@Z"(i32 %add)
525  ret ptr %this1
526}
527
528declare dso_local void @"?printf@@YAXZZ"(...) #7
529
530attributes #0 = { noinline nounwind optnone mustprogress "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" }
531attributes #1 = { noinline optnone mustprogress "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" }
532attributes #2 = { nounwind readnone }
533attributes #3 = { noinline nounwind optnone "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" }
534attributes #4 = { noinline optnone "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" }
535attributes #5 = { argmemonly nofree nosync nounwind willreturn }
536attributes #6 = { noinline norecurse optnone mustprogress "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" }
537attributes #7 = { "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" }
538attributes #8 = { nounwind }
539
540!llvm.module.flags = !{!0, !1}
541
542!0 = !{i32 1, !"wchar_size", i32 2}
543!1 = !{i32 2, !"eh-asynch", i32 1}
544