1 //===- RegUsageInfoCollector.cpp - Register Usage Informartion Collector --===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// 10 /// This pass is required to take advantage of the interprocedural register 11 /// allocation infrastructure. 12 /// 13 /// This pass is simple MachineFunction pass which collects register usage 14 /// details by iterating through each physical registers and checking 15 /// MRI::isPhysRegUsed() then creates a RegMask based on this details. 16 /// The pass then stores this RegMask in PhysicalRegisterUsageInfo.cpp 17 /// 18 //===----------------------------------------------------------------------===// 19 20 #include "llvm/CodeGen/MachineBasicBlock.h" 21 #include "llvm/CodeGen/MachineFunctionPass.h" 22 #include "llvm/CodeGen/MachineInstr.h" 23 #include "llvm/CodeGen/MachineOperand.h" 24 #include "llvm/CodeGen/MachineRegisterInfo.h" 25 #include "llvm/CodeGen/Passes.h" 26 #include "llvm/CodeGen/RegisterUsageInfo.h" 27 #include "llvm/Support/Debug.h" 28 #include "llvm/Support/raw_ostream.h" 29 30 using namespace llvm; 31 32 #define DEBUG_TYPE "ip-regalloc" 33 34 namespace llvm { 35 void initializeRegUsageInfoCollectorPass(PassRegistry &); 36 } 37 38 namespace { 39 class RegUsageInfoCollector : public MachineFunctionPass { 40 public: 41 RegUsageInfoCollector() : MachineFunctionPass(ID) { 42 PassRegistry &Registry = *PassRegistry::getPassRegistry(); 43 initializeRegUsageInfoCollectorPass(Registry); 44 } 45 46 const char *getPassName() const override { 47 return "Register Usage Information Collector Pass"; 48 } 49 50 void getAnalysisUsage(AnalysisUsage &AU) const override; 51 52 bool runOnMachineFunction(MachineFunction &MF) override; 53 54 static char ID; 55 56 private: 57 void markRegClobbered(const TargetRegisterInfo *TRI, uint32_t *RegMask, 58 unsigned PReg); 59 }; 60 } // end of anonymous namespace 61 62 char RegUsageInfoCollector::ID = 0; 63 64 INITIALIZE_PASS_BEGIN(RegUsageInfoCollector, "RegUsageInfoCollector", 65 "Register Usage Information Collector", false, false) 66 INITIALIZE_PASS_DEPENDENCY(PhysicalRegisterUsageInfo) 67 INITIALIZE_PASS_END(RegUsageInfoCollector, "RegUsageInfoCollector", 68 "Register Usage Information Collector", false, false) 69 70 FunctionPass *llvm::createRegUsageInfoCollector() { 71 return new RegUsageInfoCollector(); 72 } 73 74 void RegUsageInfoCollector::markRegClobbered(const TargetRegisterInfo *TRI, 75 uint32_t *RegMask, unsigned PReg) { 76 // If PReg is clobbered then all of its alias are also clobbered. 77 for (MCRegAliasIterator AI(PReg, TRI, true); AI.isValid(); ++AI) 78 RegMask[*AI / 32] &= ~(1u << *AI % 32); 79 } 80 81 void RegUsageInfoCollector::getAnalysisUsage(AnalysisUsage &AU) const { 82 AU.addRequired<PhysicalRegisterUsageInfo>(); 83 AU.setPreservesAll(); 84 MachineFunctionPass::getAnalysisUsage(AU); 85 } 86 87 bool RegUsageInfoCollector::runOnMachineFunction(MachineFunction &MF) { 88 MachineRegisterInfo *MRI = &MF.getRegInfo(); 89 const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo(); 90 const TargetMachine &TM = MF.getTarget(); 91 92 DEBUG(dbgs() << " -------------------- " << getPassName() 93 << " -------------------- \n"); 94 DEBUG(dbgs() << "Function Name : " << MF.getName() << "\n"); 95 96 std::vector<uint32_t> RegMask; 97 98 // Compute the size of the bit vector to represent all the registers. 99 // The bit vector is broken into 32-bit chunks, thus takes the ceil of 100 // the number of registers divided by 32 for the size. 101 unsigned RegMaskSize = (TRI->getNumRegs() + 31) / 32; 102 RegMask.resize(RegMaskSize, 0xFFFFFFFF); 103 104 PhysicalRegisterUsageInfo *PRUI = &getAnalysis<PhysicalRegisterUsageInfo>(); 105 106 PRUI->setTargetMachine(&TM); 107 108 DEBUG(dbgs() << "Clobbered Registers: "); 109 for (unsigned PReg = 1, PRegE = TRI->getNumRegs(); PReg < PRegE; ++PReg) 110 if (!MRI->reg_nodbg_empty(PReg) && MRI->isPhysRegUsed(PReg)) 111 markRegClobbered(TRI, &RegMask[0], PReg); 112 113 const uint32_t *CallPreservedMask = 114 TRI->getCallPreservedMask(MF, MF.getFunction()->getCallingConv()); 115 // Set callee saved register as preserved. 116 for (unsigned i = 0; i < RegMaskSize; ++i) 117 RegMask[i] = RegMask[i] | CallPreservedMask[i]; 118 119 for (unsigned PReg = 1, PRegE = TRI->getNumRegs(); PReg < PRegE; ++PReg) 120 if (MachineOperand::clobbersPhysReg(&(RegMask[0]), PReg)) 121 DEBUG(dbgs() << TRI->getName(PReg) << " "); 122 123 DEBUG(dbgs() << " \n----------------------------------------\n"); 124 125 PRUI->storeUpdateRegUsageInfo(MF.getFunction(), std::move(RegMask)); 126 127 return false; 128 } 129