[llvm-branch-commits] [llvm-branch] r155833 - in /llvm/branches/release_31: ./ include/llvm/Transforms/Utils/BasicBlockUtils.h lib/Transforms/Scalar/LoopUnswitch.cpp lib/Transforms/Utils/BreakCriticalEdges.cpp test/Transforms/LoopUnswitch/2012-04-30-LoopUnswitch-LPad-Crash.ll

Bill Wendling isanbard at gmail.com
Mon Apr 30 10:48:15 PDT 2012


Author: void
Date: Mon Apr 30 12:48:14 2012
New Revision: 155833

URL: http://llvm.org/viewvc/llvm-project?rev=155833&view=rev
Log:
Merging r155817:
------------------------------------------------------------------------
r155817 | void | 2012-04-30 03:44:54 -0700 (Mon, 30 Apr 2012) | 9 lines

Second attempt at PR12573:

Allow the "SplitCriticalEdge" function to split the edge to a landing pad. If
the pass is *sure* that it thinks it knows what it's doing, then it may go ahead
and specify that the landing pad can have its critical edge split. The loop
unswitch pass is one of these passes. It will split the critical edges of all
edges coming from a loop to a landing pad not within the loop. Doing so will
retain important loop analysis information, such as loop simplify.

------------------------------------------------------------------------

Added:
    llvm/branches/release_31/test/Transforms/LoopUnswitch/2012-04-30-LoopUnswitch-LPad-Crash.ll
      - copied unchanged from r155817, llvm/trunk/test/Transforms/LoopUnswitch/2012-04-30-LoopUnswitch-LPad-Crash.ll
Modified:
    llvm/branches/release_31/   (props changed)
    llvm/branches/release_31/include/llvm/Transforms/Utils/BasicBlockUtils.h
    llvm/branches/release_31/lib/Transforms/Scalar/LoopUnswitch.cpp
    llvm/branches/release_31/lib/Transforms/Utils/BreakCriticalEdges.cpp

Propchange: llvm/branches/release_31/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Apr 30 12:48:14 2012
@@ -1,3 +1,3 @@
 /llvm/branches/Apple/Pertwee:110850,110961
 /llvm/branches/type-system-rewrite:133420-134817
-/llvm/trunk:155166,155230,155284-155288,155307,155342,155466,155536,155668,155809,155813,155818
+/llvm/trunk:155166,155230,155284-155288,155307,155342,155466,155536,155668,155809,155813,155817-155818

Modified: llvm/branches/release_31/include/llvm/Transforms/Utils/BasicBlockUtils.h
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_31/include/llvm/Transforms/Utils/BasicBlockUtils.h?rev=155833&r1=155832&r2=155833&view=diff
==============================================================================
--- llvm/branches/release_31/include/llvm/Transforms/Utils/BasicBlockUtils.h (original)
+++ llvm/branches/release_31/include/llvm/Transforms/Utils/BasicBlockUtils.h Mon Apr 30 12:48:14 2012
@@ -110,7 +110,8 @@
 ///
 BasicBlock *SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum,
                               Pass *P = 0, bool MergeIdenticalEdges = false,
-                              bool DontDeleteUselessPHIs = false);
+                              bool DontDeleteUselessPHIs = false,
+                              bool SplitLandingPads = false);
 
 inline BasicBlock *SplitCriticalEdge(BasicBlock *BB, succ_iterator SI,
                                      Pass *P = 0) {

Modified: llvm/branches/release_31/lib/Transforms/Scalar/LoopUnswitch.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_31/lib/Transforms/Scalar/LoopUnswitch.cpp?rev=155833&r1=155832&r2=155833&view=diff
==============================================================================
--- llvm/branches/release_31/lib/Transforms/Scalar/LoopUnswitch.cpp (original)
+++ llvm/branches/release_31/lib/Transforms/Scalar/LoopUnswitch.cpp Mon Apr 30 12:48:14 2012
@@ -687,8 +687,8 @@
 
   // If either edge is critical, split it. This helps preserve LoopSimplify
   // form for enclosing loops.
-  SplitCriticalEdge(BI, 0, this);
-  SplitCriticalEdge(BI, 1, this);
+  SplitCriticalEdge(BI, 0, this, false, false, true);
+  SplitCriticalEdge(BI, 1, this, false, false, true);
 }
 
 /// UnswitchTrivialCondition - Given a loop that has a trivial unswitchable

Modified: llvm/branches/release_31/lib/Transforms/Utils/BreakCriticalEdges.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_31/lib/Transforms/Utils/BreakCriticalEdges.cpp?rev=155833&r1=155832&r2=155833&view=diff
==============================================================================
--- llvm/branches/release_31/lib/Transforms/Utils/BreakCriticalEdges.cpp (original)
+++ llvm/branches/release_31/lib/Transforms/Utils/BreakCriticalEdges.cpp Mon Apr 30 12:48:14 2012
@@ -119,31 +119,36 @@
 
 /// CreatePHIsForSplitLoopExit - When a loop exit edge is split, LCSSA form
 /// may require new PHIs in the new exit block. This function inserts the
-/// new PHIs, as needed.  Preds is a list of preds inside the loop, SplitBB
+/// new PHIs, as needed. Preds is a list of preds inside the loop, SplitBB
 /// is the new loop exit block, and DestBB is the old loop exit, now the
 /// successor of SplitBB.
 static void CreatePHIsForSplitLoopExit(SmallVectorImpl<BasicBlock *> &Preds,
                                        BasicBlock *SplitBB,
                                        BasicBlock *DestBB) {
   // SplitBB shouldn't have anything non-trivial in it yet.
-  assert(SplitBB->getFirstNonPHI() == SplitBB->getTerminator() &&
-         "SplitBB has non-PHI nodes!");
+  assert((SplitBB->getFirstNonPHI() == SplitBB->getTerminator() ||
+          SplitBB->isLandingPad()) && "SplitBB has non-PHI nodes!");
 
-  // For each PHI in the destination block...
+  // For each PHI in the destination block.
   for (BasicBlock::iterator I = DestBB->begin();
        PHINode *PN = dyn_cast<PHINode>(I); ++I) {
     unsigned Idx = PN->getBasicBlockIndex(SplitBB);
     Value *V = PN->getIncomingValue(Idx);
+
     // If the input is a PHI which already satisfies LCSSA, don't create
     // a new one.
     if (const PHINode *VP = dyn_cast<PHINode>(V))
       if (VP->getParent() == SplitBB)
         continue;
+
     // Otherwise a new PHI is needed. Create one and populate it.
-    PHINode *NewPN = PHINode::Create(PN->getType(), Preds.size(), "split",
-                                     SplitBB->getTerminator());
+    PHINode *NewPN =
+      PHINode::Create(PN->getType(), Preds.size(), "split",
+                      SplitBB->isLandingPad() ?
+                      SplitBB->begin() : SplitBB->getTerminator());
     for (unsigned i = 0, e = Preds.size(); i != e; ++i)
       NewPN->addIncoming(V, Preds[i]);
+
     // Update the original PHI.
     PN->setIncomingValue(Idx, NewPN);
   }
@@ -168,7 +173,8 @@
 ///
 BasicBlock *llvm::SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum,
                                     Pass *P, bool MergeIdenticalEdges,
-                                    bool DontDeleteUselessPhis) {
+                                    bool DontDeleteUselessPhis,
+                                    bool SplitLandingPads) {
   if (!isCriticalEdge(TI, SuccNum, MergeIdenticalEdges)) return 0;
 
   assert(!isa<IndirectBrInst>(TI) &&
@@ -371,10 +377,19 @@
           // getUniqueExitBlocks above because that depends on LoopSimplify
           // form, which we're in the process of restoring!
           if (!Preds.empty() && HasPredOutsideOfLoop) {
-            BasicBlock *NewExitBB =
-              SplitBlockPredecessors(Exit, Preds, "split", P);
-            if (P->mustPreserveAnalysisID(LCSSAID))
-              CreatePHIsForSplitLoopExit(Preds, NewExitBB, Exit);
+            if (!Exit->isLandingPad()) {
+              BasicBlock *NewExitBB =
+                SplitBlockPredecessors(Exit, Preds, "split", P);
+              if (P->mustPreserveAnalysisID(LCSSAID))
+                createPHIsForSplitLoopExit(Preds, NewExitBB, Exit);
+            } else if (SplitLandingPads) {
+              SmallVector<BasicBlock*, 8> NewBBs;
+              SplitLandingPadPredecessors(Exit, Preds,
+                                          ".split1", ".split2",
+                                          P, NewBBs);
+              if (P->mustPreserveAnalysisID(LCSSAID))
+                createPHIsForSplitLoopExit(Preds, NewBBs[0], Exit);
+            }
           }
         }
       }





More information about the llvm-branch-commits mailing list