Weight loop unrolling counts by nesting depth. Unrolling deeply nested loops tends...
authorOwen Anderson <resistor@mac.com>
Mon, 27 Sep 2010 22:58:54 +0000 (22:58 +0000)
committerOwen Anderson <resistor@mac.com>
Mon, 27 Sep 2010 22:58:54 +0000 (22:58 +0000)
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 <rdar://problem/7635585>.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114919 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopUnrollPass.cpp

index 7da2b52da544a64bfc94e5588022a98b48beef02..99a38b1ed010a5e29dc6b7cd08d72e182fda1d81 100644 (file)
@@ -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");