[llvm] r296898 - [LoopUnrolling] Peel loops with invariant backedge Phi input

Yung, Douglas via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 7 17:19:50 PST 2017


Hi Max,

This change is causing an assertion failure in one of our tests. I have put the details in PR32178, can you take a look at it?

Douglas Yung

> -----Original Message-----
> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On Behalf Of
> Sanjoy Das via llvm-commits
> Sent: Friday, March 03, 2017 10:19
> To: llvm-commits at lists.llvm.org
> Subject: [llvm] r296898 - [LoopUnrolling] Peel loops with invariant backedge
> Phi input
> 
> Author: sanjoy
> Date: Fri Mar  3 12:19:15 2017
> New Revision: 296898
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=296898&view=rev
> Log:
> [LoopUnrolling] Peel loops with invariant backedge Phi input
> 
> Summary:
> If a loop contains a Phi node which has an invariant input from back edge, it
> is profitable to peel such loops (rather than unroll them) to use the
> advantage that this Phi is always invariant starting from 2nd iteration. After
> the 1st iteration is peeled, other optimizations can potentially simplify
> calculations with this invariant.
> 
> Patch by Max Kazantsev!
> 
> Reviewers: sanjoy, apilipenko, igor-laevsky, anna, mkuper, reames
> 
> Reviewed By: mkuper
> 
> Subscribers: mkuper, mzolotukhin, llvm-commits
> 
> Differential Revision: https://reviews.llvm.org/D30161
> 
> Added:
>     llvm/trunk/test/Transforms/LoopUnroll/peel-loop-not-forced.ll
> Modified:
>     llvm/trunk/lib/Transforms/Utils/LoopUnrollPeel.cpp
> 
> Modified: llvm/trunk/lib/Transforms/Utils/LoopUnrollPeel.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/Transforms/Utils/LoopUnrollPeel.cpp?rev=296898&r1=29689
> 7&r2=296898&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/LoopUnrollPeel.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/LoopUnrollPeel.cpp Fri Mar  3
> +++ 12:19:15 2017
> @@ -71,6 +71,31 @@ void llvm::computePeelCount(Loop *L, uns
>    if (!L->empty())
>      return;
> 
> +  // Try to find a Phi node that has the same loop invariant as an
> + input from  // its only back edge. If there is such Phi, peeling 1
> + iteration from the  // loop is profitable, because starting from 2nd
> + iteration we will have an  // invariant instead of this Phi.
> +  if (auto *BackEdge = L->getLoopLatch()) {
> +    BasicBlock *Header = L->getHeader();
> +    // Iterate over Phis to find one with invariant input on back edge.
> +    bool FoundCandidate = false;
> +    PHINode *Phi;
> +    for (auto BI = Header->begin(); Phi = dyn_cast<PHINode>(&*BI); ++BI) {
> +      Value *Input = Phi->getIncomingValueForBlock(BackEdge);
> +      if (L->isLoopInvariant(Input)) {
> +        FoundCandidate = true;
> +        break;
> +      }
> +    }
> +    if (FoundCandidate) {
> +      DEBUG(dbgs() << "Peel one iteration to get rid of " << *Phi
> +                   << " because starting from 2nd iteration it is always"
> +                   << " an invariant\n");
> +      UP.PeelCount = 1;
> +      return;
> +    }
> +  }
> +
>    // Bail if we know the statically calculated trip count.
>    // In this case we rather prefer partial unrolling.
>    if (TripCount)
> 
> Added: llvm/trunk/test/Transforms/LoopUnroll/peel-loop-not-forced.ll
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/Transforms/LoopUnroll/peel-loop-not-
> forced.ll?rev=296898&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/LoopUnroll/peel-loop-not-forced.ll (added)
> +++ llvm/trunk/test/Transforms/LoopUnroll/peel-loop-not-forced.ll Fri
> +++ Mar  3 12:19:15 2017
> @@ -0,0 +1,25 @@
> +; RUN: opt < %s -S -loop-unroll | FileCheck %s
> +
> +define i32 @invariant_backedge_1(i32 %a, i32 %b) { ; CHECK-LABEL:
> + at invariant_backedge_1
> +; CHECK-NOT:     %plus = phi
> +; CHECK:       loop.peel:
> +; CHECK:       loop:
> +; CHECK:         %i = phi
> +; CHECK:         %sum = phi
> +entry:
> +  br label %loop
> +
> +loop:
> +  %i = phi i32 [ 0, %entry ], [ %inc, %loop ]
> +  %sum = phi i32 [ 0, %entry ], [ %incsum, %loop ]
> +  %plus = phi i32 [ %a, %entry ], [ %b, %loop ]
> +
> +  %incsum = add i32 %sum, %plus
> +  %inc = add i32 %i, 1
> +  %cmp = icmp slt i32 %i, 1000
> +  br i1 %cmp, label %loop, label %exit
> +
> +exit:
> +  ret i32 %sum
> +}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list