Not all users of a BB are Instructions any more.
authorNick Lewycky <nicholas@mxc.ca>
Sat, 8 Mar 2008 07:48:41 +0000 (07:48 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Sat, 8 Mar 2008 07:48:41 +0000 (07:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48047 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/BasicBlock.h
lib/Transforms/Scalar/SCCP.cpp

index 5a1c5a45b2b57df82fe33a8788cc569a042bf928..4099d3bd32ec1d0f7ec7f1dce5caab58f66839e0 100644 (file)
@@ -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<Instruction>(*use_begin());}
-  const Instruction *use_back() const { return cast<Instruction>(*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
index 561cdb1fbb4b949fa757c371b0a8352330ebff95..b1c923c2bdcb168d2ef588db7b1ad16a0346ded1 100644 (file)
@@ -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<BasicBlock>(DeadBB->use_back())) {
+          PredBB->setUnwindDest(NULL);
+          continue;
+        }
+
         Instruction *I = cast<Instruction>(DeadBB->use_back());
         bool Folded = ConstantFoldTerminator(I->getParent());
         if (!Folded) {