[llvm] r233447 - [SCEV] Look at backedge dominating conditions.
Daniel Jasper
djasper at google.com
Mon Mar 30 02:33:09 PDT 2015
This makes builds under msan incredibly slow. The root cause seems to be
the repeated recursion:
...
llvm::ScalarEvolution::getZeroExtendExpr(llvm::SCEV const*, llvm::Type*) ()
llvm::ScalarEvolution::isImpliedCond(llvm::CmpInst::Predicate, llvm::SCEV
const*, llvm::SCEV const*, llvm::Value*, bool) ()
llvm::ScalarEvolution::isLoopBackedgeGuardedByCond(llvm::Loop const*,
llvm::CmpInst::Predicate, llvm::SCEV const*, llvm::SCEV const*) ()
llvm::ScalarEvolution::getZeroExtendExpr(llvm::SCEV const*, llvm::Type*) ()
llvm::ScalarEvolution::isImpliedCond(llvm::CmpInst::Predicate, llvm::SCEV
const*, llvm::SCEV const*, llvm::Value*, bool) ()
llvm::ScalarEvolution::isLoopBackedgeGuardedByCond(llvm::Loop const*,
llvm::CmpInst::Predicate, llvm::SCEV const*, llvm::SCEV const*) ()
...
I don't understand enough about this or about MSAN to know whether it is
only slow under MSAN or whether MSAN somehow triggers a corner case. I for
now revert this in r233528 until we can properly investigate.
On Sat, Mar 28, 2015 at 12:18 AM, Sanjoy Das <sanjoy at playingwithpointers.com
> wrote:
> Author: sanjoy
> Date: Fri Mar 27 18:18:08 2015
> New Revision: 233447
>
> URL: http://llvm.org/viewvc/llvm-project?rev=233447&view=rev
> Log:
> [SCEV] Look at backedge dominating conditions.
>
> Summary:
> This change teaches ScalarEvolution::isLoopBackedgeGuardedByCond to look
> at edges within the loop body that dominate the latch. We don't do an
> exhaustive search for all possible edges, but only a quick walk up the
> dom tree.
>
> Reviewers: atrick, hfinkel
>
> Subscribers: llvm-commits
>
> Differential Revision: http://reviews.llvm.org/D8627
>
> Added:
> llvm/trunk/test/Analysis/ScalarEvolution/latch-dominating-conditions.ll
> Modified:
> llvm/trunk/lib/Analysis/ScalarEvolution.cpp
>
> Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=233447&r1=233446&r2=233447&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
> +++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Fri Mar 27 18:18:08 2015
> @@ -6686,6 +6686,46 @@ ScalarEvolution::isLoopBackedgeGuardedBy
> LoopContinuePredicate->getSuccessor(0) !=
> L->getHeader()))
> return true;
>
> + // If the loop is not reachable from the entry block, we risk running
> into an
> + // infinite loop as we walk up into the dom tree. These loops do not
> matter
> + // anyway, so we just return a conservative answer when we see them.
> + if (!DT->isReachableFromEntry(L->getHeader()))
> + return false;
> +
> + for (DomTreeNode *DTN = (*DT)[Latch], *HeaderDTN =
> (*DT)[L->getHeader()];
> + DTN != HeaderDTN;
> + DTN = DTN->getIDom()) {
> +
> + assert(DTN && "should reach the loop header before reaching the
> root!");
> +
> + BasicBlock *BB = DTN->getBlock();
> + BasicBlock *PBB = BB->getSinglePredecessor();
> + if (!PBB)
> + continue;
> +
> + BranchInst *ContinuePredicate =
> dyn_cast<BranchInst>(PBB->getTerminator());
> + if (!ContinuePredicate || !ContinuePredicate->isConditional())
> + continue;
> +
> + Value *Condition = ContinuePredicate->getCondition();
> +
> + // If we have an edge `E` within the loop body that dominates the only
> + // latch, the condition guarding `E` also guards the backedge. This
> + // reasoning works only for loops with a single latch.
> +
> + BasicBlockEdge DominatingEdge(PBB, BB);
> + if (DominatingEdge.isSingleEdge()) {
> + // We're constructively (and conservatively) enumerating edges
> within the
> + // loop body that dominate the latch. The dominator tree better
> agree
> + // with us on this:
> + assert(DT->dominates(DominatingEdge, Latch) && "should be!");
> +
> + if (isImpliedCond(Pred, LHS, RHS, Condition,
> + BB != ContinuePredicate->getSuccessor(0)))
> + return true;
> + }
> + }
> +
> // Check conditions due to any @llvm.assume intrinsics.
> for (auto &AssumeVH : AC->assumptions()) {
> if (!AssumeVH)
>
> Added:
> llvm/trunk/test/Analysis/ScalarEvolution/latch-dominating-conditions.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/latch-dominating-conditions.ll?rev=233447&view=auto
>
> ==============================================================================
> ---
> llvm/trunk/test/Analysis/ScalarEvolution/latch-dominating-conditions.ll
> (added)
> +++
> llvm/trunk/test/Analysis/ScalarEvolution/latch-dominating-conditions.ll Fri
> Mar 27 18:18:08 2015
> @@ -0,0 +1,55 @@
> +; RUN: opt -S -indvars < %s | FileCheck %s
> +
> +declare void @side_effect(i1)
> +
> +define void @latch_dominating_0(i8 %start) {
> +; CHECK-LABEL: latch_dominating_0
> + entry:
> + %e = icmp slt i8 %start, 42
> + br i1 %e, label %loop, label %exit
> +
> + loop:
> +; CHECK-LABEL: loop
> + %idx = phi i8 [ %start, %entry ], [ %idx.inc, %be ]
> + %idx.inc = add i8 %idx, 1
> + %folds.to.true = icmp slt i8 %idx, 42
> +; CHECK: call void @side_effect(i1 true)
> + call void @side_effect(i1 %folds.to.true)
> + %c0 = icmp slt i8 %idx.inc, 42
> + br i1 %c0, label %be, label %exit
> +
> + be:
> +; CHECK: call void @side_effect(i1 true)
> + call void @side_effect(i1 %folds.to.true)
> + %c1 = icmp slt i8 %idx.inc, 100
> + br i1 %c1, label %loop, label %exit
> +
> + exit:
> + ret void
> +}
> +
> +define void @latch_dominating_1(i8 %start) {
> +; CHECK-LABEL: latch_dominating_1
> + entry:
> + %e = icmp slt i8 %start, 42
> + br i1 %e, label %loop, label %exit
> +
> + loop:
> +; CHECK-LABEL: loop
> + %idx = phi i8 [ %start, %entry ], [ %idx.inc, %be ]
> + %idx.inc = add i8 %idx, 1
> + %does.not.fold.to.true = icmp slt i8 %idx, 42
> +; CHECK: call void @side_effect(i1 %does.not.fold.to.true)
> + call void @side_effect(i1 %does.not.fold.to.true)
> + %c0 = icmp slt i8 %idx.inc, 42
> + br i1 %c0, label %be, label %be
> +
> + be:
> +; CHECK: call void @side_effect(i1 %does.not.fold.to.true)
> + call void @side_effect(i1 %does.not.fold.to.true)
> + %c1 = icmp slt i8 %idx.inc, 100
> + br i1 %c1, label %loop, label %exit
> +
> + exit:
> + ret void
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150330/92725d9c/attachment.html>
More information about the llvm-commits
mailing list