10b57cec5SDimitry Andric //===--- LivePhysRegs.cpp - Live Physical Register Set --------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file implements the LivePhysRegs utility for tracking liveness of
100b57cec5SDimitry Andric // physical registers across machine instructions in forward or backward order.
110b57cec5SDimitry Andric // A more detailed description can be found in the corresponding header file.
120b57cec5SDimitry Andric //
130b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
140b57cec5SDimitry Andric
150b57cec5SDimitry Andric #include "llvm/CodeGen/LivePhysRegs.h"
16480093f4SDimitry Andric #include "llvm/CodeGen/LiveRegUnits.h"
170b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFrameInfo.h"
180b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunction.h"
190b57cec5SDimitry Andric #include "llvm/CodeGen/MachineInstrBundle.h"
200b57cec5SDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h"
210b57cec5SDimitry Andric #include "llvm/Config/llvm-config.h"
220b57cec5SDimitry Andric #include "llvm/Support/Debug.h"
230b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
240b57cec5SDimitry Andric using namespace llvm;
250b57cec5SDimitry Andric
260b57cec5SDimitry Andric
270b57cec5SDimitry Andric /// Remove all registers from the set that get clobbered by the register
280b57cec5SDimitry Andric /// mask.
290b57cec5SDimitry Andric /// The clobbers set will be the list of live registers clobbered
300b57cec5SDimitry Andric /// by the regmask.
removeRegsInMask(const MachineOperand & MO,SmallVectorImpl<std::pair<MCPhysReg,const MachineOperand * >> * Clobbers)310b57cec5SDimitry Andric void LivePhysRegs::removeRegsInMask(const MachineOperand &MO,
320b57cec5SDimitry Andric SmallVectorImpl<std::pair<MCPhysReg, const MachineOperand*>> *Clobbers) {
330b57cec5SDimitry Andric RegisterSet::iterator LRI = LiveRegs.begin();
340b57cec5SDimitry Andric while (LRI != LiveRegs.end()) {
350b57cec5SDimitry Andric if (MO.clobbersPhysReg(*LRI)) {
360b57cec5SDimitry Andric if (Clobbers)
370b57cec5SDimitry Andric Clobbers->push_back(std::make_pair(*LRI, &MO));
380b57cec5SDimitry Andric LRI = LiveRegs.erase(LRI);
390b57cec5SDimitry Andric } else
400b57cec5SDimitry Andric ++LRI;
410b57cec5SDimitry Andric }
420b57cec5SDimitry Andric }
430b57cec5SDimitry Andric
440b57cec5SDimitry Andric /// Remove defined registers and regmask kills from the set.
removeDefs(const MachineInstr & MI)450b57cec5SDimitry Andric void LivePhysRegs::removeDefs(const MachineInstr &MI) {
46480093f4SDimitry Andric for (const MachineOperand &MOP : phys_regs_and_masks(MI)) {
47480093f4SDimitry Andric if (MOP.isRegMask()) {
48480093f4SDimitry Andric removeRegsInMask(MOP);
490b57cec5SDimitry Andric continue;
50480093f4SDimitry Andric }
51480093f4SDimitry Andric
52480093f4SDimitry Andric if (MOP.isDef())
53480093f4SDimitry Andric removeReg(MOP.getReg());
540b57cec5SDimitry Andric }
550b57cec5SDimitry Andric }
560b57cec5SDimitry Andric
570b57cec5SDimitry Andric /// Add uses to the set.
addUses(const MachineInstr & MI)580b57cec5SDimitry Andric void LivePhysRegs::addUses(const MachineInstr &MI) {
59480093f4SDimitry Andric for (const MachineOperand &MOP : phys_regs_and_masks(MI)) {
60480093f4SDimitry Andric if (!MOP.isReg() || !MOP.readsReg())
610b57cec5SDimitry Andric continue;
62480093f4SDimitry Andric addReg(MOP.getReg());
630b57cec5SDimitry Andric }
640b57cec5SDimitry Andric }
650b57cec5SDimitry Andric
660b57cec5SDimitry Andric /// Simulates liveness when stepping backwards over an instruction(bundle):
670b57cec5SDimitry Andric /// Remove Defs, add uses. This is the recommended way of calculating liveness.
stepBackward(const MachineInstr & MI)680b57cec5SDimitry Andric void LivePhysRegs::stepBackward(const MachineInstr &MI) {
690b57cec5SDimitry Andric // Remove defined registers and regmask kills from the set.
700b57cec5SDimitry Andric removeDefs(MI);
710b57cec5SDimitry Andric
720b57cec5SDimitry Andric // Add uses to the set.
730b57cec5SDimitry Andric addUses(MI);
740b57cec5SDimitry Andric }
750b57cec5SDimitry Andric
760b57cec5SDimitry Andric /// Simulates liveness when stepping forward over an instruction(bundle): Remove
770b57cec5SDimitry Andric /// killed-uses, add defs. This is the not recommended way, because it depends
780b57cec5SDimitry Andric /// on accurate kill flags. If possible use stepBackward() instead of this
790b57cec5SDimitry Andric /// function.
stepForward(const MachineInstr & MI,SmallVectorImpl<std::pair<MCPhysReg,const MachineOperand * >> & Clobbers)800b57cec5SDimitry Andric void LivePhysRegs::stepForward(const MachineInstr &MI,
810b57cec5SDimitry Andric SmallVectorImpl<std::pair<MCPhysReg, const MachineOperand*>> &Clobbers) {
820b57cec5SDimitry Andric // Remove killed registers from the set.
830b57cec5SDimitry Andric for (ConstMIBundleOperands O(MI); O.isValid(); ++O) {
84349cc55cSDimitry Andric if (O->isReg()) {
85349cc55cSDimitry Andric if (O->isDebug())
86349cc55cSDimitry Andric continue;
878bcb0991SDimitry Andric Register Reg = O->getReg();
88349cc55cSDimitry Andric if (!Reg.isPhysical())
890b57cec5SDimitry Andric continue;
900b57cec5SDimitry Andric if (O->isDef()) {
910b57cec5SDimitry Andric // Note, dead defs are still recorded. The caller should decide how to
920b57cec5SDimitry Andric // handle them.
930b57cec5SDimitry Andric Clobbers.push_back(std::make_pair(Reg, &*O));
940b57cec5SDimitry Andric } else {
950b57cec5SDimitry Andric assert(O->isUse());
96349cc55cSDimitry Andric if (O->isKill())
970b57cec5SDimitry Andric removeReg(Reg);
980b57cec5SDimitry Andric }
99349cc55cSDimitry Andric } else if (O->isRegMask()) {
1000b57cec5SDimitry Andric removeRegsInMask(*O, &Clobbers);
1010b57cec5SDimitry Andric }
102349cc55cSDimitry Andric }
1030b57cec5SDimitry Andric
1040b57cec5SDimitry Andric // Add defs to the set.
1050b57cec5SDimitry Andric for (auto Reg : Clobbers) {
1060b57cec5SDimitry Andric // Skip dead defs and registers clobbered by regmasks. They shouldn't
1070b57cec5SDimitry Andric // be added to the set.
1080b57cec5SDimitry Andric if (Reg.second->isReg() && Reg.second->isDead())
1090b57cec5SDimitry Andric continue;
1100b57cec5SDimitry Andric if (Reg.second->isRegMask() &&
1110b57cec5SDimitry Andric MachineOperand::clobbersPhysReg(Reg.second->getRegMask(), Reg.first))
1120b57cec5SDimitry Andric continue;
1130b57cec5SDimitry Andric addReg(Reg.first);
1140b57cec5SDimitry Andric }
1150b57cec5SDimitry Andric }
1160b57cec5SDimitry Andric
117480093f4SDimitry Andric /// Print the currently live registers to OS.
print(raw_ostream & OS) const1180b57cec5SDimitry Andric void LivePhysRegs::print(raw_ostream &OS) const {
1190b57cec5SDimitry Andric OS << "Live Registers:";
1200b57cec5SDimitry Andric if (!TRI) {
1210b57cec5SDimitry Andric OS << " (uninitialized)\n";
1220b57cec5SDimitry Andric return;
1230b57cec5SDimitry Andric }
1240b57cec5SDimitry Andric
1250b57cec5SDimitry Andric if (empty()) {
1260b57cec5SDimitry Andric OS << " (empty)\n";
1270b57cec5SDimitry Andric return;
1280b57cec5SDimitry Andric }
1290b57cec5SDimitry Andric
130fe6060f1SDimitry Andric for (MCPhysReg R : *this)
131fe6060f1SDimitry Andric OS << " " << printReg(R, TRI);
1320b57cec5SDimitry Andric OS << "\n";
1330b57cec5SDimitry Andric }
1340b57cec5SDimitry Andric
1350b57cec5SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump() const1360b57cec5SDimitry Andric LLVM_DUMP_METHOD void LivePhysRegs::dump() const {
1370b57cec5SDimitry Andric dbgs() << " " << *this;
1380b57cec5SDimitry Andric }
1390b57cec5SDimitry Andric #endif
1400b57cec5SDimitry Andric
available(const MachineRegisterInfo & MRI,MCPhysReg Reg) const1410b57cec5SDimitry Andric bool LivePhysRegs::available(const MachineRegisterInfo &MRI,
1420b57cec5SDimitry Andric MCPhysReg Reg) const {
1430b57cec5SDimitry Andric if (LiveRegs.count(Reg))
1440b57cec5SDimitry Andric return false;
1450b57cec5SDimitry Andric if (MRI.isReserved(Reg))
1460b57cec5SDimitry Andric return false;
1470b57cec5SDimitry Andric for (MCRegAliasIterator R(Reg, TRI, false); R.isValid(); ++R) {
1480b57cec5SDimitry Andric if (LiveRegs.count(*R))
1490b57cec5SDimitry Andric return false;
1500b57cec5SDimitry Andric }
1510b57cec5SDimitry Andric return true;
1520b57cec5SDimitry Andric }
1530b57cec5SDimitry Andric
1540b57cec5SDimitry Andric /// Add live-in registers of basic block \p MBB to \p LiveRegs.
addBlockLiveIns(const MachineBasicBlock & MBB)1550b57cec5SDimitry Andric void LivePhysRegs::addBlockLiveIns(const MachineBasicBlock &MBB) {
1560b57cec5SDimitry Andric for (const auto &LI : MBB.liveins()) {
1570b57cec5SDimitry Andric MCPhysReg Reg = LI.PhysReg;
1580b57cec5SDimitry Andric LaneBitmask Mask = LI.LaneMask;
1590b57cec5SDimitry Andric MCSubRegIndexIterator S(Reg, TRI);
1600b57cec5SDimitry Andric assert(Mask.any() && "Invalid livein mask");
1610b57cec5SDimitry Andric if (Mask.all() || !S.isValid()) {
1620b57cec5SDimitry Andric addReg(Reg);
1630b57cec5SDimitry Andric continue;
1640b57cec5SDimitry Andric }
1650b57cec5SDimitry Andric for (; S.isValid(); ++S) {
1660b57cec5SDimitry Andric unsigned SI = S.getSubRegIndex();
1670b57cec5SDimitry Andric if ((Mask & TRI->getSubRegIndexLaneMask(SI)).any())
1680b57cec5SDimitry Andric addReg(S.getSubReg());
1690b57cec5SDimitry Andric }
1700b57cec5SDimitry Andric }
1710b57cec5SDimitry Andric }
1720b57cec5SDimitry Andric
1730b57cec5SDimitry Andric /// Adds all callee saved registers to \p LiveRegs.
addCalleeSavedRegs(LivePhysRegs & LiveRegs,const MachineFunction & MF)1740b57cec5SDimitry Andric static void addCalleeSavedRegs(LivePhysRegs &LiveRegs,
1750b57cec5SDimitry Andric const MachineFunction &MF) {
1760b57cec5SDimitry Andric const MachineRegisterInfo &MRI = MF.getRegInfo();
1770b57cec5SDimitry Andric for (const MCPhysReg *CSR = MRI.getCalleeSavedRegs(); CSR && *CSR; ++CSR)
1780b57cec5SDimitry Andric LiveRegs.addReg(*CSR);
1790b57cec5SDimitry Andric }
1800b57cec5SDimitry Andric
addPristines(const MachineFunction & MF)1810b57cec5SDimitry Andric void LivePhysRegs::addPristines(const MachineFunction &MF) {
1820b57cec5SDimitry Andric const MachineFrameInfo &MFI = MF.getFrameInfo();
1830b57cec5SDimitry Andric if (!MFI.isCalleeSavedInfoValid())
1840b57cec5SDimitry Andric return;
1850b57cec5SDimitry Andric /// This function will usually be called on an empty object, handle this
1860b57cec5SDimitry Andric /// as a special case.
1870b57cec5SDimitry Andric if (empty()) {
1880b57cec5SDimitry Andric /// Add all callee saved regs, then remove the ones that are saved and
1890b57cec5SDimitry Andric /// restored.
1900b57cec5SDimitry Andric addCalleeSavedRegs(*this, MF);
1910b57cec5SDimitry Andric /// Remove the ones that are not saved/restored; they are pristine.
1920b57cec5SDimitry Andric for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
1930b57cec5SDimitry Andric removeReg(Info.getReg());
1940b57cec5SDimitry Andric return;
1950b57cec5SDimitry Andric }
1960b57cec5SDimitry Andric /// If a callee-saved register that is not pristine is already present
1970b57cec5SDimitry Andric /// in the set, we should make sure that it stays in it. Precompute the
1980b57cec5SDimitry Andric /// set of pristine registers in a separate object.
1990b57cec5SDimitry Andric /// Add all callee saved regs, then remove the ones that are saved+restored.
2000b57cec5SDimitry Andric LivePhysRegs Pristine(*TRI);
2010b57cec5SDimitry Andric addCalleeSavedRegs(Pristine, MF);
2020b57cec5SDimitry Andric /// Remove the ones that are not saved/restored; they are pristine.
2030b57cec5SDimitry Andric for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
2040b57cec5SDimitry Andric Pristine.removeReg(Info.getReg());
2050b57cec5SDimitry Andric for (MCPhysReg R : Pristine)
2060b57cec5SDimitry Andric addReg(R);
2070b57cec5SDimitry Andric }
2080b57cec5SDimitry Andric
addLiveOutsNoPristines(const MachineBasicBlock & MBB)2090b57cec5SDimitry Andric void LivePhysRegs::addLiveOutsNoPristines(const MachineBasicBlock &MBB) {
2100b57cec5SDimitry Andric // To get the live-outs we simply merge the live-ins of all successors.
2110b57cec5SDimitry Andric for (const MachineBasicBlock *Succ : MBB.successors())
2120b57cec5SDimitry Andric addBlockLiveIns(*Succ);
2130b57cec5SDimitry Andric if (MBB.isReturnBlock()) {
2140b57cec5SDimitry Andric // Return blocks are a special case because we currently don't mark up
2150b57cec5SDimitry Andric // return instructions completely: specifically, there is no explicit
2160b57cec5SDimitry Andric // use for callee-saved registers. So we add all callee saved registers
2170b57cec5SDimitry Andric // that are saved and restored (somewhere). This does not include
2180b57cec5SDimitry Andric // callee saved registers that are unused and hence not saved and
2190b57cec5SDimitry Andric // restored; they are called pristine.
2200b57cec5SDimitry Andric // FIXME: PEI should add explicit markings to return instructions
2210b57cec5SDimitry Andric // instead of implicitly handling them here.
2220b57cec5SDimitry Andric const MachineFunction &MF = *MBB.getParent();
2230b57cec5SDimitry Andric const MachineFrameInfo &MFI = MF.getFrameInfo();
2240b57cec5SDimitry Andric if (MFI.isCalleeSavedInfoValid()) {
2250b57cec5SDimitry Andric for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
2260b57cec5SDimitry Andric if (Info.isRestored())
2270b57cec5SDimitry Andric addReg(Info.getReg());
2280b57cec5SDimitry Andric }
2290b57cec5SDimitry Andric }
2300b57cec5SDimitry Andric }
2310b57cec5SDimitry Andric
addLiveOuts(const MachineBasicBlock & MBB)2320b57cec5SDimitry Andric void LivePhysRegs::addLiveOuts(const MachineBasicBlock &MBB) {
2330b57cec5SDimitry Andric const MachineFunction &MF = *MBB.getParent();
2340b57cec5SDimitry Andric addPristines(MF);
2350b57cec5SDimitry Andric addLiveOutsNoPristines(MBB);
2360b57cec5SDimitry Andric }
2370b57cec5SDimitry Andric
addLiveIns(const MachineBasicBlock & MBB)2380b57cec5SDimitry Andric void LivePhysRegs::addLiveIns(const MachineBasicBlock &MBB) {
2390b57cec5SDimitry Andric const MachineFunction &MF = *MBB.getParent();
2400b57cec5SDimitry Andric addPristines(MF);
2410b57cec5SDimitry Andric addBlockLiveIns(MBB);
2420b57cec5SDimitry Andric }
2430b57cec5SDimitry Andric
addLiveInsNoPristines(const MachineBasicBlock & MBB)244fe6060f1SDimitry Andric void LivePhysRegs::addLiveInsNoPristines(const MachineBasicBlock &MBB) {
245fe6060f1SDimitry Andric addBlockLiveIns(MBB);
246fe6060f1SDimitry Andric }
247fe6060f1SDimitry Andric
computeLiveIns(LivePhysRegs & LiveRegs,const MachineBasicBlock & MBB)2480b57cec5SDimitry Andric void llvm::computeLiveIns(LivePhysRegs &LiveRegs,
2490b57cec5SDimitry Andric const MachineBasicBlock &MBB) {
2500b57cec5SDimitry Andric const MachineFunction &MF = *MBB.getParent();
2510b57cec5SDimitry Andric const MachineRegisterInfo &MRI = MF.getRegInfo();
2520b57cec5SDimitry Andric const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
2530b57cec5SDimitry Andric LiveRegs.init(TRI);
2540b57cec5SDimitry Andric LiveRegs.addLiveOutsNoPristines(MBB);
255349cc55cSDimitry Andric for (const MachineInstr &MI : llvm::reverse(MBB))
2560b57cec5SDimitry Andric LiveRegs.stepBackward(MI);
2570b57cec5SDimitry Andric }
2580b57cec5SDimitry Andric
addLiveIns(MachineBasicBlock & MBB,const LivePhysRegs & LiveRegs)2590b57cec5SDimitry Andric void llvm::addLiveIns(MachineBasicBlock &MBB, const LivePhysRegs &LiveRegs) {
2600b57cec5SDimitry Andric assert(MBB.livein_empty() && "Expected empty live-in list");
2610b57cec5SDimitry Andric const MachineFunction &MF = *MBB.getParent();
2620b57cec5SDimitry Andric const MachineRegisterInfo &MRI = MF.getRegInfo();
2630b57cec5SDimitry Andric const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
2640b57cec5SDimitry Andric for (MCPhysReg Reg : LiveRegs) {
2650b57cec5SDimitry Andric if (MRI.isReserved(Reg))
2660b57cec5SDimitry Andric continue;
2670b57cec5SDimitry Andric // Skip the register if we are about to add one of its super registers.
268*06c3fb27SDimitry Andric if (any_of(TRI.superregs(Reg), [&](MCPhysReg SReg) {
269*06c3fb27SDimitry Andric return LiveRegs.contains(SReg) && !MRI.isReserved(SReg);
270*06c3fb27SDimitry Andric }))
2710b57cec5SDimitry Andric continue;
2720b57cec5SDimitry Andric MBB.addLiveIn(Reg);
2730b57cec5SDimitry Andric }
2740b57cec5SDimitry Andric }
2750b57cec5SDimitry Andric
recomputeLivenessFlags(MachineBasicBlock & MBB)2760b57cec5SDimitry Andric void llvm::recomputeLivenessFlags(MachineBasicBlock &MBB) {
2770b57cec5SDimitry Andric const MachineFunction &MF = *MBB.getParent();
2780b57cec5SDimitry Andric const MachineRegisterInfo &MRI = MF.getRegInfo();
2790b57cec5SDimitry Andric const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
2805ffd83dbSDimitry Andric const MachineFrameInfo &MFI = MF.getFrameInfo();
2810b57cec5SDimitry Andric
2820b57cec5SDimitry Andric // We walk through the block backwards and start with the live outs.
2830b57cec5SDimitry Andric LivePhysRegs LiveRegs;
2840b57cec5SDimitry Andric LiveRegs.init(TRI);
2850b57cec5SDimitry Andric LiveRegs.addLiveOutsNoPristines(MBB);
2860b57cec5SDimitry Andric
287349cc55cSDimitry Andric for (MachineInstr &MI : llvm::reverse(MBB)) {
2880b57cec5SDimitry Andric // Recompute dead flags.
2890b57cec5SDimitry Andric for (MIBundleOperands MO(MI); MO.isValid(); ++MO) {
2900b57cec5SDimitry Andric if (!MO->isReg() || !MO->isDef() || MO->isDebug())
2910b57cec5SDimitry Andric continue;
2920b57cec5SDimitry Andric
2938bcb0991SDimitry Andric Register Reg = MO->getReg();
2940b57cec5SDimitry Andric if (Reg == 0)
2950b57cec5SDimitry Andric continue;
296349cc55cSDimitry Andric assert(Reg.isPhysical());
2970b57cec5SDimitry Andric
2980b57cec5SDimitry Andric bool IsNotLive = LiveRegs.available(MRI, Reg);
2995ffd83dbSDimitry Andric
3005ffd83dbSDimitry Andric // Special-case return instructions for cases when a return is not
3015ffd83dbSDimitry Andric // the last instruction in the block.
3025ffd83dbSDimitry Andric if (MI.isReturn() && MFI.isCalleeSavedInfoValid()) {
3035ffd83dbSDimitry Andric for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo()) {
3045ffd83dbSDimitry Andric if (Info.getReg() == Reg) {
3055ffd83dbSDimitry Andric IsNotLive = !Info.isRestored();
3065ffd83dbSDimitry Andric break;
3075ffd83dbSDimitry Andric }
3085ffd83dbSDimitry Andric }
3095ffd83dbSDimitry Andric }
3105ffd83dbSDimitry Andric
3110b57cec5SDimitry Andric MO->setIsDead(IsNotLive);
3120b57cec5SDimitry Andric }
3130b57cec5SDimitry Andric
3140b57cec5SDimitry Andric // Step backward over defs.
3150b57cec5SDimitry Andric LiveRegs.removeDefs(MI);
3160b57cec5SDimitry Andric
3170b57cec5SDimitry Andric // Recompute kill flags.
3180b57cec5SDimitry Andric for (MIBundleOperands MO(MI); MO.isValid(); ++MO) {
3190b57cec5SDimitry Andric if (!MO->isReg() || !MO->readsReg() || MO->isDebug())
3200b57cec5SDimitry Andric continue;
3210b57cec5SDimitry Andric
3228bcb0991SDimitry Andric Register Reg = MO->getReg();
3230b57cec5SDimitry Andric if (Reg == 0)
3240b57cec5SDimitry Andric continue;
325349cc55cSDimitry Andric assert(Reg.isPhysical());
3260b57cec5SDimitry Andric
3270b57cec5SDimitry Andric bool IsNotLive = LiveRegs.available(MRI, Reg);
3280b57cec5SDimitry Andric MO->setIsKill(IsNotLive);
3290b57cec5SDimitry Andric }
3300b57cec5SDimitry Andric
3310b57cec5SDimitry Andric // Complete the stepbackward.
3320b57cec5SDimitry Andric LiveRegs.addUses(MI);
3330b57cec5SDimitry Andric }
3340b57cec5SDimitry Andric }
3350b57cec5SDimitry Andric
computeAndAddLiveIns(LivePhysRegs & LiveRegs,MachineBasicBlock & MBB)3360b57cec5SDimitry Andric void llvm::computeAndAddLiveIns(LivePhysRegs &LiveRegs,
3370b57cec5SDimitry Andric MachineBasicBlock &MBB) {
3380b57cec5SDimitry Andric computeLiveIns(LiveRegs, MBB);
3390b57cec5SDimitry Andric addLiveIns(MBB, LiveRegs);
3400b57cec5SDimitry Andric }
341