1010#include " llvm/ADT/SetOperations.h"
1111#include " llvm/ADT/SmallSet.h"
1212#include " llvm/CodeGen/LiveRegUnits.h"
13+ #include " llvm/CodeGen/MachineFrameInfo.h"
14+ #include " llvm/CodeGen/TargetInstrInfo.h"
1315#include " llvm/CodeGen/TargetRegisterInfo.h"
1416#include " llvm/CodeGen/TargetSubtargetInfo.h"
1517#include " llvm/Support/Debug.h"
@@ -18,6 +20,10 @@ using namespace llvm;
1820
1921#define DEBUG_TYPE " reaching-defs-analysis"
2022
23+ static cl::opt<bool > PrintAllReachingDefs (" print-all-reaching-defs" , cl::Hidden,
24+ cl::desc (" Used for test purpuses" ),
25+ cl::Hidden);
26+
2127char ReachingDefAnalysis::ID = 0 ;
2228INITIALIZE_PASS (ReachingDefAnalysis, DEBUG_TYPE, " ReachingDefAnalysis" , false ,
2329 true )
@@ -48,12 +54,25 @@ static bool isValidRegDefOf(const MachineOperand &MO, Register Reg,
4854 return TRI->regsOverlap (MO.getReg (), Reg);
4955}
5056
57+ static bool isFIDef (const MachineInstr &MI, int FrameIndex,
58+ const TargetInstrInfo *TII) {
59+ int DefFrameIndex = 0 ;
60+ int SrcFrameIndex = 0 ;
61+ if (TII->isStoreToStackSlot (MI, DefFrameIndex) ||
62+ TII->isStackSlotCopy (MI, DefFrameIndex, SrcFrameIndex)) {
63+ return DefFrameIndex == FrameIndex;
64+ }
65+ return false ;
66+ }
67+
5168void ReachingDefAnalysis::enterBasicBlock (MachineBasicBlock *MBB) {
5269 unsigned MBBNumber = MBB->getNumber ();
5370 assert (MBBNumber < MBBReachingDefs.numBlockIDs () &&
5471 " Unexpected basic block number." );
5572 MBBReachingDefs.startBasicBlock (MBBNumber, NumRegUnits);
5673
74+ MBBFrameObjsReachingDefs[MBBNumber].resize (NumStackObjects, {-1 });
75+
5776 // Reset instruction counter in each basic block.
5877 CurInstr = 0 ;
5978
@@ -126,6 +145,14 @@ void ReachingDefAnalysis::processDefs(MachineInstr *MI) {
126145 " Unexpected basic block number." );
127146
128147 for (auto &MO : MI->operands ()) {
148+ if (MO.isFI ()) {
149+ int FrameIndex = MO.getIndex ();
150+ assert (FrameIndex >= 0 && " Can't handle negative frame indicies yet!" );
151+ if (!isFIDef (*MI, FrameIndex, TII))
152+ continue ;
153+ MBBFrameObjsReachingDefs[MBBNumber][FrameIndex - ObjectIndexBegin]
154+ .push_back (CurInstr);
155+ }
129156 if (!isValidRegDef (MO))
130157 continue ;
131158 for (MCRegUnit Unit : TRI->regunits (MO.getReg ().asMCReg ())) {
@@ -209,19 +236,62 @@ void ReachingDefAnalysis::processBasicBlock(
209236 leaveBasicBlock (MBB);
210237}
211238
239+ void ReachingDefAnalysis::printAllReachingDefs (MachineFunction &MF) {
240+ dbgs () << " RDA results for " << MF.getName () << " \n " ;
241+ int Num = 0 ;
242+ DenseMap<MachineInstr *, int > InstToNumMap;
243+ SmallPtrSet<MachineInstr *, 2 > Defs;
244+ for (MachineBasicBlock &MBB : MF) {
245+ for (MachineInstr &MI : MBB) {
246+ for (MachineOperand &MO : MI.operands ()) {
247+ Register Reg;
248+ if (MO.isFI ()) {
249+ int FrameIndex = MO.getIndex ();
250+ assert (FrameIndex >= 0 &&
251+ " Can't handle negative frame indicies yet!" );
252+ Reg = Register::index2StackSlot (FrameIndex);
253+ } else if (MO.isReg ()) {
254+ if (MO.isDef ())
255+ continue ;
256+ Reg = MO.getReg ();
257+ if (!Reg.isValid ())
258+ continue ;
259+ } else
260+ continue ;
261+ Defs.clear ();
262+ getGlobalReachingDefs (&MI, Reg, Defs);
263+ MO.print (dbgs (), TRI);
264+ dbgs () << " :{ " ;
265+ for (MachineInstr *Def : Defs)
266+ dbgs () << InstToNumMap[Def] << " " ;
267+ dbgs () << " }\n " ;
268+ }
269+ dbgs () << Num << " : " << MI << " \n " ;
270+ InstToNumMap[&MI] = Num;
271+ ++Num;
272+ }
273+ }
274+ }
275+
212276bool ReachingDefAnalysis::runOnMachineFunction (MachineFunction &mf) {
213277 MF = &mf;
214278 TRI = MF->getSubtarget ().getRegisterInfo ();
279+ const TargetSubtargetInfo &STI = MF->getSubtarget ();
280+ TRI = STI.getRegisterInfo ();
281+ TII = STI.getInstrInfo ();
215282 LLVM_DEBUG (dbgs () << " ********** REACHING DEFINITION ANALYSIS **********\n " );
216283 init ();
217284 traverse ();
285+ if (PrintAllReachingDefs)
286+ printAllReachingDefs (*MF);
218287 return false ;
219288}
220289
221290void ReachingDefAnalysis::releaseMemory () {
222291 // Clear the internal vectors.
223292 MBBOutRegsInfos.clear ();
224293 MBBReachingDefs.clear ();
294+ MBBFrameObjsReachingDefs.clear ();
225295 InstIds.clear ();
226296 LiveRegs.clear ();
227297}
@@ -234,7 +304,10 @@ void ReachingDefAnalysis::reset() {
234304
235305void ReachingDefAnalysis::init () {
236306 NumRegUnits = TRI->getNumRegUnits ();
307+ NumStackObjects = MF->getFrameInfo ().getNumObjects ();
308+ ObjectIndexBegin = MF->getFrameInfo ().getObjectIndexBegin ();
237309 MBBReachingDefs.init (MF->getNumBlockIDs ());
310+ MBBFrameObjsReachingDefs.resize (MF->getNumBlockIDs ());
238311 // Initialize the MBBOutRegsInfos
239312 MBBOutRegsInfos.resize (MF->getNumBlockIDs ());
240313 LoopTraversal Traversal;
@@ -268,6 +341,19 @@ int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, Register Reg) const {
268341 assert (MBBNumber < MBBReachingDefs.numBlockIDs () &&
269342 " Unexpected basic block number." );
270343 int LatestDef = ReachingDefDefaultVal;
344+
345+ if (Register::isStackSlot (Reg)) {
346+ int FrameIndex = Register::stackSlot2Index (Reg);
347+ for (int Def :
348+ MBBFrameObjsReachingDefs[MBBNumber][FrameIndex - ObjectIndexBegin]) {
349+ if (Def >= InstId)
350+ break ;
351+ DefRes = Def;
352+ }
353+ LatestDef = std::max (LatestDef, DefRes);
354+ return LatestDef;
355+ }
356+
271357 for (MCRegUnit Unit : TRI->regunits (Reg)) {
272358 for (int Def : MBBReachingDefs.defs (MBBNumber, Unit)) {
273359 if (Def >= InstId)
@@ -419,7 +505,7 @@ void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB, Register Reg,
419505 VisitedBBs.insert (MBB);
420506 LiveRegUnits LiveRegs (*TRI);
421507 LiveRegs.addLiveOuts (*MBB);
422- if (LiveRegs.available (Reg))
508+ if (Register::isPhysicalRegister (Reg) && LiveRegs.available (Reg))
423509 return ;
424510
425511 if (auto *Def = getLocalLiveOutMIDef (MBB, Reg))
@@ -500,7 +586,7 @@ bool ReachingDefAnalysis::isReachingDefLiveOut(MachineInstr *MI,
500586 MachineBasicBlock *MBB = MI->getParent ();
501587 LiveRegUnits LiveRegs (*TRI);
502588 LiveRegs.addLiveOuts (*MBB);
503- if (LiveRegs.available (Reg))
589+ if (Register::isPhysicalRegister (Reg) && LiveRegs.available (Reg))
504590 return false ;
505591
506592 auto Last = MBB->getLastNonDebugInstr ();
@@ -520,14 +606,21 @@ MachineInstr *ReachingDefAnalysis::getLocalLiveOutMIDef(MachineBasicBlock *MBB,
520606 Register Reg) const {
521607 LiveRegUnits LiveRegs (*TRI);
522608 LiveRegs.addLiveOuts (*MBB);
523- if (LiveRegs.available (Reg))
609+ if (Register::isPhysicalRegister (Reg) && LiveRegs.available (Reg))
524610 return nullptr ;
525611
526612 auto Last = MBB->getLastNonDebugInstr ();
527613 if (Last == MBB->end ())
528614 return nullptr ;
529615
616+ if (Register::isStackSlot (Reg)) {
617+ int FrameIndex = Register::stackSlot2Index (Reg);
618+ if (isFIDef (*Last, FrameIndex, TII))
619+ return &*Last;
620+ }
621+
530622 int Def = getReachingDef (&*Last, Reg);
623+
531624 for (auto &MO : Last->operands ())
532625 if (isValidRegDefOf (MO, Reg, TRI))
533626 return &*Last;
0 commit comments