1 //===---- ReachingDefAnalysis.cpp - Reaching Def Analysis ---*- C++ -*-----===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "llvm/ADT/SmallSet.h"
10 #include "llvm/ADT/SetOperations.h"
11 #include "llvm/CodeGen/LivePhysRegs.h"
12 #include "llvm/CodeGen/ReachingDefAnalysis.h"
13 #include "llvm/CodeGen/TargetRegisterInfo.h"
14 #include "llvm/CodeGen/TargetSubtargetInfo.h"
15 #include "llvm/Support/Debug.h"
19 #define DEBUG_TYPE "reaching-deps-analysis"
21 char ReachingDefAnalysis::ID
= 0;
22 INITIALIZE_PASS(ReachingDefAnalysis
, DEBUG_TYPE
, "ReachingDefAnalysis", false,
25 static bool isValidReg(const MachineOperand
&MO
) {
26 return MO
.isReg() && MO
.getReg();
29 static bool isValidRegUse(const MachineOperand
&MO
) {
30 return isValidReg(MO
) && MO
.isUse();
33 static bool isValidRegUseOf(const MachineOperand
&MO
, MCRegister PhysReg
,
34 const TargetRegisterInfo
*TRI
) {
35 if (!isValidRegUse(MO
))
37 if (MO
.getReg() == PhysReg
)
39 for (MCRegAliasIterator
R(PhysReg
, TRI
, false); R
.isValid(); ++R
)
40 if (MO
.getReg() == *R
)
45 static bool isValidRegDef(const MachineOperand
&MO
) {
46 return isValidReg(MO
) && MO
.isDef();
49 static bool isValidRegDefOf(const MachineOperand
&MO
, MCRegister PhysReg
,
50 const TargetRegisterInfo
*TRI
) {
51 if (!isValidRegDef(MO
))
53 if (MO
.getReg() == PhysReg
)
55 for (MCRegAliasIterator
R(PhysReg
, TRI
, false); R
.isValid(); ++R
)
56 if (MO
.getReg() == *R
)
61 void ReachingDefAnalysis::enterBasicBlock(MachineBasicBlock
*MBB
) {
62 unsigned MBBNumber
= MBB
->getNumber();
63 assert(MBBNumber
< MBBReachingDefs
.size() &&
64 "Unexpected basic block number.");
65 MBBReachingDefs
[MBBNumber
].resize(NumRegUnits
);
67 // Reset instruction counter in each basic block.
70 // Set up LiveRegs to represent registers entering MBB.
71 // Default values are 'nothing happened a long time ago'.
73 LiveRegs
.assign(NumRegUnits
, ReachingDefDefaultVal
);
75 // This is the entry block.
76 if (MBB
->pred_empty()) {
77 for (const auto &LI
: MBB
->liveins()) {
78 for (MCRegUnitIterator
Unit(LI
.PhysReg
, TRI
); Unit
.isValid(); ++Unit
) {
79 // Treat function live-ins as if they were defined just before the first
80 // instruction. Usually, function arguments are set up immediately
82 if (LiveRegs
[*Unit
] != -1) {
84 MBBReachingDefs
[MBBNumber
][*Unit
].push_back(-1);
88 LLVM_DEBUG(dbgs() << printMBBReference(*MBB
) << ": entry\n");
92 // Try to coalesce live-out registers from predecessors.
93 for (MachineBasicBlock
*pred
: MBB
->predecessors()) {
94 assert(unsigned(pred
->getNumber()) < MBBOutRegsInfos
.size() &&
95 "Should have pre-allocated MBBInfos for all MBBs");
96 const LiveRegsDefInfo
&Incoming
= MBBOutRegsInfos
[pred
->getNumber()];
97 // Incoming is null if this is a backedge from a BB
98 // we haven't processed yet
102 // Find the most recent reaching definition from a predecessor.
103 for (unsigned Unit
= 0; Unit
!= NumRegUnits
; ++Unit
)
104 LiveRegs
[Unit
] = std::max(LiveRegs
[Unit
], Incoming
[Unit
]);
107 // Insert the most recent reaching definition we found.
108 for (unsigned Unit
= 0; Unit
!= NumRegUnits
; ++Unit
)
109 if (LiveRegs
[Unit
] != ReachingDefDefaultVal
)
110 MBBReachingDefs
[MBBNumber
][Unit
].push_back(LiveRegs
[Unit
]);
113 void ReachingDefAnalysis::leaveBasicBlock(MachineBasicBlock
*MBB
) {
114 assert(!LiveRegs
.empty() && "Must enter basic block first.");
115 unsigned MBBNumber
= MBB
->getNumber();
116 assert(MBBNumber
< MBBOutRegsInfos
.size() &&
117 "Unexpected basic block number.");
118 // Save register clearances at end of MBB - used by enterBasicBlock().
119 MBBOutRegsInfos
[MBBNumber
] = LiveRegs
;
121 // While processing the basic block, we kept `Def` relative to the start
122 // of the basic block for convenience. However, future use of this information
123 // only cares about the clearance from the end of the block, so adjust
124 // everything to be relative to the end of the basic block.
125 for (int &OutLiveReg
: MBBOutRegsInfos
[MBBNumber
])
126 if (OutLiveReg
!= ReachingDefDefaultVal
)
127 OutLiveReg
-= CurInstr
;
131 void ReachingDefAnalysis::processDefs(MachineInstr
*MI
) {
132 assert(!MI
->isDebugInstr() && "Won't process debug instructions");
134 unsigned MBBNumber
= MI
->getParent()->getNumber();
135 assert(MBBNumber
< MBBReachingDefs
.size() &&
136 "Unexpected basic block number.");
138 for (auto &MO
: MI
->operands()) {
139 if (!isValidRegDef(MO
))
141 for (MCRegUnitIterator
Unit(MO
.getReg().asMCReg(), TRI
); Unit
.isValid();
143 // This instruction explicitly defines the current reg unit.
144 LLVM_DEBUG(dbgs() << printRegUnit(*Unit
, TRI
) << ":\t" << CurInstr
147 // How many instructions since this reg unit was last written?
148 if (LiveRegs
[*Unit
] != CurInstr
) {
149 LiveRegs
[*Unit
] = CurInstr
;
150 MBBReachingDefs
[MBBNumber
][*Unit
].push_back(CurInstr
);
154 InstIds
[MI
] = CurInstr
;
158 void ReachingDefAnalysis::reprocessBasicBlock(MachineBasicBlock
*MBB
) {
159 unsigned MBBNumber
= MBB
->getNumber();
160 assert(MBBNumber
< MBBReachingDefs
.size() &&
161 "Unexpected basic block number.");
163 // Count number of non-debug instructions for end of block adjustment.
165 instructionsWithoutDebug(MBB
->instr_begin(), MBB
->instr_end());
166 int NumInsts
= std::distance(NonDbgInsts
.begin(), NonDbgInsts
.end());
168 // When reprocessing a block, the only thing we need to do is check whether
169 // there is now a more recent incoming reaching definition from a predecessor.
170 for (MachineBasicBlock
*pred
: MBB
->predecessors()) {
171 assert(unsigned(pred
->getNumber()) < MBBOutRegsInfos
.size() &&
172 "Should have pre-allocated MBBInfos for all MBBs");
173 const LiveRegsDefInfo
&Incoming
= MBBOutRegsInfos
[pred
->getNumber()];
174 // Incoming may be empty for dead predecessors.
175 if (Incoming
.empty())
178 for (unsigned Unit
= 0; Unit
!= NumRegUnits
; ++Unit
) {
179 int Def
= Incoming
[Unit
];
180 if (Def
== ReachingDefDefaultVal
)
183 auto Start
= MBBReachingDefs
[MBBNumber
][Unit
].begin();
184 if (Start
!= MBBReachingDefs
[MBBNumber
][Unit
].end() && *Start
< 0) {
188 // Update existing reaching def from predecessor to a more recent one.
191 // Insert new reaching def from predecessor.
192 MBBReachingDefs
[MBBNumber
][Unit
].insert(Start
, Def
);
195 // Update reaching def at end of of BB. Keep in mind that these are
196 // adjusted relative to the end of the basic block.
197 if (MBBOutRegsInfos
[MBBNumber
][Unit
] < Def
- NumInsts
)
198 MBBOutRegsInfos
[MBBNumber
][Unit
] = Def
- NumInsts
;
203 void ReachingDefAnalysis::processBasicBlock(
204 const LoopTraversal::TraversedMBBInfo
&TraversedMBB
) {
205 MachineBasicBlock
*MBB
= TraversedMBB
.MBB
;
206 LLVM_DEBUG(dbgs() << printMBBReference(*MBB
)
207 << (!TraversedMBB
.IsDone
? ": incomplete\n"
208 : ": all preds known\n"));
210 if (!TraversedMBB
.PrimaryPass
) {
211 // Reprocess MBB that is part of a loop.
212 reprocessBasicBlock(MBB
);
216 enterBasicBlock(MBB
);
217 for (MachineInstr
&MI
:
218 instructionsWithoutDebug(MBB
->instr_begin(), MBB
->instr_end()))
220 leaveBasicBlock(MBB
);
223 bool ReachingDefAnalysis::runOnMachineFunction(MachineFunction
&mf
) {
225 TRI
= MF
->getSubtarget().getRegisterInfo();
226 LLVM_DEBUG(dbgs() << "********** REACHING DEFINITION ANALYSIS **********\n");
232 void ReachingDefAnalysis::releaseMemory() {
233 // Clear the internal vectors.
234 MBBOutRegsInfos
.clear();
235 MBBReachingDefs
.clear();
240 void ReachingDefAnalysis::reset() {
246 void ReachingDefAnalysis::init() {
247 NumRegUnits
= TRI
->getNumRegUnits();
248 MBBReachingDefs
.resize(MF
->getNumBlockIDs());
249 // Initialize the MBBOutRegsInfos
250 MBBOutRegsInfos
.resize(MF
->getNumBlockIDs());
251 LoopTraversal Traversal
;
252 TraversedMBBOrder
= Traversal
.traverse(*MF
);
255 void ReachingDefAnalysis::traverse() {
256 // Traverse the basic blocks.
257 for (LoopTraversal::TraversedMBBInfo TraversedMBB
: TraversedMBBOrder
)
258 processBasicBlock(TraversedMBB
);
260 // Make sure reaching defs are sorted and unique.
261 for (MBBDefsInfo
&MBBDefs
: MBBReachingDefs
) {
262 for (MBBRegUnitDefs
&RegUnitDefs
: MBBDefs
) {
263 int LastDef
= ReachingDefDefaultVal
;
264 for (int Def
: RegUnitDefs
) {
265 assert(Def
> LastDef
&& "Defs must be sorted and unique");
273 int ReachingDefAnalysis::getReachingDef(MachineInstr
*MI
,
274 MCRegister PhysReg
) const {
275 assert(InstIds
.count(MI
) && "Unexpected machine instuction.");
276 int InstId
= InstIds
.lookup(MI
);
277 int DefRes
= ReachingDefDefaultVal
;
278 unsigned MBBNumber
= MI
->getParent()->getNumber();
279 assert(MBBNumber
< MBBReachingDefs
.size() &&
280 "Unexpected basic block number.");
281 int LatestDef
= ReachingDefDefaultVal
;
282 for (MCRegUnitIterator
Unit(PhysReg
, TRI
); Unit
.isValid(); ++Unit
) {
283 for (int Def
: MBBReachingDefs
[MBBNumber
][*Unit
]) {
288 LatestDef
= std::max(LatestDef
, DefRes
);
294 ReachingDefAnalysis::getReachingLocalMIDef(MachineInstr
*MI
,
295 MCRegister PhysReg
) const {
296 return hasLocalDefBefore(MI
, PhysReg
)
297 ? getInstFromId(MI
->getParent(), getReachingDef(MI
, PhysReg
))
301 bool ReachingDefAnalysis::hasSameReachingDef(MachineInstr
*A
, MachineInstr
*B
,
302 MCRegister PhysReg
) const {
303 MachineBasicBlock
*ParentA
= A
->getParent();
304 MachineBasicBlock
*ParentB
= B
->getParent();
305 if (ParentA
!= ParentB
)
308 return getReachingDef(A
, PhysReg
) == getReachingDef(B
, PhysReg
);
311 MachineInstr
*ReachingDefAnalysis::getInstFromId(MachineBasicBlock
*MBB
,
313 assert(static_cast<size_t>(MBB
->getNumber()) < MBBReachingDefs
.size() &&
314 "Unexpected basic block number.");
315 assert(InstId
< static_cast<int>(MBB
->size()) &&
316 "Unexpected instruction id.");
321 for (auto &MI
: *MBB
) {
322 auto F
= InstIds
.find(&MI
);
323 if (F
!= InstIds
.end() && F
->second
== InstId
)
330 int ReachingDefAnalysis::getClearance(MachineInstr
*MI
,
331 MCRegister PhysReg
) const {
332 assert(InstIds
.count(MI
) && "Unexpected machine instuction.");
333 return InstIds
.lookup(MI
) - getReachingDef(MI
, PhysReg
);
336 bool ReachingDefAnalysis::hasLocalDefBefore(MachineInstr
*MI
,
337 MCRegister PhysReg
) const {
338 return getReachingDef(MI
, PhysReg
) >= 0;
341 void ReachingDefAnalysis::getReachingLocalUses(MachineInstr
*Def
,
343 InstSet
&Uses
) const {
344 MachineBasicBlock
*MBB
= Def
->getParent();
345 MachineBasicBlock::iterator MI
= MachineBasicBlock::iterator(Def
);
346 while (++MI
!= MBB
->end()) {
347 if (MI
->isDebugInstr())
350 // If/when we find a new reaching def, we know that there's no more uses
352 if (getReachingLocalMIDef(&*MI
, PhysReg
) != Def
)
355 for (auto &MO
: MI
->operands()) {
356 if (!isValidRegUseOf(MO
, PhysReg
, TRI
))
366 bool ReachingDefAnalysis::getLiveInUses(MachineBasicBlock
*MBB
,
368 InstSet
&Uses
) const {
369 for (MachineInstr
&MI
:
370 instructionsWithoutDebug(MBB
->instr_begin(), MBB
->instr_end())) {
371 for (auto &MO
: MI
.operands()) {
372 if (!isValidRegUseOf(MO
, PhysReg
, TRI
))
374 if (getReachingDef(&MI
, PhysReg
) >= 0)
379 auto Last
= MBB
->getLastNonDebugInstr();
380 if (Last
== MBB
->end())
382 return isReachingDefLiveOut(&*Last
, PhysReg
);
385 void ReachingDefAnalysis::getGlobalUses(MachineInstr
*MI
, MCRegister PhysReg
,
386 InstSet
&Uses
) const {
387 MachineBasicBlock
*MBB
= MI
->getParent();
389 // Collect the uses that each def touches within the block.
390 getReachingLocalUses(MI
, PhysReg
, Uses
);
392 // Handle live-out values.
393 if (auto *LiveOut
= getLocalLiveOutMIDef(MI
->getParent(), PhysReg
)) {
397 SmallVector
<MachineBasicBlock
*, 4> ToVisit(MBB
->successors());
398 SmallPtrSet
<MachineBasicBlock
*, 4>Visited
;
399 while (!ToVisit
.empty()) {
400 MachineBasicBlock
*MBB
= ToVisit
.back();
402 if (Visited
.count(MBB
) || !MBB
->isLiveIn(PhysReg
))
404 if (getLiveInUses(MBB
, PhysReg
, Uses
))
405 llvm::append_range(ToVisit
, MBB
->successors());
411 void ReachingDefAnalysis::getGlobalReachingDefs(MachineInstr
*MI
,
413 InstSet
&Defs
) const {
414 if (auto *Def
= getUniqueReachingMIDef(MI
, PhysReg
)) {
419 for (auto *MBB
: MI
->getParent()->predecessors())
420 getLiveOuts(MBB
, PhysReg
, Defs
);
423 void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock
*MBB
,
424 MCRegister PhysReg
, InstSet
&Defs
) const {
425 SmallPtrSet
<MachineBasicBlock
*, 2> VisitedBBs
;
426 getLiveOuts(MBB
, PhysReg
, Defs
, VisitedBBs
);
429 void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock
*MBB
,
430 MCRegister PhysReg
, InstSet
&Defs
,
431 BlockSet
&VisitedBBs
) const {
432 if (VisitedBBs
.count(MBB
))
435 VisitedBBs
.insert(MBB
);
436 LivePhysRegs
LiveRegs(*TRI
);
437 LiveRegs
.addLiveOuts(*MBB
);
438 if (LiveRegs
.available(MBB
->getParent()->getRegInfo(), PhysReg
))
441 if (auto *Def
= getLocalLiveOutMIDef(MBB
, PhysReg
))
444 for (auto *Pred
: MBB
->predecessors())
445 getLiveOuts(Pred
, PhysReg
, Defs
, VisitedBBs
);
449 ReachingDefAnalysis::getUniqueReachingMIDef(MachineInstr
*MI
,
450 MCRegister PhysReg
) const {
451 // If there's a local def before MI, return it.
452 MachineInstr
*LocalDef
= getReachingLocalMIDef(MI
, PhysReg
);
453 if (LocalDef
&& InstIds
.lookup(LocalDef
) < InstIds
.lookup(MI
))
456 SmallPtrSet
<MachineInstr
*, 2> Incoming
;
457 MachineBasicBlock
*Parent
= MI
->getParent();
458 for (auto *Pred
: Parent
->predecessors())
459 getLiveOuts(Pred
, PhysReg
, Incoming
);
461 // Check that we have a single incoming value and that it does not
462 // come from the same block as MI - since it would mean that the def
463 // is executed after MI.
464 if (Incoming
.size() == 1 && (*Incoming
.begin())->getParent() != Parent
)
465 return *Incoming
.begin();
469 MachineInstr
*ReachingDefAnalysis::getMIOperand(MachineInstr
*MI
,
470 unsigned Idx
) const {
471 assert(MI
->getOperand(Idx
).isReg() && "Expected register operand");
472 return getUniqueReachingMIDef(MI
, MI
->getOperand(Idx
).getReg());
475 MachineInstr
*ReachingDefAnalysis::getMIOperand(MachineInstr
*MI
,
476 MachineOperand
&MO
) const {
477 assert(MO
.isReg() && "Expected register operand");
478 return getUniqueReachingMIDef(MI
, MO
.getReg());
481 bool ReachingDefAnalysis::isRegUsedAfter(MachineInstr
*MI
,
482 MCRegister PhysReg
) const {
483 MachineBasicBlock
*MBB
= MI
->getParent();
484 LivePhysRegs
LiveRegs(*TRI
);
485 LiveRegs
.addLiveOuts(*MBB
);
487 // Yes if the register is live out of the basic block.
488 if (!LiveRegs
.available(MBB
->getParent()->getRegInfo(), PhysReg
))
491 // Walk backwards through the block to see if the register is live at some
493 for (MachineInstr
&Last
:
494 instructionsWithoutDebug(MBB
->instr_rbegin(), MBB
->instr_rend())) {
495 LiveRegs
.stepBackward(Last
);
496 if (!LiveRegs
.available(MBB
->getParent()->getRegInfo(), PhysReg
))
497 return InstIds
.lookup(&Last
) > InstIds
.lookup(MI
);
502 bool ReachingDefAnalysis::isRegDefinedAfter(MachineInstr
*MI
,
503 MCRegister PhysReg
) const {
504 MachineBasicBlock
*MBB
= MI
->getParent();
505 auto Last
= MBB
->getLastNonDebugInstr();
506 if (Last
!= MBB
->end() &&
507 getReachingDef(MI
, PhysReg
) != getReachingDef(&*Last
, PhysReg
))
510 if (auto *Def
= getLocalLiveOutMIDef(MBB
, PhysReg
))
511 return Def
== getReachingLocalMIDef(MI
, PhysReg
);
516 bool ReachingDefAnalysis::isReachingDefLiveOut(MachineInstr
*MI
,
517 MCRegister PhysReg
) const {
518 MachineBasicBlock
*MBB
= MI
->getParent();
519 LivePhysRegs
LiveRegs(*TRI
);
520 LiveRegs
.addLiveOuts(*MBB
);
521 if (LiveRegs
.available(MBB
->getParent()->getRegInfo(), PhysReg
))
524 auto Last
= MBB
->getLastNonDebugInstr();
525 int Def
= getReachingDef(MI
, PhysReg
);
526 if (Last
!= MBB
->end() && getReachingDef(&*Last
, PhysReg
) != Def
)
529 // Finally check that the last instruction doesn't redefine the register.
530 for (auto &MO
: Last
->operands())
531 if (isValidRegDefOf(MO
, PhysReg
, TRI
))
538 ReachingDefAnalysis::getLocalLiveOutMIDef(MachineBasicBlock
*MBB
,
539 MCRegister PhysReg
) const {
540 LivePhysRegs
LiveRegs(*TRI
);
541 LiveRegs
.addLiveOuts(*MBB
);
542 if (LiveRegs
.available(MBB
->getParent()->getRegInfo(), PhysReg
))
545 auto Last
= MBB
->getLastNonDebugInstr();
546 if (Last
== MBB
->end())
549 int Def
= getReachingDef(&*Last
, PhysReg
);
550 for (auto &MO
: Last
->operands())
551 if (isValidRegDefOf(MO
, PhysReg
, TRI
))
554 return Def
< 0 ? nullptr : getInstFromId(MBB
, Def
);
557 static bool mayHaveSideEffects(MachineInstr
&MI
) {
558 return MI
.mayLoadOrStore() || MI
.mayRaiseFPException() ||
559 MI
.hasUnmodeledSideEffects() || MI
.isTerminator() ||
560 MI
.isCall() || MI
.isBarrier() || MI
.isBranch() || MI
.isReturn();
563 // Can we safely move 'From' to just before 'To'? To satisfy this, 'From' must
564 // not define a register that is used by any instructions, after and including,
565 // 'To'. These instructions also must not redefine any of Froms operands.
566 template<typename Iterator
>
567 bool ReachingDefAnalysis::isSafeToMove(MachineInstr
*From
,
568 MachineInstr
*To
) const {
569 if (From
->getParent() != To
->getParent() || From
== To
)
572 SmallSet
<int, 2> Defs
;
573 // First check that From would compute the same value if moved.
574 for (auto &MO
: From
->operands()) {
578 Defs
.insert(MO
.getReg());
579 else if (!hasSameReachingDef(From
, To
, MO
.getReg()))
583 // Now walk checking that the rest of the instructions will compute the same
584 // value and that we're not overwriting anything. Don't move the instruction
585 // past any memory, control-flow or other ambiguous instructions.
586 for (auto I
= ++Iterator(From
), E
= Iterator(To
); I
!= E
; ++I
) {
587 if (mayHaveSideEffects(*I
))
589 for (auto &MO
: I
->operands())
590 if (MO
.isReg() && MO
.getReg() && Defs
.count(MO
.getReg()))
596 bool ReachingDefAnalysis::isSafeToMoveForwards(MachineInstr
*From
,
597 MachineInstr
*To
) const {
598 using Iterator
= MachineBasicBlock::iterator
;
599 // Walk forwards until we find the instruction.
600 for (auto I
= Iterator(From
), E
= From
->getParent()->end(); I
!= E
; ++I
)
602 return isSafeToMove
<Iterator
>(From
, To
);
606 bool ReachingDefAnalysis::isSafeToMoveBackwards(MachineInstr
*From
,
607 MachineInstr
*To
) const {
608 using Iterator
= MachineBasicBlock::reverse_iterator
;
609 // Walk backwards until we find the instruction.
610 for (auto I
= Iterator(From
), E
= From
->getParent()->rend(); I
!= E
; ++I
)
612 return isSafeToMove
<Iterator
>(From
, To
);
616 bool ReachingDefAnalysis::isSafeToRemove(MachineInstr
*MI
,
617 InstSet
&ToRemove
) const {
618 SmallPtrSet
<MachineInstr
*, 1> Ignore
;
619 SmallPtrSet
<MachineInstr
*, 2> Visited
;
620 return isSafeToRemove(MI
, Visited
, ToRemove
, Ignore
);
624 ReachingDefAnalysis::isSafeToRemove(MachineInstr
*MI
, InstSet
&ToRemove
,
625 InstSet
&Ignore
) const {
626 SmallPtrSet
<MachineInstr
*, 2> Visited
;
627 return isSafeToRemove(MI
, Visited
, ToRemove
, Ignore
);
631 ReachingDefAnalysis::isSafeToRemove(MachineInstr
*MI
, InstSet
&Visited
,
632 InstSet
&ToRemove
, InstSet
&Ignore
) const {
633 if (Visited
.count(MI
) || Ignore
.count(MI
))
635 else if (mayHaveSideEffects(*MI
)) {
636 // Unless told to ignore the instruction, don't remove anything which has
642 for (auto &MO
: MI
->operands()) {
643 if (!isValidRegDef(MO
))
646 SmallPtrSet
<MachineInstr
*, 4> Uses
;
647 getGlobalUses(MI
, MO
.getReg(), Uses
);
649 for (auto I
: Uses
) {
650 if (Ignore
.count(I
) || ToRemove
.count(I
))
652 if (!isSafeToRemove(I
, Visited
, ToRemove
, Ignore
))
660 void ReachingDefAnalysis::collectKilledOperands(MachineInstr
*MI
,
661 InstSet
&Dead
) const {
663 auto IsDead
= [this, &Dead
](MachineInstr
*Def
, MCRegister PhysReg
) {
664 if (mayHaveSideEffects(*Def
))
667 unsigned LiveDefs
= 0;
668 for (auto &MO
: Def
->operands()) {
669 if (!isValidRegDef(MO
))
678 SmallPtrSet
<MachineInstr
*, 4> Uses
;
679 getGlobalUses(Def
, PhysReg
, Uses
);
680 return llvm::set_is_subset(Uses
, Dead
);
683 for (auto &MO
: MI
->operands()) {
684 if (!isValidRegUse(MO
))
686 if (MachineInstr
*Def
= getMIOperand(MI
, MO
))
687 if (IsDead(Def
, MO
.getReg()))
688 collectKilledOperands(Def
, Dead
);
692 bool ReachingDefAnalysis::isSafeToDefRegAt(MachineInstr
*MI
,
693 MCRegister PhysReg
) const {
694 SmallPtrSet
<MachineInstr
*, 1> Ignore
;
695 return isSafeToDefRegAt(MI
, PhysReg
, Ignore
);
698 bool ReachingDefAnalysis::isSafeToDefRegAt(MachineInstr
*MI
, MCRegister PhysReg
,
699 InstSet
&Ignore
) const {
700 // Check for any uses of the register after MI.
701 if (isRegUsedAfter(MI
, PhysReg
)) {
702 if (auto *Def
= getReachingLocalMIDef(MI
, PhysReg
)) {
703 SmallPtrSet
<MachineInstr
*, 2> Uses
;
704 getGlobalUses(Def
, PhysReg
, Uses
);
705 if (!llvm::set_is_subset(Uses
, Ignore
))
711 MachineBasicBlock
*MBB
= MI
->getParent();
712 // Check for any defs after MI.
713 if (isRegDefinedAfter(MI
, PhysReg
)) {
714 auto I
= MachineBasicBlock::iterator(MI
);
715 for (auto E
= MBB
->end(); I
!= E
; ++I
) {
716 if (Ignore
.count(&*I
))
718 for (auto &MO
: I
->operands())
719 if (isValidRegDefOf(MO
, PhysReg
, TRI
))