[llvm] 248e430 - precommit test for D109845/D106852
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 15 12:54:02 PDT 2021
Author: Philip Reames
Date: 2021-09-15T12:53:55-07:00
New Revision: 248e430f37c8486e526147c5e6b8cbda1e633467
URL: https://github.com/llvm/llvm-project/commit/248e430f37c8486e526147c5e6b8cbda1e633467
DIFF: https://github.com/llvm/llvm-project/commit/248e430f37c8486e526147c5e6b8cbda1e633467.diff
LOG: precommit test for D109845/D106852
Added:
Modified:
llvm/test/Analysis/ScalarEvolution/no-wrap-add-exprs.ll
Removed:
################################################################################
diff --git a/llvm/test/Analysis/ScalarEvolution/no-wrap-add-exprs.ll b/llvm/test/Analysis/ScalarEvolution/no-wrap-add-exprs.ll
index cf4f66163030..6b24a641c17b 100644
--- a/llvm/test/Analysis/ScalarEvolution/no-wrap-add-exprs.ll
+++ b/llvm/test/Analysis/ScalarEvolution/no-wrap-add-exprs.ll
@@ -284,3 +284,81 @@ define void @f3(i8* %x_addr, i8* %y_addr, i32* %tmp_addr) {
ret void
}
+
+
+; The next two tests demonstrate that (at the time of being written), SCEV
+; will incorrectly propagate flags from an add in one scope to an add in
+; another scope. Note as well that the results are visit order dependent
+; and (as shown in the _b variant) the printer frequently makes the actual
+; bug very hard to see.
+define i1 @test2_a(i32 %a, i32 %b, i1 %will_overflow) {
+; CHECK-LABEL: 'test2_a'
+; CHECK-NEXT: Classifying expressions for: @test2_a
+; CHECK-NEXT: %iv = phi i32 [ %a, %entry ], [ %iv.next, %loop ]
+; CHECK-NEXT: --> {%a,+,%b}<nuw><nsw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
+; CHECK-NEXT: %iv.next = add nuw nsw i32 %iv, %b
+; CHECK-NEXT: --> {(%a + %b)<nuw><nsw>,+,%b}<nuw><nsw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
+; CHECK-NEXT: %trap = udiv i32 %a, %iv.next
+; CHECK-NEXT: --> (%a /u {(%a + %b)<nuw><nsw>,+,%b}<nuw><nsw><%loop>) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
+; CHECK-NEXT: %c = add i32 %a, %b
+; CHECK-NEXT: --> (%a + %b)<nuw><nsw> U: full-set S: full-set
+; CHECK-NEXT: Determining loop execution counts for: @test2_a
+; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
+; CHECK-NEXT: Loop %loop: Unpredictable max backedge-taken count.
+; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
+;
+entry:
+ br i1 %will_overflow, label %exit1, label %loop
+
+loop:
+ %iv = phi i32 [%a, %entry], [%iv.next, %loop]
+ %iv.next = add nuw nsw i32 %iv, %b
+ %trap = udiv i32 %a, %iv.next ;; Use to force poison -> UB
+ %ret2 = icmp ult i32 %iv.next, %a
+ ; Note: backedge is unreachable here
+ br i1 %ret2, label %loop, label %exit2
+
+exit2:
+ ret i1 false
+
+exit1:
+ %c = add i32 %a, %b
+ %ret1 = icmp ult i32 %c, %a
+ ret i1 false
+}
+
+define i1 @test2_b(i32 %a, i32 %b, i1 %will_overflow) {
+; CHECK-LABEL: 'test2_b'
+; CHECK-NEXT: Classifying expressions for: @test2_b
+; CHECK-NEXT: %c = add i32 %a, %b
+; CHECK-NEXT: --> (%a + %b) U: full-set S: full-set
+; CHECK-NEXT: %iv = phi i32 [ %a, %entry ], [ %iv.next, %loop ]
+; CHECK-NEXT: --> {%a,+,%b}<nuw><nsw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
+; CHECK-NEXT: %iv.next = add nuw nsw i32 %iv, %b
+; CHECK-NEXT: --> {(%a + %b)<nuw><nsw>,+,%b}<nuw><nsw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
+; CHECK-NEXT: %trap = udiv i32 %a, %iv.next
+; CHECK-NEXT: --> (%a /u {(%a + %b)<nuw><nsw>,+,%b}<nuw><nsw><%loop>) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
+; CHECK-NEXT: Determining loop execution counts for: @test2_b
+; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
+; CHECK-NEXT: Loop %loop: Unpredictable max backedge-taken count.
+; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count.
+;
+entry:
+ br i1 %will_overflow, label %exit1, label %loop
+
+exit1:
+ %c = add i32 %a, %b
+ %ret1 = icmp ult i32 %c, %a
+ ret i1 false
+
+loop:
+ %iv = phi i32 [%a, %entry], [%iv.next, %loop]
+ %iv.next = add nuw nsw i32 %iv, %b
+ %trap = udiv i32 %a, %iv.next
+ %ret2 = icmp ult i32 %iv.next, %a
+ ; Note: backedge is unreachable here
+ br i1 %ret2, label %loop, label %exit2
+
+exit2:
+ ret i1 false
+}
More information about the llvm-commits
mailing list