@@ -15,21 +15,23 @@ 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: [[SCEVGEP:%.*]] = getelementptr i8, i8* [[PHI2]], i32 -1
2730; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
2831; 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
32+ ; CHECK-NEXT: [[LSR_IV:%.*]] = phi i8* [ [[SCEVGEP1:%.*]], [[ITER:%.*]] ], [ [[SCEVGEP]], [[BLAH2]] ]
33+ ; CHECK-NEXT: [[SCEVGEP1]] = getelementptr i8, i8* [[LSR_IV]], i32 1
34+ ; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[SCEVGEP1]], undef
3335; CHECK-NEXT: br i1 [[TMP100]], label [[UNWIND_OUT:%.*]], label [[ITER]]
3436; CHECK: iter:
3537; CHECK-NEXT: br i1 true, label [[UNWIND_OUT]], label [[LOOP_BODY]]
@@ -74,25 +76,27 @@ define void @g() personality i32 (...)* @_except_handler3 {
7476; CHECK-NEXT: entry:
7577; CHECK-NEXT: br label [[THROW:%.*]]
7678; CHECK: throw:
79+ ; CHECK-NEXT: [[TMP96:%.*]] = getelementptr inbounds i8, i8* undef, i32 1
7780; CHECK-NEXT: invoke void @reserve()
7881; CHECK-NEXT: to label [[THROW]] unwind label [[PAD:%.*]]
7982; CHECK: pad:
83+ ; CHECK-NEXT: [[PHI2:%.*]] = phi i8* [ [[TMP96]], [[THROW]] ]
8084; CHECK-NEXT: [[CS:%.*]] = catchswitch within none [label [[UNREACHABLE:%.*]], label %blah] unwind to caller
8185; CHECK: unreachable:
8286; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS]] []
8387; CHECK-NEXT: unreachable
8488; CHECK: blah:
8589; CHECK-NEXT: [[CATCHPAD:%.*]] = catchpad within [[CS]] []
90+ ; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, i8* [[PHI2]], i32 -1
8691; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
8792; CHECK: unwind_out:
8893; CHECK-NEXT: catchret from [[CATCHPAD]] to label [[LEAVE:%.*]]
8994; CHECK: leave:
9095; CHECK-NEXT: ret void
9196; 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
97+ ; CHECK-NEXT: [[LSR_IV:%.*]] = phi i8* [ [[SCEVGEP1:%.*]], [[ITER:%.*]] ], [ [[SCEVGEP]], [[BLAH:%.*]] ]
98+ ; CHECK-NEXT: [[SCEVGEP1]] = getelementptr i8, i8* [[LSR_IV]], i32 1
99+ ; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[SCEVGEP1]], undef
96100; CHECK-NEXT: br i1 [[TMP100]], label [[UNWIND_OUT:%.*]], label [[ITER]]
97101; CHECK: iter:
98102; CHECK-NEXT: br i1 true, label [[UNWIND_OUT]], label [[LOOP_BODY]]
@@ -138,6 +142,7 @@ define void @h() personality i32 (...)* @_except_handler3 {
138142; CHECK-NEXT: entry:
139143; CHECK-NEXT: br label [[THROW:%.*]]
140144; CHECK: throw:
145+ ; CHECK-NEXT: [[TMP96:%.*]] = getelementptr inbounds i8, i8* undef, i32 1
141146; CHECK-NEXT: invoke void @reserve()
142147; CHECK-NEXT: to label [[THROW]] unwind label [[PAD:%.*]]
143148; CHECK: pad:
@@ -146,17 +151,18 @@ define void @h() personality i32 (...)* @_except_handler3 {
146151; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS]] []
147152; CHECK-NEXT: unreachable
148153; CHECK: blug:
154+ ; CHECK-NEXT: [[PHI2:%.*]] = phi i8* [ [[TMP96]], [[PAD]] ]
149155; CHECK-NEXT: [[CATCHPAD:%.*]] = catchpad within [[CS]] []
156+ ; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, i8* [[PHI2]], i32 -1
150157; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
151158; CHECK: unwind_out:
152159; CHECK-NEXT: catchret from [[CATCHPAD]] to label [[LEAVE:%.*]]
153160; CHECK: leave:
154161; CHECK-NEXT: ret void
155162; 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
163+ ; CHECK-NEXT: [[LSR_IV:%.*]] = phi i8* [ [[SCEVGEP1:%.*]], [[ITER:%.*]] ], [ [[SCEVGEP]], [[BLUG:%.*]] ]
164+ ; CHECK-NEXT: [[SCEVGEP1]] = getelementptr i8, i8* [[LSR_IV]], i32 1
165+ ; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[SCEVGEP1]], undef
160166; CHECK-NEXT: br i1 [[TMP100]], label [[UNWIND_OUT:%.*]], label [[ITER]]
161167; CHECK: iter:
162168; CHECK-NEXT: br i1 true, label [[UNWIND_OUT]], label [[LOOP_BODY]]
@@ -202,9 +208,11 @@ define void @i() personality i32 (...)* @_except_handler3 {
202208; CHECK-NEXT: entry:
203209; CHECK-NEXT: br label [[THROW:%.*]]
204210; CHECK: throw:
211+ ; CHECK-NEXT: [[TMP96:%.*]] = getelementptr inbounds i8, i8* undef, i32 1
205212; CHECK-NEXT: invoke void @reserve()
206213; CHECK-NEXT: to label [[THROW]] unwind label [[CATCHPAD:%.*]]
207214; CHECK: catchpad:
215+ ; CHECK-NEXT: [[PHI2:%.*]] = phi i8* [ [[TMP96]], [[THROW]] ]
208216; CHECK-NEXT: [[CS:%.*]] = catchswitch within none [label %cp_body] unwind label [[CLEANUPPAD:%.*]]
209217; CHECK: cp_body:
210218; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS]] []
@@ -213,12 +221,12 @@ define void @i() personality i32 (...)* @_except_handler3 {
213221; CHECK-NEXT: [[TMP1:%.*]] = cleanuppad within none []
214222; CHECK-NEXT: br label [[LOOP_HEAD]]
215223; CHECK: loop_head:
224+ ; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, i8* [[PHI2]], i32 -1
216225; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
217226; 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
227+ ; CHECK-NEXT: [[LSR_IV:%.*]] = phi i8* [ [[SCEVGEP1:%.*]], [[ITER:%.*]] ], [ [[SCEVGEP]], [[LOOP_HEAD]] ]
228+ ; CHECK-NEXT: [[SCEVGEP1]] = getelementptr i8, i8* [[LSR_IV]], i32 1
229+ ; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[SCEVGEP1]], undef
222230; CHECK-NEXT: br i1 [[TMP100]], label [[UNWIND_OUT:%.*]], label [[ITER]]
223231; CHECK: iter:
224232; CHECK-NEXT: br i1 true, label [[UNWIND_OUT]], label [[LOOP_BODY]]
0 commit comments