[llvm] r253253 - [PR25538]: Fix a failure caused by r253126.

Michael Zolotukhin via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 16 13:17:26 PST 2015


Author: mzolotukhin
Date: Mon Nov 16 15:17:26 2015
New Revision: 253253

URL: http://llvm.org/viewvc/llvm-project?rev=253253&view=rev
Log:
[PR25538]: Fix a failure caused by r253126.

In r253126 we stopped to recompute LCSSA after loop unrolling in all
cases, except the unrolling is full and at least one of the loop exits
is outside the parent loop. In other cases the transformation should not
break LCSSA, but it turned out, that we also call SimplifyLoop on the
parent loop, which might break LCSSA by itself. This fix just triggers
LCSSA recomputation in this case as well.

I'm committing it without a test case for now, but I'll try to invent
one. It's a bit tricky because in an isolated test LoopSimplify would
be scheduled before LoopUnroll, and thus will change the test and hide
the problem.

Modified:
    llvm/trunk/lib/Transforms/Utils/LoopUnroll.cpp

Modified: llvm/trunk/lib/Transforms/Utils/LoopUnroll.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LoopUnroll.cpp?rev=253253&r1=253252&r2=253253&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/LoopUnroll.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/LoopUnroll.cpp Mon Nov 16 15:17:26 2015
@@ -550,7 +550,7 @@ bool llvm::UnrollLoop(Loop *L, unsigned
     if (!OuterL && !CompletelyUnroll)
       OuterL = L;
     if (OuterL) {
-      simplifyLoop(OuterL, DT, LI, PP, SE, AC);
+      bool Simplified = simplifyLoop(OuterL, DT, LI, PP, SE, AC);
 
       // LCSSA must be performed on the outermost affected loop. The unrolled
       // loop's last loop latch is guaranteed to be in the outermost loop after
@@ -560,7 +560,7 @@ bool llvm::UnrollLoop(Loop *L, unsigned
         while (OuterL->getParentLoop() != LatchLoop)
           OuterL = OuterL->getParentLoop();
 
-      if (CompletelyUnroll && !AllExitsAreInsideParentLoop)
+      if (CompletelyUnroll && (!AllExitsAreInsideParentLoop || Simplified))
         formLCSSARecursively(*OuterL, *DT, LI, SE);
       else
         assert(OuterL->isLCSSAForm(*DT) &&




More information about the llvm-commits mailing list