@@ -284,3 +284,81 @@ define void @f3(i8* %x_addr, i8* %y_addr, i32* %tmp_addr) {
284
284
285
285
ret void
286
286
}
287
+
288
+
289
+ ; The next two tests demonstrate that (at the time of being written), SCEV
290
+ ; will incorrectly propagate flags from an add in one scope to an add in
291
+ ; another scope. Note as well that the results are visit order dependent
292
+ ; and (as shown in the _b variant) the printer frequently makes the actual
293
+ ; bug very hard to see.
294
+ define i1 @test2_a (i32 %a , i32 %b , i1 %will_overflow ) {
295
+ ; CHECK-LABEL: 'test2_a'
296
+ ; CHECK-NEXT: Classifying expressions for: @test2_a
297
+ ; CHECK-NEXT: %iv = phi i32 [ %a, %entry ], [ %iv.next, %loop ]
298
+ ; CHECK-NEXT: --> {%a,+,%b}<nuw><nsw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
299
+ ; CHECK-NEXT: %iv.next = add nuw nsw i32 %iv, %b
300
+ ; CHECK-NEXT: --> {(%a + %b)<nuw><nsw>,+,%b}<nuw><nsw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
301
+ ; CHECK-NEXT: %trap = udiv i32 %a, %iv.next
302
+ ; CHECK-NEXT: --> (%a /u {(%a + %b)<nuw><nsw>,+,%b}<nuw><nsw><%loop>) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
303
+ ; CHECK-NEXT: %c = add i32 %a, %b
304
+ ; CHECK-NEXT: --> (%a + %b)<nuw><nsw> U: full-set S: full-set
305
+ ; CHECK-NEXT: Determining loop execution counts for: @test2_a
306
+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
307
+ ; CHECK-NEXT: Loop %loop: Unpredictable max backedge-taken count.
308
+ ; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
309
+ ;
310
+ entry:
311
+ br i1 %will_overflow , label %exit1 , label %loop
312
+
313
+ loop:
314
+ %iv = phi i32 [%a , %entry ], [%iv.next , %loop ]
315
+ %iv.next = add nuw nsw i32 %iv , %b
316
+ %trap = udiv i32 %a , %iv.next ;; Use to force poison -> UB
317
+ %ret2 = icmp ult i32 %iv.next , %a
318
+ ; Note: backedge is unreachable here
319
+ br i1 %ret2 , label %loop , label %exit2
320
+
321
+ exit2:
322
+ ret i1 false
323
+
324
+ exit1:
325
+ %c = add i32 %a , %b
326
+ %ret1 = icmp ult i32 %c , %a
327
+ ret i1 false
328
+ }
329
+
330
+ define i1 @test2_b (i32 %a , i32 %b , i1 %will_overflow ) {
331
+ ; CHECK-LABEL: 'test2_b'
332
+ ; CHECK-NEXT: Classifying expressions for: @test2_b
333
+ ; CHECK-NEXT: %c = add i32 %a, %b
334
+ ; CHECK-NEXT: --> (%a + %b) U: full-set S: full-set
335
+ ; CHECK-NEXT: %iv = phi i32 [ %a, %entry ], [ %iv.next, %loop ]
336
+ ; CHECK-NEXT: --> {%a,+,%b}<nuw><nsw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
337
+ ; CHECK-NEXT: %iv.next = add nuw nsw i32 %iv, %b
338
+ ; CHECK-NEXT: --> {(%a + %b)<nuw><nsw>,+,%b}<nuw><nsw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
339
+ ; CHECK-NEXT: %trap = udiv i32 %a, %iv.next
340
+ ; CHECK-NEXT: --> (%a /u {(%a + %b)<nuw><nsw>,+,%b}<nuw><nsw><%loop>) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
341
+ ; CHECK-NEXT: Determining loop execution counts for: @test2_b
342
+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
343
+ ; CHECK-NEXT: Loop %loop: Unpredictable max backedge-taken count.
344
+ ; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
345
+ ;
346
+ entry:
347
+ br i1 %will_overflow , label %exit1 , label %loop
348
+
349
+ exit1:
350
+ %c = add i32 %a , %b
351
+ %ret1 = icmp ult i32 %c , %a
352
+ ret i1 false
353
+
354
+ loop:
355
+ %iv = phi i32 [%a , %entry ], [%iv.next , %loop ]
356
+ %iv.next = add nuw nsw i32 %iv , %b
357
+ %trap = udiv i32 %a , %iv.next
358
+ %ret2 = icmp ult i32 %iv.next , %a
359
+ ; Note: backedge is unreachable here
360
+ br i1 %ret2 , label %loop , label %exit2
361
+
362
+ exit2:
363
+ ret i1 false
364
+ }
0 commit comments