@@ -15,21 +15,25 @@ define void @f() personality i32 (...)* @_except_handler3 {
15
15
; CHECK-NEXT: entry:
16
16
; CHECK-NEXT: br label [[THROW:%.*]]
17
17
; CHECK: throw:
18
+ ; CHECK-NEXT: [[TMP96:%.*]] = getelementptr inbounds i8, i8* undef, i32 1
18
19
; CHECK-NEXT: invoke void @reserve()
19
20
; CHECK-NEXT: to label [[THROW]] unwind label [[PAD:%.*]]
20
21
; CHECK: pad:
22
+ ; CHECK-NEXT: [[PHI2:%.*]] = phi i8* [ [[TMP96]], [[THROW]] ]
21
23
; CHECK-NEXT: [[CS:%.*]] = catchswitch within none [label %unreachable] unwind label [[BLAH2:%.*]]
22
24
; CHECK: unreachable:
23
25
; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS]] []
24
26
; CHECK-NEXT: unreachable
25
27
; CHECK: blah2:
26
28
; 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]]
27
32
; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
28
33
; 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
33
37
; CHECK-NEXT: br i1 [[TMP100]], label [[UNWIND_OUT:%.*]], label [[ITER]]
34
38
; CHECK: iter:
35
39
; CHECK-NEXT: br i1 true, label [[UNWIND_OUT]], label [[LOOP_BODY]]
@@ -74,25 +78,29 @@ define void @g() personality i32 (...)* @_except_handler3 {
74
78
; CHECK-NEXT: entry:
75
79
; CHECK-NEXT: br label [[THROW:%.*]]
76
80
; CHECK: throw:
81
+ ; CHECK-NEXT: [[TMP96:%.*]] = getelementptr inbounds i8, i8* undef, i32 1
77
82
; CHECK-NEXT: invoke void @reserve()
78
83
; CHECK-NEXT: to label [[THROW]] unwind label [[PAD:%.*]]
79
84
; CHECK: pad:
85
+ ; CHECK-NEXT: [[PHI2:%.*]] = phi i8* [ [[TMP96]], [[THROW]] ]
80
86
; CHECK-NEXT: [[CS:%.*]] = catchswitch within none [label [[UNREACHABLE:%.*]], label %blah] unwind to caller
81
87
; CHECK: unreachable:
82
88
; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS]] []
83
89
; CHECK-NEXT: unreachable
84
90
; CHECK: blah:
85
91
; 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]]
86
95
; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
87
96
; CHECK: unwind_out:
88
97
; CHECK-NEXT: catchret from [[CATCHPAD]] to label [[LEAVE:%.*]]
89
98
; CHECK: leave:
90
99
; CHECK-NEXT: ret void
91
100
; 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
96
104
; CHECK-NEXT: br i1 [[TMP100]], label [[UNWIND_OUT:%.*]], label [[ITER]]
97
105
; CHECK: iter:
98
106
; CHECK-NEXT: br i1 true, label [[UNWIND_OUT]], label [[LOOP_BODY]]
@@ -138,6 +146,7 @@ define void @h() personality i32 (...)* @_except_handler3 {
138
146
; CHECK-NEXT: entry:
139
147
; CHECK-NEXT: br label [[THROW:%.*]]
140
148
; CHECK: throw:
149
+ ; CHECK-NEXT: [[TMP96:%.*]] = getelementptr inbounds i8, i8* undef, i32 1
141
150
; CHECK-NEXT: invoke void @reserve()
142
151
; CHECK-NEXT: to label [[THROW]] unwind label [[PAD:%.*]]
143
152
; CHECK: pad:
@@ -146,17 +155,20 @@ define void @h() personality i32 (...)* @_except_handler3 {
146
155
; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS]] []
147
156
; CHECK-NEXT: unreachable
148
157
; CHECK: blug:
158
+ ; CHECK-NEXT: [[PHI2:%.*]] = phi i8* [ [[TMP96]], [[PAD]] ]
149
159
; 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]]
150
163
; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
151
164
; CHECK: unwind_out:
152
165
; CHECK-NEXT: catchret from [[CATCHPAD]] to label [[LEAVE:%.*]]
153
166
; CHECK: leave:
154
167
; CHECK-NEXT: ret void
155
168
; 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
160
172
; CHECK-NEXT: br i1 [[TMP100]], label [[UNWIND_OUT:%.*]], label [[ITER]]
161
173
; CHECK: iter:
162
174
; CHECK-NEXT: br i1 true, label [[UNWIND_OUT]], label [[LOOP_BODY]]
@@ -202,9 +214,11 @@ define void @i() personality i32 (...)* @_except_handler3 {
202
214
; CHECK-NEXT: entry:
203
215
; CHECK-NEXT: br label [[THROW:%.*]]
204
216
; CHECK: throw:
217
+ ; CHECK-NEXT: [[TMP96:%.*]] = getelementptr inbounds i8, i8* undef, i32 1
205
218
; CHECK-NEXT: invoke void @reserve()
206
219
; CHECK-NEXT: to label [[THROW]] unwind label [[CATCHPAD:%.*]]
207
220
; CHECK: catchpad:
221
+ ; CHECK-NEXT: [[PHI2:%.*]] = phi i8* [ [[TMP96]], [[THROW]] ]
208
222
; CHECK-NEXT: [[CS:%.*]] = catchswitch within none [label %cp_body] unwind label [[CLEANUPPAD:%.*]]
209
223
; CHECK: cp_body:
210
224
; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS]] []
@@ -213,12 +227,14 @@ define void @i() personality i32 (...)* @_except_handler3 {
213
227
; CHECK-NEXT: [[TMP1:%.*]] = cleanuppad within none []
214
228
; CHECK-NEXT: br label [[LOOP_HEAD]]
215
229
; 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]]
216
233
; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
217
234
; 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
222
238
; CHECK-NEXT: br i1 [[TMP100]], label [[UNWIND_OUT:%.*]], label [[ITER]]
223
239
; CHECK: iter:
224
240
; CHECK-NEXT: br i1 true, label [[UNWIND_OUT]], label [[LOOP_BODY]]
0 commit comments