xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/pr48225.ll (revision 0d38f21e4ab7fe7cebe76a9d7c218ec54dba1e98)
10c101c9cSMax Kazantsev; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
20c101c9cSMax Kazantsev; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s
30c101c9cSMax Kazantsev
40c101c9cSMax Kazantsev; Tests demonstrate the bug reported as PR48225 by Congzhe Cao.
50c101c9cSMax Kazantsev
60c101c9cSMax Kazantsev; When %boolcond = false and %cond = 0:
70c101c9cSMax Kazantsev; - %cond.false.on.first.iter is false on 1st iteration;
80c101c9cSMax Kazantsev; - %cond.false.on.second.iter is false on 2nd iteration;
90c101c9cSMax Kazantsev; - Therefore, their AND is false on first two iterations, and the backedge is taken twice.
10211d9411SMax Kazantsev;  'constant max backedge-taken count is 1' is a bug caused by wrong treatment of AND
110c101c9cSMax Kazantsev;  condition in the computation logic. It should be 2.
120c101c9cSMax Kazantsevdefine void @test_and(i1 %boolcond) {
130c101c9cSMax Kazantsev; CHECK-LABEL: 'test_and'
140c101c9cSMax Kazantsev; CHECK-NEXT:  Classifying expressions for: @test_and
150c101c9cSMax Kazantsev; CHECK-NEXT:    %conv = zext i1 %boolcond to i32
160c101c9cSMax Kazantsev; CHECK-NEXT:    --> (zext i1 %boolcond to i32) U: [0,2) S: [0,2)
170c101c9cSMax Kazantsev; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %inc, %backedge ]
1848d7cc6aSMax Kazantsev; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,3) S: [0,3) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
190c101c9cSMax Kazantsev; CHECK-NEXT:    %or.cond = and i1 %cond.false.on.first.iter, %cond.false.on.second.iter
20503541faSRoman Lebedev; CHECK-NEXT:    --> (%cond.false.on.first.iter umin %cond.false.on.second.iter) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
210c101c9cSMax Kazantsev; CHECK-NEXT:    %inc = add nuw nsw i32 %iv, 1
2248d7cc6aSMax Kazantsev; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,4) S: [1,4) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
230c101c9cSMax Kazantsev; CHECK-NEXT:  Determining loop execution counts for: @test_and
240c101c9cSMax Kazantsev; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
25*0d38f21eSPhilip Reames; CHECK-NEXT:    exit count for loop: i32 2
260c101c9cSMax Kazantsev; CHECK-NEXT:    exit count for backedge: ***COULDNOTCOMPUTE***
277755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 2
28*0d38f21eSPhilip Reames; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is i32 2
29*0d38f21eSPhilip Reames; CHECK-NEXT:    symbolic max exit count for loop: i32 2
30e5fa7eb1SMax Kazantsev; CHECK-NEXT:    symbolic max exit count for backedge: ***COULDNOTCOMPUTE***
310c101c9cSMax Kazantsev;
320c101c9cSMax Kazantseventry:
330c101c9cSMax Kazantsev  %conv = zext i1 %boolcond to i32
340c101c9cSMax Kazantsev  br label %loop
350c101c9cSMax Kazantsev
360c101c9cSMax Kazantsevloop:
370c101c9cSMax Kazantsev  %iv = phi i32 [ 0, %entry ], [ %inc, %backedge ]
380c101c9cSMax Kazantsev  %cmp = icmp ult i32 %iv, 2
390c101c9cSMax Kazantsev  br i1 %cmp, label %backedge, label %for.end
400c101c9cSMax Kazantsev
410c101c9cSMax Kazantsevbackedge:
420c101c9cSMax Kazantsev  %cond.false.on.first.iter = icmp ne i32 %iv, 0
430c101c9cSMax Kazantsev  %cond.false.on.second.iter = icmp eq i32 %iv, %conv
440c101c9cSMax Kazantsev  %or.cond = and i1 %cond.false.on.first.iter, %cond.false.on.second.iter
450c101c9cSMax Kazantsev  %inc = add nuw nsw i32 %iv, 1
460c101c9cSMax Kazantsev  br i1 %or.cond, label %exit, label %loop
470c101c9cSMax Kazantsev
480c101c9cSMax Kazantsevexit:
490c101c9cSMax Kazantsev  unreachable
500c101c9cSMax Kazantsev
510c101c9cSMax Kazantsevfor.end:
520c101c9cSMax Kazantsev  ret void
530c101c9cSMax Kazantsev}
540c101c9cSMax Kazantsev
550c101c9cSMax Kazantsev; When %boolcond = false and %cond = 0:
560c101c9cSMax Kazantsev; - %cond.true.on.first.iter is true on 1st iteration;
570c101c9cSMax Kazantsev; - %cond.true.on.second.iter is true on 2nd iteration;
580c101c9cSMax Kazantsev; - Therefore, their OR is true on first two iterations, and the backedge is taken twice.
59211d9411SMax Kazantsev;  'constant max backedge-taken count is 1' is a bug caused by wrong treatment of OR
600c101c9cSMax Kazantsev;  condition in the computation logic. It should be 2.
610c101c9cSMax Kazantsevdefine void @test_or(i1 %boolcond) {
620c101c9cSMax Kazantsev; CHECK-LABEL: 'test_or'
630c101c9cSMax Kazantsev; CHECK-NEXT:  Classifying expressions for: @test_or
640c101c9cSMax Kazantsev; CHECK-NEXT:    %conv = zext i1 %boolcond to i32
650c101c9cSMax Kazantsev; CHECK-NEXT:    --> (zext i1 %boolcond to i32) U: [0,2) S: [0,2)
660c101c9cSMax Kazantsev; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %inc, %backedge ]
6748d7cc6aSMax Kazantsev; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,3) S: [0,3) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
680c101c9cSMax Kazantsev; CHECK-NEXT:    %or.cond = or i1 %cond.true.on.first.iter, %cond.true.on.second.iter
69e7e0834fSRoman Lebedev; CHECK-NEXT:    --> (%cond.true.on.first.iter umax %cond.true.on.second.iter) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
700c101c9cSMax Kazantsev; CHECK-NEXT:    %inc = add nuw nsw i32 %iv, 1
7148d7cc6aSMax Kazantsev; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,4) S: [1,4) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
720c101c9cSMax Kazantsev; CHECK-NEXT:  Determining loop execution counts for: @test_or
730c101c9cSMax Kazantsev; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.
74*0d38f21eSPhilip Reames; CHECK-NEXT:    exit count for loop: i32 2
750c101c9cSMax Kazantsev; CHECK-NEXT:    exit count for backedge: ***COULDNOTCOMPUTE***
767755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 2
77*0d38f21eSPhilip Reames; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is i32 2
78*0d38f21eSPhilip Reames; CHECK-NEXT:    symbolic max exit count for loop: i32 2
79e5fa7eb1SMax Kazantsev; CHECK-NEXT:    symbolic max exit count for backedge: ***COULDNOTCOMPUTE***
800c101c9cSMax Kazantsev;
810c101c9cSMax Kazantseventry:
820c101c9cSMax Kazantsev  %conv = zext i1 %boolcond to i32
830c101c9cSMax Kazantsev  br label %loop
840c101c9cSMax Kazantsev
850c101c9cSMax Kazantsevloop:
860c101c9cSMax Kazantsev  %iv = phi i32 [ 0, %entry ], [ %inc, %backedge ]
870c101c9cSMax Kazantsev  %cmp = icmp ult i32 %iv, 2
880c101c9cSMax Kazantsev  br i1 %cmp, label %backedge, label %for.end
890c101c9cSMax Kazantsev
900c101c9cSMax Kazantsevbackedge:
910c101c9cSMax Kazantsev  %cond.true.on.first.iter = icmp eq i32 %iv, 0
920c101c9cSMax Kazantsev  %cond.true.on.second.iter = icmp ne i32 %iv, %conv
930c101c9cSMax Kazantsev  %or.cond = or i1 %cond.true.on.first.iter, %cond.true.on.second.iter
940c101c9cSMax Kazantsev  %inc = add nuw nsw i32 %iv, 1
950c101c9cSMax Kazantsev  br i1 %or.cond, label %loop, label %exit
960c101c9cSMax Kazantsev
970c101c9cSMax Kazantsevexit:
980c101c9cSMax Kazantsev  unreachable
990c101c9cSMax Kazantsev
1000c101c9cSMax Kazantsevfor.end:
1010c101c9cSMax Kazantsev  ret void
1020c101c9cSMax Kazantsev}
103