xref: /openbsd-src/gnu/llvm/llvm/lib/CodeGen/LivePhysRegs.cpp (revision d415bd752c734aee168c4ee86ff32e8cc249eb16)
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