- // If there are some blocks dead...
- if (AliveBlocks.size() != Func->size()) {
- // Insert a new entry node to eliminate the entry node as a special case.
- BasicBlock *NewEntry = new BasicBlock();
- NewEntry->getInstList().push_back(new BranchInst(&Func->front()));
- Func->getBasicBlockList().push_front(NewEntry);
- AliveBlocks.insert(NewEntry); // This block is always alive!
+
+ if (AliveBlocks.size() == Func->size()) { // No dead blocks?
+ for (Function::iterator I = Func->begin(), E = Func->end(); I != E; ++I)
+ // Loop over all of the instructions in the function, telling dead
+ // instructions to drop their references. This is so that the next sweep
+ // over the program can safely delete dead instructions without other dead
+ // instructions still refering to them.
+ //
+ dropReferencesOfDeadInstructionsInLiveBlock(I);
+
+ } else { // If there are some blocks dead...
+ // If the entry node is dead, insert a new entry node to eliminate the entry
+ // node as a special case.
+ //
+ if (!AliveBlocks.count(&Func->front())) {
+ BasicBlock *NewEntry = new BasicBlock();
+ NewEntry->getInstList().push_back(new BranchInst(&Func->front()));
+ Func->getBasicBlockList().push_front(NewEntry);
+ AliveBlocks.insert(NewEntry); // This block is always alive!
+ }