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