ReachingDefAnalysis.cpp 6.8 KB

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