1 //===--- LivePhysRegs.cpp - Live Physical Register Set --------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements the LivePhysRegs utility for tracking liveness of 11 // physical registers across machine instructions in forward or backward order. 12 // A more detailed description can be found in the corresponding header file. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #include "llvm/CodeGen/LivePhysRegs.h" 17 #include "llvm/CodeGen/MachineInstrBundle.h" 18 #include "llvm/Support/Debug.h" 19 #include "llvm/Support/raw_ostream.h" 20 using namespace llvm; 21 22 23 /// \brief Remove all registers from the set that get clobbered by the register 24 /// mask. 25 /// The clobbers set will be the list of live registers clobbered 26 /// by the regmask. 27 void LivePhysRegs::removeRegsInMask(const MachineOperand &MO, 28 SmallVectorImpl<std::pair<unsigned, const MachineOperand*>> *Clobbers) { 29 SparseSet<unsigned>::iterator LRI = LiveRegs.begin(); 30 while (LRI != LiveRegs.end()) { 31 if (MO.clobbersPhysReg(*LRI)) { 32 if (Clobbers) 33 Clobbers->push_back(std::make_pair(*LRI, &MO)); 34 LRI = LiveRegs.erase(LRI); 35 } else 36 ++LRI; 37 } 38 } 39 40 /// Simulates liveness when stepping backwards over an instruction(bundle): 41 /// Remove Defs, add uses. This is the recommended way of calculating liveness. 42 void LivePhysRegs::stepBackward(const MachineInstr &MI) { 43 // Remove defined registers and regmask kills from the set. 44 for (ConstMIBundleOperands O(&MI); O.isValid(); ++O) { 45 if (O->isReg()) { 46 if (!O->isDef()) 47 continue; 48 unsigned Reg = O->getReg(); 49 if (Reg == 0) 50 continue; 51 removeReg(Reg); 52 } else if (O->isRegMask()) 53 removeRegsInMask(*O, nullptr); 54 } 55 56 // Add uses to the set. 57 for (ConstMIBundleOperands O(&MI); O.isValid(); ++O) { 58 if (!O->isReg() || !O->readsReg() || O->isUndef()) 59 continue; 60 unsigned Reg = O->getReg(); 61 if (Reg == 0) 62 continue; 63 addReg(Reg); 64 } 65 } 66 67 /// Simulates liveness when stepping forward over an instruction(bundle): Remove 68 /// killed-uses, add defs. This is the not recommended way, because it depends 69 /// on accurate kill flags. If possible use stepBackwards() instead of this 70 /// function. 71 void LivePhysRegs::stepForward(const MachineInstr &MI, 72 SmallVectorImpl<std::pair<unsigned, const MachineOperand*>> &Clobbers) { 73 // Remove killed registers from the set. 74 for (ConstMIBundleOperands O(&MI); O.isValid(); ++O) { 75 if (O->isReg()) { 76 unsigned Reg = O->getReg(); 77 if (Reg == 0) 78 continue; 79 if (O->isDef()) { 80 // Note, dead defs are still recorded. The caller should decide how to 81 // handle them. 82 Clobbers.push_back(std::make_pair(Reg, &*O)); 83 } else { 84 if (!O->isKill()) 85 continue; 86 assert(O->isUse()); 87 removeReg(Reg); 88 } 89 } else if (O->isRegMask()) 90 removeRegsInMask(*O, &Clobbers); 91 } 92 93 // Add defs to the set. 94 for (auto Reg : Clobbers) { 95 // Skip dead defs. They shouldn't be added to the set. 96 if (Reg.second->isReg() && Reg.second->isDead()) 97 continue; 98 addReg(Reg.first); 99 } 100 } 101 102 /// Prin the currently live registers to OS. 103 void LivePhysRegs::print(raw_ostream &OS) const { 104 OS << "Live Registers:"; 105 if (!TRI) { 106 OS << " (uninitialized)\n"; 107 return; 108 } 109 110 if (empty()) { 111 OS << " (empty)\n"; 112 return; 113 } 114 115 for (const_iterator I = begin(), E = end(); I != E; ++I) 116 OS << " " << PrintReg(*I, TRI); 117 OS << "\n"; 118 } 119 120 /// Dumps the currently live registers to the debug output. 121 void LivePhysRegs::dump() const { 122 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 123 dbgs() << " " << *this; 124 #endif 125 } 126