10
10
#include " llvm/ADT/SetOperations.h"
11
11
#include " llvm/ADT/SmallSet.h"
12
12
#include " llvm/CodeGen/LiveRegUnits.h"
13
+ #include " llvm/CodeGen/MachineFrameInfo.h"
14
+ #include " llvm/CodeGen/TargetInstrInfo.h"
13
15
#include " llvm/CodeGen/TargetRegisterInfo.h"
14
16
#include " llvm/CodeGen/TargetSubtargetInfo.h"
15
17
#include " llvm/Support/Debug.h"
@@ -18,6 +20,10 @@ using namespace llvm;
18
20
19
21
#define DEBUG_TYPE " reaching-defs-analysis"
20
22
23
+ static cl::opt<bool > PrintAllReachingDefs (" print-all-reaching-defs" , cl::Hidden,
24
+ cl::desc (" Used for test purpuses" ),
25
+ cl::Hidden);
26
+
21
27
char ReachingDefAnalysis::ID = 0 ;
22
28
INITIALIZE_PASS (ReachingDefAnalysis, DEBUG_TYPE, " ReachingDefAnalysis" , false ,
23
29
true )
@@ -48,12 +54,25 @@ static bool isValidRegDefOf(const MachineOperand &MO, MCRegister Reg,
48
54
return TRI->regsOverlap (MO.getReg (), Reg);
49
55
}
50
56
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
+
51
68
void ReachingDefAnalysis::enterBasicBlock (MachineBasicBlock *MBB) {
52
69
unsigned MBBNumber = MBB->getNumber ();
53
70
assert (MBBNumber < MBBReachingDefs.numBlockIDs () &&
54
71
" Unexpected basic block number." );
55
72
MBBReachingDefs.startBasicBlock (MBBNumber, NumRegUnits);
56
73
74
+ MBBFrameObjsReachingDefs[MBBNumber].resize (NumStackObjects, {-1 });
75
+
57
76
// Reset instruction counter in each basic block.
58
77
CurInstr = 0 ;
59
78
@@ -126,6 +145,13 @@ void ReachingDefAnalysis::processDefs(MachineInstr *MI) {
126
145
" Unexpected basic block number." );
127
146
128
147
for (auto &MO : MI->operands ()) {
148
+ if (MO.isFI ()) {
149
+ int FrameIndex = MO.getIndex ();
150
+ if (!isFIDef (*MI, FrameIndex, TII))
151
+ continue ;
152
+ MBBFrameObjsReachingDefs[MBBNumber][FrameIndex - ObjectIndexBegin]
153
+ .push_back (CurInstr);
154
+ }
129
155
if (!isValidRegDef (MO))
130
156
continue ;
131
157
for (MCRegUnit Unit : TRI->regunits (MO.getReg ().asMCReg ())) {
@@ -209,19 +235,62 @@ void ReachingDefAnalysis::processBasicBlock(
209
235
leaveBasicBlock (MBB);
210
236
}
211
237
238
+ void ReachingDefAnalysis::printAllReachingDefs (MachineFunction &MF) {
239
+ dbgs () << " RDA results for " << MF.getName () << " \n " ;
240
+ int Num = 0 ;
241
+ DenseMap<MachineInstr *, int > InstToNumMap;
242
+ SmallPtrSet<MachineInstr *, 2 > Defs;
243
+ for (MachineBasicBlock &MBB : MF) {
244
+ for (MachineInstr &MI : MBB) {
245
+ for (MachineOperand &MO : MI.operands ()) {
246
+ Register Reg;
247
+ if (MO.isFI ()) {
248
+ int FrameIndex = MO.getIndex ();
249
+ Reg = Register::index2StackSlot (FrameIndex);
250
+ } else if (MO.isReg ()) {
251
+ if (MO.isDef ())
252
+ continue ;
253
+ Reg = MO.getReg ();
254
+ if (Reg == MCRegister::NoRegister)
255
+ continue ;
256
+ } else {
257
+ continue ;
258
+ }
259
+ Defs.clear ();
260
+ getGlobalReachingDefs (&MI, Reg, Defs);
261
+ MO.print (dbgs (), TRI);
262
+ dbgs () << " :{ " ;
263
+ for (MachineInstr *Def : Defs) {
264
+ dbgs () << InstToNumMap[Def] << " " ;
265
+ }
266
+ dbgs () << " }\n " ;
267
+ }
268
+ dbgs () << Num << " : " << MI << " \n " ;
269
+ InstToNumMap[&MI] = Num;
270
+ ++Num;
271
+ }
272
+ }
273
+ }
274
+
212
275
bool ReachingDefAnalysis::runOnMachineFunction (MachineFunction &mf) {
213
276
MF = &mf;
214
277
TRI = MF->getSubtarget ().getRegisterInfo ();
278
+ const TargetSubtargetInfo &STI = MF->getSubtarget ();
279
+ TRI = STI.getRegisterInfo ();
280
+ TII = STI.getInstrInfo ();
215
281
LLVM_DEBUG (dbgs () << " ********** REACHING DEFINITION ANALYSIS **********\n " );
216
282
init ();
217
283
traverse ();
284
+ if (PrintAllReachingDefs)
285
+ printAllReachingDefs (*MF);
218
286
return false ;
219
287
}
220
288
221
289
void ReachingDefAnalysis::releaseMemory () {
222
290
// Clear the internal vectors.
223
291
MBBOutRegsInfos.clear ();
224
292
MBBReachingDefs.clear ();
293
+ MBBFrameObjsReachingDefs.clear ();
225
294
InstIds.clear ();
226
295
LiveRegs.clear ();
227
296
}
@@ -234,7 +303,10 @@ void ReachingDefAnalysis::reset() {
234
303
235
304
void ReachingDefAnalysis::init () {
236
305
NumRegUnits = TRI->getNumRegUnits ();
306
+ NumStackObjects = MF->getFrameInfo ().getNumObjects ();
307
+ ObjectIndexBegin = MF->getFrameInfo ().getObjectIndexBegin ();
237
308
MBBReachingDefs.init (MF->getNumBlockIDs ());
309
+ MBBFrameObjsReachingDefs.resize (MF->getNumBlockIDs ());
238
310
// Initialize the MBBOutRegsInfos
239
311
MBBOutRegsInfos.resize (MF->getNumBlockIDs ());
240
312
LoopTraversal Traversal;
@@ -269,6 +341,19 @@ int ReachingDefAnalysis::getReachingDef(MachineInstr *MI,
269
341
assert (MBBNumber < MBBReachingDefs.numBlockIDs () &&
270
342
" Unexpected basic block number." );
271
343
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
+
272
357
for (MCRegUnit Unit : TRI->regunits (Reg)) {
273
358
for (int Def : MBBReachingDefs.defs (MBBNumber, Unit)) {
274
359
if (Def >= InstId)
@@ -422,7 +507,7 @@ void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB, MCRegister Reg,
422
507
VisitedBBs.insert (MBB);
423
508
LiveRegUnits LiveRegs (*TRI);
424
509
LiveRegs.addLiveOuts (*MBB);
425
- if (LiveRegs.available (Reg))
510
+ if (Register::isPhysicalRegister (Reg) && LiveRegs.available (Reg))
426
511
return ;
427
512
428
513
if (auto *Def = getLocalLiveOutMIDef (MBB, Reg))
@@ -505,7 +590,7 @@ bool ReachingDefAnalysis::isReachingDefLiveOut(MachineInstr *MI,
505
590
MachineBasicBlock *MBB = MI->getParent ();
506
591
LiveRegUnits LiveRegs (*TRI);
507
592
LiveRegs.addLiveOuts (*MBB);
508
- if (LiveRegs.available (Reg))
593
+ if (Register::isPhysicalRegister (Reg) && LiveRegs.available (Reg))
509
594
return false ;
510
595
511
596
auto Last = MBB->getLastNonDebugInstr ();
@@ -525,14 +610,21 @@ MachineInstr *ReachingDefAnalysis::getLocalLiveOutMIDef(MachineBasicBlock *MBB,
525
610
MCRegister Reg) const {
526
611
LiveRegUnits LiveRegs (*TRI);
527
612
LiveRegs.addLiveOuts (*MBB);
528
- if (LiveRegs.available (Reg))
613
+ if (Register::isPhysicalRegister (Reg) && LiveRegs.available (Reg))
529
614
return nullptr ;
530
615
531
616
auto Last = MBB->getLastNonDebugInstr ();
532
617
if (Last == MBB->end ())
533
618
return nullptr ;
534
619
535
620
int Def = getReachingDef (&*Last, Reg);
621
+
622
+ if (Register::isStackSlot (Reg)) {
623
+ int FrameIndex = Register::stackSlot2Index (Reg);
624
+ if (isFIDef (*Last, FrameIndex, TII))
625
+ return &*Last;
626
+ }
627
+
536
628
for (auto &MO : Last->operands ())
537
629
if (isValidRegDefOf (MO, Reg, TRI))
538
630
return &*Last;
0 commit comments