[llvm] r339500 - [UnJ] Create a hasInvariantIterationCount function. NFC
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 13 10:37:29 PDT 2018
This API needs some revisions. The current description/naming leaves
open the following questions:
1. What is returned for a single loop which has no statically known
exit count?
2. In the case of a 3-deep nest, which parent loop is considered?
Possible naming suggestions:
hasIterationCountInvariantInParent
hasIterationCountInvariantInNest
On 08/10/2018 11:57 PM, David Green via llvm-commits wrote:
> Author: dmgreen
> Date: Fri Aug 10 23:57:28 2018
> New Revision: 339500
>
> URL: http://llvm.org/viewvc/llvm-project?rev=339500&view=rev
> Log:
> [UnJ] Create a hasInvariantIterationCount function. NFC
>
> Pulled out a separate function for some code that calculates
> if an inner loop iteration count is invariant to it's outer
> loop.
>
> Differential Revision: https://reviews.llvm.org/D50063
>
> Modified:
> llvm/trunk/include/llvm/Transforms/Utils/LoopUtils.h
> llvm/trunk/lib/Transforms/Utils/LoopUnrollAndJam.cpp
> llvm/trunk/lib/Transforms/Utils/LoopUtils.cpp
>
> Modified: llvm/trunk/include/llvm/Transforms/Utils/LoopUtils.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/LoopUtils.h?rev=339500&r1=339499&r2=339500&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Utils/LoopUtils.h (original)
> +++ llvm/trunk/include/llvm/Transforms/Utils/LoopUtils.h Fri Aug 10 23:57:28 2018
> @@ -490,6 +490,10 @@ void addStringMetadataToLoop(Loop *TheLo
> /// estimate can not be made.
> Optional<unsigned> getLoopEstimatedTripCount(Loop *L);
>
> +/// Check inner loop (L) backedge count is known to be invariant on all iterations
> +/// of its outer loop. If the loop has no parent, this is trivially true.
> +bool hasInvariantIterationCount(Loop *L, ScalarEvolution &SE);
> +
> /// Helper to consistently add the set of standard passes to a loop pass's \c
> /// AnalysisUsage.
> ///
>
> Modified: llvm/trunk/lib/Transforms/Utils/LoopUnrollAndJam.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LoopUnrollAndJam.cpp?rev=339500&r1=339499&r2=339500&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/LoopUnrollAndJam.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/LoopUnrollAndJam.cpp Fri Aug 10 23:57:28 2018
> @@ -754,20 +754,7 @@ bool llvm::isSafeToUnrollAndJam(Loop *L,
>
> // Check inner loop backedge count is consistent on all iterations of the
> // outer loop
> - auto CheckInnerLoopIterationCountInvariant = [](Loop *SubLoop, Loop *OuterL,
> - ScalarEvolution &SE) {
> - BasicBlock *SubLoopLatch = SubLoop->getLoopLatch();
> - const SCEV *SubLoopBECountSC = SE.getExitCount(SubLoop, SubLoopLatch);
> - if (isa<SCEVCouldNotCompute>(SubLoopBECountSC) ||
> - !SubLoopBECountSC->getType()->isIntegerTy())
> - return false;
> - ScalarEvolution::LoopDisposition LD =
> - SE.getLoopDisposition(SubLoopBECountSC, OuterL);
> - if (LD != ScalarEvolution::LoopInvariant)
> - return false;
> - return true;
> - };
> - if (!CheckInnerLoopIterationCountInvariant(SubLoop, L, SE)) {
> + if (!hasInvariantIterationCount(SubLoop, SE)) {
> LLVM_DEBUG(dbgs() << "Won't unroll-and-jam; Inner loop iteration count is "
> "not consistent on each iteration\n");
> return false;
>
> Modified: llvm/trunk/lib/Transforms/Utils/LoopUtils.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LoopUtils.cpp?rev=339500&r1=339499&r2=339500&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/LoopUtils.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/LoopUtils.cpp Fri Aug 10 23:57:28 2018
> @@ -1521,6 +1521,28 @@ Optional<unsigned> llvm::getLoopEstimate
> return (FalseVal + (TrueVal / 2)) / TrueVal;
> }
>
> +bool llvm::hasInvariantIterationCount(Loop *InnerLoop,
> + ScalarEvolution &SE) {
> + Loop *OuterL = InnerLoop->getParentLoop();
> + if (!OuterL)
> + return true;
> +
> + // Get the backedge taken count for the inner loop
> + BasicBlock *InnerLoopLatch = InnerLoop->getLoopLatch();
> + const SCEV *InnerLoopBECountSC = SE.getExitCount(InnerLoop, InnerLoopLatch);
> + if (isa<SCEVCouldNotCompute>(InnerLoopBECountSC) ||
> + !InnerLoopBECountSC->getType()->isIntegerTy())
> + return false;
> +
> + // Get whether count is invariant to the outer loop
> + ScalarEvolution::LoopDisposition LD =
> + SE.getLoopDisposition(InnerLoopBECountSC, OuterL);
> + if (LD != ScalarEvolution::LoopInvariant)
> + return false;
> +
> + return true;
> +}
> +
> /// Adds a 'fast' flag to floating point operations.
> static Value *addFastMathFlag(Value *V) {
> if (isa<FPMathOperator>(V)) {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180813/5f16fcf6/attachment.html>
More information about the llvm-commits
mailing list