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,14 @@ 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
+ 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
+ }
129
156
if (!isValidRegDef (MO))
130
157
continue ;
131
158
for (MCRegUnit Unit : TRI->regunits (MO.getReg ().asMCReg ())) {
@@ -209,19 +236,62 @@ void ReachingDefAnalysis::processBasicBlock(
209
236
leaveBasicBlock (MBB);
210
237
}
211
238
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
+
212
276
bool ReachingDefAnalysis::runOnMachineFunction (MachineFunction &mf) {
213
277
MF = &mf;
214
278
TRI = MF->getSubtarget ().getRegisterInfo ();
279
+ const TargetSubtargetInfo &STI = MF->getSubtarget ();
280
+ TRI = STI.getRegisterInfo ();
281
+ TII = STI.getInstrInfo ();
215
282
LLVM_DEBUG (dbgs () << " ********** REACHING DEFINITION ANALYSIS **********\n " );
216
283
init ();
217
284
traverse ();
285
+ if (PrintAllReachingDefs)
286
+ printAllReachingDefs (*MF);
218
287
return false ;
219
288
}
220
289
221
290
void ReachingDefAnalysis::releaseMemory () {
222
291
// Clear the internal vectors.
223
292
MBBOutRegsInfos.clear ();
224
293
MBBReachingDefs.clear ();
294
+ MBBFrameObjsReachingDefs.clear ();
225
295
InstIds.clear ();
226
296
LiveRegs.clear ();
227
297
}
@@ -234,7 +304,10 @@ void ReachingDefAnalysis::reset() {
234
304
235
305
void ReachingDefAnalysis::init () {
236
306
NumRegUnits = TRI->getNumRegUnits ();
307
+ NumStackObjects = MF->getFrameInfo ().getNumObjects ();
308
+ ObjectIndexBegin = MF->getFrameInfo ().getObjectIndexBegin ();
237
309
MBBReachingDefs.init (MF->getNumBlockIDs ());
310
+ MBBFrameObjsReachingDefs.resize (MF->getNumBlockIDs ());
238
311
// Initialize the MBBOutRegsInfos
239
312
MBBOutRegsInfos.resize (MF->getNumBlockIDs ());
240
313
LoopTraversal Traversal;
@@ -269,6 +342,19 @@ int ReachingDefAnalysis::getReachingDef(MachineInstr *MI,
269
342
assert (MBBNumber < MBBReachingDefs.numBlockIDs () &&
270
343
" Unexpected basic block number." );
271
344
int LatestDef = ReachingDefDefaultVal;
345
+
346
+ if (Register::isStackSlot (Reg)) {
347
+ int FrameIndex = Register::stackSlot2Index (Reg);
348
+ for (int Def :
349
+ MBBFrameObjsReachingDefs[MBBNumber][FrameIndex - ObjectIndexBegin]) {
350
+ if (Def >= InstId)
351
+ break ;
352
+ DefRes = Def;
353
+ }
354
+ LatestDef = std::max (LatestDef, DefRes);
355
+ return LatestDef;
356
+ }
357
+
272
358
for (MCRegUnit Unit : TRI->regunits (Reg)) {
273
359
for (int Def : MBBReachingDefs.defs (MBBNumber, Unit)) {
274
360
if (Def >= InstId)
@@ -422,7 +508,7 @@ void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB, MCRegister Reg,
422
508
VisitedBBs.insert (MBB);
423
509
LiveRegUnits LiveRegs (*TRI);
424
510
LiveRegs.addLiveOuts (*MBB);
425
- if (LiveRegs.available (Reg))
511
+ if (Register::isPhysicalRegister (Reg) && LiveRegs.available (Reg))
426
512
return ;
427
513
428
514
if (auto *Def = getLocalLiveOutMIDef (MBB, Reg))
@@ -505,7 +591,7 @@ bool ReachingDefAnalysis::isReachingDefLiveOut(MachineInstr *MI,
505
591
MachineBasicBlock *MBB = MI->getParent ();
506
592
LiveRegUnits LiveRegs (*TRI);
507
593
LiveRegs.addLiveOuts (*MBB);
508
- if (LiveRegs.available (Reg))
594
+ if (Register::isPhysicalRegister (Reg) && LiveRegs.available (Reg))
509
595
return false ;
510
596
511
597
auto Last = MBB->getLastNonDebugInstr ();
@@ -525,14 +611,21 @@ MachineInstr *ReachingDefAnalysis::getLocalLiveOutMIDef(MachineBasicBlock *MBB,
525
611
MCRegister Reg) const {
526
612
LiveRegUnits LiveRegs (*TRI);
527
613
LiveRegs.addLiveOuts (*MBB);
528
- if (LiveRegs.available (Reg))
614
+ if (Register::isPhysicalRegister (Reg) && LiveRegs.available (Reg))
529
615
return nullptr ;
530
616
531
617
auto Last = MBB->getLastNonDebugInstr ();
532
618
if (Last == MBB->end ())
533
619
return nullptr ;
534
620
621
+ if (Register::isStackSlot (Reg)) {
622
+ int FrameIndex = Register::stackSlot2Index (Reg);
623
+ if (isFIDef (*Last, FrameIndex, TII))
624
+ return &*Last;
625
+ }
626
+
535
627
int Def = getReachingDef (&*Last, Reg);
628
+
536
629
for (auto &MO : Last->operands ())
537
630
if (isValidRegDefOf (MO, Reg, TRI))
538
631
return &*Last;
0 commit comments