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,6 +54,16 @@ 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+ return false ;
65+ }
66+
5167void ReachingDefAnalysis::enterBasicBlock (MachineBasicBlock *MBB) {
5268 unsigned MBBNumber = MBB->getNumber ();
5369 assert (MBBNumber < MBBReachingDefs.numBlockIDs () &&
@@ -126,6 +142,22 @@ void ReachingDefAnalysis::processDefs(MachineInstr *MI) {
126142 " Unexpected basic block number." );
127143
128144 for (auto &MO : MI->operands ()) {
145+ if (MO.isFI ()) {
146+ int FrameIndex = MO.getIndex ();
147+ assert (FrameIndex >= 0 && " Can't handle negative frame indicies yet!" );
148+ if (!isFIDef (*MI, FrameIndex, TII))
149+ continue ;
150+ if (MBBFrameObjsReachingDefs.contains (MBBNumber)) {
151+ auto Frame2InstrIdx = MBBFrameObjsReachingDefs[MBBNumber];
152+ if (Frame2InstrIdx.count (FrameIndex - ObjectIndexBegin) > 0 )
153+ Frame2InstrIdx[FrameIndex - ObjectIndexBegin].push_back (CurInstr);
154+ else
155+ Frame2InstrIdx[FrameIndex - ObjectIndexBegin] = {CurInstr};
156+ } else {
157+ MBBFrameObjsReachingDefs[MBBNumber] = {
158+ {FrameIndex - ObjectIndexBegin, {CurInstr}}};
159+ }
160+ }
129161 if (!isValidRegDef (MO))
130162 continue ;
131163 for (MCRegUnit Unit : TRI->regunits (MO.getReg ().asMCReg ())) {
@@ -209,19 +241,62 @@ void ReachingDefAnalysis::processBasicBlock(
209241 leaveBasicBlock (MBB);
210242}
211243
244+ void ReachingDefAnalysis::printAllReachingDefs (MachineFunction &MF) {
245+ dbgs () << " RDA results for " << MF.getName () << " \n " ;
246+ int Num = 0 ;
247+ DenseMap<MachineInstr *, int > InstToNumMap;
248+ SmallPtrSet<MachineInstr *, 2 > Defs;
249+ for (MachineBasicBlock &MBB : MF) {
250+ for (MachineInstr &MI : MBB) {
251+ for (MachineOperand &MO : MI.operands ()) {
252+ Register Reg;
253+ if (MO.isFI ()) {
254+ int FrameIndex = MO.getIndex ();
255+ assert (FrameIndex >= 0 &&
256+ " Can't handle negative frame indicies yet!" );
257+ Reg = Register::index2StackSlot (FrameIndex);
258+ } else if (MO.isReg ()) {
259+ if (MO.isDef ())
260+ continue ;
261+ Reg = MO.getReg ();
262+ if (!Reg.isValid ())
263+ continue ;
264+ } else
265+ continue ;
266+ Defs.clear ();
267+ getGlobalReachingDefs (&MI, Reg, Defs);
268+ MO.print (dbgs (), TRI);
269+ dbgs () << " :{ " ;
270+ for (MachineInstr *Def : Defs)
271+ dbgs () << InstToNumMap[Def] << " " ;
272+ dbgs () << " }\n " ;
273+ }
274+ dbgs () << Num << " : " << MI << " \n " ;
275+ InstToNumMap[&MI] = Num;
276+ ++Num;
277+ }
278+ }
279+ }
280+
212281bool ReachingDefAnalysis::runOnMachineFunction (MachineFunction &mf) {
213282 MF = &mf;
214283 TRI = MF->getSubtarget ().getRegisterInfo ();
284+ const TargetSubtargetInfo &STI = MF->getSubtarget ();
285+ TRI = STI.getRegisterInfo ();
286+ TII = STI.getInstrInfo ();
215287 LLVM_DEBUG (dbgs () << " ********** REACHING DEFINITION ANALYSIS **********\n " );
216288 init ();
217289 traverse ();
290+ if (PrintAllReachingDefs)
291+ printAllReachingDefs (*MF);
218292 return false ;
219293}
220294
221295void ReachingDefAnalysis::releaseMemory () {
222296 // Clear the internal vectors.
223297 MBBOutRegsInfos.clear ();
224298 MBBReachingDefs.clear ();
299+ MBBFrameObjsReachingDefs.clear ();
225300 InstIds.clear ();
226301 LiveRegs.clear ();
227302}
@@ -234,6 +309,8 @@ void ReachingDefAnalysis::reset() {
234309
235310void ReachingDefAnalysis::init () {
236311 NumRegUnits = TRI->getNumRegUnits ();
312+ NumStackObjects = MF->getFrameInfo ().getNumObjects ();
313+ ObjectIndexBegin = MF->getFrameInfo ().getObjectIndexBegin ();
237314 MBBReachingDefs.init (MF->getNumBlockIDs ());
238315 // Initialize the MBBOutRegsInfos
239316 MBBOutRegsInfos.resize (MF->getNumBlockIDs ());
@@ -268,6 +345,19 @@ int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, Register Reg) const {
268345 assert (MBBNumber < MBBReachingDefs.numBlockIDs () &&
269346 " Unexpected basic block number." );
270347 int LatestDef = ReachingDefDefaultVal;
348+
349+ if (Register::isStackSlot (Reg)) {
350+ int FrameIndex = Register::stackSlot2Index (Reg);
351+ for (int Def : MBBFrameObjsReachingDefs.lookup (MBBNumber).lookup (
352+ FrameIndex - ObjectIndexBegin)) {
353+ if (Def >= InstId)
354+ break ;
355+ DefRes = Def;
356+ }
357+ LatestDef = std::max (LatestDef, DefRes);
358+ return LatestDef;
359+ }
360+
271361 for (MCRegUnit Unit : TRI->regunits (Reg)) {
272362 for (int Def : MBBReachingDefs.defs (MBBNumber, Unit)) {
273363 if (Def >= InstId)
@@ -419,7 +509,7 @@ void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB, Register Reg,
419509 VisitedBBs.insert (MBB);
420510 LiveRegUnits LiveRegs (*TRI);
421511 LiveRegs.addLiveOuts (*MBB);
422- if (LiveRegs.available (Reg))
512+ if (Register::isPhysicalRegister (Reg) && LiveRegs.available (Reg))
423513 return ;
424514
425515 if (auto *Def = getLocalLiveOutMIDef (MBB, Reg))
@@ -500,7 +590,7 @@ bool ReachingDefAnalysis::isReachingDefLiveOut(MachineInstr *MI,
500590 MachineBasicBlock *MBB = MI->getParent ();
501591 LiveRegUnits LiveRegs (*TRI);
502592 LiveRegs.addLiveOuts (*MBB);
503- if (LiveRegs.available (Reg))
593+ if (Register::isPhysicalRegister (Reg) && LiveRegs.available (Reg))
504594 return false ;
505595
506596 auto Last = MBB->getLastNonDebugInstr ();
@@ -520,14 +610,21 @@ MachineInstr *ReachingDefAnalysis::getLocalLiveOutMIDef(MachineBasicBlock *MBB,
520610 Register Reg) const {
521611 LiveRegUnits LiveRegs (*TRI);
522612 LiveRegs.addLiveOuts (*MBB);
523- if (LiveRegs.available (Reg))
613+ if (Register::isPhysicalRegister (Reg) && LiveRegs.available (Reg))
524614 return nullptr ;
525615
526616 auto Last = MBB->getLastNonDebugInstr ();
527617 if (Last == MBB->end ())
528618 return nullptr ;
529619
620+ if (Register::isStackSlot (Reg)) {
621+ int FrameIndex = Register::stackSlot2Index (Reg);
622+ if (isFIDef (*Last, FrameIndex, TII))
623+ return &*Last;
624+ }
625+
530626 int Def = getReachingDef (&*Last, Reg);
627+
531628 for (auto &MO : Last->operands ())
532629 if (isValidRegDefOf (MO, Reg, TRI))
533630 return &*Last;
0 commit comments