1 //===---- ReachingDefAnalysis.cpp - Reaching Def Analysis ---*- C++ -*-----===// 2 // 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 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "llvm/CodeGen/ReachingDefAnalysis.h" 10 #include "llvm/ADT/SetOperations.h" 11 #include "llvm/ADT/SmallSet.h" 12 #include "llvm/CodeGen/LiveRegUnits.h" 13 #include "llvm/CodeGen/MachineFrameInfo.h" 14 #include "llvm/CodeGen/TargetInstrInfo.h" 15 #include "llvm/CodeGen/TargetRegisterInfo.h" 16 #include "llvm/CodeGen/TargetSubtargetInfo.h" 17 #include "llvm/Support/Debug.h" 18 19 using namespace llvm; 20 21 #define DEBUG_TYPE "reaching-defs-analysis" 22 23 static cl::opt<bool> PrintAllReachingDefs("print-all-reaching-defs", cl::Hidden, 24 cl::desc("Used for test purpuses"), 25 cl::Hidden); 26 27 char ReachingDefAnalysis::ID = 0; 28 INITIALIZE_PASS(ReachingDefAnalysis, DEBUG_TYPE, "ReachingDefAnalysis", false, 29 true) 30 31 static bool isValidReg(const MachineOperand &MO) { 32 return MO.isReg() && MO.getReg(); 33 } 34 35 static bool isValidRegUse(const MachineOperand &MO) { 36 return isValidReg(MO) && MO.isUse(); 37 } 38 39 static bool isValidRegUseOf(const MachineOperand &MO, Register Reg, 40 const TargetRegisterInfo *TRI) { 41 if (!isValidRegUse(MO)) 42 return false; 43 return TRI->regsOverlap(MO.getReg(), Reg); 44 } 45 46 static bool isValidRegDef(const MachineOperand &MO) { 47 return isValidReg(MO) && MO.isDef(); 48 } 49 50 static bool isValidRegDefOf(const MachineOperand &MO, Register Reg, 51 const TargetRegisterInfo *TRI) { 52 if (!isValidRegDef(MO)) 53 return false; 54 return TRI->regsOverlap(MO.getReg(), Reg); 55 } 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 67 void ReachingDefAnalysis::enterBasicBlock(MachineBasicBlock *MBB) { 68 unsigned MBBNumber = MBB->getNumber(); 69 assert(MBBNumber < MBBReachingDefs.numBlockIDs() && 70 "Unexpected basic block number."); 71 MBBReachingDefs.startBasicBlock(MBBNumber, NumRegUnits); 72 73 // Reset instruction counter in each basic block. 74 CurInstr = 0; 75 76 // Set up LiveRegs to represent registers entering MBB. 77 // Default values are 'nothing happened a long time ago'. 78 if (LiveRegs.empty()) 79 LiveRegs.assign(NumRegUnits, ReachingDefDefaultVal); 80 81 // This is the entry block. 82 if (MBB->pred_empty()) { 83 for (const auto &LI : MBB->liveins()) { 84 for (MCRegUnit Unit : TRI->regunits(LI.PhysReg)) { 85 // Treat function live-ins as if they were defined just before the first 86 // instruction. Usually, function arguments are set up immediately 87 // before the call. 88 if (LiveRegs[Unit] != -1) { 89 LiveRegs[Unit] = -1; 90 MBBReachingDefs.append(MBBNumber, Unit, -1); 91 } 92 } 93 } 94 LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << ": entry\n"); 95 return; 96 } 97 98 // Try to coalesce live-out registers from predecessors. 99 for (MachineBasicBlock *pred : MBB->predecessors()) { 100 assert(unsigned(pred->getNumber()) < MBBOutRegsInfos.size() && 101 "Should have pre-allocated MBBInfos for all MBBs"); 102 const LiveRegsDefInfo &Incoming = MBBOutRegsInfos[pred->getNumber()]; 103 // Incoming is null if this is a backedge from a BB 104 // we haven't processed yet 105 if (Incoming.empty()) 106 continue; 107 108 // Find the most recent reaching definition from a predecessor. 109 for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit) 110 LiveRegs[Unit] = std::max(LiveRegs[Unit], Incoming[Unit]); 111 } 112 113 // Insert the most recent reaching definition we found. 114 for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit) 115 if (LiveRegs[Unit] != ReachingDefDefaultVal) 116 MBBReachingDefs.append(MBBNumber, Unit, LiveRegs[Unit]); 117 } 118 119 void ReachingDefAnalysis::leaveBasicBlock(MachineBasicBlock *MBB) { 120 assert(!LiveRegs.empty() && "Must enter basic block first."); 121 unsigned MBBNumber = MBB->getNumber(); 122 assert(MBBNumber < MBBOutRegsInfos.size() && 123 "Unexpected basic block number."); 124 // Save register clearances at end of MBB - used by enterBasicBlock(). 125 MBBOutRegsInfos[MBBNumber] = LiveRegs; 126 127 // While processing the basic block, we kept `Def` relative to the start 128 // of the basic block for convenience. However, future use of this information 129 // only cares about the clearance from the end of the block, so adjust 130 // everything to be relative to the end of the basic block. 131 for (int &OutLiveReg : MBBOutRegsInfos[MBBNumber]) 132 if (OutLiveReg != ReachingDefDefaultVal) 133 OutLiveReg -= CurInstr; 134 LiveRegs.clear(); 135 } 136 137 void ReachingDefAnalysis::processDefs(MachineInstr *MI) { 138 assert(!MI->isDebugInstr() && "Won't process debug instructions"); 139 140 unsigned MBBNumber = MI->getParent()->getNumber(); 141 assert(MBBNumber < MBBReachingDefs.numBlockIDs() && 142 "Unexpected basic block number."); 143 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 } 161 if (!isValidRegDef(MO)) 162 continue; 163 for (MCRegUnit Unit : TRI->regunits(MO.getReg().asMCReg())) { 164 // This instruction explicitly defines the current reg unit. 165 LLVM_DEBUG(dbgs() << printRegUnit(Unit, TRI) << ":\t" << CurInstr << '\t' 166 << *MI); 167 168 // How many instructions since this reg unit was last written? 169 if (LiveRegs[Unit] != CurInstr) { 170 LiveRegs[Unit] = CurInstr; 171 MBBReachingDefs.append(MBBNumber, Unit, CurInstr); 172 } 173 } 174 } 175 InstIds[MI] = CurInstr; 176 ++CurInstr; 177 } 178 179 void ReachingDefAnalysis::reprocessBasicBlock(MachineBasicBlock *MBB) { 180 unsigned MBBNumber = MBB->getNumber(); 181 assert(MBBNumber < MBBReachingDefs.numBlockIDs() && 182 "Unexpected basic block number."); 183 184 // Count number of non-debug instructions for end of block adjustment. 185 auto NonDbgInsts = 186 instructionsWithoutDebug(MBB->instr_begin(), MBB->instr_end()); 187 int NumInsts = std::distance(NonDbgInsts.begin(), NonDbgInsts.end()); 188 189 // When reprocessing a block, the only thing we need to do is check whether 190 // there is now a more recent incoming reaching definition from a predecessor. 191 for (MachineBasicBlock *pred : MBB->predecessors()) { 192 assert(unsigned(pred->getNumber()) < MBBOutRegsInfos.size() && 193 "Should have pre-allocated MBBInfos for all MBBs"); 194 const LiveRegsDefInfo &Incoming = MBBOutRegsInfos[pred->getNumber()]; 195 // Incoming may be empty for dead predecessors. 196 if (Incoming.empty()) 197 continue; 198 199 for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit) { 200 int Def = Incoming[Unit]; 201 if (Def == ReachingDefDefaultVal) 202 continue; 203 204 auto Defs = MBBReachingDefs.defs(MBBNumber, Unit); 205 if (!Defs.empty() && Defs.front() < 0) { 206 if (Defs.front() >= Def) 207 continue; 208 209 // Update existing reaching def from predecessor to a more recent one. 210 MBBReachingDefs.replaceFront(MBBNumber, Unit, Def); 211 } else { 212 // Insert new reaching def from predecessor. 213 MBBReachingDefs.prepend(MBBNumber, Unit, Def); 214 } 215 216 // Update reaching def at end of BB. Keep in mind that these are 217 // adjusted relative to the end of the basic block. 218 if (MBBOutRegsInfos[MBBNumber][Unit] < Def - NumInsts) 219 MBBOutRegsInfos[MBBNumber][Unit] = Def - NumInsts; 220 } 221 } 222 } 223 224 void ReachingDefAnalysis::processBasicBlock( 225 const LoopTraversal::TraversedMBBInfo &TraversedMBB) { 226 MachineBasicBlock *MBB = TraversedMBB.MBB; 227 LLVM_DEBUG(dbgs() << printMBBReference(*MBB) 228 << (!TraversedMBB.IsDone ? ": incomplete\n" 229 : ": all preds known\n")); 230 231 if (!TraversedMBB.PrimaryPass) { 232 // Reprocess MBB that is part of a loop. 233 reprocessBasicBlock(MBB); 234 return; 235 } 236 237 enterBasicBlock(MBB); 238 for (MachineInstr &MI : 239 instructionsWithoutDebug(MBB->instr_begin(), MBB->instr_end())) 240 processDefs(&MI); 241 leaveBasicBlock(MBB); 242 } 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 281 bool ReachingDefAnalysis::runOnMachineFunction(MachineFunction &mf) { 282 MF = &mf; 283 TRI = MF->getSubtarget().getRegisterInfo(); 284 const TargetSubtargetInfo &STI = MF->getSubtarget(); 285 TRI = STI.getRegisterInfo(); 286 TII = STI.getInstrInfo(); 287 LLVM_DEBUG(dbgs() << "********** REACHING DEFINITION ANALYSIS **********\n"); 288 init(); 289 traverse(); 290 if (PrintAllReachingDefs) 291 printAllReachingDefs(*MF); 292 return false; 293 } 294 295 void ReachingDefAnalysis::releaseMemory() { 296 // Clear the internal vectors. 297 MBBOutRegsInfos.clear(); 298 MBBReachingDefs.clear(); 299 MBBFrameObjsReachingDefs.clear(); 300 InstIds.clear(); 301 LiveRegs.clear(); 302 } 303 304 void ReachingDefAnalysis::reset() { 305 releaseMemory(); 306 init(); 307 traverse(); 308 } 309 310 void ReachingDefAnalysis::init() { 311 NumRegUnits = TRI->getNumRegUnits(); 312 NumStackObjects = MF->getFrameInfo().getNumObjects(); 313 ObjectIndexBegin = MF->getFrameInfo().getObjectIndexBegin(); 314 MBBReachingDefs.init(MF->getNumBlockIDs()); 315 // Initialize the MBBOutRegsInfos 316 MBBOutRegsInfos.resize(MF->getNumBlockIDs()); 317 LoopTraversal Traversal; 318 TraversedMBBOrder = Traversal.traverse(*MF); 319 } 320 321 void ReachingDefAnalysis::traverse() { 322 // Traverse the basic blocks. 323 for (LoopTraversal::TraversedMBBInfo TraversedMBB : TraversedMBBOrder) 324 processBasicBlock(TraversedMBB); 325 #ifndef NDEBUG 326 // Make sure reaching defs are sorted and unique. 327 for (unsigned MBBNumber = 0, NumBlockIDs = MF->getNumBlockIDs(); 328 MBBNumber != NumBlockIDs; ++MBBNumber) { 329 for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit) { 330 int LastDef = ReachingDefDefaultVal; 331 for (int Def : MBBReachingDefs.defs(MBBNumber, Unit)) { 332 assert(Def > LastDef && "Defs must be sorted and unique"); 333 LastDef = Def; 334 } 335 } 336 } 337 #endif 338 } 339 340 int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, Register Reg) const { 341 assert(InstIds.count(MI) && "Unexpected machine instuction."); 342 int InstId = InstIds.lookup(MI); 343 int DefRes = ReachingDefDefaultVal; 344 unsigned MBBNumber = MI->getParent()->getNumber(); 345 assert(MBBNumber < MBBReachingDefs.numBlockIDs() && 346 "Unexpected basic block number."); 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 361 for (MCRegUnit Unit : TRI->regunits(Reg)) { 362 for (int Def : MBBReachingDefs.defs(MBBNumber, Unit)) { 363 if (Def >= InstId) 364 break; 365 DefRes = Def; 366 } 367 LatestDef = std::max(LatestDef, DefRes); 368 } 369 return LatestDef; 370 } 371 372 MachineInstr *ReachingDefAnalysis::getReachingLocalMIDef(MachineInstr *MI, 373 Register Reg) const { 374 return hasLocalDefBefore(MI, Reg) 375 ? getInstFromId(MI->getParent(), getReachingDef(MI, Reg)) 376 : nullptr; 377 } 378 379 bool ReachingDefAnalysis::hasSameReachingDef(MachineInstr *A, MachineInstr *B, 380 Register Reg) const { 381 MachineBasicBlock *ParentA = A->getParent(); 382 MachineBasicBlock *ParentB = B->getParent(); 383 if (ParentA != ParentB) 384 return false; 385 386 return getReachingDef(A, Reg) == getReachingDef(B, Reg); 387 } 388 389 MachineInstr *ReachingDefAnalysis::getInstFromId(MachineBasicBlock *MBB, 390 int InstId) const { 391 assert(static_cast<size_t>(MBB->getNumber()) < 392 MBBReachingDefs.numBlockIDs() && 393 "Unexpected basic block number."); 394 assert(InstId < static_cast<int>(MBB->size()) && 395 "Unexpected instruction id."); 396 397 if (InstId < 0) 398 return nullptr; 399 400 for (auto &MI : *MBB) { 401 auto F = InstIds.find(&MI); 402 if (F != InstIds.end() && F->second == InstId) 403 return &MI; 404 } 405 406 return nullptr; 407 } 408 409 int ReachingDefAnalysis::getClearance(MachineInstr *MI, Register Reg) const { 410 assert(InstIds.count(MI) && "Unexpected machine instuction."); 411 return InstIds.lookup(MI) - getReachingDef(MI, Reg); 412 } 413 414 bool ReachingDefAnalysis::hasLocalDefBefore(MachineInstr *MI, 415 Register Reg) const { 416 return getReachingDef(MI, Reg) >= 0; 417 } 418 419 void ReachingDefAnalysis::getReachingLocalUses(MachineInstr *Def, Register Reg, 420 InstSet &Uses) const { 421 MachineBasicBlock *MBB = Def->getParent(); 422 MachineBasicBlock::iterator MI = MachineBasicBlock::iterator(Def); 423 while (++MI != MBB->end()) { 424 if (MI->isDebugInstr()) 425 continue; 426 427 // If/when we find a new reaching def, we know that there's no more uses 428 // of 'Def'. 429 if (getReachingLocalMIDef(&*MI, Reg) != Def) 430 return; 431 432 for (auto &MO : MI->operands()) { 433 if (!isValidRegUseOf(MO, Reg, TRI)) 434 continue; 435 436 Uses.insert(&*MI); 437 if (MO.isKill()) 438 return; 439 } 440 } 441 } 442 443 bool ReachingDefAnalysis::getLiveInUses(MachineBasicBlock *MBB, Register Reg, 444 InstSet &Uses) const { 445 for (MachineInstr &MI : 446 instructionsWithoutDebug(MBB->instr_begin(), MBB->instr_end())) { 447 for (auto &MO : MI.operands()) { 448 if (!isValidRegUseOf(MO, Reg, TRI)) 449 continue; 450 if (getReachingDef(&MI, Reg) >= 0) 451 return false; 452 Uses.insert(&MI); 453 } 454 } 455 auto Last = MBB->getLastNonDebugInstr(); 456 if (Last == MBB->end()) 457 return true; 458 return isReachingDefLiveOut(&*Last, Reg); 459 } 460 461 void ReachingDefAnalysis::getGlobalUses(MachineInstr *MI, Register Reg, 462 InstSet &Uses) const { 463 MachineBasicBlock *MBB = MI->getParent(); 464 465 // Collect the uses that each def touches within the block. 466 getReachingLocalUses(MI, Reg, Uses); 467 468 // Handle live-out values. 469 if (auto *LiveOut = getLocalLiveOutMIDef(MI->getParent(), Reg)) { 470 if (LiveOut != MI) 471 return; 472 473 SmallVector<MachineBasicBlock *, 4> ToVisit(MBB->successors()); 474 SmallPtrSet<MachineBasicBlock*, 4>Visited; 475 while (!ToVisit.empty()) { 476 MachineBasicBlock *MBB = ToVisit.pop_back_val(); 477 if (Visited.count(MBB) || !MBB->isLiveIn(Reg)) 478 continue; 479 if (getLiveInUses(MBB, Reg, Uses)) 480 llvm::append_range(ToVisit, MBB->successors()); 481 Visited.insert(MBB); 482 } 483 } 484 } 485 486 void ReachingDefAnalysis::getGlobalReachingDefs(MachineInstr *MI, Register Reg, 487 InstSet &Defs) const { 488 if (auto *Def = getUniqueReachingMIDef(MI, Reg)) { 489 Defs.insert(Def); 490 return; 491 } 492 493 for (auto *MBB : MI->getParent()->predecessors()) 494 getLiveOuts(MBB, Reg, Defs); 495 } 496 497 void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB, Register Reg, 498 InstSet &Defs) const { 499 SmallPtrSet<MachineBasicBlock*, 2> VisitedBBs; 500 getLiveOuts(MBB, Reg, Defs, VisitedBBs); 501 } 502 503 void ReachingDefAnalysis::getLiveOuts(MachineBasicBlock *MBB, Register Reg, 504 InstSet &Defs, 505 BlockSet &VisitedBBs) const { 506 if (VisitedBBs.count(MBB)) 507 return; 508 509 VisitedBBs.insert(MBB); 510 LiveRegUnits LiveRegs(*TRI); 511 LiveRegs.addLiveOuts(*MBB); 512 if (Register::isPhysicalRegister(Reg) && LiveRegs.available(Reg)) 513 return; 514 515 if (auto *Def = getLocalLiveOutMIDef(MBB, Reg)) 516 Defs.insert(Def); 517 else 518 for (auto *Pred : MBB->predecessors()) 519 getLiveOuts(Pred, Reg, Defs, VisitedBBs); 520 } 521 522 MachineInstr *ReachingDefAnalysis::getUniqueReachingMIDef(MachineInstr *MI, 523 Register Reg) const { 524 // If there's a local def before MI, return it. 525 MachineInstr *LocalDef = getReachingLocalMIDef(MI, Reg); 526 if (LocalDef && InstIds.lookup(LocalDef) < InstIds.lookup(MI)) 527 return LocalDef; 528 529 SmallPtrSet<MachineInstr*, 2> Incoming; 530 MachineBasicBlock *Parent = MI->getParent(); 531 for (auto *Pred : Parent->predecessors()) 532 getLiveOuts(Pred, Reg, Incoming); 533 534 // Check that we have a single incoming value and that it does not 535 // come from the same block as MI - since it would mean that the def 536 // is executed after MI. 537 if (Incoming.size() == 1 && (*Incoming.begin())->getParent() != Parent) 538 return *Incoming.begin(); 539 return nullptr; 540 } 541 542 MachineInstr *ReachingDefAnalysis::getMIOperand(MachineInstr *MI, 543 unsigned Idx) const { 544 assert(MI->getOperand(Idx).isReg() && "Expected register operand"); 545 return getUniqueReachingMIDef(MI, MI->getOperand(Idx).getReg()); 546 } 547 548 MachineInstr *ReachingDefAnalysis::getMIOperand(MachineInstr *MI, 549 MachineOperand &MO) const { 550 assert(MO.isReg() && "Expected register operand"); 551 return getUniqueReachingMIDef(MI, MO.getReg()); 552 } 553 554 bool ReachingDefAnalysis::isRegUsedAfter(MachineInstr *MI, Register Reg) const { 555 MachineBasicBlock *MBB = MI->getParent(); 556 LiveRegUnits LiveRegs(*TRI); 557 LiveRegs.addLiveOuts(*MBB); 558 559 // Yes if the register is live out of the basic block. 560 if (!LiveRegs.available(Reg)) 561 return true; 562 563 // Walk backwards through the block to see if the register is live at some 564 // point. 565 for (MachineInstr &Last : 566 instructionsWithoutDebug(MBB->instr_rbegin(), MBB->instr_rend())) { 567 LiveRegs.stepBackward(Last); 568 if (!LiveRegs.available(Reg)) 569 return InstIds.lookup(&Last) > InstIds.lookup(MI); 570 } 571 return false; 572 } 573 574 bool ReachingDefAnalysis::isRegDefinedAfter(MachineInstr *MI, 575 Register Reg) const { 576 MachineBasicBlock *MBB = MI->getParent(); 577 auto Last = MBB->getLastNonDebugInstr(); 578 if (Last != MBB->end() && 579 getReachingDef(MI, Reg) != getReachingDef(&*Last, Reg)) 580 return true; 581 582 if (auto *Def = getLocalLiveOutMIDef(MBB, Reg)) 583 return Def == getReachingLocalMIDef(MI, Reg); 584 585 return false; 586 } 587 588 bool ReachingDefAnalysis::isReachingDefLiveOut(MachineInstr *MI, 589 Register Reg) const { 590 MachineBasicBlock *MBB = MI->getParent(); 591 LiveRegUnits LiveRegs(*TRI); 592 LiveRegs.addLiveOuts(*MBB); 593 if (Register::isPhysicalRegister(Reg) && LiveRegs.available(Reg)) 594 return false; 595 596 auto Last = MBB->getLastNonDebugInstr(); 597 int Def = getReachingDef(MI, Reg); 598 if (Last != MBB->end() && getReachingDef(&*Last, Reg) != Def) 599 return false; 600 601 // Finally check that the last instruction doesn't redefine the register. 602 for (auto &MO : Last->operands()) 603 if (isValidRegDefOf(MO, Reg, TRI)) 604 return false; 605 606 return true; 607 } 608 609 MachineInstr *ReachingDefAnalysis::getLocalLiveOutMIDef(MachineBasicBlock *MBB, 610 Register Reg) const { 611 LiveRegUnits LiveRegs(*TRI); 612 LiveRegs.addLiveOuts(*MBB); 613 if (Register::isPhysicalRegister(Reg) && LiveRegs.available(Reg)) 614 return nullptr; 615 616 auto Last = MBB->getLastNonDebugInstr(); 617 if (Last == MBB->end()) 618 return nullptr; 619 620 if (Register::isStackSlot(Reg)) { 621 int FrameIndex = Register::stackSlot2Index(Reg); 622 if (isFIDef(*Last, FrameIndex, TII)) 623 return &*Last; 624 } 625 626 int Def = getReachingDef(&*Last, Reg); 627 628 for (auto &MO : Last->operands()) 629 if (isValidRegDefOf(MO, Reg, TRI)) 630 return &*Last; 631 632 return Def < 0 ? nullptr : getInstFromId(MBB, Def); 633 } 634 635 static bool mayHaveSideEffects(MachineInstr &MI) { 636 return MI.mayLoadOrStore() || MI.mayRaiseFPException() || 637 MI.hasUnmodeledSideEffects() || MI.isTerminator() || 638 MI.isCall() || MI.isBarrier() || MI.isBranch() || MI.isReturn(); 639 } 640 641 // Can we safely move 'From' to just before 'To'? To satisfy this, 'From' must 642 // not define a register that is used by any instructions, after and including, 643 // 'To'. These instructions also must not redefine any of Froms operands. 644 template<typename Iterator> 645 bool ReachingDefAnalysis::isSafeToMove(MachineInstr *From, 646 MachineInstr *To) const { 647 if (From->getParent() != To->getParent() || From == To) 648 return false; 649 650 SmallSet<int, 2> Defs; 651 // First check that From would compute the same value if moved. 652 for (auto &MO : From->operands()) { 653 if (!isValidReg(MO)) 654 continue; 655 if (MO.isDef()) 656 Defs.insert(MO.getReg()); 657 else if (!hasSameReachingDef(From, To, MO.getReg())) 658 return false; 659 } 660 661 // Now walk checking that the rest of the instructions will compute the same 662 // value and that we're not overwriting anything. Don't move the instruction 663 // past any memory, control-flow or other ambiguous instructions. 664 for (auto I = ++Iterator(From), E = Iterator(To); I != E; ++I) { 665 if (mayHaveSideEffects(*I)) 666 return false; 667 for (auto &MO : I->operands()) 668 if (MO.isReg() && MO.getReg() && Defs.count(MO.getReg())) 669 return false; 670 } 671 return true; 672 } 673 674 bool ReachingDefAnalysis::isSafeToMoveForwards(MachineInstr *From, 675 MachineInstr *To) const { 676 using Iterator = MachineBasicBlock::iterator; 677 // Walk forwards until we find the instruction. 678 for (auto I = Iterator(From), E = From->getParent()->end(); I != E; ++I) 679 if (&*I == To) 680 return isSafeToMove<Iterator>(From, To); 681 return false; 682 } 683 684 bool ReachingDefAnalysis::isSafeToMoveBackwards(MachineInstr *From, 685 MachineInstr *To) const { 686 using Iterator = MachineBasicBlock::reverse_iterator; 687 // Walk backwards until we find the instruction. 688 for (auto I = Iterator(From), E = From->getParent()->rend(); I != E; ++I) 689 if (&*I == To) 690 return isSafeToMove<Iterator>(From, To); 691 return false; 692 } 693 694 bool ReachingDefAnalysis::isSafeToRemove(MachineInstr *MI, 695 InstSet &ToRemove) const { 696 SmallPtrSet<MachineInstr*, 1> Ignore; 697 SmallPtrSet<MachineInstr*, 2> Visited; 698 return isSafeToRemove(MI, Visited, ToRemove, Ignore); 699 } 700 701 bool 702 ReachingDefAnalysis::isSafeToRemove(MachineInstr *MI, InstSet &ToRemove, 703 InstSet &Ignore) const { 704 SmallPtrSet<MachineInstr*, 2> Visited; 705 return isSafeToRemove(MI, Visited, ToRemove, Ignore); 706 } 707 708 bool 709 ReachingDefAnalysis::isSafeToRemove(MachineInstr *MI, InstSet &Visited, 710 InstSet &ToRemove, InstSet &Ignore) const { 711 if (Visited.count(MI) || Ignore.count(MI)) 712 return true; 713 else if (mayHaveSideEffects(*MI)) { 714 // Unless told to ignore the instruction, don't remove anything which has 715 // side effects. 716 return false; 717 } 718 719 Visited.insert(MI); 720 for (auto &MO : MI->operands()) { 721 if (!isValidRegDef(MO)) 722 continue; 723 724 SmallPtrSet<MachineInstr*, 4> Uses; 725 getGlobalUses(MI, MO.getReg(), Uses); 726 727 for (auto *I : Uses) { 728 if (Ignore.count(I) || ToRemove.count(I)) 729 continue; 730 if (!isSafeToRemove(I, Visited, ToRemove, Ignore)) 731 return false; 732 } 733 } 734 ToRemove.insert(MI); 735 return true; 736 } 737 738 void ReachingDefAnalysis::collectKilledOperands(MachineInstr *MI, 739 InstSet &Dead) const { 740 Dead.insert(MI); 741 auto IsDead = [this, &Dead](MachineInstr *Def, Register Reg) { 742 if (mayHaveSideEffects(*Def)) 743 return false; 744 745 unsigned LiveDefs = 0; 746 for (auto &MO : Def->operands()) { 747 if (!isValidRegDef(MO)) 748 continue; 749 if (!MO.isDead()) 750 ++LiveDefs; 751 } 752 753 if (LiveDefs > 1) 754 return false; 755 756 SmallPtrSet<MachineInstr*, 4> Uses; 757 getGlobalUses(Def, Reg, Uses); 758 return llvm::set_is_subset(Uses, Dead); 759 }; 760 761 for (auto &MO : MI->operands()) { 762 if (!isValidRegUse(MO)) 763 continue; 764 if (MachineInstr *Def = getMIOperand(MI, MO)) 765 if (IsDead(Def, MO.getReg())) 766 collectKilledOperands(Def, Dead); 767 } 768 } 769 770 bool ReachingDefAnalysis::isSafeToDefRegAt(MachineInstr *MI, 771 Register Reg) const { 772 SmallPtrSet<MachineInstr*, 1> Ignore; 773 return isSafeToDefRegAt(MI, Reg, Ignore); 774 } 775 776 bool ReachingDefAnalysis::isSafeToDefRegAt(MachineInstr *MI, Register Reg, 777 InstSet &Ignore) const { 778 // Check for any uses of the register after MI. 779 if (isRegUsedAfter(MI, Reg)) { 780 if (auto *Def = getReachingLocalMIDef(MI, Reg)) { 781 SmallPtrSet<MachineInstr*, 2> Uses; 782 getGlobalUses(Def, Reg, Uses); 783 if (!llvm::set_is_subset(Uses, Ignore)) 784 return false; 785 } else 786 return false; 787 } 788 789 MachineBasicBlock *MBB = MI->getParent(); 790 // Check for any defs after MI. 791 if (isRegDefinedAfter(MI, Reg)) { 792 auto I = MachineBasicBlock::iterator(MI); 793 for (auto E = MBB->end(); I != E; ++I) { 794 if (Ignore.count(&*I)) 795 continue; 796 for (auto &MO : I->operands()) 797 if (isValidRegDefOf(MO, Reg, TRI)) 798 return false; 799 } 800 } 801 return true; 802 } 803