diff options
author | Dan Gohman <gohman@apple.com> | 2009-10-13 17:50:43 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-10-13 17:50:43 +0000 |
commit | b24f6c74957540a87b7475a1917e4a66f1634cf0 (patch) | |
tree | 75caa7cf1486159a1e001990363aa6b55ef5d9ef /lib/Transforms/Scalar/LoopUnswitch.cpp | |
parent | 61358ab84304c641f5a071288d7cfbe3ddd10aa0 (diff) |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83992 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/LoopUnswitch.cpp')
-rw-r--r-- | lib/Transforms/Scalar/LoopUnswitch.cpp | 26 |
1 files changed, 7 insertions, 19 deletions
diff --git a/lib/Transforms/Scalar/LoopUnswitch.cpp b/lib/Transforms/Scalar/LoopUnswitch.cpp index b1f421467e..f116d5314e 100644 --- a/lib/Transforms/Scalar/LoopUnswitch.cpp +++ b/lib/Transforms/Scalar/LoopUnswitch.cpp @@ -56,9 +56,11 @@ STATISTIC(NumSelects , "Number of selects unswitched"); 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 @@ unsigned LoopUnswitch::getLoopUnswitchCost(Value *LIC) { 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; } |