[llvm-commits] [llvm] r83992 - /llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp

Chris Lattner clattner at apple.com
Tue Oct 13 10:53:27 PDT 2009


On Oct 13, 2009, at 10:50 AM, Dan Gohman wrote:

> Author: djg
> Date: Tue Oct 13 12:50:43 2009
> New Revision: 83992
>
> URL: http://llvm.org/viewvc/llvm-project?rev=83992&view=rev
> Log:
> Make LoopUnswitch's cost estimation count Instructions, rather than
> BasicBlocks, so that it doesn't blindly procede in the presence of
> large individual BasicBlocks. This addresses a class of code-size
> expansion problems.

This should use the heuristic the inliner etc has.  In particular it  
is important that presence of debug intrinsics not affect the cost.

-Chris

>
> Modified:
>    llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp
>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp?rev=83992&r1=83991&r2=83992&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp Tue Oct 13  
> 12:50:43 2009
> @@ -56,9 +56,11 @@
> STATISTIC(NumTrivial , "Number of unswitches that are trivial");
> STATISTIC(NumSimplify, "Number of simplifications of unswitched  
> code");
>
> +// The specific value of 50 here was chosen based only on intuition  
> and a
> +// few specific examples.
> static cl::opt<unsigned>
> Threshold("loop-unswitch-threshold", cl::desc("Max loop size to  
> unswitch"),
> -          cl::init(10), cl::Hidden);
> +          cl::init(50), cl::Hidden);
>
> namespace {
>   class LoopUnswitch : public LoopPass {
> @@ -406,27 +408,13 @@
>   if (IsTrivialUnswitchCondition(LIC))
>     return 0;
>
> -  // FIXME: This is really overly conservative.  However, more  
> liberal
> -  // estimations have thus far resulted in excessive unswitching,  
> which is bad
> -  // both in compile time and in code size.  This should be  
> replaced once
> -  // someone figures out how a good estimation.
> -  return currentLoop->getBlocks().size();
> -
> +  // FIXME: This is really overly conservative and brain dead.
>   unsigned Cost = 0;
> -  // FIXME: this is brain dead.  It should take into consideration  
> code
> -  // shrinkage.
>   for (Loop::block_iterator I = currentLoop->block_begin(),
>          E = currentLoop->block_end();
> -       I != E; ++I) {
> -    BasicBlock *BB = *I;
> -    // Do not include empty blocks in the cost calculation.  This  
> happen due to
> -    // loop canonicalization and will be removed.
> -    if (BB->begin() == BasicBlock::iterator(BB->getTerminator()))
> -      continue;
> -
> -    // Count basic blocks.
> -    ++Cost;
> -  }
> +       I != E; ++I)
> +    // Count instructions.
> +    Cost += (*I)->size();
>
>   return Cost;
> }
>
>
> _______________________________________________
> 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