MachineInstrBundle.cpp revision 396618b43a85e12d290a90b181c6af5d7c0c5f11
1ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng//===-- lib/CodeGen/MachineInstrBundle.cpp --------------------------------===// 2ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// 3ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// The LLVM Compiler Infrastructure 4ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// 5ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// This file is distributed under the University of Illinois Open Source 6ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// License. See LICENSE.TXT for details. 7ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng// 8ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng//===----------------------------------------------------------------------===// 9ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 10ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/CodeGen/MachineInstrBundle.h" 11ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/CodeGen/MachineInstrBuilder.h" 12ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/CodeGen/Passes.h" 13ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/CodeGen/MachineFunctionPass.h" 14ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/Target/TargetInstrInfo.h" 15ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/Target/TargetMachine.h" 16ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/Target/TargetRegisterInfo.h" 17ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/ADT/SmallSet.h" 18ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/ADT/SmallVector.h" 19ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chengusing namespace llvm; 20ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 21ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chengnamespace { 22ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng class UnpackMachineBundles : public MachineFunctionPass { 23ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng public: 24ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng static char ID; // Pass identification 25ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng UnpackMachineBundles() : MachineFunctionPass(ID) { 26ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng initializeUnpackMachineBundlesPass(*PassRegistry::getPassRegistry()); 27ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 28ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 29ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng virtual bool runOnMachineFunction(MachineFunction &MF); 30ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng }; 31ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} // end anonymous namespace 32ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 33ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chengchar UnpackMachineBundles::ID = 0; 341dd8c8560d45d36a8e507cd014352f1d313f9f9eAndrew Trickchar &llvm::UnpackMachineBundlesID = UnpackMachineBundles::ID; 35ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan ChengINITIALIZE_PASS(UnpackMachineBundles, "unpack-mi-bundles", 36ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng "Unpack machine instruction bundles", false, false) 37ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 38ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chengbool UnpackMachineBundles::runOnMachineFunction(MachineFunction &MF) { 39ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng bool Changed = false; 40ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) { 41ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock *MBB = &*I; 42ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 43ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng for (MachineBasicBlock::instr_iterator MII = MBB->instr_begin(), 44ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MIE = MBB->instr_end(); MII != MIE; ) { 45ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineInstr *MI = &*MII; 46ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 47ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng // Remove BUNDLE instruction and the InsideBundle flags from bundled 48ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng // instructions. 49ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (MI->isBundle()) { 50ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng while (++MII != MIE && MII->isInsideBundle()) { 51ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MII->setIsInsideBundle(false); 52ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng for (unsigned i = 0, e = MII->getNumOperands(); i != e; ++i) { 53ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineOperand &MO = MII->getOperand(i); 54ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (MO.isReg() && MO.isInternalRead()) 55ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MO.setIsInternalRead(false); 56ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 57ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 58ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MI->eraseFromParent(); 59ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 60ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng Changed = true; 61ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng continue; 62ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 63ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 64ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng ++MII; 65ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 66ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 67ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 68ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return Changed; 69ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 70ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 71ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng 72ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Chengnamespace { 73ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng class FinalizeMachineBundles : public MachineFunctionPass { 74ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng public: 75ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng static char ID; // Pass identification 76ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng FinalizeMachineBundles() : MachineFunctionPass(ID) { 77ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng initializeFinalizeMachineBundlesPass(*PassRegistry::getPassRegistry()); 78ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng } 79ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng 80ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng virtual bool runOnMachineFunction(MachineFunction &MF); 81ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng }; 82ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng} // end anonymous namespace 83ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng 84ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Chengchar FinalizeMachineBundles::ID = 0; 851dd8c8560d45d36a8e507cd014352f1d313f9f9eAndrew Trickchar &llvm::FinalizeMachineBundlesID = FinalizeMachineBundles::ID; 86ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan ChengINITIALIZE_PASS(FinalizeMachineBundles, "finalize-mi-bundles", 87ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng "Finalize machine instruction bundles", false, false) 88ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng 89ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Chengbool FinalizeMachineBundles::runOnMachineFunction(MachineFunction &MF) { 90ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng return llvm::finalizeBundles(MF); 91ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng} 92ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng 93ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng 949b159710ebe8a37cba38ca0c5b465e362bd68af7Evan Cheng/// finalizeBundle - Finalize a machine instruction bundle which includes 95bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// a sequence of instructions starting from FirstMI to LastMI (exclusive). 96ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng/// This routine adds a BUNDLE instruction to represent the bundle, it adds 97ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng/// IsInternalRead markers to MachineOperands which are defined inside the 98ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng/// bundle, and it copies externally visible defs and uses to the BUNDLE 99ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng/// instruction. 1009b159710ebe8a37cba38ca0c5b465e362bd68af7Evan Chengvoid llvm::finalizeBundle(MachineBasicBlock &MBB, 101ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator FirstMI, 102ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator LastMI) { 103bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng assert(FirstMI != LastMI && "Empty bundle?"); 104bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng 105ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const TargetMachine &TM = MBB.getParent()->getTarget(); 106ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const TargetInstrInfo *TII = TM.getInstrInfo(); 107ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const TargetRegisterInfo *TRI = TM.getRegisterInfo(); 108ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 109ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineInstrBuilder MIB = BuildMI(MBB, FirstMI, FirstMI->getDebugLoc(), 110ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng TII->get(TargetOpcode::BUNDLE)); 111ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 112ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng SmallVector<unsigned, 8> LocalDefs; 113ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng SmallSet<unsigned, 8> LocalDefSet; 114ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng SmallSet<unsigned, 8> DeadDefSet; 115ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng SmallSet<unsigned, 8> KilledDefSet; 116ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng SmallVector<unsigned, 8> ExternUses; 117ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng SmallSet<unsigned, 8> ExternUseSet; 118ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng SmallSet<unsigned, 8> KilledUseSet; 119ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng SmallSet<unsigned, 8> UndefUseSet; 120ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng SmallVector<MachineOperand*, 4> Defs; 121bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng for (; FirstMI != LastMI; ++FirstMI) { 122ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng for (unsigned i = 0, e = FirstMI->getNumOperands(); i != e; ++i) { 123ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineOperand &MO = FirstMI->getOperand(i); 124ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (!MO.isReg()) 125ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng continue; 126ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (MO.isDef()) { 127ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng Defs.push_back(&MO); 128ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng continue; 129ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 130ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 131ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned Reg = MO.getReg(); 132ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (!Reg) 133ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng continue; 134ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng assert(TargetRegisterInfo::isPhysicalRegister(Reg)); 135ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (LocalDefSet.count(Reg)) { 136ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MO.setIsInternalRead(); 137ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (MO.isKill()) 138ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng // Internal def is now killed. 139ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng KilledDefSet.insert(Reg); 140ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } else { 141ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (ExternUseSet.insert(Reg)) { 142ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng ExternUses.push_back(Reg); 143ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (MO.isUndef()) 144ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng UndefUseSet.insert(Reg); 145ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 146ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (MO.isKill()) 147ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng // External def is now killed. 148ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng KilledUseSet.insert(Reg); 149ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 150ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 151ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 152ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng for (unsigned i = 0, e = Defs.size(); i != e; ++i) { 153ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineOperand &MO = *Defs[i]; 154ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned Reg = MO.getReg(); 155ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (!Reg) 156ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng continue; 157ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 158ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (LocalDefSet.insert(Reg)) { 159ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng LocalDefs.push_back(Reg); 160ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (MO.isDead()) { 161ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DeadDefSet.insert(Reg); 162ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 163ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } else { 164ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng // Re-defined inside the bundle, it's no longer killed. 165ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng KilledDefSet.erase(Reg); 166ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (!MO.isDead()) 167ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng // Previously defined but dead. 168ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DeadDefSet.erase(Reg); 169ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 170ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 171ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (!MO.isDead()) { 172396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) { 173396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen unsigned SubReg = *SubRegs; 174ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (LocalDefSet.insert(SubReg)) 175ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng LocalDefs.push_back(SubReg); 176ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 177ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 178ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 179ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 180ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng FirstMI->setIsInsideBundle(); 181ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng Defs.clear(); 182bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng } 183ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 184ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng SmallSet<unsigned, 8> Added; 185ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng for (unsigned i = 0, e = LocalDefs.size(); i != e; ++i) { 186ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned Reg = LocalDefs[i]; 187ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (Added.insert(Reg)) { 188ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng // If it's not live beyond end of the bundle, mark it dead. 189ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng bool isDead = DeadDefSet.count(Reg) || KilledDefSet.count(Reg); 190ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MIB.addReg(Reg, getDefRegState(true) | getDeadRegState(isDead) | 191ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng getImplRegState(true)); 192ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 193ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 194ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 195ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng for (unsigned i = 0, e = ExternUses.size(); i != e; ++i) { 196ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned Reg = ExternUses[i]; 197ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng bool isKill = KilledUseSet.count(Reg); 198ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng bool isUndef = UndefUseSet.count(Reg); 199ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MIB.addReg(Reg, getKillRegState(isKill) | getUndefRegState(isUndef) | 200ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng getImplRegState(true)); 201ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 202ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 203bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng 204bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// finalizeBundle - Same functionality as the previous finalizeBundle except 205bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// the last instruction in the bundle is not provided as an input. This is 206bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// used in cases where bundles are pre-determined by marking instructions 207a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng/// with 'InsideBundle' marker. It returns the MBB instruction iterator that 208a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng/// points to the end of the bundle. 209a2e435cd23427eef7d8e86c72bb94c756e60e473Evan ChengMachineBasicBlock::instr_iterator 210a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Chengllvm::finalizeBundle(MachineBasicBlock &MBB, 211a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng MachineBasicBlock::instr_iterator FirstMI) { 212bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng MachineBasicBlock::instr_iterator E = MBB.instr_end(); 213bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng MachineBasicBlock::instr_iterator LastMI = llvm::next(FirstMI); 214bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng while (LastMI != E && LastMI->isInsideBundle()) 215bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng ++LastMI; 216bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng finalizeBundle(MBB, FirstMI, LastMI); 217a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng return LastMI; 218bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng} 219ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng 220ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng/// finalizeBundles - Finalize instruction bundles in the specified 221ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng/// MachineFunction. Return true if any bundles are finalized. 222ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Chengbool llvm::finalizeBundles(MachineFunction &MF) { 223ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng bool Changed = false; 224ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) { 225ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng MachineBasicBlock &MBB = *I; 226ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng 227ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng MachineBasicBlock::instr_iterator MII = MBB.instr_begin(); 228ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng assert(!MII->isInsideBundle() && 229ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng "First instr cannot be inside bundle before finalization!"); 230ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng 231ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng MachineBasicBlock::instr_iterator MIE = MBB.instr_end(); 2328250d7385a16e8d586f608b3040eb6738bbf8e55Evan Cheng if (MII == MIE) 2338250d7385a16e8d586f608b3040eb6738bbf8e55Evan Cheng continue; 234ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng for (++MII; MII != MIE; ) { 235ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng if (!MII->isInsideBundle()) 236ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng ++MII; 237ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng else { 238ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng MII = finalizeBundle(MBB, llvm::prior(MII)); 239ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng Changed = true; 240ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng } 241ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng } 242ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng } 243ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng 244ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng return Changed; 245ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng} 246a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen 247a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen//===----------------------------------------------------------------------===// 248a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen// MachineOperand iterator 249a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen//===----------------------------------------------------------------------===// 250a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen 251a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund OlesenMachineOperandIteratorBase::RegInfo 252a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund OlesenMachineOperandIteratorBase::analyzeVirtReg(unsigned Reg, 253a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen SmallVectorImpl<std::pair<MachineInstr*, unsigned> > *Ops) { 254a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen RegInfo RI = { false, false, false }; 255a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen for(; isValid(); ++*this) { 256a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen MachineOperand &MO = deref(); 257a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen if (!MO.isReg() || MO.getReg() != Reg) 258a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen continue; 259a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen 260a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen // Remember each (MI, OpNo) that refers to Reg. 261a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen if (Ops) 262a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen Ops->push_back(std::make_pair(MO.getParent(), getOperandNo())); 263a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen 264a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen // Both defs and uses can read virtual registers. 265a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen if (MO.readsReg()) { 266a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen RI.Reads = true; 267a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen if (MO.isDef()) 268a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen RI.Tied = true; 269a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen } 270a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen 271a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen // Only defs can write. 272a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen if (MO.isDef()) 273a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen RI.Writes = true; 274a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen else if (!RI.Tied && MO.getParent()->isRegTiedToDefOperand(getOperandNo())) 275a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen RI.Tied = true; 276a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen } 277a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen return RI; 278a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen} 279