[llvm] r233447 - [SCEV] Look at backedge dominating conditions.

Daniel Jasper djasper at google.com
Mon Mar 30 10:48:31 PDT 2015


Hi, Evgeniy, Alexey,

do you have an idea what might be going wrong here?

Cheers,
Daniel

On Mon, Mar 30, 2015 at 11:33 AM, Daniel Jasper <djasper at google.com> wrote:

> 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/d5186698/attachment.html>


More information about the llvm-commits mailing list