1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00

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.

llvm-svn: 83992
This commit is contained in:
Dan Gohman 2009-10-13 17:50:43 +00:00
parent a3d8b98dcd
commit d01c6196f4

View File

@ -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;
}