[llvm-commits] [llvm] r129449 - in /llvm/trunk: include/llvm/Transforms/Scalar.h lib/Transforms/Scalar/LoopUnrollPass.cpp

Eli Friedman eli.friedman at gmail.com
Wed Apr 13 09:24:11 PDT 2011


On Wed, Apr 13, 2011 at 9:15 AM, Junjie Gu <jgu222 at gmail.com> wrote:
> Author: jugu
> Date: Wed Apr 13 11:15:29 2011
> New Revision: 129449
>
> URL: http://llvm.org/viewvc/llvm-project?rev=129449&view=rev
> Log:
> Passing unroll parameters (unroll-count, threshold, and partial unroll) via LoopUnroll class's ctor. Doing so
> will allow multiple context with different loop unroll parameters to run.  This is a minor change and no effect
> on existing application.
>
>
> Modified:
>    llvm/trunk/include/llvm/Transforms/Scalar.h
>    llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp
>
> Modified: llvm/trunk/include/llvm/Transforms/Scalar.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar.h?rev=129449&r1=129448&r2=129449&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Scalar.h (original)
> +++ llvm/trunk/include/llvm/Transforms/Scalar.h Wed Apr 13 11:15:29 2011
> @@ -128,7 +128,7 @@
>  //
>  // LoopUnroll - This pass is a simple loop unrolling pass.
>  //
> -Pass *createLoopUnrollPass();
> +Pass *createLoopUnrollPass(int Threshold = -1, int Count = -1, int AllowPartial = -1);
>
>  //===----------------------------------------------------------------------===//
>  //
>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp?rev=129449&r1=129448&r2=129449&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp Wed Apr 13 11:15:29 2011
> @@ -43,7 +43,13 @@
>   class LoopUnroll : public LoopPass {
>   public:
>     static char ID; // Pass ID, replacement for typeid
> -    LoopUnroll() : LoopPass(ID) {
> +    LoopUnroll(int T = -1, int C = -1,  int P = -1) : LoopPass(ID) {
> +      CurrentThreshold = (T == -1) ? UnrollThreshold : T;
> +      CurrentCount = (C == -1) ? UnrollCount : C;
> +      CurrentAllowPartial = (P == -1) ? UnrollAllowPartial : (bool)P;
> +
> +      UserThreshold = (T != -1) || (UnrollThreshold.getNumOccurrences() > 0);
> +
>       initializeLoopUnrollPass(*PassRegistry::getPassRegistry());
>     }
>
> @@ -56,7 +62,10 @@
>     // explicit -unroll-threshold).
>     static const unsigned OptSizeUnrollThreshold = 50;
>
> +    unsigned CurrentCount;
>     unsigned CurrentThreshold;
> +    bool     CurrentAllowPartial;
> +    bool     UserThreshold;        // CurrentThreshold is user-specified.
>
>     bool runOnLoop(Loop *L, LPPassManager &LPM);
>
> @@ -87,7 +96,9 @@
>  INITIALIZE_PASS_DEPENDENCY(LCSSA)
>  INITIALIZE_PASS_END(LoopUnroll, "loop-unroll", "Unroll loops", false, false)
>
> -Pass *llvm::createLoopUnrollPass() { return new LoopUnroll(); }
> +Pass *llvm::createLoopUnrollPass(int Threshold, int Count, int AllowPartial) {
> +  return new LoopUnroll();
> +}

You added the arguments, and they're ignored?

-Eli

>  /// ApproximateLoopSize - Approximate the size of the loop.
>  static unsigned ApproximateLoopSize(const Loop *L, unsigned &NumCalls) {
> @@ -119,14 +130,14 @@
>   // from UnrollThreshold, it is overridden to a smaller value if the current
>   // function is marked as optimize-for-size, and the unroll threshold was
>   // not user specified.
> -  CurrentThreshold = UnrollThreshold;
> -  if (Header->getParent()->hasFnAttr(Attribute::OptimizeForSize) &&
> -      UnrollThreshold.getNumOccurrences() == 0)
> -    CurrentThreshold = OptSizeUnrollThreshold;
> +  unsigned Threshold = CurrentThreshold;
> +  if (!UserThreshold &&
> +      Header->getParent()->hasFnAttr(Attribute::OptimizeForSize))
> +    Threshold = OptSizeUnrollThreshold;
>
>   // Find trip count
>   unsigned TripCount = L->getSmallConstantTripCount();
> -  unsigned Count = UnrollCount;
> +  unsigned Count = CurrentCount;
>
>   // Automatically select an unroll count.
>   if (Count == 0) {
> @@ -140,7 +151,7 @@
>   }
>
>   // Enforce the threshold.
> -  if (CurrentThreshold != NoThreshold) {
> +  if (Threshold != NoThreshold) {
>     unsigned NumInlineCandidates;
>     unsigned LoopSize = ApproximateLoopSize(L, NumInlineCandidates);
>     DEBUG(dbgs() << "  Loop Size = " << LoopSize << "\n");
> @@ -149,16 +160,16 @@
>       return false;
>     }
>     uint64_t Size = (uint64_t)LoopSize*Count;
> -    if (TripCount != 1 && Size > CurrentThreshold) {
> +    if (TripCount != 1 && Size > Threshold) {
>       DEBUG(dbgs() << "  Too large to fully unroll with count: " << Count
> -            << " because size: " << Size << ">" << CurrentThreshold << "\n");
> -      if (!UnrollAllowPartial) {
> +            << " because size: " << Size << ">" << Threshold << "\n");
> +      if (!CurrentAllowPartial) {
>         DEBUG(dbgs() << "  will not try to unroll partially because "
>               << "-unroll-allow-partial not given\n");
>         return false;
>       }
>       // Reduce unroll count to be modulo of TripCount for partial unrolling
> -      Count = CurrentThreshold / LoopSize;
> +      Count = Threshold / LoopSize;
>       while (Count != 0 && TripCount%Count != 0) {
>         Count--;
>       }
>
>
> _______________________________________________
> 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