10bf841acSMarina Yatsina //===---- ReachingDefAnalysis.cpp - Reaching Def Analysis ---*- C++ -*-----===//
20bf841acSMarina Yatsina //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60bf841acSMarina Yatsina //
70bf841acSMarina Yatsina //===----------------------------------------------------------------------===//
80bf841acSMarina Yatsina
9ac30ea2fSSam Parker #include "llvm/ADT/SmallSet.h"
10d6391209SKazu Hirata #include "llvm/ADT/SetOperations.h"
11cced971fSSam Parker #include "llvm/CodeGen/LivePhysRegs.h"
120bf841acSMarina Yatsina #include "llvm/CodeGen/ReachingDefAnalysis.h"
130bf841acSMarina Yatsina #include "llvm/CodeGen/TargetRegisterInfo.h"
140bf841acSMarina Yatsina #include "llvm/CodeGen/TargetSubtargetInfo.h"
151d7b4136SReid Kleckner #include "llvm/Support/Debug.h"
160bf841acSMarina Yatsina
170bf841acSMarina Yatsina using namespace llvm;
180bf841acSMarina Yatsina
190bf841acSMarina Yatsina #define DEBUG_TYPE "reaching-deps-analysis"
200bf841acSMarina Yatsina
210bf841acSMarina Yatsina char ReachingDefAnalysis::ID = 0;
220bf841acSMarina Yatsina INITIALIZE_PASS(ReachingDefAnalysis, DEBUG_TYPE, "ReachingDefAnalysis", false,
230bf841acSMarina Yatsina true)
240bf841acSMarina Yatsina
isValidReg(const MachineOperand & MO)25247a177cSBenjamin Kramer static bool isValidReg(const MachineOperand &MO) {
26bf61421aSSam Parker return MO.isReg() && MO.getReg();
27bf61421aSSam Parker }
28bf61421aSSam Parker
isValidRegUse(const MachineOperand & MO)29247a177cSBenjamin Kramer static bool isValidRegUse(const MachineOperand &MO) {
30bf61421aSSam Parker return isValidReg(MO) && MO.isUse();
31bf61421aSSam Parker }
32bf61421aSSam Parker
isValidRegUseOf(const MachineOperand & MO,MCRegister PhysReg,const TargetRegisterInfo * TRI)33eeddcba5SDavid Green static bool isValidRegUseOf(const MachineOperand &MO, MCRegister PhysReg,
34eeddcba5SDavid Green const TargetRegisterInfo *TRI) {
35eeddcba5SDavid Green if (!isValidRegUse(MO))
36eeddcba5SDavid Green return false;
371de11fe3SBenjamin Kramer return TRI->regsOverlap(MO.getReg(), PhysReg);
38bf61421aSSam Parker }
39bf61421aSSam Parker
isValidRegDef(const MachineOperand & MO)40247a177cSBenjamin Kramer static bool isValidRegDef(const MachineOperand &MO) {
41bf61421aSSam Parker return isValidReg(MO) && MO.isDef();
42bf61421aSSam Parker }
43bf61421aSSam Parker
isValidRegDefOf(const MachineOperand & MO,MCRegister PhysReg,const TargetRegisterInfo * TRI)44eeddcba5SDavid Green static bool isValidRegDefOf(const MachineOperand &MO, MCRegister PhysReg,
45eeddcba5SDavid Green const TargetRegisterInfo *TRI) {
46eeddcba5SDavid Green if (!isValidRegDef(MO))
47eeddcba5SDavid Green return false;
481de11fe3SBenjamin Kramer return TRI->regsOverlap(MO.getReg(), PhysReg);
49bf61421aSSam Parker }
50bf61421aSSam Parker
enterBasicBlock(MachineBasicBlock * MBB)5176e987b3SNikita Popov void ReachingDefAnalysis::enterBasicBlock(MachineBasicBlock *MBB) {
52e4d63a49SMarina Yatsina unsigned MBBNumber = MBB->getNumber();
530bf841acSMarina Yatsina assert(MBBNumber < MBBReachingDefs.size() &&
540bf841acSMarina Yatsina "Unexpected basic block number.");
550bf841acSMarina Yatsina MBBReachingDefs[MBBNumber].resize(NumRegUnits);
560bf841acSMarina Yatsina
570bf841acSMarina Yatsina // Reset instruction counter in each basic block.
580bf841acSMarina Yatsina CurInstr = 0;
590bf841acSMarina Yatsina
600bf841acSMarina Yatsina // Set up LiveRegs to represent registers entering MBB.
610bf841acSMarina Yatsina // Default values are 'nothing happened a long time ago'.
620bf841acSMarina Yatsina if (LiveRegs.empty())
630f110a88SCraig Topper LiveRegs.assign(NumRegUnits, ReachingDefDefaultVal);
640bf841acSMarina Yatsina
650bf841acSMarina Yatsina // This is the entry block.
660bf841acSMarina Yatsina if (MBB->pred_empty()) {
670bf841acSMarina Yatsina for (const auto &LI : MBB->liveins()) {
680bf841acSMarina Yatsina for (MCRegUnitIterator Unit(LI.PhysReg, TRI); Unit.isValid(); ++Unit) {
690bf841acSMarina Yatsina // Treat function live-ins as if they were defined just before the first
700bf841acSMarina Yatsina // instruction. Usually, function arguments are set up immediately
710bf841acSMarina Yatsina // before the call.
72361c29d7SNikita Popov if (LiveRegs[*Unit] != -1) {
730bf841acSMarina Yatsina LiveRegs[*Unit] = -1;
74361c29d7SNikita Popov MBBReachingDefs[MBBNumber][*Unit].push_back(-1);
75361c29d7SNikita Popov }
760bf841acSMarina Yatsina }
770bf841acSMarina Yatsina }
78d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << ": entry\n");
790bf841acSMarina Yatsina return;
800bf841acSMarina Yatsina }
810bf841acSMarina Yatsina
820bf841acSMarina Yatsina // Try to coalesce live-out registers from predecessors.
830bf841acSMarina Yatsina for (MachineBasicBlock *pred : MBB->predecessors()) {
84e4d63a49SMarina Yatsina assert(unsigned(pred->getNumber()) < MBBOutRegsInfos.size() &&
850bf841acSMarina Yatsina "Should have pre-allocated MBBInfos for all MBBs");
860bf841acSMarina Yatsina const LiveRegsDefInfo &Incoming = MBBOutRegsInfos[pred->getNumber()];
870bf841acSMarina Yatsina // Incoming is null if this is a backedge from a BB
880bf841acSMarina Yatsina // we haven't processed yet
890bf841acSMarina Yatsina if (Incoming.empty())
900bf841acSMarina Yatsina continue;
910bf841acSMarina Yatsina
92e8b83f7dSNikita Popov // Find the most recent reaching definition from a predecessor.
93e8b83f7dSNikita Popov for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit)
940bf841acSMarina Yatsina LiveRegs[Unit] = std::max(LiveRegs[Unit], Incoming[Unit]);
95e8b83f7dSNikita Popov }
96e8b83f7dSNikita Popov
97e8b83f7dSNikita Popov // Insert the most recent reaching definition we found.
98e8b83f7dSNikita Popov for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit)
99e8b83f7dSNikita Popov if (LiveRegs[Unit] != ReachingDefDefaultVal)
1000bf841acSMarina Yatsina MBBReachingDefs[MBBNumber][Unit].push_back(LiveRegs[Unit]);
1010bf841acSMarina Yatsina }
1020bf841acSMarina Yatsina
leaveBasicBlock(MachineBasicBlock * MBB)10376e987b3SNikita Popov void ReachingDefAnalysis::leaveBasicBlock(MachineBasicBlock *MBB) {
1040bf841acSMarina Yatsina assert(!LiveRegs.empty() && "Must enter basic block first.");
10576e987b3SNikita Popov unsigned MBBNumber = MBB->getNumber();
1060bf841acSMarina Yatsina assert(MBBNumber < MBBOutRegsInfos.size() &&
1070bf841acSMarina Yatsina "Unexpected basic block number.");
1080bf841acSMarina Yatsina // Save register clearances at end of MBB - used by enterBasicBlock().
1090bf841acSMarina Yatsina MBBOutRegsInfos[MBBNumber] = LiveRegs;
1100bf841acSMarina Yatsina
1110bf841acSMarina Yatsina // While processing the basic block, we kept `Def` relative to the start
1120bf841acSMarina Yatsina // of the basic block for convenience. However, future use of this information
1130bf841acSMarina Yatsina // only cares about the clearance from the end of the block, so adjust
1140bf841acSMarina Yatsina // everything to be relative to the end of the basic block.
1150bf841acSMarina Yatsina for (int &OutLiveReg : MBBOutRegsInfos[MBBNumber])
1168d75df14SNikita Popov if (OutLiveReg != ReachingDefDefaultVal)
1170bf841acSMarina Yatsina OutLiveReg -= CurInstr;
1180bf841acSMarina Yatsina LiveRegs.clear();
1190bf841acSMarina Yatsina }
1200bf841acSMarina Yatsina
processDefs(MachineInstr * MI)1210bf841acSMarina Yatsina void ReachingDefAnalysis::processDefs(MachineInstr *MI) {
122801bf7ebSShiva Chen assert(!MI->isDebugInstr() && "Won't process debug instructions");
1230bf841acSMarina Yatsina
124e4d63a49SMarina Yatsina unsigned MBBNumber = MI->getParent()->getNumber();
1250bf841acSMarina Yatsina assert(MBBNumber < MBBReachingDefs.size() &&
1260bf841acSMarina Yatsina "Unexpected basic block number.");
127bf61421aSSam Parker
128bf61421aSSam Parker for (auto &MO : MI->operands()) {
129bf61421aSSam Parker if (!isValidRegDef(MO))
1300bf841acSMarina Yatsina continue;
131e24537d4SMircea Trofin for (MCRegUnitIterator Unit(MO.getReg().asMCReg(), TRI); Unit.isValid();
132e24537d4SMircea Trofin ++Unit) {
1330bf841acSMarina Yatsina // This instruction explicitly defines the current reg unit.
134b3d38327SDavid Green LLVM_DEBUG(dbgs() << printRegUnit(*Unit, TRI) << ":\t" << CurInstr
135d34e60caSNicola Zaghen << '\t' << *MI);
1360bf841acSMarina Yatsina
1370bf841acSMarina Yatsina // How many instructions since this reg unit was last written?
138361c29d7SNikita Popov if (LiveRegs[*Unit] != CurInstr) {
1390bf841acSMarina Yatsina LiveRegs[*Unit] = CurInstr;
1400bf841acSMarina Yatsina MBBReachingDefs[MBBNumber][*Unit].push_back(CurInstr);
1410bf841acSMarina Yatsina }
1420bf841acSMarina Yatsina }
143361c29d7SNikita Popov }
1440bf841acSMarina Yatsina InstIds[MI] = CurInstr;
1450bf841acSMarina Yatsina ++CurInstr;
1460bf841acSMarina Yatsina }
1470bf841acSMarina Yatsina
reprocessBasicBlock(MachineBasicBlock * MBB)148259649a5SNikita Popov void ReachingDefAnalysis::reprocessBasicBlock(MachineBasicBlock *MBB) {
149259649a5SNikita Popov unsigned MBBNumber = MBB->getNumber();
150259649a5SNikita Popov assert(MBBNumber < MBBReachingDefs.size() &&
151259649a5SNikita Popov "Unexpected basic block number.");
152259649a5SNikita Popov
153259649a5SNikita Popov // Count number of non-debug instructions for end of block adjustment.
1548f92f3c2SSam Parker auto NonDbgInsts =
1558f92f3c2SSam Parker instructionsWithoutDebug(MBB->instr_begin(), MBB->instr_end());
1568f92f3c2SSam Parker int NumInsts = std::distance(NonDbgInsts.begin(), NonDbgInsts.end());
157259649a5SNikita Popov
158259649a5SNikita Popov // When reprocessing a block, the only thing we need to do is check whether
159259649a5SNikita Popov // there is now a more recent incoming reaching definition from a predecessor.
160259649a5SNikita Popov for (MachineBasicBlock *pred : MBB->predecessors()) {
161259649a5SNikita Popov assert(unsigned(pred->getNumber()) < MBBOutRegsInfos.size() &&
162259649a5SNikita Popov "Should have pre-allocated MBBInfos for all MBBs");
163259649a5SNikita Popov const LiveRegsDefInfo &Incoming = MBBOutRegsInfos[pred->getNumber()];
164259649a5SNikita Popov // Incoming may be empty for dead predecessors.
165259649a5SNikita Popov if (Incoming.empty())
166259649a5SNikita Popov continue;
167259649a5SNikita Popov
168259649a5SNikita Popov for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit) {
169259649a5SNikita Popov int Def = Incoming[Unit];
170259649a5SNikita Popov if (Def == ReachingDefDefaultVal)
171259649a5SNikita Popov continue;
172259649a5SNikita Popov
173259649a5SNikita Popov auto Start = MBBReachingDefs[MBBNumber][Unit].begin();
174259649a5SNikita Popov if (Start != MBBReachingDefs[MBBNumber][Unit].end() && *Start < 0) {
175259649a5SNikita Popov if (*Start >= Def)
176259649a5SNikita Popov continue;
177259649a5SNikita Popov
178259649a5SNikita Popov // Update existing reaching def from predecessor to a more recent one.
179259649a5SNikita Popov *Start = Def;
180259649a5SNikita Popov } else {
181259649a5SNikita Popov // Insert new reaching def from predecessor.
182259649a5SNikita Popov MBBReachingDefs[MBBNumber][Unit].insert(Start, Def);
183259649a5SNikita Popov }
184259649a5SNikita Popov
185259649a5SNikita Popov // Update reaching def at end of of BB. Keep in mind that these are
186259649a5SNikita Popov // adjusted relative to the end of the basic block.
187259649a5SNikita Popov if (MBBOutRegsInfos[MBBNumber][Unit] < Def - NumInsts)
188259649a5SNikita Popov MBBOutRegsInfos[MBBNumber][Unit] = Def - NumInsts;
189259649a5SNikita Popov }
190259649a5SNikita Popov }
191259649a5SNikita Popov }
192259649a5SNikita Popov
processBasicBlock(const LoopTraversal::TraversedMBBInfo & TraversedMBB)1930bf841acSMarina Yatsina void ReachingDefAnalysis::processBasicBlock(
1940bf841acSMarina Yatsina const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
19576e987b3SNikita Popov MachineBasicBlock *MBB = TraversedMBB.MBB;
19676e987b3SNikita Popov LLVM_DEBUG(dbgs() << printMBBReference(*MBB)
19776e987b3SNikita Popov << (!TraversedMBB.IsDone ? ": incomplete\n"
19876e987b3SNikita Popov : ": all preds known\n"));
19976e987b3SNikita Popov
200259649a5SNikita Popov if (!TraversedMBB.PrimaryPass) {
201259649a5SNikita Popov // Reprocess MBB that is part of a loop.
202259649a5SNikita Popov reprocessBasicBlock(MBB);
203259649a5SNikita Popov return;
204259649a5SNikita Popov }
205259649a5SNikita Popov
20676e987b3SNikita Popov enterBasicBlock(MBB);
2078f92f3c2SSam Parker for (MachineInstr &MI :
2088f92f3c2SSam Parker instructionsWithoutDebug(MBB->instr_begin(), MBB->instr_end()))
2090bf841acSMarina Yatsina processDefs(&MI);
21076e987b3SNikita Popov leaveBasicBlock(MBB);
2110bf841acSMarina Yatsina }
2120bf841acSMarina Yatsina
runOnMachineFunction(MachineFunction & mf)2130bf841acSMarina Yatsina bool ReachingDefAnalysis::runOnMachineFunction(MachineFunction &mf) {
2140bf841acSMarina Yatsina MF = &mf;
2150bf841acSMarina Yatsina TRI = MF->getSubtarget().getRegisterInfo();
216d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "********** REACHING DEFINITION ANALYSIS **********\n");
217659500c0SSam Parker init();
218659500c0SSam Parker traverse();
2190bf841acSMarina Yatsina return false;
2200bf841acSMarina Yatsina }
2210bf841acSMarina Yatsina
releaseMemory()2220bf841acSMarina Yatsina void ReachingDefAnalysis::releaseMemory() {
2230bf841acSMarina Yatsina // Clear the internal vectors.
2240bf841acSMarina Yatsina MBBOutRegsInfos.clear();
2250bf841acSMarina Yatsina MBBReachingDefs.clear();
2260bf841acSMarina Yatsina InstIds.clear();
227659500c0SSam Parker LiveRegs.clear();
228659500c0SSam Parker }
229659500c0SSam Parker
reset()230659500c0SSam Parker void ReachingDefAnalysis::reset() {
231659500c0SSam Parker releaseMemory();
232659500c0SSam Parker init();
233659500c0SSam Parker traverse();
234659500c0SSam Parker }
235659500c0SSam Parker
init()236659500c0SSam Parker void ReachingDefAnalysis::init() {
237659500c0SSam Parker NumRegUnits = TRI->getNumRegUnits();
238659500c0SSam Parker MBBReachingDefs.resize(MF->getNumBlockIDs());
239659500c0SSam Parker // Initialize the MBBOutRegsInfos
240659500c0SSam Parker MBBOutRegsInfos.resize(MF->getNumBlockIDs());
241659500c0SSam Parker LoopTraversal Traversal;
242659500c0SSam Parker TraversedMBBOrder = Traversal.traverse(*MF);
243659500c0SSam Parker }
244659500c0SSam Parker
traverse()245659500c0SSam Parker void ReachingDefAnalysis::traverse() {
246659500c0SSam Parker // Traverse the basic blocks.
247659500c0SSam Parker for (LoopTraversal::TraversedMBBInfo TraversedMBB : TraversedMBBOrder)
248659500c0SSam Parker processBasicBlock(TraversedMBB);
249259649a5SNikita Popov #ifndef NDEBUG
250259649a5SNikita Popov // Make sure reaching defs are sorted and unique.
251659500c0SSam Parker for (MBBDefsInfo &MBBDefs : MBBReachingDefs) {
252259649a5SNikita Popov for (MBBRegUnitDefs &RegUnitDefs : MBBDefs) {
253259649a5SNikita Popov int LastDef = ReachingDefDefaultVal;
254259649a5SNikita Popov for (int Def : RegUnitDefs) {
255259649a5SNikita Popov assert(Def > LastDef && "Defs must be sorted and unique");
256259649a5SNikita Popov LastDef = Def;
257659500c0SSam Parker }
2580bf841acSMarina Yatsina }
259259649a5SNikita Popov }
260259649a5SNikita Popov #endif
261259649a5SNikita Popov }
2620bf841acSMarina Yatsina
getReachingDef(MachineInstr * MI,MCRegister PhysReg) const263e24537d4SMircea Trofin int ReachingDefAnalysis::getReachingDef(MachineInstr *MI,
264e24537d4SMircea Trofin MCRegister PhysReg) const {
2650bf841acSMarina Yatsina assert(InstIds.count(MI) && "Unexpected machine instuction.");
2660d1468dbSSam Parker int InstId = InstIds.lookup(MI);
2670f110a88SCraig Topper int DefRes = ReachingDefDefaultVal;
268e4d63a49SMarina Yatsina unsigned MBBNumber = MI->getParent()->getNumber();
2690bf841acSMarina Yatsina assert(MBBNumber < MBBReachingDefs.size() &&
2700bf841acSMarina Yatsina "Unexpected basic block number.");
2710f110a88SCraig Topper int LatestDef = ReachingDefDefaultVal;
2720bf841acSMarina Yatsina for (MCRegUnitIterator Unit(PhysReg, TRI); Unit.isValid(); ++Unit) {
2730bf841acSMarina Yatsina for (int Def : MBBReachingDefs[MBBNumber][*Unit]) {
2740bf841acSMarina Yatsina if (Def >= InstId)
2750bf841acSMarina Yatsina break;
2760bf841acSMarina Yatsina DefRes = Def;
2770bf841acSMarina Yatsina }
2780bf841acSMarina Yatsina LatestDef = std::max(LatestDef, DefRes);
2790bf841acSMarina Yatsina }
2800bf841acSMarina Yatsina return LatestDef;
2810bf841acSMarina Yatsina }
2820bf841acSMarina Yatsina
283e24537d4SMircea Trofin MachineInstr *
getReachingLocalMIDef(MachineInstr * MI,MCRegister PhysReg) const284e24537d4SMircea Trofin ReachingDefAnalysis::getReachingLocalMIDef(MachineInstr *MI,
285e24537d4SMircea Trofin MCRegister PhysReg) const {
28685a5c65fSSam Parker return hasLocalDefBefore(MI, PhysReg)
28785a5c65fSSam Parker ? getInstFromId(MI->getParent(), getReachingDef(MI, PhysReg))
28885a5c65fSSam Parker : nullptr;
289cced971fSSam Parker }
290cced971fSSam Parker
hasSameReachingDef(MachineInstr * A,MachineInstr * B,MCRegister PhysReg) const29128166816SSam Parker bool ReachingDefAnalysis::hasSameReachingDef(MachineInstr *A, MachineInstr *B,
292e24537d4SMircea Trofin MCRegister PhysReg) const {
29328166816SSam Parker MachineBasicBlock *ParentA = A->getParent();
29428166816SSam Parker MachineBasicBlock *ParentB = B->getParent();
29528166816SSam Parker if (ParentA != ParentB)
29628166816SSam Parker return false;
29728166816SSam Parker
29828166816SSam Parker return getReachingDef(A, PhysReg) == getReachingDef(B, PhysReg);
29928166816SSam Parker }
30028166816SSam Parker
getInstFromId(MachineBasicBlock * MBB,int InstId) const301cced971fSSam Parker MachineInstr *ReachingDefAnalysis::getInstFromId(MachineBasicBlock *MBB,
3020d1468dbSSam Parker int InstId) const {
30328166816SSam Parker assert(static_cast<size_t>(MBB->getNumber()) < MBBReachingDefs.size() &&
304cced971fSSam Parker "Unexpected basic block number.");
305cced971fSSam Parker assert(InstId < static_cast<int>(MBB->size()) &&
306cced971fSSam Parker "Unexpected instruction id.");
307cced971fSSam Parker
308cced971fSSam Parker if (InstId < 0)
309cced971fSSam Parker return nullptr;
310cced971fSSam Parker
311cced971fSSam Parker for (auto &MI : *MBB) {
31293b0536fSSjoerd Meijer auto F = InstIds.find(&MI);
31393b0536fSSjoerd Meijer if (F != InstIds.end() && F->second == InstId)
314cced971fSSam Parker return &MI;
315cced971fSSam Parker }
31693b0536fSSjoerd Meijer
317cced971fSSam Parker return nullptr;
318cced971fSSam Parker }
319cced971fSSam Parker
getClearance(MachineInstr * MI,MCRegister PhysReg) const320e24537d4SMircea Trofin int ReachingDefAnalysis::getClearance(MachineInstr *MI,
321e24537d4SMircea Trofin MCRegister PhysReg) const {
3220bf841acSMarina Yatsina assert(InstIds.count(MI) && "Unexpected machine instuction.");
3230d1468dbSSam Parker return InstIds.lookup(MI) - getReachingDef(MI, PhysReg);
3240bf841acSMarina Yatsina }
325cced971fSSam Parker
hasLocalDefBefore(MachineInstr * MI,MCRegister PhysReg) const326e24537d4SMircea Trofin bool ReachingDefAnalysis::hasLocalDefBefore(MachineInstr *MI,
327e24537d4SMircea Trofin MCRegister PhysReg) const {
328ac30ea2fSSam Parker return getReachingDef(MI, PhysReg) >= 0;
329ac30ea2fSSam Parker }
330ac30ea2fSSam Parker
getReachingLocalUses(MachineInstr * Def,MCRegister PhysReg,InstSet & Uses) const331e24537d4SMircea Trofin void ReachingDefAnalysis::getReachingLocalUses(MachineInstr *Def,
332e24537d4SMircea Trofin MCRegister PhysReg,
3337ad879caSSam Parker InstSet &Uses) const {
33428166816SSam Parker MachineBasicBlock *MBB = Def->getParent();
33528166816SSam Parker MachineBasicBlock::iterator MI = MachineBasicBlock::iterator(Def);
33628166816SSam Parker while (++MI != MBB->end()) {
33705532575SSam Parker if (MI->isDebugInstr())
33805532575SSam Parker continue;
33905532575SSam Parker
34028166816SSam Parker // If/when we find a new reaching def, we know that there's no more uses
34128166816SSam Parker // of 'Def'.
3421d06e75dSSam Parker if (getReachingLocalMIDef(&*MI, PhysReg) != Def)
34328166816SSam Parker return;
34428166816SSam Parker
345acbc9aedSSam Parker for (auto &MO : MI->operands()) {
346eeddcba5SDavid Green if (!isValidRegUseOf(MO, PhysReg, TRI))
347acbc9aedSSam Parker continue;
348acbc9aedSSam Parker
34942350cd8SSam Parker Uses.insert(&*MI);
35028166816SSam Parker if (MO.isKill())
35128166816SSam Parker return;
35228166816SSam Parker }
35328166816SSam Parker }
35428166816SSam Parker }
35528166816SSam Parker
getLiveInUses(MachineBasicBlock * MBB,MCRegister PhysReg,InstSet & Uses) const356e24537d4SMircea Trofin bool ReachingDefAnalysis::getLiveInUses(MachineBasicBlock *MBB,
357e24537d4SMircea Trofin MCRegister PhysReg,
3587ad879caSSam Parker InstSet &Uses) const {
3598f92f3c2SSam Parker for (MachineInstr &MI :
3608f92f3c2SSam Parker instructionsWithoutDebug(MBB->instr_begin(), MBB->instr_end())) {
36142350cd8SSam Parker for (auto &MO : MI.operands()) {
362eeddcba5SDavid Green if (!isValidRegUseOf(MO, PhysReg, TRI))
36342350cd8SSam Parker continue;
36442350cd8SSam Parker if (getReachingDef(&MI, PhysReg) >= 0)
36542350cd8SSam Parker return false;
36642350cd8SSam Parker Uses.insert(&MI);
36742350cd8SSam Parker }
36842350cd8SSam Parker }
369cb27006aSDavid Green auto Last = MBB->getLastNonDebugInstr();
370cb27006aSDavid Green if (Last == MBB->end())
371cb27006aSDavid Green return true;
372cb27006aSDavid Green return isReachingDefLiveOut(&*Last, PhysReg);
37342350cd8SSam Parker }
37442350cd8SSam Parker
getGlobalUses(MachineInstr * MI,MCRegister PhysReg,InstSet & Uses) const375e24537d4SMircea Trofin void ReachingDefAnalysis::getGlobalUses(MachineInstr *MI, MCRegister PhysReg,
3767ad879caSSam Parker InstSet &Uses) const {
37742350cd8SSam Parker MachineBasicBlock *MBB = MI->getParent();
37842350cd8SSam Parker
37942350cd8SSam Parker // Collect the uses that each def touches within the block.
38042350cd8SSam Parker getReachingLocalUses(MI, PhysReg, Uses);
38142350cd8SSam Parker
38242350cd8SSam Parker // Handle live-out values.
38342350cd8SSam Parker if (auto *LiveOut = getLocalLiveOutMIDef(MI->getParent(), PhysReg)) {
38442350cd8SSam Parker if (LiveOut != MI)
38542350cd8SSam Parker return;
38642350cd8SSam Parker
3877bc76fd0SKazu Hirata SmallVector<MachineBasicBlock *, 4> ToVisit(MBB->successors());
38842350cd8SSam Parker SmallPtrSet<MachineBasicBlock*, 4>Visited;
38942350cd8SSam Parker while (!ToVisit.empty()) {
39084b07c9bSKazu Hirata MachineBasicBlock *MBB = ToVisit.pop_back_val();
39142350cd8SSam Parker if (Visited.count(MBB) || !MBB->isLiveIn(PhysReg))
39242350cd8SSam Parker continue;
39342350cd8SSam Parker if (getLiveInUses(MBB, PhysReg, Uses))
3941e3ed091SKazu Hirata llvm::append_range(ToVisit, MBB->successors());
39542350cd8SSam Parker Visited.insert(MBB);
39642350cd8SSam Parker }
39742350cd8SSam Parker }
398cced971fSSam Parker }
399cced971fSSam Parker
getGlobalReachingDefs(MachineInstr * MI,MCRegister PhysReg,InstSet & Defs) const400e24537d4SMircea Trofin void ReachingDefAnalysis::getGlobalReachingDefs(MachineInstr *MI,
401e24537d4SMircea Trofin MCRegister PhysReg,
402b30adfb5SSam Parker InstSet &Defs) const {
403b30adfb5SSam Parker if (auto *Def = getUniqueReachingMIDef(MI, PhysReg)) {
404b30adfb5SSam Parker Defs.insert(Def);
405b30adfb5SSam Parker return;
406b30adfb5SSam Parker }
407b30adfb5SSam Parker
408b30adfb5SSam Parker for (auto *MBB : MI->getParent()->predecessors())
409b30adfb5SSam Parker getLiveOuts(MBB, PhysReg, Defs);
410b30adfb5SSam Parker }
411b30adfb5SSam Parker
getLiveOuts(MachineBasicBlock * MBB,MCRegister PhysReg,InstSet & Defs) const412e24537d4SMircea Trofin void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB,
413e24537d4SMircea Trofin MCRegister PhysReg, InstSet &Defs) const {
4143ee580d0SSam Parker SmallPtrSet<MachineBasicBlock*, 2> VisitedBBs;
4153ee580d0SSam Parker getLiveOuts(MBB, PhysReg, Defs, VisitedBBs);
4163ee580d0SSam Parker }
4173ee580d0SSam Parker
getLiveOuts(MachineBasicBlock * MBB,MCRegister PhysReg,InstSet & Defs,BlockSet & VisitedBBs) const418e24537d4SMircea Trofin void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB,
419e24537d4SMircea Trofin MCRegister PhysReg, InstSet &Defs,
420e24537d4SMircea Trofin BlockSet &VisitedBBs) const {
4211d06e75dSSam Parker if (VisitedBBs.count(MBB))
4221d06e75dSSam Parker return;
4231d06e75dSSam Parker
4241d06e75dSSam Parker VisitedBBs.insert(MBB);
4251d06e75dSSam Parker LivePhysRegs LiveRegs(*TRI);
4261d06e75dSSam Parker LiveRegs.addLiveOuts(*MBB);
427eeddcba5SDavid Green if (LiveRegs.available(MBB->getParent()->getRegInfo(), PhysReg))
4281d06e75dSSam Parker return;
4291d06e75dSSam Parker
4301d06e75dSSam Parker if (auto *Def = getLocalLiveOutMIDef(MBB, PhysReg))
4311d06e75dSSam Parker Defs.insert(Def);
4321d06e75dSSam Parker else
4331d06e75dSSam Parker for (auto *Pred : MBB->predecessors())
4341d06e75dSSam Parker getLiveOuts(Pred, PhysReg, Defs, VisitedBBs);
4351d06e75dSSam Parker }
4361d06e75dSSam Parker
437e24537d4SMircea Trofin MachineInstr *
getUniqueReachingMIDef(MachineInstr * MI,MCRegister PhysReg) const438e24537d4SMircea Trofin ReachingDefAnalysis::getUniqueReachingMIDef(MachineInstr *MI,
439e24537d4SMircea Trofin MCRegister PhysReg) const {
4401d06e75dSSam Parker // If there's a local def before MI, return it.
4411d06e75dSSam Parker MachineInstr *LocalDef = getReachingLocalMIDef(MI, PhysReg);
4425618e9beSSam Parker if (LocalDef && InstIds.lookup(LocalDef) < InstIds.lookup(MI))
4431d06e75dSSam Parker return LocalDef;
4441d06e75dSSam Parker
4451d06e75dSSam Parker SmallPtrSet<MachineInstr*, 2> Incoming;
44685dd852aSSam Tebbs MachineBasicBlock *Parent = MI->getParent();
44785dd852aSSam Tebbs for (auto *Pred : Parent->predecessors())
4481c421046SSam Parker getLiveOuts(Pred, PhysReg, Incoming);
4491d06e75dSSam Parker
4501c421046SSam Parker // Check that we have a single incoming value and that it does not
4511c421046SSam Parker // come from the same block as MI - since it would mean that the def
4521c421046SSam Parker // is executed after MI.
4531c421046SSam Parker if (Incoming.size() == 1 && (*Incoming.begin())->getParent() != Parent)
4541d06e75dSSam Parker return *Incoming.begin();
4551c421046SSam Parker return nullptr;
4561d06e75dSSam Parker }
4571d06e75dSSam Parker
getMIOperand(MachineInstr * MI,unsigned Idx) const4581d06e75dSSam Parker MachineInstr *ReachingDefAnalysis::getMIOperand(MachineInstr *MI,
4591d06e75dSSam Parker unsigned Idx) const {
4601d06e75dSSam Parker assert(MI->getOperand(Idx).isReg() && "Expected register operand");
4611d06e75dSSam Parker return getUniqueReachingMIDef(MI, MI->getOperand(Idx).getReg());
4621d06e75dSSam Parker }
4631d06e75dSSam Parker
getMIOperand(MachineInstr * MI,MachineOperand & MO) const4641d06e75dSSam Parker MachineInstr *ReachingDefAnalysis::getMIOperand(MachineInstr *MI,
4651d06e75dSSam Parker MachineOperand &MO) const {
4661d06e75dSSam Parker assert(MO.isReg() && "Expected register operand");
4671d06e75dSSam Parker return getUniqueReachingMIDef(MI, MO.getReg());
4681d06e75dSSam Parker }
4691d06e75dSSam Parker
isRegUsedAfter(MachineInstr * MI,MCRegister PhysReg) const470e24537d4SMircea Trofin bool ReachingDefAnalysis::isRegUsedAfter(MachineInstr *MI,
471e24537d4SMircea Trofin MCRegister PhysReg) const {
472cced971fSSam Parker MachineBasicBlock *MBB = MI->getParent();
473cced971fSSam Parker LivePhysRegs LiveRegs(*TRI);
474cced971fSSam Parker LiveRegs.addLiveOuts(*MBB);
475cced971fSSam Parker
476cced971fSSam Parker // Yes if the register is live out of the basic block.
477eeddcba5SDavid Green if (!LiveRegs.available(MBB->getParent()->getRegInfo(), PhysReg))
478cced971fSSam Parker return true;
479cced971fSSam Parker
480cced971fSSam Parker // Walk backwards through the block to see if the register is live at some
481cced971fSSam Parker // point.
4828f92f3c2SSam Parker for (MachineInstr &Last :
4838f92f3c2SSam Parker instructionsWithoutDebug(MBB->instr_rbegin(), MBB->instr_rend())) {
4848f92f3c2SSam Parker LiveRegs.stepBackward(Last);
485eeddcba5SDavid Green if (!LiveRegs.available(MBB->getParent()->getRegInfo(), PhysReg))
4868f92f3c2SSam Parker return InstIds.lookup(&Last) > InstIds.lookup(MI);
487cced971fSSam Parker }
488cced971fSSam Parker return false;
489cced971fSSam Parker }
490cced971fSSam Parker
isRegDefinedAfter(MachineInstr * MI,MCRegister PhysReg) const491ac30ea2fSSam Parker bool ReachingDefAnalysis::isRegDefinedAfter(MachineInstr *MI,
492e24537d4SMircea Trofin MCRegister PhysReg) const {
493ac30ea2fSSam Parker MachineBasicBlock *MBB = MI->getParent();
494cb27006aSDavid Green auto Last = MBB->getLastNonDebugInstr();
495cb27006aSDavid Green if (Last != MBB->end() &&
496cb27006aSDavid Green getReachingDef(MI, PhysReg) != getReachingDef(&*Last, PhysReg))
497ac30ea2fSSam Parker return true;
498ac30ea2fSSam Parker
499ac30ea2fSSam Parker if (auto *Def = getLocalLiveOutMIDef(MBB, PhysReg))
5001d06e75dSSam Parker return Def == getReachingLocalMIDef(MI, PhysReg);
501ac30ea2fSSam Parker
502ac30ea2fSSam Parker return false;
503ac30ea2fSSam Parker }
504ac30ea2fSSam Parker
isReachingDefLiveOut(MachineInstr * MI,MCRegister PhysReg) const505e24537d4SMircea Trofin bool ReachingDefAnalysis::isReachingDefLiveOut(MachineInstr *MI,
506e24537d4SMircea Trofin MCRegister PhysReg) const {
507acbc9aedSSam Parker MachineBasicBlock *MBB = MI->getParent();
508acbc9aedSSam Parker LivePhysRegs LiveRegs(*TRI);
509acbc9aedSSam Parker LiveRegs.addLiveOuts(*MBB);
510eeddcba5SDavid Green if (LiveRegs.available(MBB->getParent()->getRegInfo(), PhysReg))
511acbc9aedSSam Parker return false;
512acbc9aedSSam Parker
513cb27006aSDavid Green auto Last = MBB->getLastNonDebugInstr();
514acbc9aedSSam Parker int Def = getReachingDef(MI, PhysReg);
515cb27006aSDavid Green if (Last != MBB->end() && getReachingDef(&*Last, PhysReg) != Def)
516acbc9aedSSam Parker return false;
517acbc9aedSSam Parker
518acbc9aedSSam Parker // Finally check that the last instruction doesn't redefine the register.
519acbc9aedSSam Parker for (auto &MO : Last->operands())
520eeddcba5SDavid Green if (isValidRegDefOf(MO, PhysReg, TRI))
521acbc9aedSSam Parker return false;
522acbc9aedSSam Parker
523acbc9aedSSam Parker return true;
524acbc9aedSSam Parker }
525acbc9aedSSam Parker
526e24537d4SMircea Trofin MachineInstr *
getLocalLiveOutMIDef(MachineBasicBlock * MBB,MCRegister PhysReg) const527e24537d4SMircea Trofin ReachingDefAnalysis::getLocalLiveOutMIDef(MachineBasicBlock *MBB,
528e24537d4SMircea Trofin MCRegister PhysReg) const {
529acbc9aedSSam Parker LivePhysRegs LiveRegs(*TRI);
530acbc9aedSSam Parker LiveRegs.addLiveOuts(*MBB);
531eeddcba5SDavid Green if (LiveRegs.available(MBB->getParent()->getRegInfo(), PhysReg))
532acbc9aedSSam Parker return nullptr;
533acbc9aedSSam Parker
534cb27006aSDavid Green auto Last = MBB->getLastNonDebugInstr();
535cb27006aSDavid Green if (Last == MBB->end())
536cb27006aSDavid Green return nullptr;
537cb27006aSDavid Green
538cb27006aSDavid Green int Def = getReachingDef(&*Last, PhysReg);
539acbc9aedSSam Parker for (auto &MO : Last->operands())
540eeddcba5SDavid Green if (isValidRegDefOf(MO, PhysReg, TRI))
541cb27006aSDavid Green return &*Last;
542acbc9aedSSam Parker
543acbc9aedSSam Parker return Def < 0 ? nullptr : getInstFromId(MBB, Def);
544acbc9aedSSam Parker }
545ac30ea2fSSam Parker
mayHaveSideEffects(MachineInstr & MI)5460a8cae10SSam Parker static bool mayHaveSideEffects(MachineInstr &MI) {
5470a8cae10SSam Parker return MI.mayLoadOrStore() || MI.mayRaiseFPException() ||
5480a8cae10SSam Parker MI.hasUnmodeledSideEffects() || MI.isTerminator() ||
5490a8cae10SSam Parker MI.isCall() || MI.isBarrier() || MI.isBranch() || MI.isReturn();
5500a8cae10SSam Parker }
5510a8cae10SSam Parker
552ac30ea2fSSam Parker // Can we safely move 'From' to just before 'To'? To satisfy this, 'From' must
553ac30ea2fSSam Parker // not define a register that is used by any instructions, after and including,
554ac30ea2fSSam Parker // 'To'. These instructions also must not redefine any of Froms operands.
555ac30ea2fSSam Parker template<typename Iterator>
isSafeToMove(MachineInstr * From,MachineInstr * To) const556ac30ea2fSSam Parker bool ReachingDefAnalysis::isSafeToMove(MachineInstr *From,
557ac30ea2fSSam Parker MachineInstr *To) const {
558700f93e9SSam Parker if (From->getParent() != To->getParent() || From == To)
559ac30ea2fSSam Parker return false;
560ac30ea2fSSam Parker
561ac30ea2fSSam Parker SmallSet<int, 2> Defs;
562ac30ea2fSSam Parker // First check that From would compute the same value if moved.
563ac30ea2fSSam Parker for (auto &MO : From->operands()) {
564bf61421aSSam Parker if (!isValidReg(MO))
565ac30ea2fSSam Parker continue;
566ac30ea2fSSam Parker if (MO.isDef())
567ac30ea2fSSam Parker Defs.insert(MO.getReg());
568ac30ea2fSSam Parker else if (!hasSameReachingDef(From, To, MO.getReg()))
569ac30ea2fSSam Parker return false;
570ac30ea2fSSam Parker }
571ac30ea2fSSam Parker
572ac30ea2fSSam Parker // Now walk checking that the rest of the instructions will compute the same
5730a8cae10SSam Parker // value and that we're not overwriting anything. Don't move the instruction
57468b30bc0SCasey Carter // past any memory, control-flow or other ambiguous instructions.
575ac30ea2fSSam Parker for (auto I = ++Iterator(From), E = Iterator(To); I != E; ++I) {
5760a8cae10SSam Parker if (mayHaveSideEffects(*I))
5770a8cae10SSam Parker return false;
578ac30ea2fSSam Parker for (auto &MO : I->operands())
5790a8cae10SSam Parker if (MO.isReg() && MO.getReg() && Defs.count(MO.getReg()))
580ac30ea2fSSam Parker return false;
581ac30ea2fSSam Parker }
582ac30ea2fSSam Parker return true;
583ac30ea2fSSam Parker }
584ac30ea2fSSam Parker
isSafeToMoveForwards(MachineInstr * From,MachineInstr * To) const585ac30ea2fSSam Parker bool ReachingDefAnalysis::isSafeToMoveForwards(MachineInstr *From,
586ac30ea2fSSam Parker MachineInstr *To) const {
587700f93e9SSam Parker using Iterator = MachineBasicBlock::iterator;
588700f93e9SSam Parker // Walk forwards until we find the instruction.
589700f93e9SSam Parker for (auto I = Iterator(From), E = From->getParent()->end(); I != E; ++I)
590700f93e9SSam Parker if (&*I == To)
591700f93e9SSam Parker return isSafeToMove<Iterator>(From, To);
592700f93e9SSam Parker return false;
593ac30ea2fSSam Parker }
594ac30ea2fSSam Parker
isSafeToMoveBackwards(MachineInstr * From,MachineInstr * To) const595ac30ea2fSSam Parker bool ReachingDefAnalysis::isSafeToMoveBackwards(MachineInstr *From,
596ac30ea2fSSam Parker MachineInstr *To) const {
597700f93e9SSam Parker using Iterator = MachineBasicBlock::reverse_iterator;
598700f93e9SSam Parker // Walk backwards until we find the instruction.
599700f93e9SSam Parker for (auto I = Iterator(From), E = From->getParent()->rend(); I != E; ++I)
600700f93e9SSam Parker if (&*I == To)
601700f93e9SSam Parker return isSafeToMove<Iterator>(From, To);
602700f93e9SSam Parker return false;
603ac30ea2fSSam Parker }
604ac30ea2fSSam Parker
isSafeToRemove(MachineInstr * MI,InstSet & ToRemove) const605ac30ea2fSSam Parker bool ReachingDefAnalysis::isSafeToRemove(MachineInstr *MI,
606ac30ea2fSSam Parker InstSet &ToRemove) const {
607ac30ea2fSSam Parker SmallPtrSet<MachineInstr*, 1> Ignore;
608ac30ea2fSSam Parker SmallPtrSet<MachineInstr*, 2> Visited;
609ac30ea2fSSam Parker return isSafeToRemove(MI, Visited, ToRemove, Ignore);
610ac30ea2fSSam Parker }
611ac30ea2fSSam Parker
612ac30ea2fSSam Parker bool
isSafeToRemove(MachineInstr * MI,InstSet & ToRemove,InstSet & Ignore) const613ac30ea2fSSam Parker ReachingDefAnalysis::isSafeToRemove(MachineInstr *MI, InstSet &ToRemove,
614ac30ea2fSSam Parker InstSet &Ignore) const {
615ac30ea2fSSam Parker SmallPtrSet<MachineInstr*, 2> Visited;
616ac30ea2fSSam Parker return isSafeToRemove(MI, Visited, ToRemove, Ignore);
617ac30ea2fSSam Parker }
618ac30ea2fSSam Parker
619ac30ea2fSSam Parker bool
isSafeToRemove(MachineInstr * MI,InstSet & Visited,InstSet & ToRemove,InstSet & Ignore) const620ac30ea2fSSam Parker ReachingDefAnalysis::isSafeToRemove(MachineInstr *MI, InstSet &Visited,
621ac30ea2fSSam Parker InstSet &ToRemove, InstSet &Ignore) const {
622ac30ea2fSSam Parker if (Visited.count(MI) || Ignore.count(MI))
623ac30ea2fSSam Parker return true;
6240a8cae10SSam Parker else if (mayHaveSideEffects(*MI)) {
625ac30ea2fSSam Parker // Unless told to ignore the instruction, don't remove anything which has
626ac30ea2fSSam Parker // side effects.
627ac30ea2fSSam Parker return false;
628ac30ea2fSSam Parker }
629ac30ea2fSSam Parker
630ac30ea2fSSam Parker Visited.insert(MI);
631ac30ea2fSSam Parker for (auto &MO : MI->operands()) {
632bf61421aSSam Parker if (!isValidRegDef(MO))
633ac30ea2fSSam Parker continue;
634ac30ea2fSSam Parker
635ac30ea2fSSam Parker SmallPtrSet<MachineInstr*, 4> Uses;
636ac30ea2fSSam Parker getGlobalUses(MI, MO.getReg(), Uses);
637ac30ea2fSSam Parker
638*9e6d1f4bSKazu Hirata for (auto *I : Uses) {
639ac30ea2fSSam Parker if (Ignore.count(I) || ToRemove.count(I))
640ac30ea2fSSam Parker continue;
641ac30ea2fSSam Parker if (!isSafeToRemove(I, Visited, ToRemove, Ignore))
642ac30ea2fSSam Parker return false;
643ac30ea2fSSam Parker }
644ac30ea2fSSam Parker }
645ac30ea2fSSam Parker ToRemove.insert(MI);
646ac30ea2fSSam Parker return true;
647ac30ea2fSSam Parker }
648ac30ea2fSSam Parker
collectKilledOperands(MachineInstr * MI,InstSet & Dead) const6495618e9beSSam Parker void ReachingDefAnalysis::collectKilledOperands(MachineInstr *MI,
650a67eb221SSam Parker InstSet &Dead) const {
651a67eb221SSam Parker Dead.insert(MI);
652e24537d4SMircea Trofin auto IsDead = [this, &Dead](MachineInstr *Def, MCRegister PhysReg) {
653779a8a02SSam Parker if (mayHaveSideEffects(*Def))
654779a8a02SSam Parker return false;
655779a8a02SSam Parker
656a67eb221SSam Parker unsigned LiveDefs = 0;
657bf61421aSSam Parker for (auto &MO : Def->operands()) {
658bf61421aSSam Parker if (!isValidRegDef(MO))
659bf61421aSSam Parker continue;
660a67eb221SSam Parker if (!MO.isDead())
661a67eb221SSam Parker ++LiveDefs;
662bf61421aSSam Parker }
663a67eb221SSam Parker
664a67eb221SSam Parker if (LiveDefs > 1)
665a67eb221SSam Parker return false;
666a67eb221SSam Parker
667a67eb221SSam Parker SmallPtrSet<MachineInstr*, 4> Uses;
668a67eb221SSam Parker getGlobalUses(Def, PhysReg, Uses);
669d6391209SKazu Hirata return llvm::set_is_subset(Uses, Dead);
670a67eb221SSam Parker };
671a67eb221SSam Parker
672bf61421aSSam Parker for (auto &MO : MI->operands()) {
6735618e9beSSam Parker if (!isValidRegUse(MO))
674a67eb221SSam Parker continue;
6755618e9beSSam Parker if (MachineInstr *Def = getMIOperand(MI, MO))
676a67eb221SSam Parker if (IsDead(Def, MO.getReg()))
6775618e9beSSam Parker collectKilledOperands(Def, Dead);
678a67eb221SSam Parker }
679a67eb221SSam Parker }
680a67eb221SSam Parker
isSafeToDefRegAt(MachineInstr * MI,MCRegister PhysReg) const681ac30ea2fSSam Parker bool ReachingDefAnalysis::isSafeToDefRegAt(MachineInstr *MI,
682e24537d4SMircea Trofin MCRegister PhysReg) const {
683ac30ea2fSSam Parker SmallPtrSet<MachineInstr*, 1> Ignore;
684ac30ea2fSSam Parker return isSafeToDefRegAt(MI, PhysReg, Ignore);
685ac30ea2fSSam Parker }
686ac30ea2fSSam Parker
isSafeToDefRegAt(MachineInstr * MI,MCRegister PhysReg,InstSet & Ignore) const687e24537d4SMircea Trofin bool ReachingDefAnalysis::isSafeToDefRegAt(MachineInstr *MI, MCRegister PhysReg,
688ac30ea2fSSam Parker InstSet &Ignore) const {
689ac30ea2fSSam Parker // Check for any uses of the register after MI.
690ac30ea2fSSam Parker if (isRegUsedAfter(MI, PhysReg)) {
6911d06e75dSSam Parker if (auto *Def = getReachingLocalMIDef(MI, PhysReg)) {
692ac30ea2fSSam Parker SmallPtrSet<MachineInstr*, 2> Uses;
6933f88c10aSSam Parker getGlobalUses(Def, PhysReg, Uses);
694d6391209SKazu Hirata if (!llvm::set_is_subset(Uses, Ignore))
695ac30ea2fSSam Parker return false;
696ac30ea2fSSam Parker } else
697ac30ea2fSSam Parker return false;
698ac30ea2fSSam Parker }
699ac30ea2fSSam Parker
700ac30ea2fSSam Parker MachineBasicBlock *MBB = MI->getParent();
701ac30ea2fSSam Parker // Check for any defs after MI.
702ac30ea2fSSam Parker if (isRegDefinedAfter(MI, PhysReg)) {
703ac30ea2fSSam Parker auto I = MachineBasicBlock::iterator(MI);
704ac30ea2fSSam Parker for (auto E = MBB->end(); I != E; ++I) {
705ac30ea2fSSam Parker if (Ignore.count(&*I))
706ac30ea2fSSam Parker continue;
707ac30ea2fSSam Parker for (auto &MO : I->operands())
708eeddcba5SDavid Green if (isValidRegDefOf(MO, PhysReg, TRI))
709ac30ea2fSSam Parker return false;
710ac30ea2fSSam Parker }
711ac30ea2fSSam Parker }
712ac30ea2fSSam Parker return true;
713ac30ea2fSSam Parker }
714