ReachingDefAnalysis.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. //===---- ReachingDefAnalysis.cpp - Reaching Def Analysis ---*- C++ -*-----===//
  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. #include "llvm/CodeGen/ReachingDefAnalysis.h"
  10. #include "llvm/CodeGen/TargetRegisterInfo.h"
  11. #include "llvm/CodeGen/TargetSubtargetInfo.h"
  12. using namespace llvm;
  13. #define DEBUG_TYPE "reaching-deps-analysis"
  14. char ReachingDefAnalysis::ID = 0;
  15. INITIALIZE_PASS(ReachingDefAnalysis, DEBUG_TYPE, "ReachingDefAnalysis", false,
  16. true)
  17. void ReachingDefAnalysis::enterBasicBlock(
  18. const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
  19. MachineBasicBlock *MBB = TraversedMBB.MBB;
  20. unsigned MBBNumber = MBB->getNumber();
  21. assert(MBBNumber < MBBReachingDefs.size() &&
  22. "Unexpected basic block number.");
  23. MBBReachingDefs[MBBNumber].resize(NumRegUnits);
  24. // Reset instruction counter in each basic block.
  25. CurInstr = 0;
  26. // Set up LiveRegs to represent registers entering MBB.
  27. // Default values are 'nothing happened a long time ago'.
  28. if (LiveRegs.empty())
  29. LiveRegs.assign(NumRegUnits, ReachingDefDefaultVal);
  30. // This is the entry block.
  31. if (MBB->pred_empty()) {
  32. for (const auto &LI : MBB->liveins()) {
  33. for (MCRegUnitIterator Unit(LI.PhysReg, TRI); Unit.isValid(); ++Unit) {
  34. // Treat function live-ins as if they were defined just before the first
  35. // instruction. Usually, function arguments are set up immediately
  36. // before the call.
  37. LiveRegs[*Unit] = -1;
  38. MBBReachingDefs[MBBNumber][*Unit].push_back(LiveRegs[*Unit]);
  39. }
  40. }
  41. DEBUG(dbgs() << printMBBReference(*MBB) << ": entry\n");
  42. return;
  43. }
  44. // Try to coalesce live-out registers from predecessors.
  45. for (MachineBasicBlock *pred : MBB->predecessors()) {
  46. assert(unsigned(pred->getNumber()) < MBBOutRegsInfos.size() &&
  47. "Should have pre-allocated MBBInfos for all MBBs");
  48. const LiveRegsDefInfo &Incoming = MBBOutRegsInfos[pred->getNumber()];
  49. // Incoming is null if this is a backedge from a BB
  50. // we haven't processed yet
  51. if (Incoming.empty())
  52. continue;
  53. for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit) {
  54. // Use the most recent predecessor def for each register.
  55. LiveRegs[Unit] = std::max(LiveRegs[Unit], Incoming[Unit]);
  56. if ((LiveRegs[Unit] != ReachingDefDefaultVal))
  57. MBBReachingDefs[MBBNumber][Unit].push_back(LiveRegs[Unit]);
  58. }
  59. }
  60. DEBUG(dbgs() << printMBBReference(*MBB)
  61. << (!TraversedMBB.IsDone ? ": incomplete\n"
  62. : ": all preds known\n"));
  63. }
  64. void ReachingDefAnalysis::leaveBasicBlock(
  65. const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
  66. assert(!LiveRegs.empty() && "Must enter basic block first.");
  67. unsigned MBBNumber = TraversedMBB.MBB->getNumber();
  68. assert(MBBNumber < MBBOutRegsInfos.size() &&
  69. "Unexpected basic block number.");
  70. // Save register clearances at end of MBB - used by enterBasicBlock().
  71. MBBOutRegsInfos[MBBNumber] = LiveRegs;
  72. // While processing the basic block, we kept `Def` relative to the start
  73. // of the basic block for convenience. However, future use of this information
  74. // only cares about the clearance from the end of the block, so adjust
  75. // everything to be relative to the end of the basic block.
  76. for (int &OutLiveReg : MBBOutRegsInfos[MBBNumber])
  77. OutLiveReg -= CurInstr;
  78. LiveRegs.clear();
  79. }
  80. void ReachingDefAnalysis::processDefs(MachineInstr *MI) {
  81. assert(!MI->isDebugInstr() && "Won't process debug instructions");
  82. unsigned MBBNumber = MI->getParent()->getNumber();
  83. assert(MBBNumber < MBBReachingDefs.size() &&
  84. "Unexpected basic block number.");
  85. const MCInstrDesc &MCID = MI->getDesc();
  86. for (unsigned i = 0,
  87. e = MI->isVariadic() ? MI->getNumOperands() : MCID.getNumDefs();
  88. i != e; ++i) {
  89. MachineOperand &MO = MI->getOperand(i);
  90. if (!MO.isReg() || !MO.getReg())
  91. continue;
  92. if (MO.isUse())
  93. continue;
  94. for (MCRegUnitIterator Unit(MO.getReg(), TRI); Unit.isValid(); ++Unit) {
  95. // This instruction explicitly defines the current reg unit.
  96. DEBUG(dbgs() << printReg(MO.getReg(), TRI) << ":\t" << CurInstr << '\t'
  97. << *MI);
  98. // How many instructions since this reg unit was last written?
  99. LiveRegs[*Unit] = CurInstr;
  100. MBBReachingDefs[MBBNumber][*Unit].push_back(CurInstr);
  101. }
  102. }
  103. InstIds[MI] = CurInstr;
  104. ++CurInstr;
  105. }
  106. void ReachingDefAnalysis::processBasicBlock(
  107. const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
  108. enterBasicBlock(TraversedMBB);
  109. for (MachineInstr &MI : *TraversedMBB.MBB) {
  110. if (!MI.isDebugInstr())
  111. processDefs(&MI);
  112. }
  113. leaveBasicBlock(TraversedMBB);
  114. }
  115. bool ReachingDefAnalysis::runOnMachineFunction(MachineFunction &mf) {
  116. if (skipFunction(mf.getFunction()))
  117. return false;
  118. MF = &mf;
  119. TRI = MF->getSubtarget().getRegisterInfo();
  120. LiveRegs.clear();
  121. NumRegUnits = TRI->getNumRegUnits();
  122. MBBReachingDefs.resize(mf.getNumBlockIDs());
  123. DEBUG(dbgs() << "********** REACHING DEFINITION ANALYSIS **********\n");
  124. // Initialize the MBBOutRegsInfos
  125. MBBOutRegsInfos.resize(mf.getNumBlockIDs());
  126. // Traverse the basic blocks.
  127. LoopTraversal Traversal;
  128. LoopTraversal::TraversalOrder TraversedMBBOrder = Traversal.traverse(mf);
  129. for (LoopTraversal::TraversedMBBInfo TraversedMBB : TraversedMBBOrder) {
  130. processBasicBlock(TraversedMBB);
  131. }
  132. // Sorting all reaching defs found for a ceartin reg unit in a given BB.
  133. for (MBBDefsInfo &MBBDefs : MBBReachingDefs) {
  134. for (MBBRegUnitDefs &RegUnitDefs : MBBDefs)
  135. llvm::sort(RegUnitDefs.begin(), RegUnitDefs.end());
  136. }
  137. return false;
  138. }
  139. void ReachingDefAnalysis::releaseMemory() {
  140. // Clear the internal vectors.
  141. MBBOutRegsInfos.clear();
  142. MBBReachingDefs.clear();
  143. InstIds.clear();
  144. }
  145. int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, int PhysReg) {
  146. assert(InstIds.count(MI) && "Unexpected machine instuction.");
  147. int InstId = InstIds[MI];
  148. int DefRes = ReachingDefDefaultVal;
  149. unsigned MBBNumber = MI->getParent()->getNumber();
  150. assert(MBBNumber < MBBReachingDefs.size() &&
  151. "Unexpected basic block number.");
  152. int LatestDef = ReachingDefDefaultVal;
  153. for (MCRegUnitIterator Unit(PhysReg, TRI); Unit.isValid(); ++Unit) {
  154. for (int Def : MBBReachingDefs[MBBNumber][*Unit]) {
  155. if (Def >= InstId)
  156. break;
  157. DefRes = Def;
  158. }
  159. LatestDef = std::max(LatestDef, DefRes);
  160. }
  161. return LatestDef;
  162. }
  163. int ReachingDefAnalysis::getClearance(MachineInstr *MI, MCPhysReg PhysReg) {
  164. assert(InstIds.count(MI) && "Unexpected machine instuction.");
  165. return InstIds[MI] - getReachingDef(MI, PhysReg);
  166. }