xref: /openbsd-src/gnu/llvm/llvm/lib/CodeGen/ReachingDefAnalysis.cpp (revision 09467b48e8bc8b4905716062da846024139afbf2)
1*09467b48Spatrick //===---- ReachingDefAnalysis.cpp - Reaching Def Analysis ---*- C++ -*-----===//
2*09467b48Spatrick //
3*09467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*09467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*09467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*09467b48Spatrick //
7*09467b48Spatrick //===----------------------------------------------------------------------===//
8*09467b48Spatrick 
9*09467b48Spatrick #include "llvm/CodeGen/LivePhysRegs.h"
10*09467b48Spatrick #include "llvm/CodeGen/ReachingDefAnalysis.h"
11*09467b48Spatrick #include "llvm/CodeGen/TargetRegisterInfo.h"
12*09467b48Spatrick #include "llvm/CodeGen/TargetSubtargetInfo.h"
13*09467b48Spatrick #include "llvm/Support/Debug.h"
14*09467b48Spatrick 
15*09467b48Spatrick using namespace llvm;
16*09467b48Spatrick 
17*09467b48Spatrick #define DEBUG_TYPE "reaching-deps-analysis"
18*09467b48Spatrick 
19*09467b48Spatrick char ReachingDefAnalysis::ID = 0;
20*09467b48Spatrick INITIALIZE_PASS(ReachingDefAnalysis, DEBUG_TYPE, "ReachingDefAnalysis", false,
21*09467b48Spatrick                 true)
22*09467b48Spatrick 
23*09467b48Spatrick void ReachingDefAnalysis::enterBasicBlock(
24*09467b48Spatrick     const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
25*09467b48Spatrick 
26*09467b48Spatrick   MachineBasicBlock *MBB = TraversedMBB.MBB;
27*09467b48Spatrick   unsigned MBBNumber = MBB->getNumber();
28*09467b48Spatrick   assert(MBBNumber < MBBReachingDefs.size() &&
29*09467b48Spatrick          "Unexpected basic block number.");
30*09467b48Spatrick   MBBReachingDefs[MBBNumber].resize(NumRegUnits);
31*09467b48Spatrick 
32*09467b48Spatrick   // Reset instruction counter in each basic block.
33*09467b48Spatrick   CurInstr = 0;
34*09467b48Spatrick 
35*09467b48Spatrick   // Set up LiveRegs to represent registers entering MBB.
36*09467b48Spatrick   // Default values are 'nothing happened a long time ago'.
37*09467b48Spatrick   if (LiveRegs.empty())
38*09467b48Spatrick     LiveRegs.assign(NumRegUnits, ReachingDefDefaultVal);
39*09467b48Spatrick 
40*09467b48Spatrick   // This is the entry block.
41*09467b48Spatrick   if (MBB->pred_empty()) {
42*09467b48Spatrick     for (const auto &LI : MBB->liveins()) {
43*09467b48Spatrick       for (MCRegUnitIterator Unit(LI.PhysReg, TRI); Unit.isValid(); ++Unit) {
44*09467b48Spatrick         // Treat function live-ins as if they were defined just before the first
45*09467b48Spatrick         // instruction.  Usually, function arguments are set up immediately
46*09467b48Spatrick         // before the call.
47*09467b48Spatrick         LiveRegs[*Unit] = -1;
48*09467b48Spatrick         MBBReachingDefs[MBBNumber][*Unit].push_back(LiveRegs[*Unit]);
49*09467b48Spatrick       }
50*09467b48Spatrick     }
51*09467b48Spatrick     LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << ": entry\n");
52*09467b48Spatrick     return;
53*09467b48Spatrick   }
54*09467b48Spatrick 
55*09467b48Spatrick   // Try to coalesce live-out registers from predecessors.
56*09467b48Spatrick   for (MachineBasicBlock *pred : MBB->predecessors()) {
57*09467b48Spatrick     assert(unsigned(pred->getNumber()) < MBBOutRegsInfos.size() &&
58*09467b48Spatrick            "Should have pre-allocated MBBInfos for all MBBs");
59*09467b48Spatrick     const LiveRegsDefInfo &Incoming = MBBOutRegsInfos[pred->getNumber()];
60*09467b48Spatrick     // Incoming is null if this is a backedge from a BB
61*09467b48Spatrick     // we haven't processed yet
62*09467b48Spatrick     if (Incoming.empty())
63*09467b48Spatrick       continue;
64*09467b48Spatrick 
65*09467b48Spatrick     for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit) {
66*09467b48Spatrick       // Use the most recent predecessor def for each register.
67*09467b48Spatrick       LiveRegs[Unit] = std::max(LiveRegs[Unit], Incoming[Unit]);
68*09467b48Spatrick       if ((LiveRegs[Unit] != ReachingDefDefaultVal))
69*09467b48Spatrick         MBBReachingDefs[MBBNumber][Unit].push_back(LiveRegs[Unit]);
70*09467b48Spatrick     }
71*09467b48Spatrick   }
72*09467b48Spatrick 
73*09467b48Spatrick   LLVM_DEBUG(dbgs() << printMBBReference(*MBB)
74*09467b48Spatrick                     << (!TraversedMBB.IsDone ? ": incomplete\n"
75*09467b48Spatrick                                              : ": all preds known\n"));
76*09467b48Spatrick }
77*09467b48Spatrick 
78*09467b48Spatrick void ReachingDefAnalysis::leaveBasicBlock(
79*09467b48Spatrick     const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
80*09467b48Spatrick   assert(!LiveRegs.empty() && "Must enter basic block first.");
81*09467b48Spatrick   unsigned MBBNumber = TraversedMBB.MBB->getNumber();
82*09467b48Spatrick   assert(MBBNumber < MBBOutRegsInfos.size() &&
83*09467b48Spatrick          "Unexpected basic block number.");
84*09467b48Spatrick   // Save register clearances at end of MBB - used by enterBasicBlock().
85*09467b48Spatrick   MBBOutRegsInfos[MBBNumber] = LiveRegs;
86*09467b48Spatrick 
87*09467b48Spatrick   // While processing the basic block, we kept `Def` relative to the start
88*09467b48Spatrick   // of the basic block for convenience. However, future use of this information
89*09467b48Spatrick   // only cares about the clearance from the end of the block, so adjust
90*09467b48Spatrick   // everything to be relative to the end of the basic block.
91*09467b48Spatrick   for (int &OutLiveReg : MBBOutRegsInfos[MBBNumber])
92*09467b48Spatrick     OutLiveReg -= CurInstr;
93*09467b48Spatrick   LiveRegs.clear();
94*09467b48Spatrick }
95*09467b48Spatrick 
96*09467b48Spatrick void ReachingDefAnalysis::processDefs(MachineInstr *MI) {
97*09467b48Spatrick   assert(!MI->isDebugInstr() && "Won't process debug instructions");
98*09467b48Spatrick 
99*09467b48Spatrick   unsigned MBBNumber = MI->getParent()->getNumber();
100*09467b48Spatrick   assert(MBBNumber < MBBReachingDefs.size() &&
101*09467b48Spatrick          "Unexpected basic block number.");
102*09467b48Spatrick   const MCInstrDesc &MCID = MI->getDesc();
103*09467b48Spatrick   for (unsigned i = 0,
104*09467b48Spatrick                 e = MI->isVariadic() ? MI->getNumOperands() : MCID.getNumDefs();
105*09467b48Spatrick        i != e; ++i) {
106*09467b48Spatrick     MachineOperand &MO = MI->getOperand(i);
107*09467b48Spatrick     if (!MO.isReg() || !MO.getReg())
108*09467b48Spatrick       continue;
109*09467b48Spatrick     if (MO.isUse())
110*09467b48Spatrick       continue;
111*09467b48Spatrick     for (MCRegUnitIterator Unit(MO.getReg(), TRI); Unit.isValid(); ++Unit) {
112*09467b48Spatrick       // This instruction explicitly defines the current reg unit.
113*09467b48Spatrick       LLVM_DEBUG(dbgs() << printReg(MO.getReg(), TRI) << ":\t" << CurInstr
114*09467b48Spatrick                         << '\t' << *MI);
115*09467b48Spatrick 
116*09467b48Spatrick       // How many instructions since this reg unit was last written?
117*09467b48Spatrick       LiveRegs[*Unit] = CurInstr;
118*09467b48Spatrick       MBBReachingDefs[MBBNumber][*Unit].push_back(CurInstr);
119*09467b48Spatrick     }
120*09467b48Spatrick   }
121*09467b48Spatrick   InstIds[MI] = CurInstr;
122*09467b48Spatrick   ++CurInstr;
123*09467b48Spatrick }
124*09467b48Spatrick 
125*09467b48Spatrick void ReachingDefAnalysis::processBasicBlock(
126*09467b48Spatrick     const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
127*09467b48Spatrick   enterBasicBlock(TraversedMBB);
128*09467b48Spatrick   for (MachineInstr &MI : *TraversedMBB.MBB) {
129*09467b48Spatrick     if (!MI.isDebugInstr())
130*09467b48Spatrick       processDefs(&MI);
131*09467b48Spatrick   }
132*09467b48Spatrick   leaveBasicBlock(TraversedMBB);
133*09467b48Spatrick }
134*09467b48Spatrick 
135*09467b48Spatrick bool ReachingDefAnalysis::runOnMachineFunction(MachineFunction &mf) {
136*09467b48Spatrick   MF = &mf;
137*09467b48Spatrick   TRI = MF->getSubtarget().getRegisterInfo();
138*09467b48Spatrick 
139*09467b48Spatrick   LiveRegs.clear();
140*09467b48Spatrick   NumRegUnits = TRI->getNumRegUnits();
141*09467b48Spatrick 
142*09467b48Spatrick   MBBReachingDefs.resize(mf.getNumBlockIDs());
143*09467b48Spatrick 
144*09467b48Spatrick   LLVM_DEBUG(dbgs() << "********** REACHING DEFINITION ANALYSIS **********\n");
145*09467b48Spatrick 
146*09467b48Spatrick   // Initialize the MBBOutRegsInfos
147*09467b48Spatrick   MBBOutRegsInfos.resize(mf.getNumBlockIDs());
148*09467b48Spatrick 
149*09467b48Spatrick   // Traverse the basic blocks.
150*09467b48Spatrick   LoopTraversal Traversal;
151*09467b48Spatrick   LoopTraversal::TraversalOrder TraversedMBBOrder = Traversal.traverse(mf);
152*09467b48Spatrick   for (LoopTraversal::TraversedMBBInfo TraversedMBB : TraversedMBBOrder) {
153*09467b48Spatrick     processBasicBlock(TraversedMBB);
154*09467b48Spatrick   }
155*09467b48Spatrick 
156*09467b48Spatrick   // Sorting all reaching defs found for a ceartin reg unit in a given BB.
157*09467b48Spatrick   for (MBBDefsInfo &MBBDefs : MBBReachingDefs) {
158*09467b48Spatrick     for (MBBRegUnitDefs &RegUnitDefs : MBBDefs)
159*09467b48Spatrick       llvm::sort(RegUnitDefs);
160*09467b48Spatrick   }
161*09467b48Spatrick 
162*09467b48Spatrick   return false;
163*09467b48Spatrick }
164*09467b48Spatrick 
165*09467b48Spatrick void ReachingDefAnalysis::releaseMemory() {
166*09467b48Spatrick   // Clear the internal vectors.
167*09467b48Spatrick   MBBOutRegsInfos.clear();
168*09467b48Spatrick   MBBReachingDefs.clear();
169*09467b48Spatrick   InstIds.clear();
170*09467b48Spatrick }
171*09467b48Spatrick 
172*09467b48Spatrick int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, int PhysReg) {
173*09467b48Spatrick   assert(InstIds.count(MI) && "Unexpected machine instuction.");
174*09467b48Spatrick   int InstId = InstIds[MI];
175*09467b48Spatrick   int DefRes = ReachingDefDefaultVal;
176*09467b48Spatrick   unsigned MBBNumber = MI->getParent()->getNumber();
177*09467b48Spatrick   assert(MBBNumber < MBBReachingDefs.size() &&
178*09467b48Spatrick          "Unexpected basic block number.");
179*09467b48Spatrick   int LatestDef = ReachingDefDefaultVal;
180*09467b48Spatrick   for (MCRegUnitIterator Unit(PhysReg, TRI); Unit.isValid(); ++Unit) {
181*09467b48Spatrick     for (int Def : MBBReachingDefs[MBBNumber][*Unit]) {
182*09467b48Spatrick       if (Def >= InstId)
183*09467b48Spatrick         break;
184*09467b48Spatrick       DefRes = Def;
185*09467b48Spatrick     }
186*09467b48Spatrick     LatestDef = std::max(LatestDef, DefRes);
187*09467b48Spatrick   }
188*09467b48Spatrick   return LatestDef;
189*09467b48Spatrick }
190*09467b48Spatrick 
191*09467b48Spatrick MachineInstr* ReachingDefAnalysis::getReachingMIDef(MachineInstr *MI, int PhysReg) {
192*09467b48Spatrick   return getInstFromId(MI->getParent(), getReachingDef(MI, PhysReg));
193*09467b48Spatrick }
194*09467b48Spatrick 
195*09467b48Spatrick bool ReachingDefAnalysis::hasSameReachingDef(MachineInstr *A, MachineInstr *B,
196*09467b48Spatrick                                              int PhysReg) {
197*09467b48Spatrick   MachineBasicBlock *ParentA = A->getParent();
198*09467b48Spatrick   MachineBasicBlock *ParentB = B->getParent();
199*09467b48Spatrick   if (ParentA != ParentB)
200*09467b48Spatrick     return false;
201*09467b48Spatrick 
202*09467b48Spatrick   return getReachingDef(A, PhysReg) == getReachingDef(B, PhysReg);
203*09467b48Spatrick }
204*09467b48Spatrick 
205*09467b48Spatrick MachineInstr *ReachingDefAnalysis::getInstFromId(MachineBasicBlock *MBB,
206*09467b48Spatrick                                                  int InstId) {
207*09467b48Spatrick   assert(static_cast<size_t>(MBB->getNumber()) < MBBReachingDefs.size() &&
208*09467b48Spatrick          "Unexpected basic block number.");
209*09467b48Spatrick   assert(InstId < static_cast<int>(MBB->size()) &&
210*09467b48Spatrick          "Unexpected instruction id.");
211*09467b48Spatrick 
212*09467b48Spatrick   if (InstId < 0)
213*09467b48Spatrick     return nullptr;
214*09467b48Spatrick 
215*09467b48Spatrick   for (auto &MI : *MBB) {
216*09467b48Spatrick     if (InstIds.count(&MI) && InstIds[&MI] == InstId)
217*09467b48Spatrick       return &MI;
218*09467b48Spatrick   }
219*09467b48Spatrick   return nullptr;
220*09467b48Spatrick }
221*09467b48Spatrick 
222*09467b48Spatrick int ReachingDefAnalysis::getClearance(MachineInstr *MI, MCPhysReg PhysReg) {
223*09467b48Spatrick   assert(InstIds.count(MI) && "Unexpected machine instuction.");
224*09467b48Spatrick   return InstIds[MI] - getReachingDef(MI, PhysReg);
225*09467b48Spatrick }
226*09467b48Spatrick 
227*09467b48Spatrick void ReachingDefAnalysis::getReachingLocalUses(MachineInstr *Def, int PhysReg,
228*09467b48Spatrick     SmallVectorImpl<MachineInstr*> &Uses) {
229*09467b48Spatrick   MachineBasicBlock *MBB = Def->getParent();
230*09467b48Spatrick   MachineBasicBlock::iterator MI = MachineBasicBlock::iterator(Def);
231*09467b48Spatrick   while (++MI != MBB->end()) {
232*09467b48Spatrick     // If/when we find a new reaching def, we know that there's no more uses
233*09467b48Spatrick     // of 'Def'.
234*09467b48Spatrick     if (getReachingMIDef(&*MI, PhysReg) != Def)
235*09467b48Spatrick       return;
236*09467b48Spatrick 
237*09467b48Spatrick     for (auto &MO : MI->operands()) {
238*09467b48Spatrick       if (!MO.isReg() || !MO.isUse() || MO.getReg() != PhysReg)
239*09467b48Spatrick         continue;
240*09467b48Spatrick 
241*09467b48Spatrick       Uses.push_back(&*MI);
242*09467b48Spatrick       if (MO.isKill())
243*09467b48Spatrick         return;
244*09467b48Spatrick     }
245*09467b48Spatrick   }
246*09467b48Spatrick }
247*09467b48Spatrick 
248*09467b48Spatrick unsigned ReachingDefAnalysis::getNumUses(MachineInstr *Def, int PhysReg) {
249*09467b48Spatrick   SmallVector<MachineInstr*, 4> Uses;
250*09467b48Spatrick   getReachingLocalUses(Def, PhysReg, Uses);
251*09467b48Spatrick   return Uses.size();
252*09467b48Spatrick }
253*09467b48Spatrick 
254*09467b48Spatrick bool ReachingDefAnalysis::isRegUsedAfter(MachineInstr *MI, int PhysReg) {
255*09467b48Spatrick   MachineBasicBlock *MBB = MI->getParent();
256*09467b48Spatrick   LivePhysRegs LiveRegs(*TRI);
257*09467b48Spatrick   LiveRegs.addLiveOuts(*MBB);
258*09467b48Spatrick 
259*09467b48Spatrick   // Yes if the register is live out of the basic block.
260*09467b48Spatrick   if (LiveRegs.contains(PhysReg))
261*09467b48Spatrick     return true;
262*09467b48Spatrick 
263*09467b48Spatrick   // Walk backwards through the block to see if the register is live at some
264*09467b48Spatrick   // point.
265*09467b48Spatrick   for (auto Last = MBB->rbegin(), End = MBB->rend(); Last != End; ++Last) {
266*09467b48Spatrick     LiveRegs.stepBackward(*Last);
267*09467b48Spatrick     if (LiveRegs.contains(PhysReg))
268*09467b48Spatrick       return InstIds[&*Last] > InstIds[MI];
269*09467b48Spatrick   }
270*09467b48Spatrick   return false;
271*09467b48Spatrick }
272*09467b48Spatrick 
273*09467b48Spatrick bool ReachingDefAnalysis::isReachingDefLiveOut(MachineInstr *MI, int PhysReg) {
274*09467b48Spatrick   MachineBasicBlock *MBB = MI->getParent();
275*09467b48Spatrick   LivePhysRegs LiveRegs(*TRI);
276*09467b48Spatrick   LiveRegs.addLiveOuts(*MBB);
277*09467b48Spatrick   if (!LiveRegs.contains(PhysReg))
278*09467b48Spatrick     return false;
279*09467b48Spatrick 
280*09467b48Spatrick   MachineInstr *Last = &MBB->back();
281*09467b48Spatrick   int Def = getReachingDef(MI, PhysReg);
282*09467b48Spatrick   if (getReachingDef(Last, PhysReg) != Def)
283*09467b48Spatrick     return false;
284*09467b48Spatrick 
285*09467b48Spatrick   // Finally check that the last instruction doesn't redefine the register.
286*09467b48Spatrick   for (auto &MO : Last->operands())
287*09467b48Spatrick     if (MO.isReg() && MO.isDef() && MO.getReg() == PhysReg)
288*09467b48Spatrick       return false;
289*09467b48Spatrick 
290*09467b48Spatrick   return true;
291*09467b48Spatrick }
292*09467b48Spatrick 
293*09467b48Spatrick MachineInstr* ReachingDefAnalysis::getLocalLiveOutMIDef(MachineBasicBlock *MBB,
294*09467b48Spatrick                                                         int PhysReg) {
295*09467b48Spatrick   LivePhysRegs LiveRegs(*TRI);
296*09467b48Spatrick   LiveRegs.addLiveOuts(*MBB);
297*09467b48Spatrick   if (!LiveRegs.contains(PhysReg))
298*09467b48Spatrick     return nullptr;
299*09467b48Spatrick 
300*09467b48Spatrick   MachineInstr *Last = &MBB->back();
301*09467b48Spatrick   int Def = getReachingDef(Last, PhysReg);
302*09467b48Spatrick   for (auto &MO : Last->operands())
303*09467b48Spatrick     if (MO.isReg() && MO.isDef() && MO.getReg() == PhysReg)
304*09467b48Spatrick       return Last;
305*09467b48Spatrick 
306*09467b48Spatrick   return Def < 0 ? nullptr : getInstFromId(MBB, Def);
307*09467b48Spatrick }
308*09467b48Spatrick 
309*09467b48Spatrick MachineInstr *ReachingDefAnalysis::getInstWithUseBefore(MachineInstr *MI,
310*09467b48Spatrick     int PhysReg) {
311*09467b48Spatrick   auto I = MachineBasicBlock::reverse_iterator(MI);
312*09467b48Spatrick   auto E = MI->getParent()->rend();
313*09467b48Spatrick   I++;
314*09467b48Spatrick 
315*09467b48Spatrick   for ( ; I != E; I++)
316*09467b48Spatrick     for (auto &MO : I->operands())
317*09467b48Spatrick       if (MO.isReg() && MO.isUse() && MO.getReg() == PhysReg)
318*09467b48Spatrick         return &*I;
319*09467b48Spatrick 
320*09467b48Spatrick   return nullptr;
321*09467b48Spatrick }
322*09467b48Spatrick 
323*09467b48Spatrick void ReachingDefAnalysis::getAllInstWithUseBefore(MachineInstr *MI,
324*09467b48Spatrick     int PhysReg, SmallVectorImpl<MachineInstr*> &Uses) {
325*09467b48Spatrick   MachineInstr *Use = nullptr;
326*09467b48Spatrick   MachineInstr *Pos = MI;
327*09467b48Spatrick 
328*09467b48Spatrick   while ((Use = getInstWithUseBefore(Pos, PhysReg))) {
329*09467b48Spatrick     Uses.push_back(Use);
330*09467b48Spatrick     Pos = Use;
331*09467b48Spatrick   }
332*09467b48Spatrick }
333