Do not mark ALL terminators live if any instruciton in the block is live. We only
authorChris Lattner <sabre@nondot.org>
Tue, 24 Jun 2003 21:49:45 +0000 (21:49 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 24 Jun 2003 21:49:45 +0000 (21:49 +0000)
want to mark it live if it is an unconditional branch.  This fixes bug:
ADCE/2002-05-28-Crash.ll and makes this pass _much_ more useful.

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

lib/Transforms/Scalar/ADCE.cpp

index 15ae7677f2200cf7d168708263522fb4bc57b8ae..38dcff1beaae858653eee25b8a030d04dbf997f3 100644 (file)
@@ -105,8 +105,11 @@ void ADCE::markBlockAlive(BasicBlock *BB) {
              bind_obj(this, &ADCE::markTerminatorLive));
   }
   
-  // If this basic block is live, then the terminator must be as well!
-  markTerminatorLive(BB);
+  // If this basic block is live, and it ends in an unconditional branch, then
+  // the branch is alive as well...
+  if (BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator()))
+    if (BI->isUnconditional())
+      markTerminatorLive(BB);
 }
 
 // dropReferencesOfDeadInstructionsInLiveBlock - Loop over all of the
@@ -248,6 +251,7 @@ bool ADCE::doADCE() {
       NewEntry->getInstList().push_back(new BranchInst(&Func->front()));
       Func->getBasicBlockList().push_front(NewEntry);
       AliveBlocks.insert(NewEntry);    // This block is always alive!
+      LiveSet.insert(NewEntry->getTerminator());  // The branch is live
     }
     
     // Loop over all of the alive blocks in the function.  If any successor
@@ -260,6 +264,23 @@ bool ADCE::doADCE() {
         BasicBlock *BB = I;
         TerminatorInst *TI = BB->getTerminator();
       
+        // If the terminator instruction is alive, but the block it is contained
+        // in IS alive, this means that this terminator is a conditional branch
+        // on a condition that doesn't matter.  Make it an unconditional branch
+        // to ONE of the successors.  This has the side effect of dropping a use
+        // of the conditional value, which may also be dead.
+        if (!LiveSet.count(TI)) {
+          assert(TI->getNumSuccessors() > 1 && "Not a conditional?");
+          BranchInst *NB = new BranchInst(TI->getSuccessor(0), TI);
+
+          // Remove entries from PHI nodes to avoid confusing ourself later...
+          for (unsigned i = 1, e = TI->getNumSuccessors(); i != e; ++i)
+              TI->getSuccessor(i)->removePredecessor(BB);
+
+          BB->getInstList().erase(TI);
+          TI = NB;
+        }
+
         // Loop over all of the successors, looking for ones that are not alive.
         // We cannot save the number of successors in the terminator instruction
         // here because we may remove them if we don't have a postdominator...