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"
24d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/DepthFirstIterator.h"
25d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/SmallPtrSet.h"
264f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman#include "llvm/CodeGen/MachineDominators.h"
27bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson#include "llvm/CodeGen/MachineFunctionPass.h"
284f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman#include "llvm/CodeGen/MachineLoopInfo.h"
29d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineModuleInfo.h"
305d2f8072d41bcde63c9f4267efe2d50bacc1e5f3Owen Anderson#include "llvm/CodeGen/MachineRegisterInfo.h"
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/CFG.h"
320b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constant.h"
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Dominators.h"
340b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h"
350b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h"
360b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h"
37d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Pass.h"
38bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson#include "llvm/Target/TargetInstrInfo.h"
39fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattnerusing namespace llvm;
40fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
41fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattnernamespace {
426726b6d75a8b679068a58cb954ba97cf9d1690baNick Lewycky  class UnreachableBlockElim : public FunctionPass {
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    bool runOnFunction(Function &F) override;
44794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel  public:
45ecd94c804a563f2a86572dcf1d2e81f397e19daaNick Lewycky    static char ID; // Pass identification, replacement for typeid
46081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    UnreachableBlockElim() : FunctionPass(ID) {
47081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      initializeUnreachableBlockElimPass(*PassRegistry::getPassRegistry());
48081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    }
49ff5dfdff56dc2355a6c4740623dddd5fab40d885Andreas Neustifter
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    void getAnalysisUsage(AnalysisUsage &AU) const override {
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      AU.addPreserved<DominatorTreeWrapperPass>();
52ff5dfdff56dc2355a6c4740623dddd5fab40d885Andreas Neustifter    }
53fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner  };
54fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner}
55844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanchar UnreachableBlockElim::ID = 0;
56d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(UnreachableBlockElim, "unreachableblockelim",
57ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                "Remove unreachable blocks from the CFG", false, false)
58fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
59fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris LattnerFunctionPass *llvm::createUnreachableBlockEliminationPass() {
60fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner  return new UnreachableBlockElim();
61fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner}
62fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
63fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattnerbool UnreachableBlockElim::runOnFunction(Function &F) {
64eaa009d963f0715257a26c6bf32ce6dd14326415Owen Anderson  SmallPtrSet<BasicBlock*, 8> Reachable;
65fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
66fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner  // Mark all reachable blocks.
6788698f5dbcaa34c4d4e7c1bed7992c976183040aChris Lattner  for (df_ext_iterator<Function*, SmallPtrSet<BasicBlock*, 8> > I =
6888698f5dbcaa34c4d4e7c1bed7992c976183040aChris Lattner       df_ext_begin(&F, Reachable), E = df_ext_end(&F, Reachable); I != E; ++I)
6988698f5dbcaa34c4d4e7c1bed7992c976183040aChris Lattner    /* Mark all reachable blocks */;
70fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
71fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner  // Loop over all dead blocks, remembering them and deleting all instructions
72fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner  // in them.
73fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner  std::vector<BasicBlock*> DeadBlocks;
74fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner  for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
75fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner    if (!Reachable.count(I)) {
767f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner      BasicBlock *BB = I;
777f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner      DeadBlocks.push_back(BB);
787f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner      while (PHINode *PN = dyn_cast<PHINode>(BB->begin())) {
79a7235ea7245028a0723e8ab7fd011386b3900777Owen Anderson        PN->replaceAllUsesWith(Constant::getNullValue(PN->getType()));
807f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner        BB->getInstList().pop_front();
817f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner      }
827f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner      for (succ_iterator SI = succ_begin(BB), E = succ_end(BB); SI != E; ++SI)
837f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner        (*SI)->removePredecessor(BB);
847f0566c1233ba4378c2c5531ddbc9eb8ad1868daChris Lattner      BB->dropAllReferences();
85fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner    }
86fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
87bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson  // Actually remove the blocks now.
88ff5dfdff56dc2355a6c4740623dddd5fab40d885Andreas Neustifter  for (unsigned i = 0, e = DeadBlocks.size(); i != e; ++i) {
89bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson    DeadBlocks[i]->eraseFromParent();
90ff5dfdff56dc2355a6c4740623dddd5fab40d885Andreas Neustifter  }
91bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson
92bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson  return DeadBlocks.size();
93bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson}
94bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson
95bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson
96bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Andersonnamespace {
976726b6d75a8b679068a58cb954ba97cf9d1690baNick Lewycky  class UnreachableMachineBlockElim : public MachineFunctionPass {
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    bool runOnMachineFunction(MachineFunction &F) override;
9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    void getAnalysisUsage(AnalysisUsage &AU) const override;
100ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov    MachineModuleInfo *MMI;
101bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson  public:
102bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson    static char ID; // Pass identification, replacement for typeid
10390c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson    UnreachableMachineBlockElim() : MachineFunctionPass(ID) {}
104bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson  };
105bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson}
106bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Andersonchar UnreachableMachineBlockElim::ID = 0;
107bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson
10802dd53e1c5b941ca5f60fca1b95ebcaf9ccd1dfcOwen AndersonINITIALIZE_PASS(UnreachableMachineBlockElim, "unreachable-mbb-elimination",
109ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson  "Remove unreachable machine basic blocks", false, false)
110bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson
11190c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Andersonchar &llvm::UnreachableMachineBlockElimID = UnreachableMachineBlockElim::ID;
112bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson
1134f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohmanvoid UnreachableMachineBlockElim::getAnalysisUsage(AnalysisUsage &AU) const {
1144f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman  AU.addPreserved<MachineLoopInfo>();
1154f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman  AU.addPreserved<MachineDominatorTree>();
1164f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman  MachineFunctionPass::getAnalysisUsage(AU);
1174f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman}
1184f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman
119bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Andersonbool UnreachableMachineBlockElim::runOnMachineFunction(MachineFunction &F) {
120eaa009d963f0715257a26c6bf32ce6dd14326415Owen Anderson  SmallPtrSet<MachineBasicBlock*, 8> Reachable;
121b0725316cd1807b954eed4b9966250249d1fd884Owen Anderson  bool ModifiedPHI = false;
122bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson
1231465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands  MMI = getAnalysisIfAvailable<MachineModuleInfo>();
1244f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman  MachineDominatorTree *MDT = getAnalysisIfAvailable<MachineDominatorTree>();
1254f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman  MachineLoopInfo *MLI = getAnalysisIfAvailable<MachineLoopInfo>();
126ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov
127bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson  // Mark all reachable blocks.
128eaa009d963f0715257a26c6bf32ce6dd14326415Owen Anderson  for (df_ext_iterator<MachineFunction*, SmallPtrSet<MachineBasicBlock*, 8> >
129eaa009d963f0715257a26c6bf32ce6dd14326415Owen Anderson       I = df_ext_begin(&F, Reachable), E = df_ext_end(&F, Reachable);
130eaa009d963f0715257a26c6bf32ce6dd14326415Owen Anderson       I != E; ++I)
131bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson    /* Mark all reachable blocks */;
132bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson
133bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson  // Loop over all dead blocks, remembering them and deleting all instructions
134bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson  // in them.
135bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson  std::vector<MachineBasicBlock*> DeadBlocks;
1369200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson  for (MachineFunction::iterator I = F.begin(), E = F.end(); I != E; ++I) {
1379200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson    MachineBasicBlock *BB = I;
138ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov
1399200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson    // Test for deadness.
1409200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson    if (!Reachable.count(BB)) {
141bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson      DeadBlocks.push_back(BB);
142ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov
1434f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman      // Update dominator and loop info.
1444f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman      if (MLI) MLI->removeBlock(BB);
1454f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman      if (MDT && MDT->getNode(BB)) MDT->eraseNode(BB);
1464f3cfba575bceadcb3c2f66e83080751edcbcea6Dan Gohman
147bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson      while (BB->succ_begin() != BB->succ_end()) {
148bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson        MachineBasicBlock* succ = *BB->succ_begin();
149ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov
150bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson        MachineBasicBlock::iterator start = succ->begin();
151518bb53485df640d7b7e3f6b0544099020c42aa7Chris Lattner        while (start != succ->end() && start->isPHI()) {
152bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson          for (unsigned i = start->getNumOperands() - 1; i >= 2; i-=2)
153d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman            if (start->getOperand(i).isMBB() &&
154bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson                start->getOperand(i).getMBB() == BB) {
155bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson              start->RemoveOperand(i);
156bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson              start->RemoveOperand(i-1);
157bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson            }
158ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov
1599200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson          start++;
160bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson        }
161ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov
162bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson        BB->removeSuccessor(BB->succ_begin());
163bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson      }
164bd3ba461eb5578a81ba09ff7bd7eb271d1130196Owen Anderson    }
1659200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson  }
166fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
167fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner  // Actually remove the blocks now.
16818589de9b1b8c157dea602653042e486128dd9e4Chris Lattner  for (unsigned i = 0, e = DeadBlocks.size(); i != e; ++i)
16918589de9b1b8c157dea602653042e486128dd9e4Chris Lattner    DeadBlocks[i]->eraseFromParent();
170fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner
1719200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson  // Cleanup PHI nodes.
1729200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson  for (MachineFunction::iterator I = F.begin(), E = F.end(); I != E; ++I) {
1739200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson    MachineBasicBlock *BB = I;
1749200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson    // Prune unneeded PHI entries.
175ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov    SmallPtrSet<MachineBasicBlock*, 8> preds(BB->pred_begin(),
1769200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson                                             BB->pred_end());
1779200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson    MachineBasicBlock::iterator phi = BB->begin();
178518bb53485df640d7b7e3f6b0544099020c42aa7Chris Lattner    while (phi != BB->end() && phi->isPHI()) {
179b12ab97bbdb86e978bbaba62f3dbb402b53010daOwen Anderson      for (unsigned i = phi->getNumOperands() - 1; i >= 2; i-=2)
180b12ab97bbdb86e978bbaba62f3dbb402b53010daOwen Anderson        if (!preds.count(phi->getOperand(i).getMBB())) {
181b12ab97bbdb86e978bbaba62f3dbb402b53010daOwen Anderson          phi->RemoveOperand(i);
182b12ab97bbdb86e978bbaba62f3dbb402b53010daOwen Anderson          phi->RemoveOperand(i-1);
183b0725316cd1807b954eed4b9966250249d1fd884Owen Anderson          ModifiedPHI = true;
184b12ab97bbdb86e978bbaba62f3dbb402b53010daOwen Anderson        }
185ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov
1869200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson      if (phi->getNumOperands() == 3) {
1879200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson        unsigned Input = phi->getOperand(1).getReg();
1889200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson        unsigned Output = phi->getOperand(0).getReg();
1899200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson
1909200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson        MachineInstr* temp = phi;
1919200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson        ++phi;
1929200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson        temp->eraseFromParent();
193b0725316cd1807b954eed4b9966250249d1fd884Owen Anderson        ModifiedPHI = true;
1949200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson
195f031d0977f8b03288ed32ff14f71c79e81914f39Cameron Zwarich        if (Input != Output) {
196f031d0977f8b03288ed32ff14f71c79e81914f39Cameron Zwarich          MachineRegisterInfo &MRI = F.getRegInfo();
197f031d0977f8b03288ed32ff14f71c79e81914f39Cameron Zwarich          MRI.constrainRegClass(Input, MRI.getRegClass(Output));
198f031d0977f8b03288ed32ff14f71c79e81914f39Cameron Zwarich          MRI.replaceRegWith(Output, Input);
199f031d0977f8b03288ed32ff14f71c79e81914f39Cameron Zwarich        }
200b12ab97bbdb86e978bbaba62f3dbb402b53010daOwen Anderson
2019200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson        continue;
2029200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson      }
203ed532cac7c65a617accdbc1fc7622b1c40110bafAnton Korobeynikov
2049200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson      ++phi;
2059200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson    }
2069200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson  }
2079200e81a1828f7d3aa59a48c52317e1beeeac0b1Owen Anderson
20859c0d4fcde6f112dd8e83293c6aa6b7138a05424Owen Anderson  F.RenumberBlocks();
20959c0d4fcde6f112dd8e83293c6aa6b7138a05424Owen Anderson
210b0725316cd1807b954eed4b9966250249d1fd884Owen Anderson  return (DeadBlocks.size() || ModifiedPHI);
211fc3c82a804c9b5eda24d96c21f7e6ff66bc2c529Chris Lattner}
212