Home | History | Annotate | Download | only in CodeGen
      1 //===- RegisterUsageInfo.cpp - Register Usage Informartion Storage --------===//
      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 //===----------------------------------------------------------------------===//
     14 
     15 #include "llvm/CodeGen/RegisterUsageInfo.h"
     16 #include "llvm/CodeGen/MachineOperand.h"
     17 #include "llvm/IR/Module.h"
     18 #include "llvm/Support/Debug.h"
     19 #include "llvm/Support/raw_ostream.h"
     20 
     21 using namespace llvm;
     22 
     23 #define DEBUG_TYPE "ip-regalloc"
     24 
     25 cl::opt<bool> DumpRegUsage(
     26     "print-regusage", cl::init(false), cl::Hidden,
     27     cl::desc("print register usage details collected for analysis."));
     28 
     29 INITIALIZE_PASS(PhysicalRegisterUsageInfo, "reg-usage-info",
     30                 "Register Usage Informartion Stroage", false, true)
     31 
     32 char PhysicalRegisterUsageInfo::ID = 0;
     33 
     34 void PhysicalRegisterUsageInfo::anchor() {}
     35 
     36 bool PhysicalRegisterUsageInfo::doInitialization(Module &M) {
     37   RegMasks.grow(M.size());
     38   return false;
     39 }
     40 
     41 bool PhysicalRegisterUsageInfo::doFinalization(Module &M) {
     42   if (DumpRegUsage)
     43     print(errs());
     44 
     45   RegMasks.shrink_and_clear();
     46   return false;
     47 }
     48 
     49 void PhysicalRegisterUsageInfo::storeUpdateRegUsageInfo(
     50     const Function *FP, std::vector<uint32_t> RegMask) {
     51   assert(FP != nullptr && "Function * can't be nullptr.");
     52   RegMasks[FP] = std::move(RegMask);
     53 }
     54 
     55 const std::vector<uint32_t> *
     56 PhysicalRegisterUsageInfo::getRegUsageInfo(const Function *FP) {
     57   if (RegMasks.find(FP) != RegMasks.end())
     58     return &(RegMasks.find(FP)->second);
     59   return nullptr;
     60 }
     61 
     62 void PhysicalRegisterUsageInfo::print(raw_ostream &OS, const Module *M) const {
     63   const TargetRegisterInfo *TRI;
     64 
     65   typedef std::pair<const Function *, std::vector<uint32_t>> FuncPtrRegMaskPair;
     66 
     67   SmallVector<const FuncPtrRegMaskPair *, 64> FPRMPairVector;
     68 
     69   // Create a vector of pointer to RegMasks entries
     70   for (const auto &RegMask : RegMasks)
     71     FPRMPairVector.push_back(&RegMask);
     72 
     73   // sort the vector to print analysis in alphabatic order of function name.
     74   std::sort(
     75       FPRMPairVector.begin(), FPRMPairVector.end(),
     76       [](const FuncPtrRegMaskPair *A, const FuncPtrRegMaskPair *B) -> bool {
     77         return A->first->getName() < B->first->getName();
     78       });
     79 
     80   for (const FuncPtrRegMaskPair *FPRMPair : FPRMPairVector) {
     81     OS << FPRMPair->first->getName() << " "
     82        << "Clobbered Registers: ";
     83     TRI = TM->getSubtarget<TargetSubtargetInfo>(*(FPRMPair->first))
     84               .getRegisterInfo();
     85 
     86     for (unsigned PReg = 1, PRegE = TRI->getNumRegs(); PReg < PRegE; ++PReg) {
     87       if (MachineOperand::clobbersPhysReg(&(FPRMPair->second[0]), PReg))
     88         OS << TRI->getName(PReg) << " ";
     89     }
     90     OS << "\n";
     91   }
     92 }
     93