xref: /aosp_15_r20/external/llvm/test/Transforms/LoopStrengthReduce/funclet.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -loop-reduce -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4*9880d681SAndroid Build Coastguard Workertarget triple = "i686-pc-windows-msvc"
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdeclare i32 @_except_handler3(...)
7*9880d681SAndroid Build Coastguard Workerdeclare i32 @__CxxFrameHandler3(...)
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdeclare void @external(i32*)
10*9880d681SAndroid Build Coastguard Workerdeclare void @reserve()
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine void @f() personality i32 (...)* @_except_handler3 {
13*9880d681SAndroid Build Coastguard Workerentry:
14*9880d681SAndroid Build Coastguard Worker  br label %throw
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerthrow:                                            ; preds = %throw, %entry
17*9880d681SAndroid Build Coastguard Worker  %tmp96 = getelementptr inbounds i8, i8* undef, i32 1
18*9880d681SAndroid Build Coastguard Worker  invoke void @reserve()
19*9880d681SAndroid Build Coastguard Worker          to label %throw unwind label %pad
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerpad:                                              ; preds = %throw
22*9880d681SAndroid Build Coastguard Worker  %phi2 = phi i8* [ %tmp96, %throw ]
23*9880d681SAndroid Build Coastguard Worker  %cs = catchswitch within none [label %unreachable] unwind label %blah2
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerunreachable:
26*9880d681SAndroid Build Coastguard Worker  catchpad within %cs []
27*9880d681SAndroid Build Coastguard Worker  unreachable
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerblah2:
30*9880d681SAndroid Build Coastguard Worker  %cleanuppadi4.i.i.i = cleanuppad within none []
31*9880d681SAndroid Build Coastguard Worker  br label %loop_body
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerloop_body:                                        ; preds = %iter, %pad
34*9880d681SAndroid Build Coastguard Worker  %tmp99 = phi i8* [ %tmp101, %iter ], [ %phi2, %blah2 ]
35*9880d681SAndroid Build Coastguard Worker  %tmp100 = icmp eq i8* %tmp99, undef
36*9880d681SAndroid Build Coastguard Worker  br i1 %tmp100, label %unwind_out, label %iter
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workeriter:                                             ; preds = %loop_body
39*9880d681SAndroid Build Coastguard Worker  %tmp101 = getelementptr inbounds i8, i8* %tmp99, i32 1
40*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %unwind_out, label %loop_body
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerunwind_out:                                       ; preds = %iter, %loop_body
43*9880d681SAndroid Build Coastguard Worker  cleanupret from %cleanuppadi4.i.i.i unwind to caller
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @f(
47*9880d681SAndroid Build Coastguard Worker; CHECK: cleanuppad within none []
48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ptrtoint i8* %phi2 to i32
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerdefine void @g() personality i32 (...)* @_except_handler3 {
51*9880d681SAndroid Build Coastguard Workerentry:
52*9880d681SAndroid Build Coastguard Worker  br label %throw
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerthrow:                                            ; preds = %throw, %entry
55*9880d681SAndroid Build Coastguard Worker  %tmp96 = getelementptr inbounds i8, i8* undef, i32 1
56*9880d681SAndroid Build Coastguard Worker  invoke void @reserve()
57*9880d681SAndroid Build Coastguard Worker          to label %throw unwind label %pad
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerpad:
60*9880d681SAndroid Build Coastguard Worker  %phi2 = phi i8* [ %tmp96, %throw ]
61*9880d681SAndroid Build Coastguard Worker  %cs = catchswitch within none [label %unreachable, label %blah] unwind to caller
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerunreachable:
64*9880d681SAndroid Build Coastguard Worker  catchpad within %cs []
65*9880d681SAndroid Build Coastguard Worker  unreachable
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerblah:
68*9880d681SAndroid Build Coastguard Worker  %catchpad = catchpad within %cs []
69*9880d681SAndroid Build Coastguard Worker  br label %loop_body
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerunwind_out:
72*9880d681SAndroid Build Coastguard Worker  catchret from %catchpad to label %leave
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerleave:
75*9880d681SAndroid Build Coastguard Worker  ret void
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerloop_body:                                        ; preds = %iter, %pad
78*9880d681SAndroid Build Coastguard Worker  %tmp99 = phi i8* [ %tmp101, %iter ], [ %phi2, %blah ]
79*9880d681SAndroid Build Coastguard Worker  %tmp100 = icmp eq i8* %tmp99, undef
80*9880d681SAndroid Build Coastguard Worker  br i1 %tmp100, label %unwind_out, label %iter
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workeriter:                                             ; preds = %loop_body
83*9880d681SAndroid Build Coastguard Worker  %tmp101 = getelementptr inbounds i8, i8* %tmp99, i32 1
84*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %unwind_out, label %loop_body
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @g(
88*9880d681SAndroid Build Coastguard Worker; CHECK: blah:
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: catchpad within %cs []
90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ptrtoint i8* %phi2 to i32
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerdefine void @h() personality i32 (...)* @_except_handler3 {
94*9880d681SAndroid Build Coastguard Workerentry:
95*9880d681SAndroid Build Coastguard Worker  br label %throw
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerthrow:                                            ; preds = %throw, %entry
98*9880d681SAndroid Build Coastguard Worker  %tmp96 = getelementptr inbounds i8, i8* undef, i32 1
99*9880d681SAndroid Build Coastguard Worker  invoke void @reserve()
100*9880d681SAndroid Build Coastguard Worker          to label %throw unwind label %pad
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Workerpad:
103*9880d681SAndroid Build Coastguard Worker  %cs = catchswitch within none [label %unreachable, label %blug] unwind to caller
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerunreachable:
106*9880d681SAndroid Build Coastguard Worker  catchpad within %cs []
107*9880d681SAndroid Build Coastguard Worker  unreachable
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerblug:
110*9880d681SAndroid Build Coastguard Worker  %phi2 = phi i8* [ %tmp96, %pad ]
111*9880d681SAndroid Build Coastguard Worker  %catchpad = catchpad within %cs []
112*9880d681SAndroid Build Coastguard Worker  br label %loop_body
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerunwind_out:
115*9880d681SAndroid Build Coastguard Worker  catchret from %catchpad to label %leave
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerleave:
118*9880d681SAndroid Build Coastguard Worker  ret void
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workerloop_body:                                        ; preds = %iter, %pad
121*9880d681SAndroid Build Coastguard Worker  %tmp99 = phi i8* [ %tmp101, %iter ], [ %phi2, %blug ]
122*9880d681SAndroid Build Coastguard Worker  %tmp100 = icmp eq i8* %tmp99, undef
123*9880d681SAndroid Build Coastguard Worker  br i1 %tmp100, label %unwind_out, label %iter
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workeriter:                                             ; preds = %loop_body
126*9880d681SAndroid Build Coastguard Worker  %tmp101 = getelementptr inbounds i8, i8* %tmp99, i32 1
127*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %unwind_out, label %loop_body
128*9880d681SAndroid Build Coastguard Worker}
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @h(
131*9880d681SAndroid Build Coastguard Worker; CHECK: blug:
132*9880d681SAndroid Build Coastguard Worker; CHECK: catchpad within %cs []
133*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ptrtoint i8* %phi2 to i32
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerdefine void @i() personality i32 (...)* @_except_handler3 {
136*9880d681SAndroid Build Coastguard Workerentry:
137*9880d681SAndroid Build Coastguard Worker  br label %throw
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerthrow:                                            ; preds = %throw, %entry
140*9880d681SAndroid Build Coastguard Worker  %tmp96 = getelementptr inbounds i8, i8* undef, i32 1
141*9880d681SAndroid Build Coastguard Worker  invoke void @reserve()
142*9880d681SAndroid Build Coastguard Worker          to label %throw unwind label %catchpad
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workercatchpad:                                              ; preds = %throw
145*9880d681SAndroid Build Coastguard Worker  %phi2 = phi i8* [ %tmp96, %throw ]
146*9880d681SAndroid Build Coastguard Worker  %cs = catchswitch within none [label %cp_body] unwind label %cleanuppad
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Workercp_body:
149*9880d681SAndroid Build Coastguard Worker  catchpad within %cs []
150*9880d681SAndroid Build Coastguard Worker  br label %loop_head
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workercleanuppad:
153*9880d681SAndroid Build Coastguard Worker  cleanuppad within none []
154*9880d681SAndroid Build Coastguard Worker  br label %loop_head
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerloop_head:
157*9880d681SAndroid Build Coastguard Worker  br label %loop_body
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Workerloop_body:                                        ; preds = %iter, %catchpad
160*9880d681SAndroid Build Coastguard Worker  %tmp99 = phi i8* [ %tmp101, %iter ], [ %phi2, %loop_head ]
161*9880d681SAndroid Build Coastguard Worker  %tmp100 = icmp eq i8* %tmp99, undef
162*9880d681SAndroid Build Coastguard Worker  br i1 %tmp100, label %unwind_out, label %iter
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workeriter:                                             ; preds = %loop_body
165*9880d681SAndroid Build Coastguard Worker  %tmp101 = getelementptr inbounds i8, i8* %tmp99, i32 1
166*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %unwind_out, label %loop_body
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Workerunwind_out:                                       ; preds = %iter, %loop_body
169*9880d681SAndroid Build Coastguard Worker  unreachable
170*9880d681SAndroid Build Coastguard Worker}
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @i(
173*9880d681SAndroid Build Coastguard Worker; CHECK: ptrtoint i8* %phi2 to i32
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Workerdefine void @test1(i32* %b, i32* %c) personality i32 (...)* @__CxxFrameHandler3 {
176*9880d681SAndroid Build Coastguard Workerentry:
177*9880d681SAndroid Build Coastguard Worker  br label %for.cond
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Workerfor.cond:                                         ; preds = %for.inc, %entry
180*9880d681SAndroid Build Coastguard Worker  %d.0 = phi i32* [ %b, %entry ], [ %incdec.ptr, %for.inc ]
181*9880d681SAndroid Build Coastguard Worker  invoke void @external(i32* %d.0)
182*9880d681SAndroid Build Coastguard Worker          to label %for.inc unwind label %catch.dispatch
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Workerfor.inc:                                          ; preds = %for.cond
185*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %d.0, i32 1
186*9880d681SAndroid Build Coastguard Worker  br label %for.cond
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workercatch.dispatch:                                   ; preds = %for.cond
189*9880d681SAndroid Build Coastguard Worker  %cs = catchswitch within none [label %catch] unwind label %catch.dispatch.2
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Workercatch:                                            ; preds = %catch.dispatch
192*9880d681SAndroid Build Coastguard Worker  %0 = catchpad within %cs [i8* null, i32 64, i8* null]
193*9880d681SAndroid Build Coastguard Worker  catchret from %0 to label %try.cont
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Workertry.cont:                                         ; preds = %catch
196*9880d681SAndroid Build Coastguard Worker  invoke void @external(i32* %c)
197*9880d681SAndroid Build Coastguard Worker          to label %try.cont.7 unwind label %catch.dispatch.2
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Workercatch.dispatch.2:                                 ; preds = %try.cont, %catchendblock
200*9880d681SAndroid Build Coastguard Worker  %e.0 = phi i32* [ %c, %try.cont ], [ %b, %catch.dispatch ]
201*9880d681SAndroid Build Coastguard Worker  %cs2 = catchswitch within none [label %catch.4] unwind to caller
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Workercatch.4:                                          ; preds = %catch.dispatch.2
204*9880d681SAndroid Build Coastguard Worker  catchpad within %cs2 [i8* null, i32 64, i8* null]
205*9880d681SAndroid Build Coastguard Worker  unreachable
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Workertry.cont.7:                                       ; preds = %try.cont
208*9880d681SAndroid Build Coastguard Worker  ret void
209*9880d681SAndroid Build Coastguard Worker}
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test1(
212*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond:
213*9880d681SAndroid Build Coastguard Worker; CHECK:   %d.0 = phi i32* [ %b, %entry ], [ %incdec.ptr, %for.inc ]
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Worker; CHECK: catch.dispatch.2:
216*9880d681SAndroid Build Coastguard Worker; CHECK: %e.0 = phi i32* [ %c, %try.cont ], [ %b, %catch.dispatch ]
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Workerdefine i32 @test2() personality i32 (...)* @_except_handler3 {
219*9880d681SAndroid Build Coastguard Workerentry:
220*9880d681SAndroid Build Coastguard Worker  br label %for.body
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.inc, %entry
223*9880d681SAndroid Build Coastguard Worker  %phi = phi i32 [ %inc, %for.inc ], [ 0, %entry ]
224*9880d681SAndroid Build Coastguard Worker  invoke void @reserve()
225*9880d681SAndroid Build Coastguard Worker          to label %for.inc unwind label %catch.dispatch
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Workercatch.dispatch:                                   ; preds = %for.body
228*9880d681SAndroid Build Coastguard Worker  %tmp18 = catchswitch within none [label %catch.handler] unwind to caller
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Workercatch.handler:                                    ; preds = %catch.dispatch
231*9880d681SAndroid Build Coastguard Worker  %phi.lcssa = phi i32 [ %phi, %catch.dispatch ]
232*9880d681SAndroid Build Coastguard Worker  %tmp19 = catchpad within %tmp18 [i8* null]
233*9880d681SAndroid Build Coastguard Worker  catchret from %tmp19 to label %done
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Workerdone:
236*9880d681SAndroid Build Coastguard Worker  ret i32 %phi.lcssa
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Workerfor.inc:                                          ; preds = %for.body
239*9880d681SAndroid Build Coastguard Worker  %inc = add i32 %phi, 1
240*9880d681SAndroid Build Coastguard Worker  br label %for.body
241*9880d681SAndroid Build Coastguard Worker}
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @test2(
244*9880d681SAndroid Build Coastguard Worker; CHECK:      %phi.lcssa = phi i32 [ %phi, %catch.dispatch ]
245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: catchpad within
246