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,6 +54,16 @@ static bool isValidRegDefOf(const MachineOperand &MO, Register 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
+ return false ;
65
+ }
66
+
51
67
void ReachingDefAnalysis::enterBasicBlock (MachineBasicBlock *MBB) {
52
68
unsigned MBBNumber = MBB->getNumber ();
53
69
assert (MBBNumber < MBBReachingDefs.numBlockIDs () &&
@@ -126,6 +142,22 @@ void ReachingDefAnalysis::processDefs(MachineInstr *MI) {
126
142
" Unexpected basic block number." );
127
143
128
144
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
+ }
129
161
if (!isValidRegDef (MO))
130
162
continue ;
131
163
for (MCRegUnit Unit : TRI->regunits (MO.getReg ().asMCReg ())) {
@@ -209,19 +241,62 @@ void ReachingDefAnalysis::processBasicBlock(
209
241
leaveBasicBlock (MBB);
210
242
}
211
243
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
+
212
281
bool ReachingDefAnalysis::runOnMachineFunction (MachineFunction &mf) {
213
282
MF = &mf;
214
283
TRI = MF->getSubtarget ().getRegisterInfo ();
284
+ const TargetSubtargetInfo &STI = MF->getSubtarget ();
285
+ TRI = STI.getRegisterInfo ();
286
+ TII = STI.getInstrInfo ();
215
287
LLVM_DEBUG (dbgs () << " ********** REACHING DEFINITION ANALYSIS **********\n " );
216
288
init ();
217
289
traverse ();
290
+ if (PrintAllReachingDefs)
291
+ printAllReachingDefs (*MF);
218
292
return false ;
219
293
}
220
294
221
295
void ReachingDefAnalysis::releaseMemory () {
222
296
// Clear the internal vectors.
223
297
MBBOutRegsInfos.clear ();
224
298
MBBReachingDefs.clear ();
299
+ MBBFrameObjsReachingDefs.clear ();
225
300
InstIds.clear ();
226
301
LiveRegs.clear ();
227
302
}
@@ -234,6 +309,8 @@ void ReachingDefAnalysis::reset() {
234
309
235
310
void ReachingDefAnalysis::init () {
236
311
NumRegUnits = TRI->getNumRegUnits ();
312
+ NumStackObjects = MF->getFrameInfo ().getNumObjects ();
313
+ ObjectIndexBegin = MF->getFrameInfo ().getObjectIndexBegin ();
237
314
MBBReachingDefs.init (MF->getNumBlockIDs ());
238
315
// Initialize the MBBOutRegsInfos
239
316
MBBOutRegsInfos.resize (MF->getNumBlockIDs ());
@@ -268,6 +345,19 @@ int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, Register Reg) const {
268
345
assert (MBBNumber < MBBReachingDefs.numBlockIDs () &&
269
346
" Unexpected basic block number." );
270
347
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
+
271
361
for (MCRegUnit Unit : TRI->regunits (Reg)) {
272
362
for (int Def : MBBReachingDefs.defs (MBBNumber, Unit)) {
273
363
if (Def >= InstId)
@@ -419,7 +509,7 @@ void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB, Register Reg,
419
509
VisitedBBs.insert (MBB);
420
510
LiveRegUnits LiveRegs (*TRI);
421
511
LiveRegs.addLiveOuts (*MBB);
422
- if (LiveRegs.available (Reg))
512
+ if (Register::isPhysicalRegister (Reg) && LiveRegs.available (Reg))
423
513
return ;
424
514
425
515
if (auto *Def = getLocalLiveOutMIDef (MBB, Reg))
@@ -500,7 +590,7 @@ bool ReachingDefAnalysis::isReachingDefLiveOut(MachineInstr *MI,
500
590
MachineBasicBlock *MBB = MI->getParent ();
501
591
LiveRegUnits LiveRegs (*TRI);
502
592
LiveRegs.addLiveOuts (*MBB);
503
- if (LiveRegs.available (Reg))
593
+ if (Register::isPhysicalRegister (Reg) && LiveRegs.available (Reg))
504
594
return false ;
505
595
506
596
auto Last = MBB->getLastNonDebugInstr ();
@@ -520,14 +610,21 @@ MachineInstr *ReachingDefAnalysis::getLocalLiveOutMIDef(MachineBasicBlock *MBB,
520
610
Register Reg) const {
521
611
LiveRegUnits LiveRegs (*TRI);
522
612
LiveRegs.addLiveOuts (*MBB);
523
- if (LiveRegs.available (Reg))
613
+ if (Register::isPhysicalRegister (Reg) && LiveRegs.available (Reg))
524
614
return nullptr ;
525
615
526
616
auto Last = MBB->getLastNonDebugInstr ();
527
617
if (Last == MBB->end ())
528
618
return nullptr ;
529
619
620
+ if (Register::isStackSlot (Reg)) {
621
+ int FrameIndex = Register::stackSlot2Index (Reg);
622
+ if (isFIDef (*Last, FrameIndex, TII))
623
+ return &*Last;
624
+ }
625
+
530
626
int Def = getReachingDef (&*Last, Reg);
627
+
531
628
for (auto &MO : Last->operands ())
532
629
if (isValidRegDefOf (MO, Reg, TRI))
533
630
return &*Last;
0 commit comments