77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 //===--- LivePhysRegs.cpp - Live Physical Register Set --------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 // The LLVM Compiler Infrastructure
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 // This file is distributed under the University of Illinois Open Source
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 // License. See LICENSE.TXT for details.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 // This file implements the LivePhysRegs utility for tracking liveness of
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 // physical registers across machine instructions in forward or backward order.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 // A more detailed description can be found in the corresponding header file.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 #include "llvm/CodeGen/LivePhysRegs.h"
|
95
|
17 #include "llvm/CodeGen/MachineFrameInfo.h"
|
|
18 #include "llvm/CodeGen/MachineFunction.h"
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 #include "llvm/CodeGen/MachineInstrBundle.h"
|
120
|
20 #include "llvm/CodeGen/MachineRegisterInfo.h"
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 #include "llvm/Support/Debug.h"
|
95
|
22 #include "llvm/Support/raw_ostream.h"
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 using namespace llvm;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 /// \brief Remove all registers from the set that get clobbered by the register
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 /// mask.
|
95
|
28 /// The clobbers set will be the list of live registers clobbered
|
|
29 /// by the regmask.
|
|
30 void LivePhysRegs::removeRegsInMask(const MachineOperand &MO,
|
|
31 SmallVectorImpl<std::pair<unsigned, const MachineOperand*>> *Clobbers) {
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 SparseSet<unsigned>::iterator LRI = LiveRegs.begin();
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 while (LRI != LiveRegs.end()) {
|
95
|
34 if (MO.clobbersPhysReg(*LRI)) {
|
|
35 if (Clobbers)
|
|
36 Clobbers->push_back(std::make_pair(*LRI, &MO));
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 LRI = LiveRegs.erase(LRI);
|
95
|
38 } else
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 ++LRI;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42
|
121
|
43 /// Remove defined registers and regmask kills from the set.
|
|
44 void LivePhysRegs::removeDefs(const MachineInstr &MI) {
|
120
|
45 for (ConstMIBundleOperands O(MI); O.isValid(); ++O) {
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 if (O->isReg()) {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 if (!O->isDef())
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 continue;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
49 unsigned Reg = O->getReg();
|
120
|
50 if (!TargetRegisterInfo::isPhysicalRegister(Reg))
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
51 continue;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
52 removeReg(Reg);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
53 } else if (O->isRegMask())
|
121
|
54 removeRegsInMask(*O);
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55 }
|
121
|
56 }
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57
|
121
|
58 /// Add uses to the set.
|
|
59 void LivePhysRegs::addUses(const MachineInstr &MI) {
|
120
|
60 for (ConstMIBundleOperands O(MI); O.isValid(); ++O) {
|
|
61 if (!O->isReg() || !O->readsReg())
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
62 continue;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 unsigned Reg = O->getReg();
|
120
|
64 if (!TargetRegisterInfo::isPhysicalRegister(Reg))
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
65 continue;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
66 addReg(Reg);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69
|
121
|
70 /// Simulates liveness when stepping backwards over an instruction(bundle):
|
|
71 /// Remove Defs, add uses. This is the recommended way of calculating liveness.
|
|
72 void LivePhysRegs::stepBackward(const MachineInstr &MI) {
|
|
73 // Remove defined registers and regmask kills from the set.
|
|
74 removeDefs(MI);
|
|
75
|
|
76 // Add uses to the set.
|
|
77 addUses(MI);
|
|
78 }
|
|
79
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
80 /// Simulates liveness when stepping forward over an instruction(bundle): Remove
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
81 /// killed-uses, add defs. This is the not recommended way, because it depends
|
95
|
82 /// on accurate kill flags. If possible use stepBackward() instead of this
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
83 /// function.
|
95
|
84 void LivePhysRegs::stepForward(const MachineInstr &MI,
|
|
85 SmallVectorImpl<std::pair<unsigned, const MachineOperand*>> &Clobbers) {
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
86 // Remove killed registers from the set.
|
120
|
87 for (ConstMIBundleOperands O(MI); O.isValid(); ++O) {
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
88 if (O->isReg()) {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
89 unsigned Reg = O->getReg();
|
120
|
90 if (!TargetRegisterInfo::isPhysicalRegister(Reg))
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
91 continue;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
92 if (O->isDef()) {
|
95
|
93 // Note, dead defs are still recorded. The caller should decide how to
|
|
94 // handle them.
|
|
95 Clobbers.push_back(std::make_pair(Reg, &*O));
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
96 } else {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
97 if (!O->isKill())
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
98 continue;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
99 assert(O->isUse());
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
100 removeReg(Reg);
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
101 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
102 } else if (O->isRegMask())
|
95
|
103 removeRegsInMask(*O, &Clobbers);
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
104 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
105
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
106 // Add defs to the set.
|
95
|
107 for (auto Reg : Clobbers) {
|
|
108 // Skip dead defs. They shouldn't be added to the set.
|
|
109 if (Reg.second->isReg() && Reg.second->isDead())
|
|
110 continue;
|
|
111 addReg(Reg.first);
|
|
112 }
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
113 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
114
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
115 /// Prin the currently live registers to OS.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
116 void LivePhysRegs::print(raw_ostream &OS) const {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
117 OS << "Live Registers:";
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
118 if (!TRI) {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
119 OS << " (uninitialized)\n";
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
120 return;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
121 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
122
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
123 if (empty()) {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
124 OS << " (empty)\n";
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
125 return;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
126 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
127
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
128 for (const_iterator I = begin(), E = end(); I != E; ++I)
|
134
|
129 OS << " " << printReg(*I, TRI);
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
130 OS << "\n";
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
131 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
132
|
121
|
133 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
|
120
|
134 LLVM_DUMP_METHOD void LivePhysRegs::dump() const {
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
135 dbgs() << " " << *this;
|
121
|
136 }
|
77
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
137 #endif
|
95
|
138
|
120
|
139 bool LivePhysRegs::available(const MachineRegisterInfo &MRI,
|
|
140 unsigned Reg) const {
|
|
141 if (LiveRegs.count(Reg))
|
|
142 return false;
|
|
143 if (MRI.isReserved(Reg))
|
|
144 return false;
|
|
145 for (MCRegAliasIterator R(Reg, TRI, false); R.isValid(); ++R) {
|
|
146 if (LiveRegs.count(*R))
|
|
147 return false;
|
|
148 }
|
|
149 return true;
|
|
150 }
|
|
151
|
95
|
152 /// Add live-in registers of basic block \p MBB to \p LiveRegs.
|
120
|
153 void LivePhysRegs::addBlockLiveIns(const MachineBasicBlock &MBB) {
|
|
154 for (const auto &LI : MBB.liveins()) {
|
121
|
155 unsigned Reg = LI.PhysReg;
|
|
156 LaneBitmask Mask = LI.LaneMask;
|
|
157 MCSubRegIndexIterator S(Reg, TRI);
|
|
158 assert(Mask.any() && "Invalid livein mask");
|
|
159 if (Mask.all() || !S.isValid()) {
|
|
160 addReg(Reg);
|
120
|
161 continue;
|
|
162 }
|
121
|
163 for (; S.isValid(); ++S) {
|
|
164 unsigned SI = S.getSubRegIndex();
|
|
165 if ((Mask & TRI->getSubRegIndexLaneMask(SI)).any())
|
120
|
166 addReg(S.getSubReg());
|
121
|
167 }
|
120
|
168 }
|
95
|
169 }
|
|
170
|
121
|
171 /// Adds all callee saved registers to \p LiveRegs.
|
|
172 static void addCalleeSavedRegs(LivePhysRegs &LiveRegs,
|
|
173 const MachineFunction &MF) {
|
|
174 const MachineRegisterInfo &MRI = MF.getRegInfo();
|
|
175 for (const MCPhysReg *CSR = MRI.getCalleeSavedRegs(); CSR && *CSR; ++CSR)
|
95
|
176 LiveRegs.addReg(*CSR);
|
121
|
177 }
|
|
178
|
|
179 void LivePhysRegs::addPristines(const MachineFunction &MF) {
|
|
180 const MachineFrameInfo &MFI = MF.getFrameInfo();
|
|
181 if (!MFI.isCalleeSavedInfoValid())
|
|
182 return;
|
|
183 /// This function will usually be called on an empty object, handle this
|
|
184 /// as a special case.
|
|
185 if (empty()) {
|
|
186 /// Add all callee saved regs, then remove the ones that are saved and
|
|
187 /// restored.
|
|
188 addCalleeSavedRegs(*this, MF);
|
|
189 /// Remove the ones that are not saved/restored; they are pristine.
|
|
190 for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
|
|
191 removeReg(Info.getReg());
|
|
192 return;
|
|
193 }
|
|
194 /// If a callee-saved register that is not pristine is already present
|
|
195 /// in the set, we should make sure that it stays in it. Precompute the
|
|
196 /// set of pristine registers in a separate object.
|
|
197 /// Add all callee saved regs, then remove the ones that are saved+restored.
|
|
198 LivePhysRegs Pristine(*TRI);
|
|
199 addCalleeSavedRegs(Pristine, MF);
|
|
200 /// Remove the ones that are not saved/restored; they are pristine.
|
95
|
201 for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
|
121
|
202 Pristine.removeReg(Info.getReg());
|
|
203 for (MCPhysReg R : Pristine)
|
|
204 addReg(R);
|
95
|
205 }
|
|
206
|
120
|
207 void LivePhysRegs::addLiveOutsNoPristines(const MachineBasicBlock &MBB) {
|
134
|
208 // To get the live-outs we simply merge the live-ins of all successors.
|
|
209 for (const MachineBasicBlock *Succ : MBB.successors())
|
|
210 addBlockLiveIns(*Succ);
|
|
211 if (MBB.isReturnBlock()) {
|
|
212 // Return blocks are a special case because we currently don't mark up
|
|
213 // return instructions completely: specifically, there is no explicit
|
|
214 // use for callee-saved registers. So we add all callee saved registers
|
|
215 // that are saved and restored (somewhere). This does not include
|
|
216 // callee saved registers that are unused and hence not saved and
|
|
217 // restored; they are called pristine.
|
|
218 // FIXME: PEI should add explicit markings to return instructions
|
|
219 // instead of implicitly handling them here.
|
121
|
220 const MachineFunction &MF = *MBB.getParent();
|
|
221 const MachineFrameInfo &MFI = MF.getFrameInfo();
|
|
222 if (MFI.isCalleeSavedInfoValid()) {
|
|
223 for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
|
|
224 if (Info.isRestored())
|
|
225 addReg(Info.getReg());
|
|
226 }
|
|
227 }
|
120
|
228 }
|
|
229
|
|
230 void LivePhysRegs::addLiveOuts(const MachineBasicBlock &MBB) {
|
|
231 const MachineFunction &MF = *MBB.getParent();
|
134
|
232 addPristines(MF);
|
|
233 addLiveOutsNoPristines(MBB);
|
95
|
234 }
|
|
235
|
120
|
236 void LivePhysRegs::addLiveIns(const MachineBasicBlock &MBB) {
|
|
237 const MachineFunction &MF = *MBB.getParent();
|
121
|
238 addPristines(MF);
|
120
|
239 addBlockLiveIns(MBB);
|
95
|
240 }
|
121
|
241
|
|
242 void llvm::computeLiveIns(LivePhysRegs &LiveRegs,
|
|
243 const MachineBasicBlock &MBB) {
|
|
244 const MachineFunction &MF = *MBB.getParent();
|
|
245 const MachineRegisterInfo &MRI = MF.getRegInfo();
|
|
246 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
|
|
247 LiveRegs.init(TRI);
|
|
248 LiveRegs.addLiveOutsNoPristines(MBB);
|
|
249 for (const MachineInstr &MI : make_range(MBB.rbegin(), MBB.rend()))
|
|
250 LiveRegs.stepBackward(MI);
|
|
251 }
|
|
252
|
|
253 void llvm::addLiveIns(MachineBasicBlock &MBB, const LivePhysRegs &LiveRegs) {
|
|
254 assert(MBB.livein_empty() && "Expected empty live-in list");
|
|
255 const MachineFunction &MF = *MBB.getParent();
|
|
256 const MachineRegisterInfo &MRI = MF.getRegInfo();
|
|
257 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
|
|
258 for (MCPhysReg Reg : LiveRegs) {
|
|
259 if (MRI.isReserved(Reg))
|
|
260 continue;
|
|
261 // Skip the register if we are about to add one of its super registers.
|
|
262 bool ContainsSuperReg = false;
|
|
263 for (MCSuperRegIterator SReg(Reg, &TRI); SReg.isValid(); ++SReg) {
|
|
264 if (LiveRegs.contains(*SReg) && !MRI.isReserved(*SReg)) {
|
|
265 ContainsSuperReg = true;
|
|
266 break;
|
|
267 }
|
|
268 }
|
|
269 if (ContainsSuperReg)
|
|
270 continue;
|
|
271 MBB.addLiveIn(Reg);
|
|
272 }
|
|
273 }
|
|
274
|
|
275 void llvm::recomputeLivenessFlags(MachineBasicBlock &MBB) {
|
|
276 const MachineFunction &MF = *MBB.getParent();
|
|
277 const MachineRegisterInfo &MRI = MF.getRegInfo();
|
|
278 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();
|
|
279
|
|
280 // We walk through the block backwards and start with the live outs.
|
|
281 LivePhysRegs LiveRegs;
|
|
282 LiveRegs.init(TRI);
|
|
283 LiveRegs.addLiveOutsNoPristines(MBB);
|
|
284
|
|
285 for (MachineInstr &MI : make_range(MBB.rbegin(), MBB.rend())) {
|
|
286 // Recompute dead flags.
|
|
287 for (MIBundleOperands MO(MI); MO.isValid(); ++MO) {
|
|
288 if (!MO->isReg() || !MO->isDef() || MO->isDebug())
|
|
289 continue;
|
|
290
|
|
291 unsigned Reg = MO->getReg();
|
|
292 if (Reg == 0)
|
|
293 continue;
|
|
294 assert(TargetRegisterInfo::isPhysicalRegister(Reg));
|
|
295
|
|
296 bool IsNotLive = LiveRegs.available(MRI, Reg);
|
|
297 MO->setIsDead(IsNotLive);
|
|
298 }
|
|
299
|
|
300 // Step backward over defs.
|
|
301 LiveRegs.removeDefs(MI);
|
|
302
|
|
303 // Recompute kill flags.
|
|
304 for (MIBundleOperands MO(MI); MO.isValid(); ++MO) {
|
|
305 if (!MO->isReg() || !MO->readsReg() || MO->isDebug())
|
|
306 continue;
|
|
307
|
|
308 unsigned Reg = MO->getReg();
|
|
309 if (Reg == 0)
|
|
310 continue;
|
|
311 assert(TargetRegisterInfo::isPhysicalRegister(Reg));
|
|
312
|
|
313 bool IsNotLive = LiveRegs.available(MRI, Reg);
|
|
314 MO->setIsKill(IsNotLive);
|
|
315 }
|
|
316
|
|
317 // Complete the stepbackward.
|
|
318 LiveRegs.addUses(MI);
|
|
319 }
|
|
320 }
|
|
321
|
|
322 void llvm::computeAndAddLiveIns(LivePhysRegs &LiveRegs,
|
|
323 MachineBasicBlock &MBB) {
|
|
324 computeLiveIns(LiveRegs, MBB);
|
|
325 addLiveIns(MBB, LiveRegs);
|
|
326 }
|