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

Use code-size reduction metrics to estimate the amount of savings we'll get when we unroll a loop.

Next step is to recalculate the threshold values given this new heuristic.

llvm-svn: 113525
This commit is contained in:
Owen Anderson 2010-09-09 19:07:31 +00:00
parent 2ba28d3889
commit a182e2b20b

View File

@ -90,7 +90,30 @@ static unsigned ApproximateLoopSize(const Loop *L, unsigned &NumCalls) {
I != E; ++I)
Metrics.analyzeBasicBlock(*I);
NumCalls = Metrics.NumCalls;
return Metrics.NumInsts;
unsigned LoopSize = Metrics.NumInsts;
// If we can identify the induction variable, we know that it will become
// constant when we unroll the loop, so factor that into our loop size
// estimate.
// FIXME: We have to divide by InlineConstants::InstrCost because the
// measure returned by CountCodeReductionForConstant is not an instruction
// count, but rather a weight as defined by InlineConstants. It would
// probably be a good idea to standardize on a single weighting scheme by
// pushing more of the logic for weighting into CodeMetrics.
if (PHINode *IndVar = L->getCanonicalInductionVariable()) {
unsigned SizeDecrease = Metrics.CountCodeReductionForConstant(IndVar);
// NOTE: Because SizeDecrease is a fuzzy estimate, we don't want to allow
// it to totally negate the cost of unrolling a loop.
SizeDecrease = SizeDecrease > LoopSize / 2 ? LoopSize : SizeDecrease;
}
// Don't allow an estimate of size zero. This would allows unrolling of loops
// with huge iteration counts, which is a compile time problem even if it's
// not a problem for code quality.
if (LoopSize == 0) LoopSize = 1;
return LoopSize;
}
bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) {