From 6c36a0f9ee874129dce1a7453d6cb9af4ab5f636 Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Sat, 8 Mar 2008 07:48:41 +0000 Subject: [PATCH] Not all users of a BB are Instructions any more. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48047 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/BasicBlock.h | 8 +++----- lib/Transforms/Scalar/SCCP.cpp | 7 ++++++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/include/llvm/BasicBlock.h b/include/llvm/BasicBlock.h index 5a1c5a45b2b..4099d3bd32e 100644 --- a/include/llvm/BasicBlock.h +++ b/include/llvm/BasicBlock.h @@ -95,11 +95,6 @@ public: const Function *getParent() const { return Parent; } Function *getParent() { return Parent; } - /// use_back - Specialize the methods defined in Value, as we know that an - /// BasicBlock can only be used by Instructions (specifically PHI and terms). - Instruction *use_back() { return cast(*use_begin());} - const Instruction *use_back() const { return cast(*use_begin());} - /// getTerminator() - If this is a well formed basic block, then this returns /// a pointer to the terminator instruction. If it is not, then you get a /// null pointer back. @@ -187,6 +182,9 @@ public: /// update the PHI nodes that reside in the block. Note that this should be /// called while the predecessor still refers to this block. /// + /// DontDeleteUselessPHIs will keep PHIs that have one value or the same + /// value for all entries. + /// void removePredecessor(BasicBlock *Pred, bool DontDeleteUselessPHIs = false); /// splitBasicBlock - This splits a basic block into two at the specified diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp index 561cdb1fbb4..b1c923c2bdc 100644 --- a/lib/Transforms/Scalar/SCCP.cpp +++ b/lib/Transforms/Scalar/SCCP.cpp @@ -45,7 +45,7 @@ using namespace llvm; STATISTIC(NumInstRemoved, "Number of instructions removed"); STATISTIC(NumDeadBlocks , "Number of basic blocks unreachable"); -STATISTIC(IPNumInstRemoved, "Number ofinstructions removed by IPSCCP"); +STATISTIC(IPNumInstRemoved, "Number of instructions removed by IPSCCP"); STATISTIC(IPNumDeadBlocks , "Number of basic blocks unreachable by IPSCCP"); STATISTIC(IPNumArgsElimed ,"Number of arguments constant propagated by IPSCCP"); STATISTIC(IPNumGlobalConst, "Number of globals found to be constant by IPSCCP"); @@ -1637,6 +1637,11 @@ bool IPSCCP::runOnModule(Module &M) { // If there are any PHI nodes in this successor, drop entries for BB now. BasicBlock *DeadBB = BlocksToErase[i]; while (!DeadBB->use_empty()) { + if (BasicBlock *PredBB = dyn_cast(DeadBB->use_back())) { + PredBB->setUnwindDest(NULL); + continue; + } + Instruction *I = cast(DeadBB->use_back()); bool Folded = ConstantFoldTerminator(I->getParent()); if (!Folded) { -- 2.11.0