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" 11d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/SmallSet.h" 12d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/SmallVector.h" 13d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineFunctionPass.h" 14ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/CodeGen/MachineInstrBuilder.h" 15ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/CodeGen/Passes.h" 16ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/Target/TargetInstrInfo.h" 17ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/Target/TargetMachine.h" 18ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng#include "llvm/Target/TargetRegisterInfo.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()) { 50caf946edf3478fcd00a572de380d9bf0fc00fd26Jakob Stoklund Olesen while (++MII != MIE && MII->isBundledWithPred()) { 51caf946edf3478fcd00a572de380d9bf0fc00fd26Jakob Stoklund Olesen MII->unbundleFromPred(); 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?"); 104caf946edf3478fcd00a572de380d9bf0fc00fd26Jakob Stoklund Olesen MIBundleBuilder Bundle(MBB, FirstMI, LastMI); 105bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng 106ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const TargetMachine &TM = MBB.getParent()->getTarget(); 107ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const TargetInstrInfo *TII = TM.getInstrInfo(); 108ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const TargetRegisterInfo *TRI = TM.getRegisterInfo(); 109ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 110caf946edf3478fcd00a572de380d9bf0fc00fd26Jakob Stoklund Olesen MachineInstrBuilder MIB = BuildMI(*MBB.getParent(), FirstMI->getDebugLoc(), 111ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng TII->get(TargetOpcode::BUNDLE)); 112caf946edf3478fcd00a572de380d9bf0fc00fd26Jakob Stoklund Olesen Bundle.prepend(MIB); 113ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 1148dcc99496d9e32e13e30d6579b7af05f19e7c8d8Michael Ilseman SmallVector<unsigned, 32> LocalDefs; 1158dcc99496d9e32e13e30d6579b7af05f19e7c8d8Michael Ilseman SmallSet<unsigned, 32> LocalDefSet; 116ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng SmallSet<unsigned, 8> DeadDefSet; 1178dcc99496d9e32e13e30d6579b7af05f19e7c8d8Michael Ilseman SmallSet<unsigned, 16> KilledDefSet; 118ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng SmallVector<unsigned, 8> ExternUses; 119ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng SmallSet<unsigned, 8> ExternUseSet; 120ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng SmallSet<unsigned, 8> KilledUseSet; 121ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng SmallSet<unsigned, 8> UndefUseSet; 122ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng SmallVector<MachineOperand*, 4> Defs; 123bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng for (; FirstMI != LastMI; ++FirstMI) { 124ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng for (unsigned i = 0, e = FirstMI->getNumOperands(); i != e; ++i) { 125ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineOperand &MO = FirstMI->getOperand(i); 126ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (!MO.isReg()) 127ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng continue; 128ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (MO.isDef()) { 129ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng Defs.push_back(&MO); 130ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng continue; 131ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 132ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 133ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned Reg = MO.getReg(); 134ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (!Reg) 135ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng continue; 136ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng assert(TargetRegisterInfo::isPhysicalRegister(Reg)); 137ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (LocalDefSet.count(Reg)) { 138ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MO.setIsInternalRead(); 139ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (MO.isKill()) 140ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng // Internal def is now killed. 141ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng KilledDefSet.insert(Reg); 142ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } else { 143ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (ExternUseSet.insert(Reg)) { 144ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng ExternUses.push_back(Reg); 145ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (MO.isUndef()) 146ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng UndefUseSet.insert(Reg); 147ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 148ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (MO.isKill()) 149ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng // External def is now killed. 150ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng KilledUseSet.insert(Reg); 151ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 152ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 153ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 154ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng for (unsigned i = 0, e = Defs.size(); i != e; ++i) { 155ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineOperand &MO = *Defs[i]; 156ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned Reg = MO.getReg(); 157ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (!Reg) 158ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng continue; 159ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 160ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (LocalDefSet.insert(Reg)) { 161ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng LocalDefs.push_back(Reg); 162ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (MO.isDead()) { 163ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DeadDefSet.insert(Reg); 164ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 165ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } else { 166ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng // Re-defined inside the bundle, it's no longer killed. 167ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng KilledDefSet.erase(Reg); 168ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (!MO.isDead()) 169ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng // Previously defined but dead. 170ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DeadDefSet.erase(Reg); 171ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 172ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 173ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (!MO.isDead()) { 174396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) { 175396618b43a85e12d290a90b181c6af5d7c0c5f11Jakob Stoklund Olesen unsigned SubReg = *SubRegs; 176ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (LocalDefSet.insert(SubReg)) 177ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng LocalDefs.push_back(SubReg); 178ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 179ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 180ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 181ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 182ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng Defs.clear(); 183bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng } 184ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 1858dcc99496d9e32e13e30d6579b7af05f19e7c8d8Michael Ilseman SmallSet<unsigned, 32> Added; 186ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng for (unsigned i = 0, e = LocalDefs.size(); i != e; ++i) { 187ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned Reg = LocalDefs[i]; 188ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (Added.insert(Reg)) { 189ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng // If it's not live beyond end of the bundle, mark it dead. 190ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng bool isDead = DeadDefSet.count(Reg) || KilledDefSet.count(Reg); 191ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MIB.addReg(Reg, getDefRegState(true) | getDeadRegState(isDead) | 192ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng getImplRegState(true)); 193ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 194ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 195ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 196ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng for (unsigned i = 0, e = ExternUses.size(); i != e; ++i) { 197ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned Reg = ExternUses[i]; 198ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng bool isKill = KilledUseSet.count(Reg); 199ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng bool isUndef = UndefUseSet.count(Reg); 200ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MIB.addReg(Reg, getKillRegState(isKill) | getUndefRegState(isUndef) | 201ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng getImplRegState(true)); 202ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 203ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 204bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng 205bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// finalizeBundle - Same functionality as the previous finalizeBundle except 206bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// the last instruction in the bundle is not provided as an input. This is 207bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng/// used in cases where bundles are pre-determined by marking instructions 208a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng/// with 'InsideBundle' marker. It returns the MBB instruction iterator that 209a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng/// points to the end of the bundle. 210a2e435cd23427eef7d8e86c72bb94c756e60e473Evan ChengMachineBasicBlock::instr_iterator 211a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Chengllvm::finalizeBundle(MachineBasicBlock &MBB, 212a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng MachineBasicBlock::instr_iterator FirstMI) { 213bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng MachineBasicBlock::instr_iterator E = MBB.instr_end(); 214bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng MachineBasicBlock::instr_iterator LastMI = llvm::next(FirstMI); 215bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng while (LastMI != E && LastMI->isInsideBundle()) 216bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng ++LastMI; 217bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng finalizeBundle(MBB, FirstMI, LastMI); 218a2e435cd23427eef7d8e86c72bb94c756e60e473Evan Cheng return LastMI; 219bca15f9c8059ccb9244853f86593c35ac35c8801Evan Cheng} 220ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng 221ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng/// finalizeBundles - Finalize instruction bundles in the specified 222ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng/// MachineFunction. Return true if any bundles are finalized. 223ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Chengbool llvm::finalizeBundles(MachineFunction &MF) { 224ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng bool Changed = false; 225ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) { 226ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng MachineBasicBlock &MBB = *I; 227ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng MachineBasicBlock::instr_iterator MII = MBB.instr_begin(); 228ef2887d3486a1814e5a4c1c1c6acc7d815334c80Evan Cheng MachineBasicBlock::instr_iterator MIE = MBB.instr_end(); 2298250d7385a16e8d586f608b3040eb6738bbf8e55Evan Cheng if (MII == MIE) 2308250d7385a16e8d586f608b3040eb6738bbf8e55Evan Cheng continue; 23173a853f05c913f6127e93cf0df3ba6398bcfc213Jakob Stoklund Olesen assert(!MII->isInsideBundle() && 23273a853f05c913f6127e93cf0df3ba6398bcfc213Jakob Stoklund Olesen "First instr cannot be inside bundle before finalization!"); 23373a853f05c913f6127e93cf0df3ba6398bcfc213Jakob Stoklund Olesen 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 251b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames MolloyMachineOperandIteratorBase::VirtRegInfo 252a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund OlesenMachineOperandIteratorBase::analyzeVirtReg(unsigned Reg, 253a36fe736458d242e1ae4200c1a8dd42f662851fbJakob Stoklund Olesen SmallVectorImpl<std::pair<MachineInstr*, unsigned> > *Ops) { 254b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy VirtRegInfo 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} 279b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 280b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames MolloyMachineOperandIteratorBase::PhysRegInfo 281b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames MolloyMachineOperandIteratorBase::analyzePhysReg(unsigned Reg, 282b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy const TargetRegisterInfo *TRI) { 283b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy bool AllDefsDead = true; 284310f248c22c5a20eaa4de1e612af3338a89144f3Tim Northover PhysRegInfo PRI = {false, false, false, false, false, false}; 285b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 286b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy assert(TargetRegisterInfo::isPhysicalRegister(Reg) && 287b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy "analyzePhysReg not given a physical register!"); 288b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy for (; isValid(); ++*this) { 289b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy MachineOperand &MO = deref(); 290b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 291b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy if (MO.isRegMask() && MO.clobbersPhysReg(Reg)) 292b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy PRI.Clobbers = true; // Regmask clobbers Reg. 293b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 294b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy if (!MO.isReg()) 295b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy continue; 296b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 297b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy unsigned MOReg = MO.getReg(); 298b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy if (!MOReg || !TargetRegisterInfo::isPhysicalRegister(MOReg)) 299b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy continue; 300b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 301b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy bool IsRegOrSuperReg = MOReg == Reg || TRI->isSubRegister(MOReg, Reg); 302b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy bool IsRegOrOverlapping = MOReg == Reg || TRI->regsOverlap(MOReg, Reg); 303b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 304b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy if (IsRegOrSuperReg && MO.readsReg()) { 305b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy // Reg or a super-reg is read, and perhaps killed also. 306b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy PRI.Reads = true; 307b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy PRI.Kills = MO.isKill(); 308310f248c22c5a20eaa4de1e612af3338a89144f3Tim Northover } 309310f248c22c5a20eaa4de1e612af3338a89144f3Tim Northover 310310f248c22c5a20eaa4de1e612af3338a89144f3Tim Northover if (IsRegOrOverlapping && MO.readsReg()) { 311b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy PRI.ReadsOverlap = true;// Reg or an overlapping register is read. 312b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy } 3132b9430243373768d5baba046a8c344cce96749a5Michael Ilseman 314b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy if (!MO.isDef()) 315b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy continue; 316b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 317b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy if (IsRegOrSuperReg) { 318b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy PRI.Defines = true; // Reg or a super-register is defined. 319b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy if (!MO.isDead()) 320b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy AllDefsDead = false; 321b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy } 322b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy if (IsRegOrOverlapping) 323b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy PRI.Clobbers = true; // Reg or an overlapping reg is defined. 324b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy } 325b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 326b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy if (AllDefsDead && PRI.Defines) 327b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy PRI.DefinesDead = true; // Reg or super-register was defined and was dead. 328b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy 329b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy return PRI; 330b17cf29784ad526f3adfc20c5aa1b0de5c57033eJames Molloy} 331