1310034e1SJuergen Ributzka //===--- LivePhysRegs.cpp - Live Physical Register Set --------------------===//
2310034e1SJuergen Ributzka //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6310034e1SJuergen Ributzka //
7310034e1SJuergen Ributzka //===----------------------------------------------------------------------===//
8310034e1SJuergen Ributzka //
9310034e1SJuergen Ributzka // This file implements the LivePhysRegs utility for tracking liveness of
10310034e1SJuergen Ributzka // physical registers across machine instructions in forward or backward order.
11310034e1SJuergen Ributzka // A more detailed description can be found in the corresponding header file.
12310034e1SJuergen Ributzka //
13310034e1SJuergen Ributzka //===----------------------------------------------------------------------===//
14310034e1SJuergen Ributzka
15310034e1SJuergen Ributzka #include "llvm/CodeGen/LivePhysRegs.h"
1611f31187SFlorian Hahn #include "llvm/CodeGen/LiveRegUnits.h"
17e1cd96bfSMatthias Braun #include "llvm/CodeGen/MachineFrameInfo.h"
18e1cd96bfSMatthias Braun #include "llvm/CodeGen/MachineFunction.h"
19310034e1SJuergen Ributzka #include "llvm/CodeGen/MachineInstrBundle.h"
20332bb5c2SMatthias Braun #include "llvm/CodeGen/MachineRegisterInfo.h"
21432a3883SNico Weber #include "llvm/Config/llvm-config.h"
22310034e1SJuergen Ributzka #include "llvm/Support/Debug.h"
23de9f090eSBenjamin Kramer #include "llvm/Support/raw_ostream.h"
24310034e1SJuergen Ributzka using namespace llvm;
25310034e1SJuergen Ributzka
26310034e1SJuergen Ributzka
275f8f34e4SAdrian Prantl /// Remove all registers from the set that get clobbered by the register
28310034e1SJuergen Ributzka /// mask.
297605e37aSPete Cooper /// The clobbers set will be the list of live registers clobbered
307605e37aSPete Cooper /// by the regmask.
removeRegsInMask(const MachineOperand & MO,SmallVectorImpl<std::pair<MCPhysReg,const MachineOperand * >> * Clobbers)317605e37aSPete Cooper void LivePhysRegs::removeRegsInMask(const MachineOperand &MO,
32c6613879SMatthias Braun SmallVectorImpl<std::pair<MCPhysReg, const MachineOperand*>> *Clobbers) {
33c6613879SMatthias Braun RegisterSet::iterator LRI = LiveRegs.begin();
34310034e1SJuergen Ributzka while (LRI != LiveRegs.end()) {
357605e37aSPete Cooper if (MO.clobbersPhysReg(*LRI)) {
367605e37aSPete Cooper if (Clobbers)
377605e37aSPete Cooper Clobbers->push_back(std::make_pair(*LRI, &MO));
38310034e1SJuergen Ributzka LRI = LiveRegs.erase(LRI);
397605e37aSPete Cooper } else
40310034e1SJuergen Ributzka ++LRI;
41310034e1SJuergen Ributzka }
42310034e1SJuergen Ributzka }
43310034e1SJuergen Ributzka
446ca02b25SKrzysztof Parzyszek /// Remove defined registers and regmask kills from the set.
removeDefs(const MachineInstr & MI)456ca02b25SKrzysztof Parzyszek void LivePhysRegs::removeDefs(const MachineInstr &MI) {
4611f31187SFlorian Hahn for (const MachineOperand &MOP : phys_regs_and_masks(MI)) {
4711f31187SFlorian Hahn if (MOP.isRegMask()) {
4811f31187SFlorian Hahn removeRegsInMask(MOP);
49310034e1SJuergen Ributzka continue;
5011f31187SFlorian Hahn }
5111f31187SFlorian Hahn
5211f31187SFlorian Hahn if (MOP.isDef())
5311f31187SFlorian Hahn removeReg(MOP.getReg());
54310034e1SJuergen Ributzka }
556ca02b25SKrzysztof Parzyszek }
56310034e1SJuergen Ributzka
576ca02b25SKrzysztof Parzyszek /// Add uses to the set.
addUses(const MachineInstr & MI)586ca02b25SKrzysztof Parzyszek void LivePhysRegs::addUses(const MachineInstr &MI) {
5911f31187SFlorian Hahn for (const MachineOperand &MOP : phys_regs_and_masks(MI)) {
6011f31187SFlorian Hahn if (!MOP.isReg() || !MOP.readsReg())
61310034e1SJuergen Ributzka continue;
6211f31187SFlorian Hahn addReg(MOP.getReg());
63310034e1SJuergen Ributzka }
64310034e1SJuergen Ributzka }
65310034e1SJuergen Ributzka
666ca02b25SKrzysztof Parzyszek /// Simulates liveness when stepping backwards over an instruction(bundle):
676ca02b25SKrzysztof Parzyszek /// Remove Defs, add uses. This is the recommended way of calculating liveness.
stepBackward(const MachineInstr & MI)686ca02b25SKrzysztof Parzyszek void LivePhysRegs::stepBackward(const MachineInstr &MI) {
696ca02b25SKrzysztof Parzyszek // Remove defined registers and regmask kills from the set.
706ca02b25SKrzysztof Parzyszek removeDefs(MI);
716ca02b25SKrzysztof Parzyszek
726ca02b25SKrzysztof Parzyszek // Add uses to the set.
736ca02b25SKrzysztof Parzyszek addUses(MI);
746ca02b25SKrzysztof Parzyszek }
756ca02b25SKrzysztof Parzyszek
76310034e1SJuergen Ributzka /// Simulates liveness when stepping forward over an instruction(bundle): Remove
77310034e1SJuergen Ributzka /// killed-uses, add defs. This is the not recommended way, because it depends
78a67b2d01SChad Rosier /// on accurate kill flags. If possible use stepBackward() instead of this
79310034e1SJuergen Ributzka /// function.
stepForward(const MachineInstr & MI,SmallVectorImpl<std::pair<MCPhysReg,const MachineOperand * >> & Clobbers)807605e37aSPete Cooper void LivePhysRegs::stepForward(const MachineInstr &MI,
81c6613879SMatthias Braun SmallVectorImpl<std::pair<MCPhysReg, const MachineOperand*>> &Clobbers) {
82310034e1SJuergen Ributzka // Remove killed registers from the set.
83f9ab416dSDuncan P. N. Exon Smith for (ConstMIBundleOperands O(MI); O.isValid(); ++O) {
84b8016b62SJay Foad if (O->isReg()) {
85b8016b62SJay Foad if (O->isDebug())
86b8016b62SJay Foad continue;
870c476111SDaniel Sanders Register Reg = O->getReg();
88b8016b62SJay Foad if (!Reg.isPhysical())
89310034e1SJuergen Ributzka continue;
90310034e1SJuergen Ributzka if (O->isDef()) {
9127483915SPete Cooper // Note, dead defs are still recorded. The caller should decide how to
9227483915SPete Cooper // handle them.
937605e37aSPete Cooper Clobbers.push_back(std::make_pair(Reg, &*O));
94310034e1SJuergen Ributzka } else {
95310034e1SJuergen Ributzka assert(O->isUse());
96b8016b62SJay Foad if (O->isKill())
97310034e1SJuergen Ributzka removeReg(Reg);
98310034e1SJuergen Ributzka }
99b8016b62SJay Foad } else if (O->isRegMask()) {
1007605e37aSPete Cooper removeRegsInMask(*O, &Clobbers);
101310034e1SJuergen Ributzka }
102b8016b62SJay Foad }
103310034e1SJuergen Ributzka
104310034e1SJuergen Ributzka // Add defs to the set.
10527483915SPete Cooper for (auto Reg : Clobbers) {
1061cf329c9SKrzysztof Parzyszek // Skip dead defs and registers clobbered by regmasks. They shouldn't
1071cf329c9SKrzysztof Parzyszek // be added to the set.
10827483915SPete Cooper if (Reg.second->isReg() && Reg.second->isDead())
10927483915SPete Cooper continue;
1101cf329c9SKrzysztof Parzyszek if (Reg.second->isRegMask() &&
1111cf329c9SKrzysztof Parzyszek MachineOperand::clobbersPhysReg(Reg.second->getRegMask(), Reg.first))
1121cf329c9SKrzysztof Parzyszek continue;
1137605e37aSPete Cooper addReg(Reg.first);
114310034e1SJuergen Ributzka }
11527483915SPete Cooper }
116310034e1SJuergen Ributzka
1179fdb7ac5Srollrat /// Print the currently live registers to OS.
print(raw_ostream & OS) const118310034e1SJuergen Ributzka void LivePhysRegs::print(raw_ostream &OS) const {
119310034e1SJuergen Ributzka OS << "Live Registers:";
120310034e1SJuergen Ributzka if (!TRI) {
121310034e1SJuergen Ributzka OS << " (uninitialized)\n";
122310034e1SJuergen Ributzka return;
123310034e1SJuergen Ributzka }
124310034e1SJuergen Ributzka
125310034e1SJuergen Ributzka if (empty()) {
126310034e1SJuergen Ributzka OS << " (empty)\n";
127310034e1SJuergen Ributzka return;
128310034e1SJuergen Ributzka }
129310034e1SJuergen Ributzka
130d5adba10SKazu Hirata for (MCPhysReg R : *this)
131d5adba10SKazu Hirata OS << " " << printReg(R, TRI);
132310034e1SJuergen Ributzka OS << "\n";
133310034e1SJuergen Ributzka }
134310034e1SJuergen Ributzka
135615eb470SAaron Ballman #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump() const1368c209aa8SMatthias Braun LLVM_DUMP_METHOD void LivePhysRegs::dump() const {
137310034e1SJuergen Ributzka dbgs() << " " << *this;
138310034e1SJuergen Ributzka }
1398c209aa8SMatthias Braun #endif
140e1cd96bfSMatthias Braun
available(const MachineRegisterInfo & MRI,MCPhysReg Reg) const141332bb5c2SMatthias Braun bool LivePhysRegs::available(const MachineRegisterInfo &MRI,
142c6613879SMatthias Braun MCPhysReg Reg) const {
143332bb5c2SMatthias Braun if (LiveRegs.count(Reg))
144332bb5c2SMatthias Braun return false;
145332bb5c2SMatthias Braun if (MRI.isReserved(Reg))
146332bb5c2SMatthias Braun return false;
147332bb5c2SMatthias Braun for (MCRegAliasIterator R(Reg, TRI, false); R.isValid(); ++R) {
148332bb5c2SMatthias Braun if (LiveRegs.count(*R))
149332bb5c2SMatthias Braun return false;
150332bb5c2SMatthias Braun }
151332bb5c2SMatthias Braun return true;
152332bb5c2SMatthias Braun }
153332bb5c2SMatthias Braun
154e1cd96bfSMatthias Braun /// Add live-in registers of basic block \p MBB to \p LiveRegs.
addBlockLiveIns(const MachineBasicBlock & MBB)155abc0662fSKrzysztof Parzyszek void LivePhysRegs::addBlockLiveIns(const MachineBasicBlock &MBB) {
156abc0662fSKrzysztof Parzyszek for (const auto &LI : MBB.liveins()) {
157c6613879SMatthias Braun MCPhysReg Reg = LI.PhysReg;
158eec1f367SMatthias Braun LaneBitmask Mask = LI.LaneMask;
159eec1f367SMatthias Braun MCSubRegIndexIterator S(Reg, TRI);
160eec1f367SMatthias Braun assert(Mask.any() && "Invalid livein mask");
161eec1f367SMatthias Braun if (Mask.all() || !S.isValid()) {
162eec1f367SMatthias Braun addReg(Reg);
163abc0662fSKrzysztof Parzyszek continue;
164abc0662fSKrzysztof Parzyszek }
16591b5cf84SKrzysztof Parzyszek for (; S.isValid(); ++S) {
16691b5cf84SKrzysztof Parzyszek unsigned SI = S.getSubRegIndex();
167eec1f367SMatthias Braun if ((Mask & TRI->getSubRegIndexLaneMask(SI)).any())
168abc0662fSKrzysztof Parzyszek addReg(S.getSubReg());
169abc0662fSKrzysztof Parzyszek }
170e1cd96bfSMatthias Braun }
17191b5cf84SKrzysztof Parzyszek }
172e1cd96bfSMatthias Braun
173eec1f367SMatthias Braun /// Adds all callee saved registers to \p LiveRegs.
addCalleeSavedRegs(LivePhysRegs & LiveRegs,const MachineFunction & MF)174eec1f367SMatthias Braun static void addCalleeSavedRegs(LivePhysRegs &LiveRegs,
175eec1f367SMatthias Braun const MachineFunction &MF) {
176fe34c5e4SOren Ben Simhon const MachineRegisterInfo &MRI = MF.getRegInfo();
177eec1f367SMatthias Braun for (const MCPhysReg *CSR = MRI.getCalleeSavedRegs(); CSR && *CSR; ++CSR)
178e1cd96bfSMatthias Braun LiveRegs.addReg(*CSR);
179eec1f367SMatthias Braun }
180eec1f367SMatthias Braun
addPristines(const MachineFunction & MF)181f78eca8fSKrzysztof Parzyszek void LivePhysRegs::addPristines(const MachineFunction &MF) {
182eec1f367SMatthias Braun const MachineFrameInfo &MFI = MF.getFrameInfo();
183eec1f367SMatthias Braun if (!MFI.isCalleeSavedInfoValid())
184eec1f367SMatthias Braun return;
185f78eca8fSKrzysztof Parzyszek /// This function will usually be called on an empty object, handle this
186f78eca8fSKrzysztof Parzyszek /// as a special case.
187f78eca8fSKrzysztof Parzyszek if (empty()) {
188f78eca8fSKrzysztof Parzyszek /// Add all callee saved regs, then remove the ones that are saved and
189f78eca8fSKrzysztof Parzyszek /// restored.
190f78eca8fSKrzysztof Parzyszek addCalleeSavedRegs(*this, MF);
191eec1f367SMatthias Braun /// Remove the ones that are not saved/restored; they are pristine.
192e1cd96bfSMatthias Braun for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
193f78eca8fSKrzysztof Parzyszek removeReg(Info.getReg());
194f78eca8fSKrzysztof Parzyszek return;
195f78eca8fSKrzysztof Parzyszek }
196f78eca8fSKrzysztof Parzyszek /// If a callee-saved register that is not pristine is already present
197f78eca8fSKrzysztof Parzyszek /// in the set, we should make sure that it stays in it. Precompute the
198f78eca8fSKrzysztof Parzyszek /// set of pristine registers in a separate object.
199f78eca8fSKrzysztof Parzyszek /// Add all callee saved regs, then remove the ones that are saved+restored.
200f78eca8fSKrzysztof Parzyszek LivePhysRegs Pristine(*TRI);
201f78eca8fSKrzysztof Parzyszek addCalleeSavedRegs(Pristine, MF);
202f78eca8fSKrzysztof Parzyszek /// Remove the ones that are not saved/restored; they are pristine.
203f78eca8fSKrzysztof Parzyszek for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
204f78eca8fSKrzysztof Parzyszek Pristine.removeReg(Info.getReg());
205f78eca8fSKrzysztof Parzyszek for (MCPhysReg R : Pristine)
206f78eca8fSKrzysztof Parzyszek addReg(R);
207e1cd96bfSMatthias Braun }
208e1cd96bfSMatthias Braun
addLiveOutsNoPristines(const MachineBasicBlock & MBB)209d1aabb28SMatthias Braun void LivePhysRegs::addLiveOutsNoPristines(const MachineBasicBlock &MBB) {
21024f26e6dSMatthias Braun // To get the live-outs we simply merge the live-ins of all successors.
211d1aabb28SMatthias Braun for (const MachineBasicBlock *Succ : MBB.successors())
212abc0662fSKrzysztof Parzyszek addBlockLiveIns(*Succ);
21398f8bba2SEli Friedman if (MBB.isReturnBlock()) {
21498f8bba2SEli Friedman // Return blocks are a special case because we currently don't mark up
21598f8bba2SEli Friedman // return instructions completely: specifically, there is no explicit
21698f8bba2SEli Friedman // use for callee-saved registers. So we add all callee saved registers
21798f8bba2SEli Friedman // that are saved and restored (somewhere). This does not include
21898f8bba2SEli Friedman // callee saved registers that are unused and hence not saved and
21998f8bba2SEli Friedman // restored; they are called pristine.
22098f8bba2SEli Friedman // FIXME: PEI should add explicit markings to return instructions
22198f8bba2SEli Friedman // instead of implicitly handling them here.
222e2133d5bSMatthias Braun const MachineFunction &MF = *MBB.getParent();
223e2133d5bSMatthias Braun const MachineFrameInfo &MFI = MF.getFrameInfo();
224c93c0639SMatthias Braun if (MFI.isCalleeSavedInfoValid()) {
225eec1f367SMatthias Braun for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
226bea30c62SKrzysztof Parzyszek if (Info.isRestored())
227eec1f367SMatthias Braun addReg(Info.getReg());
228eec1f367SMatthias Braun }
229e2133d5bSMatthias Braun }
230e1cd96bfSMatthias Braun }
231e1cd96bfSMatthias Braun
addLiveOuts(const MachineBasicBlock & MBB)232eec1f367SMatthias Braun void LivePhysRegs::addLiveOuts(const MachineBasicBlock &MBB) {
233eec1f367SMatthias Braun const MachineFunction &MF = *MBB.getParent();
234f78eca8fSKrzysztof Parzyszek addPristines(MF);
235c93c0639SMatthias Braun addLiveOutsNoPristines(MBB);
236c93c0639SMatthias Braun }
237c93c0639SMatthias Braun
addLiveIns(const MachineBasicBlock & MBB)238d1aabb28SMatthias Braun void LivePhysRegs::addLiveIns(const MachineBasicBlock &MBB) {
239d1aabb28SMatthias Braun const MachineFunction &MF = *MBB.getParent();
240f78eca8fSKrzysztof Parzyszek addPristines(MF);
241abc0662fSKrzysztof Parzyszek addBlockLiveIns(MBB);
242e1cd96bfSMatthias Braun }
24318198305SMatthias Braun
addLiveInsNoPristines(const MachineBasicBlock & MBB)244dc0bbc9dSDavid Green void LivePhysRegs::addLiveInsNoPristines(const MachineBasicBlock &MBB) {
245dc0bbc9dSDavid Green addBlockLiveIns(MBB);
246dc0bbc9dSDavid Green }
247dc0bbc9dSDavid Green
computeLiveIns(LivePhysRegs & LiveRegs,const MachineBasicBlock & MBB)248e51c435cSMatthias Braun void llvm::computeLiveIns(LivePhysRegs &LiveRegs,
249c9056b83SMatthias Braun const MachineBasicBlock &MBB) {
250c9056b83SMatthias Braun const MachineFunction &MF = *MBB.getParent();
251c9056b83SMatthias Braun const MachineRegisterInfo &MRI = MF.getRegInfo();
252e51c435cSMatthias Braun const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
25318198305SMatthias Braun LiveRegs.init(TRI);
25418198305SMatthias Braun LiveRegs.addLiveOutsNoPristines(MBB);
255*843d1edaSKazu Hirata for (const MachineInstr &MI : llvm::reverse(MBB))
25618198305SMatthias Braun LiveRegs.stepBackward(MI);
257c9056b83SMatthias Braun }
25818198305SMatthias Braun
addLiveIns(MachineBasicBlock & MBB,const LivePhysRegs & LiveRegs)259c9056b83SMatthias Braun void llvm::addLiveIns(MachineBasicBlock &MBB, const LivePhysRegs &LiveRegs) {
260c9056b83SMatthias Braun assert(MBB.livein_empty() && "Expected empty live-in list");
261c9056b83SMatthias Braun const MachineFunction &MF = *MBB.getParent();
262c9056b83SMatthias Braun const MachineRegisterInfo &MRI = MF.getRegInfo();
263c9056b83SMatthias Braun const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
264c9056b83SMatthias Braun for (MCPhysReg Reg : LiveRegs) {
265e51c435cSMatthias Braun if (MRI.isReserved(Reg))
266e51c435cSMatthias Braun continue;
26718198305SMatthias Braun // Skip the register if we are about to add one of its super registers.
26818198305SMatthias Braun bool ContainsSuperReg = false;
26918198305SMatthias Braun for (MCSuperRegIterator SReg(Reg, &TRI); SReg.isValid(); ++SReg) {
270e51c435cSMatthias Braun if (LiveRegs.contains(*SReg) && !MRI.isReserved(*SReg)) {
27118198305SMatthias Braun ContainsSuperReg = true;
27218198305SMatthias Braun break;
27318198305SMatthias Braun }
27418198305SMatthias Braun }
27518198305SMatthias Braun if (ContainsSuperReg)
27618198305SMatthias Braun continue;
27718198305SMatthias Braun MBB.addLiveIn(Reg);
27818198305SMatthias Braun }
27918198305SMatthias Braun }
280c9056b83SMatthias Braun
recomputeLivenessFlags(MachineBasicBlock & MBB)2816ca02b25SKrzysztof Parzyszek void llvm::recomputeLivenessFlags(MachineBasicBlock &MBB) {
2826ca02b25SKrzysztof Parzyszek const MachineFunction &MF = *MBB.getParent();
2836ca02b25SKrzysztof Parzyszek const MachineRegisterInfo &MRI = MF.getRegInfo();
2846ca02b25SKrzysztof Parzyszek const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
285760b1751SSam Parker const MachineFrameInfo &MFI = MF.getFrameInfo();
2866ca02b25SKrzysztof Parzyszek
2876ca02b25SKrzysztof Parzyszek // We walk through the block backwards and start with the live outs.
2886ca02b25SKrzysztof Parzyszek LivePhysRegs LiveRegs;
2896ca02b25SKrzysztof Parzyszek LiveRegs.init(TRI);
2906ca02b25SKrzysztof Parzyszek LiveRegs.addLiveOutsNoPristines(MBB);
2916ca02b25SKrzysztof Parzyszek
292*843d1edaSKazu Hirata for (MachineInstr &MI : llvm::reverse(MBB)) {
2936ca02b25SKrzysztof Parzyszek // Recompute dead flags.
2946ca02b25SKrzysztof Parzyszek for (MIBundleOperands MO(MI); MO.isValid(); ++MO) {
2956ca02b25SKrzysztof Parzyszek if (!MO->isReg() || !MO->isDef() || MO->isDebug())
2966ca02b25SKrzysztof Parzyszek continue;
2976ca02b25SKrzysztof Parzyszek
2980c476111SDaniel Sanders Register Reg = MO->getReg();
2996ca02b25SKrzysztof Parzyszek if (Reg == 0)
3006ca02b25SKrzysztof Parzyszek continue;
301b8016b62SJay Foad assert(Reg.isPhysical());
3026ca02b25SKrzysztof Parzyszek
3036ca02b25SKrzysztof Parzyszek bool IsNotLive = LiveRegs.available(MRI, Reg);
304760b1751SSam Parker
305760b1751SSam Parker // Special-case return instructions for cases when a return is not
306760b1751SSam Parker // the last instruction in the block.
307760b1751SSam Parker if (MI.isReturn() && MFI.isCalleeSavedInfoValid()) {
308760b1751SSam Parker for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo()) {
309760b1751SSam Parker if (Info.getReg() == Reg) {
310760b1751SSam Parker IsNotLive = !Info.isRestored();
311760b1751SSam Parker break;
312760b1751SSam Parker }
313760b1751SSam Parker }
314760b1751SSam Parker }
315760b1751SSam Parker
3166ca02b25SKrzysztof Parzyszek MO->setIsDead(IsNotLive);
3176ca02b25SKrzysztof Parzyszek }
3186ca02b25SKrzysztof Parzyszek
3196ca02b25SKrzysztof Parzyszek // Step backward over defs.
3206ca02b25SKrzysztof Parzyszek LiveRegs.removeDefs(MI);
3216ca02b25SKrzysztof Parzyszek
3226ca02b25SKrzysztof Parzyszek // Recompute kill flags.
3236ca02b25SKrzysztof Parzyszek for (MIBundleOperands MO(MI); MO.isValid(); ++MO) {
3246ca02b25SKrzysztof Parzyszek if (!MO->isReg() || !MO->readsReg() || MO->isDebug())
3256ca02b25SKrzysztof Parzyszek continue;
3266ca02b25SKrzysztof Parzyszek
3270c476111SDaniel Sanders Register Reg = MO->getReg();
3286ca02b25SKrzysztof Parzyszek if (Reg == 0)
3296ca02b25SKrzysztof Parzyszek continue;
330b8016b62SJay Foad assert(Reg.isPhysical());
3316ca02b25SKrzysztof Parzyszek
3326ca02b25SKrzysztof Parzyszek bool IsNotLive = LiveRegs.available(MRI, Reg);
3336ca02b25SKrzysztof Parzyszek MO->setIsKill(IsNotLive);
3346ca02b25SKrzysztof Parzyszek }
3356ca02b25SKrzysztof Parzyszek
3366ca02b25SKrzysztof Parzyszek // Complete the stepbackward.
3376ca02b25SKrzysztof Parzyszek LiveRegs.addUses(MI);
3386ca02b25SKrzysztof Parzyszek }
3396ca02b25SKrzysztof Parzyszek }
3406ca02b25SKrzysztof Parzyszek
computeAndAddLiveIns(LivePhysRegs & LiveRegs,MachineBasicBlock & MBB)341c9056b83SMatthias Braun void llvm::computeAndAddLiveIns(LivePhysRegs &LiveRegs,
342c9056b83SMatthias Braun MachineBasicBlock &MBB) {
343c9056b83SMatthias Braun computeLiveIns(LiveRegs, MBB);
344c9056b83SMatthias Braun addLiveIns(MBB, LiveRegs);
345c9056b83SMatthias Braun }
346