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