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