From 8d9e92ce2d848f74f0610ce783dad1a9256c4ffb Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Mon, 27 Sep 2010 22:58:54 +0000 Subject: Weight loop unrolling counts by nesting depth. Unrolling deeply nested loops tends to cause high register pressure and thus excess spills, which we don't currently recover from well. This should be re-evaluated in the future if our ability to generate good spills/splits improves. Partial fix for . git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114919 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LoopUnrollPass.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'lib/Transforms/Scalar/LoopUnrollPass.cpp') diff --git a/lib/Transforms/Scalar/LoopUnrollPass.cpp b/lib/Transforms/Scalar/LoopUnrollPass.cpp index 7da2b52da5..99a38b1ed0 100644 --- a/lib/Transforms/Scalar/LoopUnrollPass.cpp +++ b/lib/Transforms/Scalar/LoopUnrollPass.cpp @@ -158,7 +158,12 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) { DEBUG(dbgs() << " Not unrolling loop with inlinable calls.\n"); return false; } - uint64_t Size = (uint64_t)LoopSize*Count; + + // NOTE: We multiply by the loop depth because unrolling inner loops of + // very deep nests tends to result in high register pressure, which we don't + // currently recover from very well. When and if the register allocator/ + // spiller improves to compensate, this should be re-evaluated. + uint64_t Size = (uint64_t)LoopSize*Count*L->getLoopDepth(); if (TripCount != 1 && Size > CurrentThreshold) { DEBUG(dbgs() << " Too large to fully unroll with count: " << Count << " because size: " << Size << ">" << CurrentThreshold << "\n"); -- cgit v1.2.3