From a94c4c0c2bd96b3a6563dae360be1a9e71cbf00d Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Thu, 6 Aug 2015 21:08:34 +0000 Subject: [PATCH] PHIs don't need to be postprocessed git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244275 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/WinEHPrepare.cpp | 37 ++++++------------------------------ 1 file changed, 6 insertions(+), 31 deletions(-) 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(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(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 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 -- 2.34.1