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

Evgeniy Stepanov eugenis at google.com
Mon Mar 30 11:37:10 PDT 2015


Well, MSan adds a lot of new control flow, some of which must be
triggering bad behavior in this patch.
Do you have an sample IR?

On Mon, Mar 30, 2015 at 8:48 PM, Daniel Jasper <djasper at google.com> wrote:
> 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
>>
>>
>



More information about the llvm-commits mailing list