From: David Majnemer <david.majnemer@gmail.com>
Date: Thu, 6 Aug 2015 21:08:34 +0000 (+0000)
Subject: PHIs don't need to be postprocessed
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a94c4c0c2bd96b3a6563dae360be1a9e71cbf00d;p=oota-llvm.git

PHIs don't need to be postprocessed

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

diff --git a/lib/CodeGen/WinEHPrepare.cpp b/lib/CodeGen/WinEHPrepare.cpp
index df9da1456a1..16b58cf7178 100644
--- a/lib/CodeGen/WinEHPrepare.cpp
+++ b/lib/CodeGen/WinEHPrepare.cpp
@@ -3190,6 +3190,9 @@ bool WinEHPrepare::prepareExplicitEH(Function &F) {
       if (NumColorsForBB == 1)
         continue;
 
+      assert(!isa<PHINode>(BB->front()) &&
+             "Polychromatic PHI nodes should have been demoted!");
+
       // Create a new basic block and copy instructions into it!
       BasicBlock *CBB = CloneBasicBlock(
           BB, VMap, Twine(".for.", FuncletPadBB->getName()), &F);
@@ -3220,43 +3223,15 @@ bool WinEHPrepare::prepareExplicitEH(Function &F) {
       // Loop over all instructions, fixing each one as we find it...
       for (Instruction &I : *BB)
         RemapInstruction(&I, VMap, RF_IgnoreMissingEntries);
-
-    // Our PHI nodes have stale predecessors after we have cloned our new blocks
-    // into the CFG.  Fix this by removing the stale predecessors.
-    for (BasicBlock *BB : BlocksInFunclet) {
-      for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE;) {
-        Instruction *I = BI++;
-        auto *PN = dyn_cast<PHINode>(I);
-        // All the PHI nodes are bunched together at the start of the BB.
-        // Stop once we've hit a non-PHI.
-        if (!PN)
-          break;
-
-        // Create a list of all the incoming PHI values we'd like to remove.
-        // This is done in two steps to avoid iterator invalidation issues.
-        std::vector<unsigned> IndicesToRemove;
-        for (unsigned Idx = 0, E = PN->getNumIncomingValues(); Idx != E;
-             ++Idx) {
-          BasicBlock *PredBB = PN->getIncomingBlock(Idx);
-          if (BlockColors[PredBB].count(FuncletPadBB) == 0)
-            IndicesToRemove.push_back(Idx);
-        }
-        // Remove incoming values in the reverse order to prevent invalidating
-        // *successive* index.
-        for (auto I = IndicesToRemove.rbegin(), E = IndicesToRemove.rend();
-             I != E; ++I)
-          PN->removeIncomingValue(*I);
-      }
-    }
   }
 
   // Clean-up some of the mess we made by removing useles PHI nodes, trivial
   // branches, etc.
   for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE;) {
     BasicBlock *BB = FI++;
-    //SimplifyInstructionsInBlock(BB);
-    //ConstantFoldTerminator(BB, /*DeleteDeadConditions=*/true);
-    //MergeBlockIntoPredecessor(BB);
+    SimplifyInstructionsInBlock(BB);
+    ConstantFoldTerminator(BB, /*DeleteDeadConditions=*/true);
+    MergeBlockIntoPredecessor(BB);
   }
 
   // TODO: Do something about cleanupblocks which branch to implausible