@@ -15,21 +15,25 @@ define void @f() personality i32 (...)* @_except_handler3 {
1515; CHECK-NEXT: entry:
1616; CHECK-NEXT: br label [[THROW:%.*]]
1717; CHECK: throw:
18+ ; CHECK-NEXT: [[TMP96:%.*]] = getelementptr inbounds i8, i8* undef, i32 1
1819; CHECK-NEXT: invoke void @reserve()
1920; CHECK-NEXT: to label [[THROW]] unwind label [[PAD:%.*]]
2021; CHECK: pad:
22+ ; CHECK-NEXT: [[PHI2:%.*]] = phi i8* [ [[TMP96]], [[THROW]] ]
2123; CHECK-NEXT: [[CS:%.*]] = catchswitch within none [label %unreachable] unwind label [[BLAH2:%.*]]
2224; CHECK: unreachable:
2325; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS]] []
2426; CHECK-NEXT: unreachable
2527; CHECK: blah2:
2628; CHECK-NEXT: [[CLEANUPPADI4_I_I_I:%.*]] = cleanuppad within none []
29+ ; CHECK-NEXT: [[PHI21:%.*]] = ptrtoint i8* [[PHI2]] to i32
30+ ; CHECK-NEXT: [[TMP1:%.*]] = sub i32 1, [[PHI21]]
31+ ; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, i8* undef, i32 [[TMP1]]
2732; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
2833; CHECK: loop_body:
29- ; CHECK-NEXT: [[LSR_IV:%.*]] = phi i32 [ [[LSR_IV_NEXT:%.*]], [[ITER:%.*]] ], [ 0, [[BLAH2]] ]
30- ; CHECK-NEXT: [[LSR_IV_NEXT]] = add nuw nsw i32 [[LSR_IV]], -1
31- ; CHECK-NEXT: [[LSR_IV_NEXT1:%.*]] = inttoptr i32 [[LSR_IV_NEXT]] to i8*
32- ; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[LSR_IV_NEXT1]], null
34+ ; CHECK-NEXT: [[LSR_IV:%.*]] = phi i8* [ [[SCEVGEP2:%.*]], [[ITER:%.*]] ], [ [[SCEVGEP]], [[BLAH2]] ]
35+ ; CHECK-NEXT: [[SCEVGEP2]] = getelementptr i8, i8* [[LSR_IV]], i32 -1
36+ ; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[SCEVGEP2]], null
3337; CHECK-NEXT: br i1 [[TMP100]], label [[UNWIND_OUT:%.*]], label [[ITER]]
3438; CHECK: iter:
3539; CHECK-NEXT: br i1 true, label [[UNWIND_OUT]], label [[LOOP_BODY]]
@@ -74,25 +78,29 @@ define void @g() personality i32 (...)* @_except_handler3 {
7478; CHECK-NEXT: entry:
7579; CHECK-NEXT: br label [[THROW:%.*]]
7680; CHECK: throw:
81+ ; CHECK-NEXT: [[TMP96:%.*]] = getelementptr inbounds i8, i8* undef, i32 1
7782; CHECK-NEXT: invoke void @reserve()
7883; CHECK-NEXT: to label [[THROW]] unwind label [[PAD:%.*]]
7984; CHECK: pad:
85+ ; CHECK-NEXT: [[PHI2:%.*]] = phi i8* [ [[TMP96]], [[THROW]] ]
8086; CHECK-NEXT: [[CS:%.*]] = catchswitch within none [label [[UNREACHABLE:%.*]], label %blah] unwind to caller
8187; CHECK: unreachable:
8288; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS]] []
8389; CHECK-NEXT: unreachable
8490; CHECK: blah:
8591; CHECK-NEXT: [[CATCHPAD:%.*]] = catchpad within [[CS]] []
92+ ; CHECK-NEXT: [[PHI21:%.*]] = ptrtoint i8* [[PHI2]] to i32
93+ ; CHECK-NEXT: [[TMP1:%.*]] = sub i32 1, [[PHI21]]
94+ ; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, i8* undef, i32 [[TMP1]]
8695; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
8796; CHECK: unwind_out:
8897; CHECK-NEXT: catchret from [[CATCHPAD]] to label [[LEAVE:%.*]]
8998; CHECK: leave:
9099; CHECK-NEXT: ret void
91100; CHECK: loop_body:
92- ; CHECK-NEXT: [[LSR_IV:%.*]] = phi i32 [ [[LSR_IV_NEXT:%.*]], [[ITER:%.*]] ], [ 0, [[BLAH:%.*]] ]
93- ; CHECK-NEXT: [[LSR_IV_NEXT]] = add nuw nsw i32 [[LSR_IV]], -1
94- ; CHECK-NEXT: [[LSR_IV_NEXT1:%.*]] = inttoptr i32 [[LSR_IV_NEXT]] to i8*
95- ; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[LSR_IV_NEXT1]], null
101+ ; CHECK-NEXT: [[LSR_IV:%.*]] = phi i8* [ [[SCEVGEP2:%.*]], [[ITER:%.*]] ], [ [[SCEVGEP]], [[BLAH:%.*]] ]
102+ ; CHECK-NEXT: [[SCEVGEP2]] = getelementptr i8, i8* [[LSR_IV]], i32 -1
103+ ; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[SCEVGEP2]], null
96104; CHECK-NEXT: br i1 [[TMP100]], label [[UNWIND_OUT:%.*]], label [[ITER]]
97105; CHECK: iter:
98106; CHECK-NEXT: br i1 true, label [[UNWIND_OUT]], label [[LOOP_BODY]]
@@ -138,6 +146,7 @@ define void @h() personality i32 (...)* @_except_handler3 {
138146; CHECK-NEXT: entry:
139147; CHECK-NEXT: br label [[THROW:%.*]]
140148; CHECK: throw:
149+ ; CHECK-NEXT: [[TMP96:%.*]] = getelementptr inbounds i8, i8* undef, i32 1
141150; CHECK-NEXT: invoke void @reserve()
142151; CHECK-NEXT: to label [[THROW]] unwind label [[PAD:%.*]]
143152; CHECK: pad:
@@ -146,17 +155,20 @@ define void @h() personality i32 (...)* @_except_handler3 {
146155; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS]] []
147156; CHECK-NEXT: unreachable
148157; CHECK: blug:
158+ ; CHECK-NEXT: [[PHI2:%.*]] = phi i8* [ [[TMP96]], [[PAD]] ]
149159; CHECK-NEXT: [[CATCHPAD:%.*]] = catchpad within [[CS]] []
160+ ; CHECK-NEXT: [[PHI21:%.*]] = ptrtoint i8* [[PHI2]] to i32
161+ ; CHECK-NEXT: [[TMP1:%.*]] = sub i32 1, [[PHI21]]
162+ ; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, i8* undef, i32 [[TMP1]]
150163; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
151164; CHECK: unwind_out:
152165; CHECK-NEXT: catchret from [[CATCHPAD]] to label [[LEAVE:%.*]]
153166; CHECK: leave:
154167; CHECK-NEXT: ret void
155168; CHECK: loop_body:
156- ; CHECK-NEXT: [[LSR_IV:%.*]] = phi i32 [ [[LSR_IV_NEXT:%.*]], [[ITER:%.*]] ], [ 0, [[BLUG:%.*]] ]
157- ; CHECK-NEXT: [[LSR_IV_NEXT]] = add nuw nsw i32 [[LSR_IV]], -1
158- ; CHECK-NEXT: [[LSR_IV_NEXT1:%.*]] = inttoptr i32 [[LSR_IV_NEXT]] to i8*
159- ; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[LSR_IV_NEXT1]], null
169+ ; CHECK-NEXT: [[LSR_IV:%.*]] = phi i8* [ [[SCEVGEP2:%.*]], [[ITER:%.*]] ], [ [[SCEVGEP]], [[BLUG:%.*]] ]
170+ ; CHECK-NEXT: [[SCEVGEP2]] = getelementptr i8, i8* [[LSR_IV]], i32 -1
171+ ; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[SCEVGEP2]], null
160172; CHECK-NEXT: br i1 [[TMP100]], label [[UNWIND_OUT:%.*]], label [[ITER]]
161173; CHECK: iter:
162174; CHECK-NEXT: br i1 true, label [[UNWIND_OUT]], label [[LOOP_BODY]]
@@ -202,9 +214,11 @@ define void @i() personality i32 (...)* @_except_handler3 {
202214; CHECK-NEXT: entry:
203215; CHECK-NEXT: br label [[THROW:%.*]]
204216; CHECK: throw:
217+ ; CHECK-NEXT: [[TMP96:%.*]] = getelementptr inbounds i8, i8* undef, i32 1
205218; CHECK-NEXT: invoke void @reserve()
206219; CHECK-NEXT: to label [[THROW]] unwind label [[CATCHPAD:%.*]]
207220; CHECK: catchpad:
221+ ; CHECK-NEXT: [[PHI2:%.*]] = phi i8* [ [[TMP96]], [[THROW]] ]
208222; CHECK-NEXT: [[CS:%.*]] = catchswitch within none [label %cp_body] unwind label [[CLEANUPPAD:%.*]]
209223; CHECK: cp_body:
210224; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS]] []
@@ -213,12 +227,14 @@ define void @i() personality i32 (...)* @_except_handler3 {
213227; CHECK-NEXT: [[TMP1:%.*]] = cleanuppad within none []
214228; CHECK-NEXT: br label [[LOOP_HEAD]]
215229; CHECK: loop_head:
230+ ; CHECK-NEXT: [[PHI21:%.*]] = ptrtoint i8* [[PHI2]] to i32
231+ ; CHECK-NEXT: [[TMP2:%.*]] = sub i32 1, [[PHI21]]
232+ ; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, i8* undef, i32 [[TMP2]]
216233; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
217234; CHECK: loop_body:
218- ; CHECK-NEXT: [[LSR_IV:%.*]] = phi i32 [ [[LSR_IV_NEXT:%.*]], [[ITER:%.*]] ], [ 0, [[LOOP_HEAD]] ]
219- ; CHECK-NEXT: [[LSR_IV_NEXT]] = add nuw nsw i32 [[LSR_IV]], -1
220- ; CHECK-NEXT: [[LSR_IV_NEXT1:%.*]] = inttoptr i32 [[LSR_IV_NEXT]] to i8*
221- ; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[LSR_IV_NEXT1]], null
235+ ; CHECK-NEXT: [[LSR_IV:%.*]] = phi i8* [ [[SCEVGEP2:%.*]], [[ITER:%.*]] ], [ [[SCEVGEP]], [[LOOP_HEAD]] ]
236+ ; CHECK-NEXT: [[SCEVGEP2]] = getelementptr i8, i8* [[LSR_IV]], i32 -1
237+ ; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[SCEVGEP2]], null
222238; CHECK-NEXT: br i1 [[TMP100]], label [[UNWIND_OUT:%.*]], label [[ITER]]
223239; CHECK: iter:
224240; CHECK-NEXT: br i1 true, label [[UNWIND_OUT]], label [[LOOP_BODY]]
0 commit comments