LLVM  4.0.0
RegisterUsageInfo.cpp
Go to the documentation of this file.
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 
17 #include "llvm/IR/Module.h"
18 #include "llvm/Support/Debug.h"
20 
21 using namespace llvm;
22 
23 #define DEBUG_TYPE "ip-regalloc"
24 
26  "print-regusage", cl::init(false), cl::Hidden,
27  cl::desc("print register usage details collected for analysis."));
28 
30  "Register Usage Informartion Stroage", false, true)
31 
33 
34 void PhysicalRegisterUsageInfo::anchor() {}
35 
37  RegMasks.grow(M.size());
38  return false;
39 }
40 
42  if (DumpRegUsage)
43  print(errs());
44 
45  RegMasks.shrink_and_clear();
46  return false;
47 }
48 
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> *
57  auto It = RegMasks.find(FP);
58  if (It != RegMasks.end())
59  return &(It->second);
60  return nullptr;
61 }
62 
64  const TargetRegisterInfo *TRI;
65 
66  typedef std::pair<const Function *, std::vector<uint32_t>> FuncPtrRegMaskPair;
67 
69 
70  // Create a vector of pointer to RegMasks entries
71  for (const auto &RegMask : RegMasks)
72  FPRMPairVector.push_back(&RegMask);
73 
74  // sort the vector to print analysis in alphabatic order of function name.
75  std::sort(
76  FPRMPairVector.begin(), FPRMPairVector.end(),
77  [](const FuncPtrRegMaskPair *A, const FuncPtrRegMaskPair *B) -> bool {
78  return A->first->getName() < B->first->getName();
79  });
80 
81  for (const FuncPtrRegMaskPair *FPRMPair : FPRMPairVector) {
82  OS << FPRMPair->first->getName() << " "
83  << "Clobbered Registers: ";
84  TRI = TM->getSubtarget<TargetSubtargetInfo>(*(FPRMPair->first))
85  .getRegisterInfo();
86 
87  for (unsigned PReg = 1, PRegE = TRI->getNumRegs(); PReg < PRegE; ++PReg) {
88  if (MachineOperand::clobbersPhysReg(&(FPRMPair->second[0]), PReg))
89  OS << TRI->getName(PReg) << " ";
90  }
91  OS << "\n";
92  }
93 }
raw_ostream & errs()
This returns a reference to a raw_ostream for standard error.
A Module instance is used to store all the information related to an LLVM module. ...
Definition: Module.h:52
void storeUpdateRegUsageInfo(const Function *FP, std::vector< uint32_t > RegMask)
To store RegMask for given Function *.
void print(raw_ostream &OS, const Module *M=nullptr) const override
print - Print out the internal state of the pass.
bool doInitialization(Module &M) override
doInitialization - Virtual method overridden by subclasses to do any necessary initialization before ...
bool doFinalization(Module &M) override
doFinalization - Virtual method overriden by subclasses to do any necessary clean up after all passes...
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
static cl::opt< bool > DumpRegUsage("print-regusage", cl::init(false), cl::Hidden, cl::desc("print register usage details collected for analysis."))
static GCRegistry::Add< OcamlGC > B("ocaml","ocaml 3.10-compatible GC")
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:395
LLVM_ATTRIBUTE_ALWAYS_INLINE iterator begin()
Definition: SmallVector.h:115
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:36
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
Definition: SmallVector.h:843
Module.h This file contains the declarations for the Module class.
const STC & getSubtarget(const Function &F) const
This method returns a pointer to the specified type of TargetSubtargetInfo.
static bool clobbersPhysReg(const uint32_t *RegMask, unsigned PhysReg)
clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
size_t size() const
Definition: Module.h:543
TargetSubtargetInfo - Generic base class for all target subtargets.
LLVM_ATTRIBUTE_ALWAYS_INLINE iterator end()
Definition: SmallVector.h:119
const std::vector< uint32_t > * getRegUsageInfo(const Function *FP)
To query stored RegMask for given Function *, it will return nullptr if function is not known...
This pass is required to take advantage of the interprocedural register allocation infrastructure...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:44
const char * getName(unsigned RegNo) const
Return the human-readable symbolic target-specific name for the specified physical register...
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
static GCRegistry::Add< ErlangGC > A("erlang","erlang-compatible garbage collector")