[llvm] r248608 - [SCEV] Teach isLoopBackedgeGuardedByCond to exploit trip counts.
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 25 12:59:57 PDT 2015
Author: sanjoy
Date: Fri Sep 25 14:59:57 2015
New Revision: 248608
URL: http://llvm.org/viewvc/llvm-project?rev=248608&view=rev
Log:
[SCEV] Teach isLoopBackedgeGuardedByCond to exploit trip counts.
Summary:
If the trip count of a specific backedge is `N`, then we know that
backedge is effectively guarded by the condition `{0,+,1} u< N`. This
change teaches SCEV to use this condition to prove things in
`isLoopBackedgeGuardedByCond`.
Depends on D12948
Depends on D12949
Reviewers: atrick, reames, majnemer, hfinkel
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D12950
Modified:
llvm/trunk/lib/Analysis/ScalarEvolution.cpp
llvm/trunk/test/Analysis/ScalarEvolution/zext-wrap.ll
llvm/trunk/test/Transforms/IndVarSimplify/eliminate-comparison.ll
Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=248608&r1=248607&r2=248608&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Fri Sep 25 14:59:57 2015
@@ -6994,6 +6994,22 @@ ScalarEvolution::isLoopBackedgeGuardedBy
SaveAndRestore<bool> ClearOnExit(WalkingBEDominatingConds, true);
+ // See if we can exploit a trip count to prove the predicate.
+ const auto &BETakenInfo = getBackedgeTakenInfo(L);
+ const SCEV *LatchBECount = BETakenInfo.getExact(Latch, this);
+ if (LatchBECount != getCouldNotCompute()) {
+ // We know that Latch branches back to the loop header exactly
+ // LatchBECount times. This means the backdege condition at Latch is
+ // equivalent to "{0,+,1} u< LatchBECount".
+ Type *Ty = LatchBECount->getType();
+ auto NoWrapFlags = SCEV::NoWrapFlags(SCEV::FlagNUW | SCEV::FlagNW);
+ const SCEV *LoopCounter =
+ getAddRecExpr(getZero(Ty), getOne(Ty), L, NoWrapFlags);
+ if (isImpliedCond(Pred, LHS, RHS, ICmpInst::ICMP_ULT, LoopCounter,
+ LatchBECount))
+ return true;
+ }
+
// Check conditions due to any @llvm.assume intrinsics.
for (auto &AssumeVH : AC.assumptions()) {
if (!AssumeVH)
Modified: llvm/trunk/test/Analysis/ScalarEvolution/zext-wrap.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/zext-wrap.ll?rev=248608&r1=248607&r2=248608&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/ScalarEvolution/zext-wrap.ll (original)
+++ llvm/trunk/test/Analysis/ScalarEvolution/zext-wrap.ll Fri Sep 25 14:59:57 2015
@@ -10,7 +10,7 @@ bb.i: ; preds = %bb1.i, %bb.np
; This cast shouldn't be folded into the addrec.
; CHECK: %tmp = zext i8 %l_95.0.i1 to i16
-; CHECK: --> (zext i8 {0,+,-1}<%bb.i> to i16){{ U: [^ ]+ S: [^ ]+}}{{ *}}Exits: 2
+; CHECK: --> (zext i8 {0,+,-1}<nw><%bb.i> to i16){{ U: [^ ]+ S: [^ ]+}}{{ *}}Exits: 2
%tmp = zext i8 %l_95.0.i1 to i16
Modified: llvm/trunk/test/Transforms/IndVarSimplify/eliminate-comparison.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IndVarSimplify/eliminate-comparison.ll?rev=248608&r1=248607&r2=248608&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/IndVarSimplify/eliminate-comparison.ll (original)
+++ llvm/trunk/test/Transforms/IndVarSimplify/eliminate-comparison.ll Fri Sep 25 14:59:57 2015
@@ -356,5 +356,42 @@ define void @func_17(i32* %len.ptr) {
ret void
}
-!0 = !{i32 0, i32 2147483647}
+define i1 @func_18(i16* %tmp20, i32* %len.addr) {
+; CHECK-LABEL: @func_18(
+entry:
+ %len = load i32, i32* %len.addr, !range !0
+ %tmp18 = icmp eq i32 %len, 0
+ br i1 %tmp18, label %bb2, label %bb0.preheader
+
+bb0.preheader:
+ br label %bb0
+
+bb0:
+; CHECK: bb0:
+ %var_0.in = phi i32 [ %var_0, %bb1 ], [ %len, %bb0.preheader ]
+ %var_1 = phi i32 [ %tmp30, %bb1 ], [ 0, %bb0.preheader ]
+ %var_0 = add nsw i32 %var_0.in, -1
+ %tmp23 = icmp ult i32 %var_1, %len
+; CHECK: br i1 true, label %stay, label %bb2.loopexit
+ br i1 %tmp23, label %stay, label %bb2
+
+stay:
+; CHECK: stay:
+ %tmp25 = getelementptr inbounds i16, i16* %tmp20, i32 %var_1
+ %tmp26 = load i16, i16* %tmp25
+ %tmp29 = icmp eq i16 %tmp26, 0
+ br i1 %tmp29, label %bb1, label %bb2
+
+bb1:
+ %tmp30 = add i32 %var_1, 1
+ %tmp31 = icmp eq i32 %var_0, 0
+ br i1 %tmp31, label %bb3, label %bb0
+bb2:
+ ret i1 false
+
+bb3:
+ ret i1 true
+}
+
+!0 = !{i32 0, i32 2147483647}
More information about the llvm-commits
mailing list