109467b48Spatrick //===--- LivePhysRegs.cpp - Live Physical Register Set --------------------===//
209467b48Spatrick //
309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609467b48Spatrick //
709467b48Spatrick //===----------------------------------------------------------------------===//
809467b48Spatrick //
909467b48Spatrick // This file implements the LivePhysRegs utility for tracking liveness of
1009467b48Spatrick // physical registers across machine instructions in forward or backward order.
1109467b48Spatrick // A more detailed description can be found in the corresponding header file.
1209467b48Spatrick //
1309467b48Spatrick //===----------------------------------------------------------------------===//
1409467b48Spatrick
1509467b48Spatrick #include "llvm/CodeGen/LivePhysRegs.h"
1609467b48Spatrick #include "llvm/CodeGen/LiveRegUnits.h"
1709467b48Spatrick #include "llvm/CodeGen/MachineFrameInfo.h"
1809467b48Spatrick #include "llvm/CodeGen/MachineFunction.h"
1909467b48Spatrick #include "llvm/CodeGen/MachineInstrBundle.h"
2009467b48Spatrick #include "llvm/CodeGen/MachineRegisterInfo.h"
2109467b48Spatrick #include "llvm/Config/llvm-config.h"
2209467b48Spatrick #include "llvm/Support/Debug.h"
2309467b48Spatrick #include "llvm/Support/raw_ostream.h"
2409467b48Spatrick using namespace llvm;
2509467b48Spatrick
2609467b48Spatrick
2709467b48Spatrick /// Remove all registers from the set that get clobbered by the register
2809467b48Spatrick /// mask.
2909467b48Spatrick /// The clobbers set will be the list of live registers clobbered
3009467b48Spatrick /// by the regmask.
removeRegsInMask(const MachineOperand & MO,SmallVectorImpl<std::pair<MCPhysReg,const MachineOperand * >> * Clobbers)3109467b48Spatrick void LivePhysRegs::removeRegsInMask(const MachineOperand &MO,
3209467b48Spatrick SmallVectorImpl<std::pair<MCPhysReg, const MachineOperand*>> *Clobbers) {
3309467b48Spatrick RegisterSet::iterator LRI = LiveRegs.begin();
3409467b48Spatrick while (LRI != LiveRegs.end()) {
3509467b48Spatrick if (MO.clobbersPhysReg(*LRI)) {
3609467b48Spatrick if (Clobbers)
3709467b48Spatrick Clobbers->push_back(std::make_pair(*LRI, &MO));
3809467b48Spatrick LRI = LiveRegs.erase(LRI);
3909467b48Spatrick } else
4009467b48Spatrick ++LRI;
4109467b48Spatrick }
4209467b48Spatrick }
4309467b48Spatrick
4409467b48Spatrick /// Remove defined registers and regmask kills from the set.
removeDefs(const MachineInstr & MI)4509467b48Spatrick void LivePhysRegs::removeDefs(const MachineInstr &MI) {
4609467b48Spatrick for (const MachineOperand &MOP : phys_regs_and_masks(MI)) {
4709467b48Spatrick if (MOP.isRegMask()) {
4809467b48Spatrick removeRegsInMask(MOP);
4909467b48Spatrick continue;
5009467b48Spatrick }
5109467b48Spatrick
5209467b48Spatrick if (MOP.isDef())
5309467b48Spatrick removeReg(MOP.getReg());
5409467b48Spatrick }
5509467b48Spatrick }
5609467b48Spatrick
5709467b48Spatrick /// Add uses to the set.
addUses(const MachineInstr & MI)5809467b48Spatrick void LivePhysRegs::addUses(const MachineInstr &MI) {
5909467b48Spatrick for (const MachineOperand &MOP : phys_regs_and_masks(MI)) {
6009467b48Spatrick if (!MOP.isReg() || !MOP.readsReg())
6109467b48Spatrick continue;
6209467b48Spatrick addReg(MOP.getReg());
6309467b48Spatrick }
6409467b48Spatrick }
6509467b48Spatrick
6609467b48Spatrick /// Simulates liveness when stepping backwards over an instruction(bundle):
6709467b48Spatrick /// Remove Defs, add uses. This is the recommended way of calculating liveness.
stepBackward(const MachineInstr & MI)6809467b48Spatrick void LivePhysRegs::stepBackward(const MachineInstr &MI) {
6909467b48Spatrick // Remove defined registers and regmask kills from the set.
7009467b48Spatrick removeDefs(MI);
7109467b48Spatrick
7209467b48Spatrick // Add uses to the set.
7309467b48Spatrick addUses(MI);
7409467b48Spatrick }
7509467b48Spatrick
7609467b48Spatrick /// Simulates liveness when stepping forward over an instruction(bundle): Remove
7709467b48Spatrick /// killed-uses, add defs. This is the not recommended way, because it depends
7809467b48Spatrick /// on accurate kill flags. If possible use stepBackward() instead of this
7909467b48Spatrick /// function.
stepForward(const MachineInstr & MI,SmallVectorImpl<std::pair<MCPhysReg,const MachineOperand * >> & Clobbers)8009467b48Spatrick void LivePhysRegs::stepForward(const MachineInstr &MI,
8109467b48Spatrick SmallVectorImpl<std::pair<MCPhysReg, const MachineOperand*>> &Clobbers) {
8209467b48Spatrick // Remove killed registers from the set.
8309467b48Spatrick for (ConstMIBundleOperands O(MI); O.isValid(); ++O) {
84*d415bd75Srobert if (O->isReg()) {
85*d415bd75Srobert if (O->isDebug())
86*d415bd75Srobert continue;
8709467b48Spatrick Register Reg = O->getReg();
88*d415bd75Srobert if (!Reg.isPhysical())
8909467b48Spatrick continue;
9009467b48Spatrick if (O->isDef()) {
9109467b48Spatrick // Note, dead defs are still recorded. The caller should decide how to
9209467b48Spatrick // handle them.
9309467b48Spatrick Clobbers.push_back(std::make_pair(Reg, &*O));
9409467b48Spatrick } else {
9509467b48Spatrick assert(O->isUse());
96*d415bd75Srobert if (O->isKill())
9709467b48Spatrick removeReg(Reg);
9809467b48Spatrick }
99*d415bd75Srobert } else if (O->isRegMask()) {
10009467b48Spatrick removeRegsInMask(*O, &Clobbers);
10109467b48Spatrick }
102*d415bd75Srobert }
10309467b48Spatrick
10409467b48Spatrick // Add defs to the set.
10509467b48Spatrick for (auto Reg : Clobbers) {
10609467b48Spatrick // Skip dead defs and registers clobbered by regmasks. They shouldn't
10709467b48Spatrick // be added to the set.
10809467b48Spatrick if (Reg.second->isReg() && Reg.second->isDead())
10909467b48Spatrick continue;
11009467b48Spatrick if (Reg.second->isRegMask() &&
11109467b48Spatrick MachineOperand::clobbersPhysReg(Reg.second->getRegMask(), Reg.first))
11209467b48Spatrick continue;
11309467b48Spatrick addReg(Reg.first);
11409467b48Spatrick }
11509467b48Spatrick }
11609467b48Spatrick
11709467b48Spatrick /// Print the currently live registers to OS.
print(raw_ostream & OS) const11809467b48Spatrick void LivePhysRegs::print(raw_ostream &OS) const {
11909467b48Spatrick OS << "Live Registers:";
12009467b48Spatrick if (!TRI) {
12109467b48Spatrick OS << " (uninitialized)\n";
12209467b48Spatrick return;
12309467b48Spatrick }
12409467b48Spatrick
12509467b48Spatrick if (empty()) {
12609467b48Spatrick OS << " (empty)\n";
12709467b48Spatrick return;
12809467b48Spatrick }
12909467b48Spatrick
13073471bf0Spatrick for (MCPhysReg R : *this)
13173471bf0Spatrick OS << " " << printReg(R, TRI);
13209467b48Spatrick OS << "\n";
13309467b48Spatrick }
13409467b48Spatrick
13509467b48Spatrick #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump() const13609467b48Spatrick LLVM_DUMP_METHOD void LivePhysRegs::dump() const {
13709467b48Spatrick dbgs() << " " << *this;
13809467b48Spatrick }
13909467b48Spatrick #endif
14009467b48Spatrick
available(const MachineRegisterInfo & MRI,MCPhysReg Reg) const14109467b48Spatrick bool LivePhysRegs::available(const MachineRegisterInfo &MRI,
14209467b48Spatrick MCPhysReg Reg) const {
14309467b48Spatrick if (LiveRegs.count(Reg))
14409467b48Spatrick return false;
14509467b48Spatrick if (MRI.isReserved(Reg))
14609467b48Spatrick return false;
14709467b48Spatrick for (MCRegAliasIterator R(Reg, TRI, false); R.isValid(); ++R) {
14809467b48Spatrick if (LiveRegs.count(*R))
14909467b48Spatrick return false;
15009467b48Spatrick }
15109467b48Spatrick return true;
15209467b48Spatrick }
15309467b48Spatrick
15409467b48Spatrick /// Add live-in registers of basic block \p MBB to \p LiveRegs.
addBlockLiveIns(const MachineBasicBlock & MBB)15509467b48Spatrick void LivePhysRegs::addBlockLiveIns(const MachineBasicBlock &MBB) {
15609467b48Spatrick for (const auto &LI : MBB.liveins()) {
15709467b48Spatrick MCPhysReg Reg = LI.PhysReg;
15809467b48Spatrick LaneBitmask Mask = LI.LaneMask;
15909467b48Spatrick MCSubRegIndexIterator S(Reg, TRI);
16009467b48Spatrick assert(Mask.any() && "Invalid livein mask");
16109467b48Spatrick if (Mask.all() || !S.isValid()) {
16209467b48Spatrick addReg(Reg);
16309467b48Spatrick continue;
16409467b48Spatrick }
16509467b48Spatrick for (; S.isValid(); ++S) {
16609467b48Spatrick unsigned SI = S.getSubRegIndex();
16709467b48Spatrick if ((Mask & TRI->getSubRegIndexLaneMask(SI)).any())
16809467b48Spatrick addReg(S.getSubReg());
16909467b48Spatrick }
17009467b48Spatrick }
17109467b48Spatrick }
17209467b48Spatrick
17309467b48Spatrick /// Adds all callee saved registers to \p LiveRegs.
addCalleeSavedRegs(LivePhysRegs & LiveRegs,const MachineFunction & MF)17409467b48Spatrick static void addCalleeSavedRegs(LivePhysRegs &LiveRegs,
17509467b48Spatrick const MachineFunction &MF) {
17609467b48Spatrick const MachineRegisterInfo &MRI = MF.getRegInfo();
17709467b48Spatrick for (const MCPhysReg *CSR = MRI.getCalleeSavedRegs(); CSR && *CSR; ++CSR)
17809467b48Spatrick LiveRegs.addReg(*CSR);
17909467b48Spatrick }
18009467b48Spatrick
addPristines(const MachineFunction & MF)18109467b48Spatrick void LivePhysRegs::addPristines(const MachineFunction &MF) {
18209467b48Spatrick const MachineFrameInfo &MFI = MF.getFrameInfo();
18309467b48Spatrick if (!MFI.isCalleeSavedInfoValid())
18409467b48Spatrick return;
18509467b48Spatrick /// This function will usually be called on an empty object, handle this
18609467b48Spatrick /// as a special case.
18709467b48Spatrick if (empty()) {
18809467b48Spatrick /// Add all callee saved regs, then remove the ones that are saved and
18909467b48Spatrick /// restored.
19009467b48Spatrick addCalleeSavedRegs(*this, MF);
19109467b48Spatrick /// Remove the ones that are not saved/restored; they are pristine.
19209467b48Spatrick for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
19309467b48Spatrick removeReg(Info.getReg());
19409467b48Spatrick return;
19509467b48Spatrick }
19609467b48Spatrick /// If a callee-saved register that is not pristine is already present
19709467b48Spatrick /// in the set, we should make sure that it stays in it. Precompute the
19809467b48Spatrick /// set of pristine registers in a separate object.
19909467b48Spatrick /// Add all callee saved regs, then remove the ones that are saved+restored.
20009467b48Spatrick LivePhysRegs Pristine(*TRI);
20109467b48Spatrick addCalleeSavedRegs(Pristine, MF);
20209467b48Spatrick /// Remove the ones that are not saved/restored; they are pristine.
20309467b48Spatrick for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
20409467b48Spatrick Pristine.removeReg(Info.getReg());
20509467b48Spatrick for (MCPhysReg R : Pristine)
20609467b48Spatrick addReg(R);
20709467b48Spatrick }
20809467b48Spatrick
addLiveOutsNoPristines(const MachineBasicBlock & MBB)20909467b48Spatrick void LivePhysRegs::addLiveOutsNoPristines(const MachineBasicBlock &MBB) {
21009467b48Spatrick // To get the live-outs we simply merge the live-ins of all successors.
21109467b48Spatrick for (const MachineBasicBlock *Succ : MBB.successors())
21209467b48Spatrick addBlockLiveIns(*Succ);
21309467b48Spatrick if (MBB.isReturnBlock()) {
21409467b48Spatrick // Return blocks are a special case because we currently don't mark up
21509467b48Spatrick // return instructions completely: specifically, there is no explicit
21609467b48Spatrick // use for callee-saved registers. So we add all callee saved registers
21709467b48Spatrick // that are saved and restored (somewhere). This does not include
21809467b48Spatrick // callee saved registers that are unused and hence not saved and
21909467b48Spatrick // restored; they are called pristine.
22009467b48Spatrick // FIXME: PEI should add explicit markings to return instructions
22109467b48Spatrick // instead of implicitly handling them here.
22209467b48Spatrick const MachineFunction &MF = *MBB.getParent();
22309467b48Spatrick const MachineFrameInfo &MFI = MF.getFrameInfo();
22409467b48Spatrick if (MFI.isCalleeSavedInfoValid()) {
22509467b48Spatrick for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
22609467b48Spatrick if (Info.isRestored())
22709467b48Spatrick addReg(Info.getReg());
22809467b48Spatrick }
22909467b48Spatrick }
23009467b48Spatrick }
23109467b48Spatrick
addLiveOuts(const MachineBasicBlock & MBB)23209467b48Spatrick void LivePhysRegs::addLiveOuts(const MachineBasicBlock &MBB) {
23309467b48Spatrick const MachineFunction &MF = *MBB.getParent();
23409467b48Spatrick addPristines(MF);
23509467b48Spatrick addLiveOutsNoPristines(MBB);
23609467b48Spatrick }
23709467b48Spatrick
addLiveIns(const MachineBasicBlock & MBB)23809467b48Spatrick void LivePhysRegs::addLiveIns(const MachineBasicBlock &MBB) {
23909467b48Spatrick const MachineFunction &MF = *MBB.getParent();
24009467b48Spatrick addPristines(MF);
24109467b48Spatrick addBlockLiveIns(MBB);
24209467b48Spatrick }
24309467b48Spatrick
addLiveInsNoPristines(const MachineBasicBlock & MBB)24473471bf0Spatrick void LivePhysRegs::addLiveInsNoPristines(const MachineBasicBlock &MBB) {
24573471bf0Spatrick addBlockLiveIns(MBB);
24673471bf0Spatrick }
24773471bf0Spatrick
computeLiveIns(LivePhysRegs & LiveRegs,const MachineBasicBlock & MBB)24809467b48Spatrick void llvm::computeLiveIns(LivePhysRegs &LiveRegs,
24909467b48Spatrick const MachineBasicBlock &MBB) {
25009467b48Spatrick const MachineFunction &MF = *MBB.getParent();
25109467b48Spatrick const MachineRegisterInfo &MRI = MF.getRegInfo();
25209467b48Spatrick const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
25309467b48Spatrick LiveRegs.init(TRI);
25409467b48Spatrick LiveRegs.addLiveOutsNoPristines(MBB);
255*d415bd75Srobert for (const MachineInstr &MI : llvm::reverse(MBB))
25609467b48Spatrick LiveRegs.stepBackward(MI);
25709467b48Spatrick }
25809467b48Spatrick
addLiveIns(MachineBasicBlock & MBB,const LivePhysRegs & LiveRegs)25909467b48Spatrick void llvm::addLiveIns(MachineBasicBlock &MBB, const LivePhysRegs &LiveRegs) {
26009467b48Spatrick assert(MBB.livein_empty() && "Expected empty live-in list");
26109467b48Spatrick const MachineFunction &MF = *MBB.getParent();
26209467b48Spatrick const MachineRegisterInfo &MRI = MF.getRegInfo();
26309467b48Spatrick const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
26409467b48Spatrick for (MCPhysReg Reg : LiveRegs) {
26509467b48Spatrick if (MRI.isReserved(Reg))
26609467b48Spatrick continue;
26709467b48Spatrick // Skip the register if we are about to add one of its super registers.
26809467b48Spatrick bool ContainsSuperReg = false;
26909467b48Spatrick for (MCSuperRegIterator SReg(Reg, &TRI); SReg.isValid(); ++SReg) {
27009467b48Spatrick if (LiveRegs.contains(*SReg) && !MRI.isReserved(*SReg)) {
27109467b48Spatrick ContainsSuperReg = true;
27209467b48Spatrick break;
27309467b48Spatrick }
27409467b48Spatrick }
27509467b48Spatrick if (ContainsSuperReg)
27609467b48Spatrick continue;
27709467b48Spatrick MBB.addLiveIn(Reg);
27809467b48Spatrick }
27909467b48Spatrick }
28009467b48Spatrick
recomputeLivenessFlags(MachineBasicBlock & MBB)28109467b48Spatrick void llvm::recomputeLivenessFlags(MachineBasicBlock &MBB) {
28209467b48Spatrick const MachineFunction &MF = *MBB.getParent();
28309467b48Spatrick const MachineRegisterInfo &MRI = MF.getRegInfo();
28409467b48Spatrick const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
285097a140dSpatrick const MachineFrameInfo &MFI = MF.getFrameInfo();
28609467b48Spatrick
28709467b48Spatrick // We walk through the block backwards and start with the live outs.
28809467b48Spatrick LivePhysRegs LiveRegs;
28909467b48Spatrick LiveRegs.init(TRI);
29009467b48Spatrick LiveRegs.addLiveOutsNoPristines(MBB);
29109467b48Spatrick
292*d415bd75Srobert for (MachineInstr &MI : llvm::reverse(MBB)) {
29309467b48Spatrick // Recompute dead flags.
29409467b48Spatrick for (MIBundleOperands MO(MI); MO.isValid(); ++MO) {
29509467b48Spatrick if (!MO->isReg() || !MO->isDef() || MO->isDebug())
29609467b48Spatrick continue;
29709467b48Spatrick
29809467b48Spatrick Register Reg = MO->getReg();
29909467b48Spatrick if (Reg == 0)
30009467b48Spatrick continue;
301*d415bd75Srobert assert(Reg.isPhysical());
30209467b48Spatrick
30309467b48Spatrick bool IsNotLive = LiveRegs.available(MRI, Reg);
304097a140dSpatrick
305097a140dSpatrick // Special-case return instructions for cases when a return is not
306097a140dSpatrick // the last instruction in the block.
307097a140dSpatrick if (MI.isReturn() && MFI.isCalleeSavedInfoValid()) {
308097a140dSpatrick for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo()) {
309097a140dSpatrick if (Info.getReg() == Reg) {
310097a140dSpatrick IsNotLive = !Info.isRestored();
311097a140dSpatrick break;
312097a140dSpatrick }
313097a140dSpatrick }
314097a140dSpatrick }
315097a140dSpatrick
31609467b48Spatrick MO->setIsDead(IsNotLive);
31709467b48Spatrick }
31809467b48Spatrick
31909467b48Spatrick // Step backward over defs.
32009467b48Spatrick LiveRegs.removeDefs(MI);
32109467b48Spatrick
32209467b48Spatrick // Recompute kill flags.
32309467b48Spatrick for (MIBundleOperands MO(MI); MO.isValid(); ++MO) {
32409467b48Spatrick if (!MO->isReg() || !MO->readsReg() || MO->isDebug())
32509467b48Spatrick continue;
32609467b48Spatrick
32709467b48Spatrick Register Reg = MO->getReg();
32809467b48Spatrick if (Reg == 0)
32909467b48Spatrick continue;
330*d415bd75Srobert assert(Reg.isPhysical());
33109467b48Spatrick
33209467b48Spatrick bool IsNotLive = LiveRegs.available(MRI, Reg);
33309467b48Spatrick MO->setIsKill(IsNotLive);
33409467b48Spatrick }
33509467b48Spatrick
33609467b48Spatrick // Complete the stepbackward.
33709467b48Spatrick LiveRegs.addUses(MI);
33809467b48Spatrick }
33909467b48Spatrick }
34009467b48Spatrick
computeAndAddLiveIns(LivePhysRegs & LiveRegs,MachineBasicBlock & MBB)34109467b48Spatrick void llvm::computeAndAddLiveIns(LivePhysRegs &LiveRegs,
34209467b48Spatrick MachineBasicBlock &MBB) {
34309467b48Spatrick computeLiveIns(LiveRegs, MBB);
34409467b48Spatrick addLiveIns(MBB, LiveRegs);
34509467b48Spatrick }
346