1fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner//===-- UnreachableBlockElim.cpp - Remove unreachable blocks for codegen --===//
2edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman//
3fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner//                     The LLVM Compiler Infrastructure
4fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman//
8fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner//===----------------------------------------------------------------------===//
9edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman//
10fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner// This pass is an extremely simple version of the SimplifyCFG pass.  Its sole
11fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner// job is to delete LLVM basic blocks that are not reachable from the entry
12fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner// node.  To do this, it performs a simple depth first traversal of the CFG,
13fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner// then deletes any unvisited nodes.
14fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner//
15fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner// Note that this pass is really a hack.  In particular, the instruction
16fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner// selectors for various targets should just not generate code for unreachable
17fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner// blocks.  Until LLVM has a more systematic way of defining instruction
18fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner// selectors, however, we cannot really expect them to handle additional
19fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner// complexity.
20fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner//
21fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner//===----------------------------------------------------------------------===//
22fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
23fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner#include "llvm/CodeGen/Passes.h"
247f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner#include "llvm/Constant.h"
25879313ae3aa2052cc40ba6f0f25c17e7a5a6f0daChris Lattner#include "llvm/Instructions.h"
26fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner#include "llvm/Function.h"
27fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner#include "llvm/Pass.h"
285b3a4553c1da7e417a240379e2f510c77532c5c1Chris Lattner#include "llvm/Type.h"
2980f6a507d4e11ba066ad0e53e12ad25ad8cf07baCameron Zwarich#include "llvm/Analysis/Dominators.h"
30ff5dfdff56dc2355a6c4740623dddd5fab40d885Andreas Neustifter#include "llvm/Analysis/ProfileInfo.h"
314f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman#include "llvm/CodeGen/MachineDominators.h"
32bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson#include "llvm/CodeGen/MachineFunctionPass.h"
33ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov#include "llvm/CodeGen/MachineModuleInfo.h"
344f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman#include "llvm/CodeGen/MachineLoopInfo.h"
355d2f8072d41bcde63c9f4267efe2d50bacc1e5f3Owen Anderson#include "llvm/CodeGen/MachineRegisterInfo.h"
36fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner#include "llvm/Support/CFG.h"
37bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson#include "llvm/Target/TargetInstrInfo.h"
38551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/DepthFirstIterator.h"
39eaa009d963f0715257a26c6bf32ce6dd14326415Owen Anderson#include "llvm/ADT/SmallPtrSet.h"
40fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattnerusing namespace llvm;
41fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
42fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattnernamespace {
436726b6d75a8b679068a58cb954ba97cf9d1690baNick Lewycky  class UnreachableBlockElim : public FunctionPass {
44fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner    virtual bool runOnFunction(Function &F);
45794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel  public:
46ecd94c804a563f2a86572dcf1d2e81f397e19daaNick Lewycky    static char ID; // Pass identification, replacement for typeid
47081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    UnreachableBlockElim() : FunctionPass(ID) {
48081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      initializeUnreachableBlockElimPass(*PassRegistry::getPassRegistry());
49081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    }
50ff5dfdff56dc2355a6c4740623dddd5fab40d885Andreas Neustifter
51ff5dfdff56dc2355a6c4740623dddd5fab40d885Andreas Neustifter    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
5280f6a507d4e11ba066ad0e53e12ad25ad8cf07baCameron Zwarich      AU.addPreserved<DominatorTree>();
53ff5dfdff56dc2355a6c4740623dddd5fab40d885Andreas Neustifter      AU.addPreserved<ProfileInfo>();
54ff5dfdff56dc2355a6c4740623dddd5fab40d885Andreas Neustifter    }
55fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner  };
56fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner}
57844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanchar UnreachableBlockElim::ID = 0;
58d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(UnreachableBlockElim, "unreachableblockelim",
59ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                "Remove unreachable blocks from the CFG", false, false)
60fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
61fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris LattnerFunctionPass *llvm::createUnreachableBlockEliminationPass() {
62fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner  return new UnreachableBlockElim();
63fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner}
64fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
65fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattnerbool UnreachableBlockElim::runOnFunction(Function &F) {
66eaa009d963f0715257a26c6bf32ce6dd14326415Owen Anderson  SmallPtrSet<BasicBlock*, 8> Reachable;
67fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
68fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner  // Mark all reachable blocks.
6988698f5dbcaa34c4d4e7c1bed7992c976183040aChris Lattner  for (df_ext_iterator<Function*, SmallPtrSet<BasicBlock*, 8> > I =
7088698f5dbcaa34c4d4e7c1bed7992c976183040aChris Lattner       df_ext_begin(&F, Reachable), E = df_ext_end(&F, Reachable); I != E; ++I)
7188698f5dbcaa34c4d4e7c1bed7992c976183040aChris Lattner    /* Mark all reachable blocks */;
72fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
73fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner  // Loop over all dead blocks, remembering them and deleting all instructions
74fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner  // in them.
75fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner  std::vector<BasicBlock*> DeadBlocks;
76fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner  for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
77fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner    if (!Reachable.count(I)) {
787f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner      BasicBlock *BB = I;
797f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner      DeadBlocks.push_back(BB);
807f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner      while (PHINode *PN = dyn_cast<PHINode>(BB->begin())) {
81a7235ea7245028a0723e8ab7fd011386b3900777Owen Anderson        PN->replaceAllUsesWith(Constant::getNullValue(PN->getType()));
827f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner        BB->getInstList().pop_front();
837f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner      }
847f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner      for (succ_iterator SI = succ_begin(BB), E = succ_end(BB); SI != E; ++SI)
857f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner        (*SI)->removePredecessor(BB);
867f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner      BB->dropAllReferences();
87fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner    }
88fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
89bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson  // Actually remove the blocks now.
90ff5dfdff56dc2355a6c4740623dddd5fab40d885Andreas Neustifter  ProfileInfo *PI = getAnalysisIfAvailable<ProfileInfo>();
91ff5dfdff56dc2355a6c4740623dddd5fab40d885Andreas Neustifter  for (unsigned i = 0, e = DeadBlocks.size(); i != e; ++i) {
92ff5dfdff56dc2355a6c4740623dddd5fab40d885Andreas Neustifter    if (PI) PI->removeBlock(DeadBlocks[i]);
93bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson    DeadBlocks[i]->eraseFromParent();
94ff5dfdff56dc2355a6c4740623dddd5fab40d885Andreas Neustifter  }
95bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson
96bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson  return DeadBlocks.size();
97bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson}
98bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson
99bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson
100bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Andersonnamespace {
1016726b6d75a8b679068a58cb954ba97cf9d1690baNick Lewycky  class UnreachableMachineBlockElim : public MachineFunctionPass {
102bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson    virtual bool runOnMachineFunction(MachineFunction &F);
1034f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman    virtual void getAnalysisUsage(AnalysisUsage &AU) const;
104ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov    MachineModuleInfo *MMI;
105bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson  public:
106bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson    static char ID; // Pass identification, replacement for typeid
10790c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson    UnreachableMachineBlockElim() : MachineFunctionPass(ID) {}
108bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson  };
109bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson}
110bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Andersonchar UnreachableMachineBlockElim::ID = 0;
111bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson
11202dd53e1c5b941ca5f60fca1b95ebcaf9ccd1dfcOwen AndersonINITIALIZE_PASS(UnreachableMachineBlockElim, "unreachable-mbb-elimination",
113ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson  "Remove unreachable machine basic blocks", false, false)
114bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson
11590c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Andersonchar &llvm::UnreachableMachineBlockElimID = UnreachableMachineBlockElim::ID;
116bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson
1174f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohmanvoid UnreachableMachineBlockElim::getAnalysisUsage(AnalysisUsage &AU) const {
1184f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman  AU.addPreserved<MachineLoopInfo>();
1194f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman  AU.addPreserved<MachineDominatorTree>();
1204f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman  MachineFunctionPass::getAnalysisUsage(AU);
1214f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman}
1224f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman
123bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Andersonbool UnreachableMachineBlockElim::runOnMachineFunction(MachineFunction &F) {
124eaa009d963f0715257a26c6bf32ce6dd14326415Owen Anderson  SmallPtrSet<MachineBasicBlock*, 8> Reachable;
125b0725316cd1807b954eed4b9966250249d1fd884Owen Anderson  bool ModifiedPHI = false;
126bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson
1271465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands  MMI = getAnalysisIfAvailable<MachineModuleInfo>();
1284f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman  MachineDominatorTree *MDT = getAnalysisIfAvailable<MachineDominatorTree>();
1294f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman  MachineLoopInfo *MLI = getAnalysisIfAvailable<MachineLoopInfo>();
130ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov
131bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson  // Mark all reachable blocks.
132eaa009d963f0715257a26c6bf32ce6dd14326415Owen Anderson  for (df_ext_iterator<MachineFunction*, SmallPtrSet<MachineBasicBlock*, 8> >
133eaa009d963f0715257a26c6bf32ce6dd14326415Owen Anderson       I = df_ext_begin(&F, Reachable), E = df_ext_end(&F, Reachable);
134eaa009d963f0715257a26c6bf32ce6dd14326415Owen Anderson       I != E; ++I)
135bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson    /* Mark all reachable blocks */;
136bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson
137bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson  // Loop over all dead blocks, remembering them and deleting all instructions
138bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson  // in them.
139bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson  std::vector<MachineBasicBlock*> DeadBlocks;
1409200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson  for (MachineFunction::iterator I = F.begin(), E = F.end(); I != E; ++I) {
1419200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson    MachineBasicBlock *BB = I;
142ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov
1439200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson    // Test for deadness.
1449200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson    if (!Reachable.count(BB)) {
145bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson      DeadBlocks.push_back(BB);
146ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov
1474f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman      // Update dominator and loop info.
1484f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman      if (MLI) MLI->removeBlock(BB);
1494f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman      if (MDT && MDT->getNode(BB)) MDT->eraseNode(BB);
1504f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman
151bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson      while (BB->succ_begin() != BB->succ_end()) {
152bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson        MachineBasicBlock* succ = *BB->succ_begin();
153ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov
154bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson        MachineBasicBlock::iterator start = succ->begin();
155518bb53485df640d7b7e3f6b0544099020c42aa7Chris Lattner        while (start != succ->end() && start->isPHI()) {
156bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson          for (unsigned i = start->getNumOperands() - 1; i >= 2; i-=2)
157d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman            if (start->getOperand(i).isMBB() &&
158bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson                start->getOperand(i).getMBB() == BB) {
159bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson              start->RemoveOperand(i);
160bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson              start->RemoveOperand(i-1);
161bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson            }
162ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov
1639200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson          start++;
164bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson        }
165ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov
166bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson        BB->removeSuccessor(BB->succ_begin());
167bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson      }
168bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson    }
1699200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson  }
170fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
171fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner  // Actually remove the blocks now.
17218589de9b1b8c157dea602653042e486128dd9e4Chris Lattner  for (unsigned i = 0, e = DeadBlocks.size(); i != e; ++i)
17318589de9b1b8c157dea602653042e486128dd9e4Chris Lattner    DeadBlocks[i]->eraseFromParent();
174fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
1759200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson  // Cleanup PHI nodes.
1769200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson  for (MachineFunction::iterator I = F.begin(), E = F.end(); I != E; ++I) {
1779200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson    MachineBasicBlock *BB = I;
1789200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson    // Prune unneeded PHI entries.
179ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov    SmallPtrSet<MachineBasicBlock*, 8> preds(BB->pred_begin(),
1809200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson                                             BB->pred_end());
1819200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson    MachineBasicBlock::iterator phi = BB->begin();
182518bb53485df640d7b7e3f6b0544099020c42aa7Chris Lattner    while (phi != BB->end() && phi->isPHI()) {
183b12ab97bbdb86e978bbaba62f3dbb402b53010daOwen Anderson      for (unsigned i = phi->getNumOperands() - 1; i >= 2; i-=2)
184b12ab97bbdb86e978bbaba62f3dbb402b53010daOwen Anderson        if (!preds.count(phi->getOperand(i).getMBB())) {
185b12ab97bbdb86e978bbaba62f3dbb402b53010daOwen Anderson          phi->RemoveOperand(i);
186b12ab97bbdb86e978bbaba62f3dbb402b53010daOwen Anderson          phi->RemoveOperand(i-1);
187b0725316cd1807b954eed4b9966250249d1fd884Owen Anderson          ModifiedPHI = true;
188b12ab97bbdb86e978bbaba62f3dbb402b53010daOwen Anderson        }
189ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov
1909200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson      if (phi->getNumOperands() == 3) {
1919200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson        unsigned Input = phi->getOperand(1).getReg();
1929200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson        unsigned Output = phi->getOperand(0).getReg();
1939200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson
1949200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson        MachineInstr* temp = phi;
1959200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson        ++phi;
1969200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson        temp->eraseFromParent();
197b0725316cd1807b954eed4b9966250249d1fd884Owen Anderson        ModifiedPHI = true;
1989200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson
199f031d0977f8b03288ed32ff14f71c79e81914f39Cameron Zwarich        if (Input != Output) {
200f031d0977f8b03288ed32ff14f71c79e81914f39Cameron Zwarich          MachineRegisterInfo &MRI = F.getRegInfo();
201f031d0977f8b03288ed32ff14f71c79e81914f39Cameron Zwarich          MRI.constrainRegClass(Input, MRI.getRegClass(Output));
202f031d0977f8b03288ed32ff14f71c79e81914f39Cameron Zwarich          MRI.replaceRegWith(Output, Input);
203f031d0977f8b03288ed32ff14f71c79e81914f39Cameron Zwarich        }
204b12ab97bbdb86e978bbaba62f3dbb402b53010daOwen Anderson
2059200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson        continue;
2069200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson      }
207ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov
2089200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson      ++phi;
2099200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson    }
2109200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson  }
2119200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson
21259c0d4fcde6f112dd8e83293c6aa6b7138a05424Owen Anderson  F.RenumberBlocks();
21359c0d4fcde6f112dd8e83293c6aa6b7138a05424Owen Anderson
214b0725316cd1807b954eed4b9966250249d1fd884Owen Anderson  return (DeadBlocks.size() || ModifiedPHI);
215fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner}
216