@@ -180,4 +180,121 @@ cleanup2343.loopexit4: ; preds = %cleanup1491
180
180
unreachable
181
181
}
182
182
183
+ ; This segfaults due to recursion in %C4. Reason: %L6 is identified to be a
184
+ ; "partially redundant load" and is replaced by a PHI node. The PHI node is then
185
+ ; simplified to be constant and is removed. This leads to %L6 being replaced by
186
+ ; %C4, which makes %C4 invalid since it uses %L6.
187
+ ; The test case has been generated by the AMD Fuzzing project and simplified
188
+ ; manually and by llvm-reduce.
189
+
190
+ define i32 @constant_phi_leads_to_self_reference (ptr %ptr ) {
191
+ ; CHECK-LABEL: @constant_phi_leads_to_self_reference(
192
+ ; CHECK-NEXT: [[A9:%.*]] = alloca i1, align 1
193
+ ; CHECK-NEXT: br label [[F6:%.*]]
194
+ ; CHECK: T3:
195
+ ; CHECK-NEXT: br label [[BB5:%.*]]
196
+ ; CHECK: BB5:
197
+ ; CHECK-NEXT: [[L10:%.*]] = load i1, ptr [[A9]], align 1
198
+ ; CHECK-NEXT: br i1 [[L10]], label [[BB6:%.*]], label [[F6]]
199
+ ; CHECK: BB6:
200
+ ; CHECK-NEXT: [[LGV3:%.*]] = load i1, ptr [[PTR:%.*]], align 1
201
+ ; CHECK-NEXT: [[C4:%.*]] = icmp sle i1 [[C4]], true
202
+ ; CHECK-NEXT: store i1 [[C4]], ptr [[PTR]], align 1
203
+ ; CHECK-NEXT: br i1 [[C4]], label [[F6]], label [[T3:%.*]]
204
+ ; CHECK: F6:
205
+ ; CHECK-NEXT: ret i32 0
206
+ ; CHECK: F7:
207
+ ; CHECK-NEXT: br label [[BB5]]
208
+ ;
209
+ %A9 = alloca i1 , align 1
210
+ br i1 false , label %BB4 , label %F6
211
+
212
+ BB4: ; preds = %0
213
+ br i1 false , label %F6 , label %F1
214
+
215
+ F1: ; preds = %BB4
216
+ br i1 false , label %T4 , label %T3
217
+
218
+ T3: ; preds = %T4, %BB6, %F1
219
+ %L6 = load i1 , ptr %ptr , align 1
220
+ br label %BB5
221
+
222
+ BB5: ; preds = %F7, %T3
223
+ %L10 = load i1 , ptr %A9 , align 1
224
+ br i1 %L10 , label %BB6 , label %F6
225
+
226
+ BB6: ; preds = %BB5
227
+ %LGV3 = load i1 , ptr %ptr , align 1
228
+ %C4 = icmp sle i1 %L6 , true
229
+ store i1 %C4 , ptr %ptr , align 1
230
+ br i1 %L6 , label %F6 , label %T3
231
+
232
+ T4: ; preds = %F1
233
+ br label %T3
234
+
235
+ F6: ; preds = %BB6, %BB5, %BB4, %0
236
+ ret i32 0
237
+
238
+ F7: ; No predecessors!
239
+ br label %BB5
240
+ }
241
+
242
+ ; Same as above, but with multiple icmps referencing the same PHI node.
243
+
244
+ define i32 @recursive_icmp_mult (ptr %ptr ) {
245
+ ; CHECK-LABEL: @recursive_icmp_mult(
246
+ ; CHECK-NEXT: [[A9:%.*]] = alloca i1, align 1
247
+ ; CHECK-NEXT: br label [[F6:%.*]]
248
+ ; CHECK: T3:
249
+ ; CHECK-NEXT: br label [[BB5:%.*]]
250
+ ; CHECK: BB5:
251
+ ; CHECK-NEXT: [[L10:%.*]] = load i1, ptr [[A9]], align 1
252
+ ; CHECK-NEXT: br i1 [[L10]], label [[BB6:%.*]], label [[F6]]
253
+ ; CHECK: BB6:
254
+ ; CHECK-NEXT: [[LGV3:%.*]] = load i1, ptr [[PTR:%.*]], align 1
255
+ ; CHECK-NEXT: [[C4:%.*]] = icmp sle i1 [[C6:%.*]], true
256
+ ; CHECK-NEXT: [[C5:%.*]] = icmp sle i1 [[C6]], false
257
+ ; CHECK-NEXT: [[C6]] = icmp sle i1 [[C4]], [[C5]]
258
+ ; CHECK-NEXT: store i1 [[C6]], ptr [[PTR]], align 1
259
+ ; CHECK-NEXT: br i1 [[C6]], label [[F6]], label [[T3:%.*]]
260
+ ; CHECK: F6:
261
+ ; CHECK-NEXT: ret i32 0
262
+ ; CHECK: F7:
263
+ ; CHECK-NEXT: br label [[BB5]]
264
+ ;
265
+ %A9 = alloca i1 , align 1
266
+ br i1 false , label %BB4 , label %F6
267
+
268
+ BB4: ; preds = %0
269
+ br i1 false , label %F6 , label %F1
270
+
271
+ F1: ; preds = %BB4
272
+ br i1 false , label %T4 , label %T3
273
+
274
+ T3: ; preds = %T4, %BB6, %F1
275
+ %L6 = load i1 , ptr %ptr , align 1
276
+ br label %BB5
277
+
278
+ BB5: ; preds = %F7, %T3
279
+ %L10 = load i1 , ptr %A9 , align 1
280
+ br i1 %L10 , label %BB6 , label %F6
281
+
282
+ BB6: ; preds = %BB5
283
+ %LGV3 = load i1 , ptr %ptr , align 1
284
+ %C4 = icmp sle i1 %L6 , true
285
+ %C5 = icmp sle i1 %L6 , false
286
+ %C6 = icmp sle i1 %C4 , %C5
287
+ store i1 %C6 , ptr %ptr , align 1
288
+ br i1 %L6 , label %F6 , label %T3
289
+
290
+ T4: ; preds = %F1
291
+ br label %T3
292
+
293
+ F6: ; preds = %BB6, %BB5, %BB4, %0
294
+ ret i32 0
295
+
296
+ F7: ; No predecessors!
297
+ br label %BB5
298
+ }
299
+
183
300
!0 = !{!"branch_weights" , i32 2146410443 , i32 1073205 }
0 commit comments