[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