1f22ef01cSRoman Divacky //===-- LiveVariables.cpp - Live Variable Analysis for Machine Code -------===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky // The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
10f22ef01cSRoman Divacky // This file implements the LiveVariable analysis pass. For each machine
11f22ef01cSRoman Divacky // instruction in the function, this pass calculates the set of registers that
12f22ef01cSRoman Divacky // are immediately dead after the instruction (i.e., the instruction calculates
13f22ef01cSRoman Divacky // the value, but it is never used) and the set of registers that are used by
14f22ef01cSRoman Divacky // the instruction, but are never used after the instruction (i.e., they are
15f22ef01cSRoman Divacky // killed).
16f22ef01cSRoman Divacky //
17dff0c46cSDimitry Andric // This class computes live variables using a sparse implementation based on
18f22ef01cSRoman Divacky // the machine code SSA form. This class computes live variable information for
19f22ef01cSRoman Divacky // each virtual and _register allocatable_ physical register in a function. It
20f22ef01cSRoman Divacky // uses the dominance properties of SSA form to efficiently compute live
21f22ef01cSRoman Divacky // variables for virtual registers, and assumes that physical registers are only
22f22ef01cSRoman Divacky // live within a single basic block (allowing it to do a single local analysis
23f22ef01cSRoman Divacky // to resolve physical register lifetimes in each basic block). If a physical
24f22ef01cSRoman Divacky // register is not register allocatable, it is not tracked. This is useful for
25f22ef01cSRoman Divacky // things like the stack pointer and condition codes.
26f22ef01cSRoman Divacky //
27f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
28f22ef01cSRoman Divacky
29f22ef01cSRoman Divacky #include "llvm/CodeGen/LiveVariables.h"
30139f7f9bSDimitry Andric #include "llvm/ADT/DepthFirstIterator.h"
31139f7f9bSDimitry Andric #include "llvm/ADT/STLExtras.h"
32139f7f9bSDimitry Andric #include "llvm/ADT/SmallPtrSet.h"
33139f7f9bSDimitry Andric #include "llvm/ADT/SmallSet.h"
34f22ef01cSRoman Divacky #include "llvm/CodeGen/MachineInstr.h"
35f22ef01cSRoman Divacky #include "llvm/CodeGen/MachineRegisterInfo.h"
36f22ef01cSRoman Divacky #include "llvm/CodeGen/Passes.h"
37*4ba319b5SDimitry Andric #include "llvm/Config/llvm-config.h"
38f22ef01cSRoman Divacky #include "llvm/Support/Debug.h"
39139f7f9bSDimitry Andric #include "llvm/Support/ErrorHandling.h"
40ff0cc061SDimitry Andric #include "llvm/Support/raw_ostream.h"
41f22ef01cSRoman Divacky #include <algorithm>
42f22ef01cSRoman Divacky using namespace llvm;
43f22ef01cSRoman Divacky
44f22ef01cSRoman Divacky char LiveVariables::ID = 0;
45dff0c46cSDimitry Andric char &llvm::LiveVariablesID = LiveVariables::ID;
462754fe60SDimitry Andric INITIALIZE_PASS_BEGIN(LiveVariables, "livevars",
472754fe60SDimitry Andric "Live Variable Analysis", false, false)
INITIALIZE_PASS_DEPENDENCY(UnreachableMachineBlockElim)482754fe60SDimitry Andric INITIALIZE_PASS_DEPENDENCY(UnreachableMachineBlockElim)
492754fe60SDimitry Andric INITIALIZE_PASS_END(LiveVariables, "livevars",
502754fe60SDimitry Andric "Live Variable Analysis", false, false)
51f22ef01cSRoman Divacky
52f22ef01cSRoman Divacky
53f22ef01cSRoman Divacky void LiveVariables::getAnalysisUsage(AnalysisUsage &AU) const {
54f22ef01cSRoman Divacky AU.addRequiredID(UnreachableMachineBlockElimID);
55f22ef01cSRoman Divacky AU.setPreservesAll();
56f22ef01cSRoman Divacky MachineFunctionPass::getAnalysisUsage(AU);
57f22ef01cSRoman Divacky }
58f22ef01cSRoman Divacky
59f22ef01cSRoman Divacky MachineInstr *
findKill(const MachineBasicBlock * MBB) const60f22ef01cSRoman Divacky LiveVariables::VarInfo::findKill(const MachineBasicBlock *MBB) const {
61f22ef01cSRoman Divacky for (unsigned i = 0, e = Kills.size(); i != e; ++i)
62f22ef01cSRoman Divacky if (Kills[i]->getParent() == MBB)
63f22ef01cSRoman Divacky return Kills[i];
6491bc56edSDimitry Andric return nullptr;
65f22ef01cSRoman Divacky }
66f22ef01cSRoman Divacky
673861d79fSDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump() const687a7e6055SDimitry Andric LLVM_DUMP_METHOD void LiveVariables::VarInfo::dump() const {
69f22ef01cSRoman Divacky dbgs() << " Alive in blocks: ";
70f22ef01cSRoman Divacky for (SparseBitVector<>::iterator I = AliveBlocks.begin(),
71f22ef01cSRoman Divacky E = AliveBlocks.end(); I != E; ++I)
72f22ef01cSRoman Divacky dbgs() << *I << ", ";
73f22ef01cSRoman Divacky dbgs() << "\n Killed by:";
74f22ef01cSRoman Divacky if (Kills.empty())
75f22ef01cSRoman Divacky dbgs() << " No instructions.\n";
76f22ef01cSRoman Divacky else {
77f22ef01cSRoman Divacky for (unsigned i = 0, e = Kills.size(); i != e; ++i)
78f22ef01cSRoman Divacky dbgs() << "\n #" << i << ": " << *Kills[i];
79f22ef01cSRoman Divacky dbgs() << "\n";
80f22ef01cSRoman Divacky }
81f22ef01cSRoman Divacky }
827a7e6055SDimitry Andric #endif
83f22ef01cSRoman Divacky
84f22ef01cSRoman Divacky /// getVarInfo - Get (possibly creating) a VarInfo object for the given vreg.
getVarInfo(unsigned RegIdx)85f22ef01cSRoman Divacky LiveVariables::VarInfo &LiveVariables::getVarInfo(unsigned RegIdx) {
86f22ef01cSRoman Divacky assert(TargetRegisterInfo::isVirtualRegister(RegIdx) &&
87f22ef01cSRoman Divacky "getVarInfo: not a virtual register!");
882754fe60SDimitry Andric VirtRegInfo.grow(RegIdx);
89f22ef01cSRoman Divacky return VirtRegInfo[RegIdx];
90f22ef01cSRoman Divacky }
91f22ef01cSRoman Divacky
MarkVirtRegAliveInBlock(VarInfo & VRInfo,MachineBasicBlock * DefBlock,MachineBasicBlock * MBB,std::vector<MachineBasicBlock * > & WorkList)92f22ef01cSRoman Divacky void LiveVariables::MarkVirtRegAliveInBlock(VarInfo& VRInfo,
93f22ef01cSRoman Divacky MachineBasicBlock *DefBlock,
94f22ef01cSRoman Divacky MachineBasicBlock *MBB,
95f22ef01cSRoman Divacky std::vector<MachineBasicBlock*> &WorkList) {
96f22ef01cSRoman Divacky unsigned BBNum = MBB->getNumber();
97f22ef01cSRoman Divacky
98f22ef01cSRoman Divacky // Check to see if this basic block is one of the killing blocks. If so,
99f22ef01cSRoman Divacky // remove it.
100f22ef01cSRoman Divacky for (unsigned i = 0, e = VRInfo.Kills.size(); i != e; ++i)
101f22ef01cSRoman Divacky if (VRInfo.Kills[i]->getParent() == MBB) {
102f22ef01cSRoman Divacky VRInfo.Kills.erase(VRInfo.Kills.begin()+i); // Erase entry
103f22ef01cSRoman Divacky break;
104f22ef01cSRoman Divacky }
105f22ef01cSRoman Divacky
106f22ef01cSRoman Divacky if (MBB == DefBlock) return; // Terminate recursion
107f22ef01cSRoman Divacky
108f22ef01cSRoman Divacky if (VRInfo.AliveBlocks.test(BBNum))
109f22ef01cSRoman Divacky return; // We already know the block is live
110f22ef01cSRoman Divacky
111f22ef01cSRoman Divacky // Mark the variable known alive in this bb
112f22ef01cSRoman Divacky VRInfo.AliveBlocks.set(BBNum);
113f22ef01cSRoman Divacky
114dff0c46cSDimitry Andric assert(MBB != &MF->front() && "Can't find reaching def for virtreg");
1153b0f4066SDimitry Andric WorkList.insert(WorkList.end(), MBB->pred_rbegin(), MBB->pred_rend());
116f22ef01cSRoman Divacky }
117f22ef01cSRoman Divacky
MarkVirtRegAliveInBlock(VarInfo & VRInfo,MachineBasicBlock * DefBlock,MachineBasicBlock * MBB)118f22ef01cSRoman Divacky void LiveVariables::MarkVirtRegAliveInBlock(VarInfo &VRInfo,
119f22ef01cSRoman Divacky MachineBasicBlock *DefBlock,
120f22ef01cSRoman Divacky MachineBasicBlock *MBB) {
121f22ef01cSRoman Divacky std::vector<MachineBasicBlock*> WorkList;
122f22ef01cSRoman Divacky MarkVirtRegAliveInBlock(VRInfo, DefBlock, MBB, WorkList);
123f22ef01cSRoman Divacky
124f22ef01cSRoman Divacky while (!WorkList.empty()) {
125f22ef01cSRoman Divacky MachineBasicBlock *Pred = WorkList.back();
126f22ef01cSRoman Divacky WorkList.pop_back();
127f22ef01cSRoman Divacky MarkVirtRegAliveInBlock(VRInfo, DefBlock, Pred, WorkList);
128f22ef01cSRoman Divacky }
129f22ef01cSRoman Divacky }
130f22ef01cSRoman Divacky
HandleVirtRegUse(unsigned reg,MachineBasicBlock * MBB,MachineInstr & MI)131f22ef01cSRoman Divacky void LiveVariables::HandleVirtRegUse(unsigned reg, MachineBasicBlock *MBB,
1323ca95b02SDimitry Andric MachineInstr &MI) {
133f22ef01cSRoman Divacky assert(MRI->getVRegDef(reg) && "Register use before def!");
134f22ef01cSRoman Divacky
135f22ef01cSRoman Divacky unsigned BBNum = MBB->getNumber();
136f22ef01cSRoman Divacky
137f22ef01cSRoman Divacky VarInfo& VRInfo = getVarInfo(reg);
138f22ef01cSRoman Divacky
139f22ef01cSRoman Divacky // Check to see if this basic block is already a kill block.
140f22ef01cSRoman Divacky if (!VRInfo.Kills.empty() && VRInfo.Kills.back()->getParent() == MBB) {
141f22ef01cSRoman Divacky // Yes, this register is killed in this basic block already. Increase the
142f22ef01cSRoman Divacky // live range by updating the kill instruction.
1433ca95b02SDimitry Andric VRInfo.Kills.back() = &MI;
144f22ef01cSRoman Divacky return;
145f22ef01cSRoman Divacky }
146f22ef01cSRoman Divacky
147f22ef01cSRoman Divacky #ifndef NDEBUG
148f22ef01cSRoman Divacky for (unsigned i = 0, e = VRInfo.Kills.size(); i != e; ++i)
149f22ef01cSRoman Divacky assert(VRInfo.Kills[i]->getParent() != MBB && "entry should be at end!");
150f22ef01cSRoman Divacky #endif
151f22ef01cSRoman Divacky
152f22ef01cSRoman Divacky // This situation can occur:
153f22ef01cSRoman Divacky //
154f22ef01cSRoman Divacky // ,------.
155f22ef01cSRoman Divacky // | |
156f22ef01cSRoman Divacky // | v
157f22ef01cSRoman Divacky // | t2 = phi ... t1 ...
158f22ef01cSRoman Divacky // | |
159f22ef01cSRoman Divacky // | v
160f22ef01cSRoman Divacky // | t1 = ...
161f22ef01cSRoman Divacky // | ... = ... t1 ...
162f22ef01cSRoman Divacky // | |
163f22ef01cSRoman Divacky // `------'
164f22ef01cSRoman Divacky //
165f22ef01cSRoman Divacky // where there is a use in a PHI node that's a predecessor to the defining
166f22ef01cSRoman Divacky // block. We don't want to mark all predecessors as having the value "alive"
167f22ef01cSRoman Divacky // in this case.
168f22ef01cSRoman Divacky if (MBB == MRI->getVRegDef(reg)->getParent()) return;
169f22ef01cSRoman Divacky
170f22ef01cSRoman Divacky // Add a new kill entry for this basic block. If this virtual register is
171f22ef01cSRoman Divacky // already marked as alive in this basic block, that means it is alive in at
172f22ef01cSRoman Divacky // least one of the successor blocks, it's not a kill.
173f22ef01cSRoman Divacky if (!VRInfo.AliveBlocks.test(BBNum))
1743ca95b02SDimitry Andric VRInfo.Kills.push_back(&MI);
175f22ef01cSRoman Divacky
176f22ef01cSRoman Divacky // Update all dominating blocks to mark them as "known live".
177f22ef01cSRoman Divacky for (MachineBasicBlock::const_pred_iterator PI = MBB->pred_begin(),
178f22ef01cSRoman Divacky E = MBB->pred_end(); PI != E; ++PI)
179f22ef01cSRoman Divacky MarkVirtRegAliveInBlock(VRInfo, MRI->getVRegDef(reg)->getParent(), *PI);
180f22ef01cSRoman Divacky }
181f22ef01cSRoman Divacky
HandleVirtRegDef(unsigned Reg,MachineInstr & MI)1823ca95b02SDimitry Andric void LiveVariables::HandleVirtRegDef(unsigned Reg, MachineInstr &MI) {
183f22ef01cSRoman Divacky VarInfo &VRInfo = getVarInfo(Reg);
184f22ef01cSRoman Divacky
185f22ef01cSRoman Divacky if (VRInfo.AliveBlocks.empty())
186f22ef01cSRoman Divacky // If vr is not alive in any block, then defaults to dead.
1873ca95b02SDimitry Andric VRInfo.Kills.push_back(&MI);
188f22ef01cSRoman Divacky }
189f22ef01cSRoman Divacky
190f22ef01cSRoman Divacky /// FindLastPartialDef - Return the last partial def of the specified register.
191f22ef01cSRoman Divacky /// Also returns the sub-registers that're defined by the instruction.
FindLastPartialDef(unsigned Reg,SmallSet<unsigned,4> & PartDefRegs)192f22ef01cSRoman Divacky MachineInstr *LiveVariables::FindLastPartialDef(unsigned Reg,
193f22ef01cSRoman Divacky SmallSet<unsigned,4> &PartDefRegs) {
194f22ef01cSRoman Divacky unsigned LastDefReg = 0;
195f22ef01cSRoman Divacky unsigned LastDefDist = 0;
19691bc56edSDimitry Andric MachineInstr *LastDef = nullptr;
1977ae0e2c9SDimitry Andric for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
1987ae0e2c9SDimitry Andric unsigned SubReg = *SubRegs;
199f22ef01cSRoman Divacky MachineInstr *Def = PhysRegDef[SubReg];
200f22ef01cSRoman Divacky if (!Def)
201f22ef01cSRoman Divacky continue;
202f22ef01cSRoman Divacky unsigned Dist = DistanceMap[Def];
203f22ef01cSRoman Divacky if (Dist > LastDefDist) {
204f22ef01cSRoman Divacky LastDefReg = SubReg;
205f22ef01cSRoman Divacky LastDef = Def;
206f22ef01cSRoman Divacky LastDefDist = Dist;
207f22ef01cSRoman Divacky }
208f22ef01cSRoman Divacky }
209f22ef01cSRoman Divacky
210f22ef01cSRoman Divacky if (!LastDef)
21191bc56edSDimitry Andric return nullptr;
212f22ef01cSRoman Divacky
213f22ef01cSRoman Divacky PartDefRegs.insert(LastDefReg);
214f22ef01cSRoman Divacky for (unsigned i = 0, e = LastDef->getNumOperands(); i != e; ++i) {
215f22ef01cSRoman Divacky MachineOperand &MO = LastDef->getOperand(i);
216f22ef01cSRoman Divacky if (!MO.isReg() || !MO.isDef() || MO.getReg() == 0)
217f22ef01cSRoman Divacky continue;
218f22ef01cSRoman Divacky unsigned DefReg = MO.getReg();
219f22ef01cSRoman Divacky if (TRI->isSubRegister(Reg, DefReg)) {
220f785676fSDimitry Andric for (MCSubRegIterator SubRegs(DefReg, TRI, /*IncludeSelf=*/true);
221f785676fSDimitry Andric SubRegs.isValid(); ++SubRegs)
2227ae0e2c9SDimitry Andric PartDefRegs.insert(*SubRegs);
223f22ef01cSRoman Divacky }
224f22ef01cSRoman Divacky }
225f22ef01cSRoman Divacky return LastDef;
226f22ef01cSRoman Divacky }
227f22ef01cSRoman Divacky
228f22ef01cSRoman Divacky /// HandlePhysRegUse - Turn previous partial def's into read/mod/writes. Add
229f22ef01cSRoman Divacky /// implicit defs to a machine instruction if there was an earlier def of its
230f22ef01cSRoman Divacky /// super-register.
HandlePhysRegUse(unsigned Reg,MachineInstr & MI)2313ca95b02SDimitry Andric void LiveVariables::HandlePhysRegUse(unsigned Reg, MachineInstr &MI) {
232f22ef01cSRoman Divacky MachineInstr *LastDef = PhysRegDef[Reg];
233f22ef01cSRoman Divacky // If there was a previous use or a "full" def all is well.
234f22ef01cSRoman Divacky if (!LastDef && !PhysRegUse[Reg]) {
235f22ef01cSRoman Divacky // Otherwise, the last sub-register def implicitly defines this register.
236f22ef01cSRoman Divacky // e.g.
237f22ef01cSRoman Divacky // AH =
2382cab237bSDimitry Andric // AL = ... implicit-def EAX, implicit killed AH
239f22ef01cSRoman Divacky // = AH
240f22ef01cSRoman Divacky // ...
241f22ef01cSRoman Divacky // = EAX
242f22ef01cSRoman Divacky // All of the sub-registers must have been defined before the use of Reg!
243f22ef01cSRoman Divacky SmallSet<unsigned, 4> PartDefRegs;
244f22ef01cSRoman Divacky MachineInstr *LastPartialDef = FindLastPartialDef(Reg, PartDefRegs);
245f22ef01cSRoman Divacky // If LastPartialDef is NULL, it must be using a livein register.
246f22ef01cSRoman Divacky if (LastPartialDef) {
247f22ef01cSRoman Divacky LastPartialDef->addOperand(MachineOperand::CreateReg(Reg, true/*IsDef*/,
248f22ef01cSRoman Divacky true/*IsImp*/));
249f22ef01cSRoman Divacky PhysRegDef[Reg] = LastPartialDef;
250f22ef01cSRoman Divacky SmallSet<unsigned, 8> Processed;
2517ae0e2c9SDimitry Andric for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
2527ae0e2c9SDimitry Andric unsigned SubReg = *SubRegs;
253f22ef01cSRoman Divacky if (Processed.count(SubReg))
254f22ef01cSRoman Divacky continue;
255f22ef01cSRoman Divacky if (PartDefRegs.count(SubReg))
256f22ef01cSRoman Divacky continue;
257f22ef01cSRoman Divacky // This part of Reg was defined before the last partial def. It's killed
258f22ef01cSRoman Divacky // here.
259f22ef01cSRoman Divacky LastPartialDef->addOperand(MachineOperand::CreateReg(SubReg,
260f22ef01cSRoman Divacky false/*IsDef*/,
261f22ef01cSRoman Divacky true/*IsImp*/));
262f22ef01cSRoman Divacky PhysRegDef[SubReg] = LastPartialDef;
2637ae0e2c9SDimitry Andric for (MCSubRegIterator SS(SubReg, TRI); SS.isValid(); ++SS)
264f22ef01cSRoman Divacky Processed.insert(*SS);
265f22ef01cSRoman Divacky }
266f22ef01cSRoman Divacky }
267dff0c46cSDimitry Andric } else if (LastDef && !PhysRegUse[Reg] &&
268f22ef01cSRoman Divacky !LastDef->findRegisterDefOperand(Reg))
269f22ef01cSRoman Divacky // Last def defines the super register, add an implicit def of reg.
270dff0c46cSDimitry Andric LastDef->addOperand(MachineOperand::CreateReg(Reg, true/*IsDef*/,
271dff0c46cSDimitry Andric true/*IsImp*/));
272f22ef01cSRoman Divacky
273f22ef01cSRoman Divacky // Remember this use.
274f785676fSDimitry Andric for (MCSubRegIterator SubRegs(Reg, TRI, /*IncludeSelf=*/true);
275f785676fSDimitry Andric SubRegs.isValid(); ++SubRegs)
2763ca95b02SDimitry Andric PhysRegUse[*SubRegs] = &MI;
277f22ef01cSRoman Divacky }
278f22ef01cSRoman Divacky
279f22ef01cSRoman Divacky /// FindLastRefOrPartRef - Return the last reference or partial reference of
280f22ef01cSRoman Divacky /// the specified register.
FindLastRefOrPartRef(unsigned Reg)281f22ef01cSRoman Divacky MachineInstr *LiveVariables::FindLastRefOrPartRef(unsigned Reg) {
282f22ef01cSRoman Divacky MachineInstr *LastDef = PhysRegDef[Reg];
283f22ef01cSRoman Divacky MachineInstr *LastUse = PhysRegUse[Reg];
284f22ef01cSRoman Divacky if (!LastDef && !LastUse)
28591bc56edSDimitry Andric return nullptr;
286f22ef01cSRoman Divacky
287f22ef01cSRoman Divacky MachineInstr *LastRefOrPartRef = LastUse ? LastUse : LastDef;
288f22ef01cSRoman Divacky unsigned LastRefOrPartRefDist = DistanceMap[LastRefOrPartRef];
289f22ef01cSRoman Divacky unsigned LastPartDefDist = 0;
2907ae0e2c9SDimitry Andric for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
2917ae0e2c9SDimitry Andric unsigned SubReg = *SubRegs;
292f22ef01cSRoman Divacky MachineInstr *Def = PhysRegDef[SubReg];
293f22ef01cSRoman Divacky if (Def && Def != LastDef) {
294f22ef01cSRoman Divacky // There was a def of this sub-register in between. This is a partial
295f22ef01cSRoman Divacky // def, keep track of the last one.
296f22ef01cSRoman Divacky unsigned Dist = DistanceMap[Def];
297f22ef01cSRoman Divacky if (Dist > LastPartDefDist)
298f22ef01cSRoman Divacky LastPartDefDist = Dist;
299f22ef01cSRoman Divacky } else if (MachineInstr *Use = PhysRegUse[SubReg]) {
300f22ef01cSRoman Divacky unsigned Dist = DistanceMap[Use];
301f22ef01cSRoman Divacky if (Dist > LastRefOrPartRefDist) {
302f22ef01cSRoman Divacky LastRefOrPartRefDist = Dist;
303f22ef01cSRoman Divacky LastRefOrPartRef = Use;
304f22ef01cSRoman Divacky }
305f22ef01cSRoman Divacky }
306f22ef01cSRoman Divacky }
307f22ef01cSRoman Divacky
308f22ef01cSRoman Divacky return LastRefOrPartRef;
309f22ef01cSRoman Divacky }
310f22ef01cSRoman Divacky
HandlePhysRegKill(unsigned Reg,MachineInstr * MI)311f22ef01cSRoman Divacky bool LiveVariables::HandlePhysRegKill(unsigned Reg, MachineInstr *MI) {
312f22ef01cSRoman Divacky MachineInstr *LastDef = PhysRegDef[Reg];
313f22ef01cSRoman Divacky MachineInstr *LastUse = PhysRegUse[Reg];
314f22ef01cSRoman Divacky if (!LastDef && !LastUse)
315f22ef01cSRoman Divacky return false;
316f22ef01cSRoman Divacky
317f22ef01cSRoman Divacky MachineInstr *LastRefOrPartRef = LastUse ? LastUse : LastDef;
318f22ef01cSRoman Divacky unsigned LastRefOrPartRefDist = DistanceMap[LastRefOrPartRef];
319f22ef01cSRoman Divacky // The whole register is used.
320f22ef01cSRoman Divacky // AL =
321f22ef01cSRoman Divacky // AH =
322f22ef01cSRoman Divacky //
323f22ef01cSRoman Divacky // = AX
3242cab237bSDimitry Andric // = AL, implicit killed AX
325f22ef01cSRoman Divacky // AX =
326f22ef01cSRoman Divacky //
327f22ef01cSRoman Divacky // Or whole register is defined, but not used at all.
3282cab237bSDimitry Andric // dead AX =
329f22ef01cSRoman Divacky // ...
330f22ef01cSRoman Divacky // AX =
331f22ef01cSRoman Divacky //
332f22ef01cSRoman Divacky // Or whole register is defined, but only partly used.
3332cab237bSDimitry Andric // dead AX = implicit-def AL
3342cab237bSDimitry Andric // = killed AL
335f22ef01cSRoman Divacky // AX =
33691bc56edSDimitry Andric MachineInstr *LastPartDef = nullptr;
337f22ef01cSRoman Divacky unsigned LastPartDefDist = 0;
338f22ef01cSRoman Divacky SmallSet<unsigned, 8> PartUses;
3397ae0e2c9SDimitry Andric for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
3407ae0e2c9SDimitry Andric unsigned SubReg = *SubRegs;
341f22ef01cSRoman Divacky MachineInstr *Def = PhysRegDef[SubReg];
342f22ef01cSRoman Divacky if (Def && Def != LastDef) {
343f22ef01cSRoman Divacky // There was a def of this sub-register in between. This is a partial
344f22ef01cSRoman Divacky // def, keep track of the last one.
345f22ef01cSRoman Divacky unsigned Dist = DistanceMap[Def];
346f22ef01cSRoman Divacky if (Dist > LastPartDefDist) {
347f22ef01cSRoman Divacky LastPartDefDist = Dist;
348f22ef01cSRoman Divacky LastPartDef = Def;
349f22ef01cSRoman Divacky }
350f22ef01cSRoman Divacky continue;
351f22ef01cSRoman Divacky }
352f22ef01cSRoman Divacky if (MachineInstr *Use = PhysRegUse[SubReg]) {
353f785676fSDimitry Andric for (MCSubRegIterator SS(SubReg, TRI, /*IncludeSelf=*/true); SS.isValid();
354f785676fSDimitry Andric ++SS)
355f22ef01cSRoman Divacky PartUses.insert(*SS);
356f22ef01cSRoman Divacky unsigned Dist = DistanceMap[Use];
357f22ef01cSRoman Divacky if (Dist > LastRefOrPartRefDist) {
358f22ef01cSRoman Divacky LastRefOrPartRefDist = Dist;
359f22ef01cSRoman Divacky LastRefOrPartRef = Use;
360f22ef01cSRoman Divacky }
361f22ef01cSRoman Divacky }
362f22ef01cSRoman Divacky }
363f22ef01cSRoman Divacky
364f22ef01cSRoman Divacky if (!PhysRegUse[Reg]) {
365f22ef01cSRoman Divacky // Partial uses. Mark register def dead and add implicit def of
366f22ef01cSRoman Divacky // sub-registers which are used.
3672cab237bSDimitry Andric // dead EAX = op implicit-def AL
368f22ef01cSRoman Divacky // That is, EAX def is dead but AL def extends pass it.
369f22ef01cSRoman Divacky PhysRegDef[Reg]->addRegisterDead(Reg, TRI, true);
3707ae0e2c9SDimitry Andric for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
3717ae0e2c9SDimitry Andric unsigned SubReg = *SubRegs;
372f22ef01cSRoman Divacky if (!PartUses.count(SubReg))
373f22ef01cSRoman Divacky continue;
374f22ef01cSRoman Divacky bool NeedDef = true;
375f22ef01cSRoman Divacky if (PhysRegDef[Reg] == PhysRegDef[SubReg]) {
376f22ef01cSRoman Divacky MachineOperand *MO = PhysRegDef[Reg]->findRegisterDefOperand(SubReg);
377f22ef01cSRoman Divacky if (MO) {
378f22ef01cSRoman Divacky NeedDef = false;
379f22ef01cSRoman Divacky assert(!MO->isDead());
380f22ef01cSRoman Divacky }
381f22ef01cSRoman Divacky }
382f22ef01cSRoman Divacky if (NeedDef)
383f22ef01cSRoman Divacky PhysRegDef[Reg]->addOperand(MachineOperand::CreateReg(SubReg,
384f22ef01cSRoman Divacky true/*IsDef*/, true/*IsImp*/));
385f22ef01cSRoman Divacky MachineInstr *LastSubRef = FindLastRefOrPartRef(SubReg);
386f22ef01cSRoman Divacky if (LastSubRef)
387f22ef01cSRoman Divacky LastSubRef->addRegisterKilled(SubReg, TRI, true);
388f22ef01cSRoman Divacky else {
389f22ef01cSRoman Divacky LastRefOrPartRef->addRegisterKilled(SubReg, TRI, true);
390f785676fSDimitry Andric for (MCSubRegIterator SS(SubReg, TRI, /*IncludeSelf=*/true);
391f785676fSDimitry Andric SS.isValid(); ++SS)
3927ae0e2c9SDimitry Andric PhysRegUse[*SS] = LastRefOrPartRef;
393f22ef01cSRoman Divacky }
3947ae0e2c9SDimitry Andric for (MCSubRegIterator SS(SubReg, TRI); SS.isValid(); ++SS)
395f22ef01cSRoman Divacky PartUses.erase(*SS);
396f22ef01cSRoman Divacky }
397f22ef01cSRoman Divacky } else if (LastRefOrPartRef == PhysRegDef[Reg] && LastRefOrPartRef != MI) {
398f22ef01cSRoman Divacky if (LastPartDef)
399f22ef01cSRoman Divacky // The last partial def kills the register.
400f22ef01cSRoman Divacky LastPartDef->addOperand(MachineOperand::CreateReg(Reg, false/*IsDef*/,
401f22ef01cSRoman Divacky true/*IsImp*/, true/*IsKill*/));
402f22ef01cSRoman Divacky else {
403f22ef01cSRoman Divacky MachineOperand *MO =
404f22ef01cSRoman Divacky LastRefOrPartRef->findRegisterDefOperand(Reg, false, TRI);
405f22ef01cSRoman Divacky bool NeedEC = MO->isEarlyClobber() && MO->getReg() != Reg;
406f22ef01cSRoman Divacky // If the last reference is the last def, then it's not used at all.
407f22ef01cSRoman Divacky // That is, unless we are currently processing the last reference itself.
408f22ef01cSRoman Divacky LastRefOrPartRef->addRegisterDead(Reg, TRI, true);
409f22ef01cSRoman Divacky if (NeedEC) {
410f22ef01cSRoman Divacky // If we are adding a subreg def and the superreg def is marked early
411f22ef01cSRoman Divacky // clobber, add an early clobber marker to the subreg def.
412f22ef01cSRoman Divacky MO = LastRefOrPartRef->findRegisterDefOperand(Reg);
413f22ef01cSRoman Divacky if (MO)
414f22ef01cSRoman Divacky MO->setIsEarlyClobber();
415f22ef01cSRoman Divacky }
416f22ef01cSRoman Divacky }
417f22ef01cSRoman Divacky } else
418f22ef01cSRoman Divacky LastRefOrPartRef->addRegisterKilled(Reg, TRI, true);
419f22ef01cSRoman Divacky return true;
420f22ef01cSRoman Divacky }
421f22ef01cSRoman Divacky
HandleRegMask(const MachineOperand & MO)422dff0c46cSDimitry Andric void LiveVariables::HandleRegMask(const MachineOperand &MO) {
423dff0c46cSDimitry Andric // Call HandlePhysRegKill() for all live registers clobbered by Mask.
424dff0c46cSDimitry Andric // Clobbered registers are always dead, sp there is no need to use
425dff0c46cSDimitry Andric // HandlePhysRegDef().
426dff0c46cSDimitry Andric for (unsigned Reg = 1, NumRegs = TRI->getNumRegs(); Reg != NumRegs; ++Reg) {
427dff0c46cSDimitry Andric // Skip dead regs.
428dff0c46cSDimitry Andric if (!PhysRegDef[Reg] && !PhysRegUse[Reg])
429dff0c46cSDimitry Andric continue;
430dff0c46cSDimitry Andric // Skip mask-preserved regs.
431dff0c46cSDimitry Andric if (!MO.clobbersPhysReg(Reg))
432dff0c46cSDimitry Andric continue;
433dff0c46cSDimitry Andric // Kill the largest clobbered super-register.
434dff0c46cSDimitry Andric // This avoids needless implicit operands.
435dff0c46cSDimitry Andric unsigned Super = Reg;
4367ae0e2c9SDimitry Andric for (MCSuperRegIterator SR(Reg, TRI); SR.isValid(); ++SR)
437dff0c46cSDimitry Andric if ((PhysRegDef[*SR] || PhysRegUse[*SR]) && MO.clobbersPhysReg(*SR))
438dff0c46cSDimitry Andric Super = *SR;
43991bc56edSDimitry Andric HandlePhysRegKill(Super, nullptr);
440dff0c46cSDimitry Andric }
441dff0c46cSDimitry Andric }
442dff0c46cSDimitry Andric
HandlePhysRegDef(unsigned Reg,MachineInstr * MI,SmallVectorImpl<unsigned> & Defs)443f22ef01cSRoman Divacky void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI,
444f785676fSDimitry Andric SmallVectorImpl<unsigned> &Defs) {
445f22ef01cSRoman Divacky // What parts of the register are previously defined?
446f22ef01cSRoman Divacky SmallSet<unsigned, 32> Live;
447f22ef01cSRoman Divacky if (PhysRegDef[Reg] || PhysRegUse[Reg]) {
448f785676fSDimitry Andric for (MCSubRegIterator SubRegs(Reg, TRI, /*IncludeSelf=*/true);
449f785676fSDimitry Andric SubRegs.isValid(); ++SubRegs)
4507ae0e2c9SDimitry Andric Live.insert(*SubRegs);
451f22ef01cSRoman Divacky } else {
4527ae0e2c9SDimitry Andric for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
4537ae0e2c9SDimitry Andric unsigned SubReg = *SubRegs;
454f22ef01cSRoman Divacky // If a register isn't itself defined, but all parts that make up of it
455f22ef01cSRoman Divacky // are defined, then consider it also defined.
456f22ef01cSRoman Divacky // e.g.
457f22ef01cSRoman Divacky // AL =
458f22ef01cSRoman Divacky // AH =
459f22ef01cSRoman Divacky // = AX
460f22ef01cSRoman Divacky if (Live.count(SubReg))
461f22ef01cSRoman Divacky continue;
462f22ef01cSRoman Divacky if (PhysRegDef[SubReg] || PhysRegUse[SubReg]) {
463f785676fSDimitry Andric for (MCSubRegIterator SS(SubReg, TRI, /*IncludeSelf=*/true);
464f785676fSDimitry Andric SS.isValid(); ++SS)
465f22ef01cSRoman Divacky Live.insert(*SS);
466f22ef01cSRoman Divacky }
467f22ef01cSRoman Divacky }
468f22ef01cSRoman Divacky }
469f22ef01cSRoman Divacky
470f22ef01cSRoman Divacky // Start from the largest piece, find the last time any part of the register
471f22ef01cSRoman Divacky // is referenced.
472f22ef01cSRoman Divacky HandlePhysRegKill(Reg, MI);
473f22ef01cSRoman Divacky // Only some of the sub-registers are used.
4747ae0e2c9SDimitry Andric for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
4757ae0e2c9SDimitry Andric unsigned SubReg = *SubRegs;
476f22ef01cSRoman Divacky if (!Live.count(SubReg))
477f22ef01cSRoman Divacky // Skip if this sub-register isn't defined.
478f22ef01cSRoman Divacky continue;
479f22ef01cSRoman Divacky HandlePhysRegKill(SubReg, MI);
480f22ef01cSRoman Divacky }
481f22ef01cSRoman Divacky
482f22ef01cSRoman Divacky if (MI)
483f22ef01cSRoman Divacky Defs.push_back(Reg); // Remember this def.
484f22ef01cSRoman Divacky }
485f22ef01cSRoman Divacky
UpdatePhysRegDefs(MachineInstr & MI,SmallVectorImpl<unsigned> & Defs)4863ca95b02SDimitry Andric void LiveVariables::UpdatePhysRegDefs(MachineInstr &MI,
487f785676fSDimitry Andric SmallVectorImpl<unsigned> &Defs) {
488f22ef01cSRoman Divacky while (!Defs.empty()) {
489f22ef01cSRoman Divacky unsigned Reg = Defs.back();
490f22ef01cSRoman Divacky Defs.pop_back();
491f785676fSDimitry Andric for (MCSubRegIterator SubRegs(Reg, TRI, /*IncludeSelf=*/true);
492f785676fSDimitry Andric SubRegs.isValid(); ++SubRegs) {
4937ae0e2c9SDimitry Andric unsigned SubReg = *SubRegs;
4943ca95b02SDimitry Andric PhysRegDef[SubReg] = &MI;
49591bc56edSDimitry Andric PhysRegUse[SubReg] = nullptr;
496f22ef01cSRoman Divacky }
497f22ef01cSRoman Divacky }
498f22ef01cSRoman Divacky }
499f22ef01cSRoman Divacky
runOnInstr(MachineInstr & MI,SmallVectorImpl<unsigned> & Defs)5003ca95b02SDimitry Andric void LiveVariables::runOnInstr(MachineInstr &MI,
50139d628a0SDimitry Andric SmallVectorImpl<unsigned> &Defs) {
502*4ba319b5SDimitry Andric assert(!MI.isDebugInstr());
503f22ef01cSRoman Divacky // Process all of the operands of the instruction...
5043ca95b02SDimitry Andric unsigned NumOperandsToProcess = MI.getNumOperands();
505f22ef01cSRoman Divacky
506f22ef01cSRoman Divacky // Unless it is a PHI node. In this case, ONLY process the DEF, not any
507f22ef01cSRoman Divacky // of the uses. They will be handled in other basic blocks.
5083ca95b02SDimitry Andric if (MI.isPHI())
509f22ef01cSRoman Divacky NumOperandsToProcess = 1;
510f22ef01cSRoman Divacky
511f22ef01cSRoman Divacky // Clear kill and dead markers. LV will recompute them.
512f22ef01cSRoman Divacky SmallVector<unsigned, 4> UseRegs;
513f22ef01cSRoman Divacky SmallVector<unsigned, 4> DefRegs;
514dff0c46cSDimitry Andric SmallVector<unsigned, 1> RegMasks;
515f22ef01cSRoman Divacky for (unsigned i = 0; i != NumOperandsToProcess; ++i) {
5163ca95b02SDimitry Andric MachineOperand &MO = MI.getOperand(i);
517dff0c46cSDimitry Andric if (MO.isRegMask()) {
518dff0c46cSDimitry Andric RegMasks.push_back(i);
519dff0c46cSDimitry Andric continue;
520dff0c46cSDimitry Andric }
521f22ef01cSRoman Divacky if (!MO.isReg() || MO.getReg() == 0)
522f22ef01cSRoman Divacky continue;
523f22ef01cSRoman Divacky unsigned MOReg = MO.getReg();
524f22ef01cSRoman Divacky if (MO.isUse()) {
5257d523365SDimitry Andric if (!(TargetRegisterInfo::isPhysicalRegister(MOReg) &&
5267d523365SDimitry Andric MRI->isReserved(MOReg)))
527f22ef01cSRoman Divacky MO.setIsKill(false);
5287ae0e2c9SDimitry Andric if (MO.readsReg())
529f22ef01cSRoman Divacky UseRegs.push_back(MOReg);
5303ca95b02SDimitry Andric } else {
5313ca95b02SDimitry Andric assert(MO.isDef());
5323ca95b02SDimitry Andric // FIXME: We should not remove any dead flags. However the MIPS RDDSP
5333ca95b02SDimitry Andric // instruction needs it at the moment: http://llvm.org/PR27116.
5343ca95b02SDimitry Andric if (TargetRegisterInfo::isPhysicalRegister(MOReg) &&
5353ca95b02SDimitry Andric !MRI->isReserved(MOReg))
536f22ef01cSRoman Divacky MO.setIsDead(false);
537f22ef01cSRoman Divacky DefRegs.push_back(MOReg);
538f22ef01cSRoman Divacky }
539f22ef01cSRoman Divacky }
540f22ef01cSRoman Divacky
5413ca95b02SDimitry Andric MachineBasicBlock *MBB = MI.getParent();
542f22ef01cSRoman Divacky // Process all uses.
543f22ef01cSRoman Divacky for (unsigned i = 0, e = UseRegs.size(); i != e; ++i) {
544f22ef01cSRoman Divacky unsigned MOReg = UseRegs[i];
545f22ef01cSRoman Divacky if (TargetRegisterInfo::isVirtualRegister(MOReg))
546f22ef01cSRoman Divacky HandleVirtRegUse(MOReg, MBB, MI);
5473861d79fSDimitry Andric else if (!MRI->isReserved(MOReg))
548f22ef01cSRoman Divacky HandlePhysRegUse(MOReg, MI);
549f22ef01cSRoman Divacky }
550f22ef01cSRoman Divacky
551dff0c46cSDimitry Andric // Process all masked registers. (Call clobbers).
552dff0c46cSDimitry Andric for (unsigned i = 0, e = RegMasks.size(); i != e; ++i)
5533ca95b02SDimitry Andric HandleRegMask(MI.getOperand(RegMasks[i]));
554dff0c46cSDimitry Andric
555f22ef01cSRoman Divacky // Process all defs.
556f22ef01cSRoman Divacky for (unsigned i = 0, e = DefRegs.size(); i != e; ++i) {
557f22ef01cSRoman Divacky unsigned MOReg = DefRegs[i];
558f22ef01cSRoman Divacky if (TargetRegisterInfo::isVirtualRegister(MOReg))
559f22ef01cSRoman Divacky HandleVirtRegDef(MOReg, MI);
5603861d79fSDimitry Andric else if (!MRI->isReserved(MOReg))
5613ca95b02SDimitry Andric HandlePhysRegDef(MOReg, &MI, Defs);
562f22ef01cSRoman Divacky }
563f22ef01cSRoman Divacky UpdatePhysRegDefs(MI, Defs);
564f22ef01cSRoman Divacky }
565f22ef01cSRoman Divacky
runOnBlock(MachineBasicBlock * MBB,const unsigned NumRegs)56639d628a0SDimitry Andric void LiveVariables::runOnBlock(MachineBasicBlock *MBB, const unsigned NumRegs) {
56739d628a0SDimitry Andric // Mark live-in registers as live-in.
56839d628a0SDimitry Andric SmallVector<unsigned, 4> Defs;
5697d523365SDimitry Andric for (const auto &LI : MBB->liveins()) {
5707d523365SDimitry Andric assert(TargetRegisterInfo::isPhysicalRegister(LI.PhysReg) &&
57139d628a0SDimitry Andric "Cannot have a live-in virtual register!");
5727d523365SDimitry Andric HandlePhysRegDef(LI.PhysReg, nullptr, Defs);
57339d628a0SDimitry Andric }
57439d628a0SDimitry Andric
57539d628a0SDimitry Andric // Loop over all of the instructions, processing them.
57639d628a0SDimitry Andric DistanceMap.clear();
57739d628a0SDimitry Andric unsigned Dist = 0;
5783ca95b02SDimitry Andric for (MachineInstr &MI : *MBB) {
579*4ba319b5SDimitry Andric if (MI.isDebugInstr())
58039d628a0SDimitry Andric continue;
5813ca95b02SDimitry Andric DistanceMap.insert(std::make_pair(&MI, Dist++));
58239d628a0SDimitry Andric
58339d628a0SDimitry Andric runOnInstr(MI, Defs);
58439d628a0SDimitry Andric }
58539d628a0SDimitry Andric
586f22ef01cSRoman Divacky // Handle any virtual assignments from PHI nodes which might be at the
587f22ef01cSRoman Divacky // bottom of this basic block. We check all of our successor blocks to see
588f22ef01cSRoman Divacky // if they have PHI nodes, and if so, we simulate an assignment at the end
589f22ef01cSRoman Divacky // of the current block.
590f22ef01cSRoman Divacky if (!PHIVarInfo[MBB->getNumber()].empty()) {
591f785676fSDimitry Andric SmallVectorImpl<unsigned> &VarInfoVec = PHIVarInfo[MBB->getNumber()];
592f22ef01cSRoman Divacky
593f785676fSDimitry Andric for (SmallVectorImpl<unsigned>::iterator I = VarInfoVec.begin(),
594f22ef01cSRoman Divacky E = VarInfoVec.end(); I != E; ++I)
595f22ef01cSRoman Divacky // Mark it alive only in the block we are representing.
596f22ef01cSRoman Divacky MarkVirtRegAliveInBlock(getVarInfo(*I),MRI->getVRegDef(*I)->getParent(),
597f22ef01cSRoman Divacky MBB);
598f22ef01cSRoman Divacky }
599f22ef01cSRoman Divacky
600dff0c46cSDimitry Andric // MachineCSE may CSE instructions which write to non-allocatable physical
601dff0c46cSDimitry Andric // registers across MBBs. Remember if any reserved register is liveout.
602dff0c46cSDimitry Andric SmallSet<unsigned, 4> LiveOuts;
603dff0c46cSDimitry Andric for (MachineBasicBlock::const_succ_iterator SI = MBB->succ_begin(),
604dff0c46cSDimitry Andric SE = MBB->succ_end(); SI != SE; ++SI) {
605dff0c46cSDimitry Andric MachineBasicBlock *SuccMBB = *SI;
6067d523365SDimitry Andric if (SuccMBB->isEHPad())
607dff0c46cSDimitry Andric continue;
6087d523365SDimitry Andric for (const auto &LI : SuccMBB->liveins()) {
6097d523365SDimitry Andric if (!TRI->isInAllocatableClass(LI.PhysReg))
610dff0c46cSDimitry Andric // Ignore other live-ins, e.g. those that are live into landing pads.
6117d523365SDimitry Andric LiveOuts.insert(LI.PhysReg);
612dff0c46cSDimitry Andric }
613dff0c46cSDimitry Andric }
614dff0c46cSDimitry Andric
615f22ef01cSRoman Divacky // Loop over PhysRegDef / PhysRegUse, killing any registers that are
616f22ef01cSRoman Divacky // available at the end of the basic block.
617f22ef01cSRoman Divacky for (unsigned i = 0; i != NumRegs; ++i)
618dff0c46cSDimitry Andric if ((PhysRegDef[i] || PhysRegUse[i]) && !LiveOuts.count(i))
61991bc56edSDimitry Andric HandlePhysRegDef(i, nullptr, Defs);
62039d628a0SDimitry Andric }
621f22ef01cSRoman Divacky
runOnMachineFunction(MachineFunction & mf)62239d628a0SDimitry Andric bool LiveVariables::runOnMachineFunction(MachineFunction &mf) {
62339d628a0SDimitry Andric MF = &mf;
62439d628a0SDimitry Andric MRI = &mf.getRegInfo();
62539d628a0SDimitry Andric TRI = MF->getSubtarget().getRegisterInfo();
62639d628a0SDimitry Andric
62739d628a0SDimitry Andric const unsigned NumRegs = TRI->getNumRegs();
62839d628a0SDimitry Andric PhysRegDef.assign(NumRegs, nullptr);
62939d628a0SDimitry Andric PhysRegUse.assign(NumRegs, nullptr);
63039d628a0SDimitry Andric PHIVarInfo.resize(MF->getNumBlockIDs());
63139d628a0SDimitry Andric PHIJoins.clear();
63239d628a0SDimitry Andric
63339d628a0SDimitry Andric // FIXME: LiveIntervals will be updated to remove its dependence on
63439d628a0SDimitry Andric // LiveVariables to improve compilation time and eliminate bizarre pass
63539d628a0SDimitry Andric // dependencies. Until then, we can't change much in -O0.
63639d628a0SDimitry Andric if (!MRI->isSSA())
63739d628a0SDimitry Andric report_fatal_error("regalloc=... not currently supported with -O0");
63839d628a0SDimitry Andric
63939d628a0SDimitry Andric analyzePHINodes(mf);
64039d628a0SDimitry Andric
64139d628a0SDimitry Andric // Calculate live variable information in depth first order on the CFG of the
64239d628a0SDimitry Andric // function. This guarantees that we will see the definition of a virtual
64339d628a0SDimitry Andric // register before its uses due to dominance properties of SSA (except for PHI
64439d628a0SDimitry Andric // nodes, which are treated as a special case).
6457d523365SDimitry Andric MachineBasicBlock *Entry = &MF->front();
646d88c1a5aSDimitry Andric df_iterator_default_set<MachineBasicBlock*,16> Visited;
64739d628a0SDimitry Andric
64839d628a0SDimitry Andric for (MachineBasicBlock *MBB : depth_first_ext(Entry, Visited)) {
64939d628a0SDimitry Andric runOnBlock(MBB, NumRegs);
65039d628a0SDimitry Andric
65139d628a0SDimitry Andric PhysRegDef.assign(NumRegs, nullptr);
65239d628a0SDimitry Andric PhysRegUse.assign(NumRegs, nullptr);
653f22ef01cSRoman Divacky }
654f22ef01cSRoman Divacky
655f22ef01cSRoman Divacky // Convert and transfer the dead / killed information we have gathered into
656f22ef01cSRoman Divacky // VirtRegInfo onto MI's.
6572754fe60SDimitry Andric for (unsigned i = 0, e1 = VirtRegInfo.size(); i != e1; ++i) {
6582754fe60SDimitry Andric const unsigned Reg = TargetRegisterInfo::index2VirtReg(i);
6592754fe60SDimitry Andric for (unsigned j = 0, e2 = VirtRegInfo[Reg].Kills.size(); j != e2; ++j)
6602754fe60SDimitry Andric if (VirtRegInfo[Reg].Kills[j] == MRI->getVRegDef(Reg))
6612754fe60SDimitry Andric VirtRegInfo[Reg].Kills[j]->addRegisterDead(Reg, TRI);
662f22ef01cSRoman Divacky else
6632754fe60SDimitry Andric VirtRegInfo[Reg].Kills[j]->addRegisterKilled(Reg, TRI);
6642754fe60SDimitry Andric }
665f22ef01cSRoman Divacky
666f22ef01cSRoman Divacky // Check to make sure there are no unreachable blocks in the MC CFG for the
667f22ef01cSRoman Divacky // function. If so, it is due to a bug in the instruction selector or some
668f22ef01cSRoman Divacky // other part of the code generator if this happens.
669f22ef01cSRoman Divacky #ifndef NDEBUG
670f22ef01cSRoman Divacky for(MachineFunction::iterator i = MF->begin(), e = MF->end(); i != e; ++i)
671f22ef01cSRoman Divacky assert(Visited.count(&*i) != 0 && "unreachable basic block found");
672f22ef01cSRoman Divacky #endif
673f22ef01cSRoman Divacky
67439d628a0SDimitry Andric PhysRegDef.clear();
67539d628a0SDimitry Andric PhysRegUse.clear();
67639d628a0SDimitry Andric PHIVarInfo.clear();
677f22ef01cSRoman Divacky
678f22ef01cSRoman Divacky return false;
679f22ef01cSRoman Divacky }
680f22ef01cSRoman Divacky
681f22ef01cSRoman Divacky /// replaceKillInstruction - Update register kill info by replacing a kill
682f22ef01cSRoman Divacky /// instruction with a new one.
replaceKillInstruction(unsigned Reg,MachineInstr & OldMI,MachineInstr & NewMI)6833ca95b02SDimitry Andric void LiveVariables::replaceKillInstruction(unsigned Reg, MachineInstr &OldMI,
6843ca95b02SDimitry Andric MachineInstr &NewMI) {
685f22ef01cSRoman Divacky VarInfo &VI = getVarInfo(Reg);
6863ca95b02SDimitry Andric std::replace(VI.Kills.begin(), VI.Kills.end(), &OldMI, &NewMI);
687f22ef01cSRoman Divacky }
688f22ef01cSRoman Divacky
689f22ef01cSRoman Divacky /// removeVirtualRegistersKilled - Remove all killed info for the specified
690f22ef01cSRoman Divacky /// instruction.
removeVirtualRegistersKilled(MachineInstr & MI)6913ca95b02SDimitry Andric void LiveVariables::removeVirtualRegistersKilled(MachineInstr &MI) {
6923ca95b02SDimitry Andric for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
6933ca95b02SDimitry Andric MachineOperand &MO = MI.getOperand(i);
694f22ef01cSRoman Divacky if (MO.isReg() && MO.isKill()) {
695f22ef01cSRoman Divacky MO.setIsKill(false);
696f22ef01cSRoman Divacky unsigned Reg = MO.getReg();
697f22ef01cSRoman Divacky if (TargetRegisterInfo::isVirtualRegister(Reg)) {
698f22ef01cSRoman Divacky bool removed = getVarInfo(Reg).removeKill(MI);
699f22ef01cSRoman Divacky assert(removed && "kill not in register's VarInfo?");
7006122f3e6SDimitry Andric (void)removed;
701f22ef01cSRoman Divacky }
702f22ef01cSRoman Divacky }
703f22ef01cSRoman Divacky }
704f22ef01cSRoman Divacky }
705f22ef01cSRoman Divacky
706f22ef01cSRoman Divacky /// analyzePHINodes - Gather information about the PHI nodes in here. In
707f22ef01cSRoman Divacky /// particular, we want to map the variable information of a virtual register
708f22ef01cSRoman Divacky /// which is used in a PHI node. We map that to the BB the vreg is coming from.
709f22ef01cSRoman Divacky ///
analyzePHINodes(const MachineFunction & Fn)710f22ef01cSRoman Divacky void LiveVariables::analyzePHINodes(const MachineFunction& Fn) {
71191bc56edSDimitry Andric for (const auto &MBB : Fn)
71291bc56edSDimitry Andric for (const auto &BBI : MBB) {
71391bc56edSDimitry Andric if (!BBI.isPHI())
71491bc56edSDimitry Andric break;
71591bc56edSDimitry Andric for (unsigned i = 1, e = BBI.getNumOperands(); i != e; i += 2)
71691bc56edSDimitry Andric if (BBI.getOperand(i).readsReg())
71791bc56edSDimitry Andric PHIVarInfo[BBI.getOperand(i + 1).getMBB()->getNumber()]
71891bc56edSDimitry Andric .push_back(BBI.getOperand(i).getReg());
71991bc56edSDimitry Andric }
720f22ef01cSRoman Divacky }
721f22ef01cSRoman Divacky
isLiveIn(const MachineBasicBlock & MBB,unsigned Reg,MachineRegisterInfo & MRI)722f22ef01cSRoman Divacky bool LiveVariables::VarInfo::isLiveIn(const MachineBasicBlock &MBB,
723f22ef01cSRoman Divacky unsigned Reg,
724f22ef01cSRoman Divacky MachineRegisterInfo &MRI) {
725f22ef01cSRoman Divacky unsigned Num = MBB.getNumber();
726f22ef01cSRoman Divacky
727f22ef01cSRoman Divacky // Reg is live-through.
728f22ef01cSRoman Divacky if (AliveBlocks.test(Num))
729f22ef01cSRoman Divacky return true;
730f22ef01cSRoman Divacky
731f22ef01cSRoman Divacky // Registers defined in MBB cannot be live in.
732f22ef01cSRoman Divacky const MachineInstr *Def = MRI.getVRegDef(Reg);
733f22ef01cSRoman Divacky if (Def && Def->getParent() == &MBB)
734f22ef01cSRoman Divacky return false;
735f22ef01cSRoman Divacky
736f22ef01cSRoman Divacky // Reg was not defined in MBB, was it killed here?
737f22ef01cSRoman Divacky return findKill(&MBB);
738f22ef01cSRoman Divacky }
739f22ef01cSRoman Divacky
isLiveOut(unsigned Reg,const MachineBasicBlock & MBB)740f22ef01cSRoman Divacky bool LiveVariables::isLiveOut(unsigned Reg, const MachineBasicBlock &MBB) {
741f22ef01cSRoman Divacky LiveVariables::VarInfo &VI = getVarInfo(Reg);
742f22ef01cSRoman Divacky
7438f0fd8f6SDimitry Andric SmallPtrSet<const MachineBasicBlock *, 8> Kills;
7448f0fd8f6SDimitry Andric for (unsigned i = 0, e = VI.Kills.size(); i != e; ++i)
7458f0fd8f6SDimitry Andric Kills.insert(VI.Kills[i]->getParent());
7468f0fd8f6SDimitry Andric
747f22ef01cSRoman Divacky // Loop over all of the successors of the basic block, checking to see if
748f22ef01cSRoman Divacky // the value is either live in the block, or if it is killed in the block.
7498f0fd8f6SDimitry Andric for (const MachineBasicBlock *SuccMBB : MBB.successors()) {
750f22ef01cSRoman Divacky // Is it alive in this successor?
751f22ef01cSRoman Divacky unsigned SuccIdx = SuccMBB->getNumber();
752f22ef01cSRoman Divacky if (VI.AliveBlocks.test(SuccIdx))
753f22ef01cSRoman Divacky return true;
7548f0fd8f6SDimitry Andric // Or is it live because there is a use in a successor that kills it?
7558f0fd8f6SDimitry Andric if (Kills.count(SuccMBB))
7568f0fd8f6SDimitry Andric return true;
757f22ef01cSRoman Divacky }
758f22ef01cSRoman Divacky
759f22ef01cSRoman Divacky return false;
760f22ef01cSRoman Divacky }
761f22ef01cSRoman Divacky
762f22ef01cSRoman Divacky /// addNewBlock - Add a new basic block BB as an empty succcessor to DomBB. All
763f22ef01cSRoman Divacky /// variables that are live out of DomBB will be marked as passing live through
764f22ef01cSRoman Divacky /// BB.
addNewBlock(MachineBasicBlock * BB,MachineBasicBlock * DomBB,MachineBasicBlock * SuccBB)765f22ef01cSRoman Divacky void LiveVariables::addNewBlock(MachineBasicBlock *BB,
766f22ef01cSRoman Divacky MachineBasicBlock *DomBB,
767f22ef01cSRoman Divacky MachineBasicBlock *SuccBB) {
768f22ef01cSRoman Divacky const unsigned NumNew = BB->getNumber();
769f22ef01cSRoman Divacky
7705517e702SDimitry Andric DenseSet<unsigned> Defs, Kills;
7713861d79fSDimitry Andric
7723861d79fSDimitry Andric MachineBasicBlock::iterator BBI = SuccBB->begin(), BBE = SuccBB->end();
7733861d79fSDimitry Andric for (; BBI != BBE && BBI->isPHI(); ++BBI) {
7743861d79fSDimitry Andric // Record the def of the PHI node.
7753861d79fSDimitry Andric Defs.insert(BBI->getOperand(0).getReg());
7763861d79fSDimitry Andric
777f22ef01cSRoman Divacky // All registers used by PHI nodes in SuccBB must be live through BB.
778f22ef01cSRoman Divacky for (unsigned i = 1, e = BBI->getNumOperands(); i != e; i += 2)
779f22ef01cSRoman Divacky if (BBI->getOperand(i+1).getMBB() == BB)
780f22ef01cSRoman Divacky getVarInfo(BBI->getOperand(i).getReg()).AliveBlocks.set(NumNew);
7813861d79fSDimitry Andric }
7823861d79fSDimitry Andric
7833861d79fSDimitry Andric // Record all vreg defs and kills of all instructions in SuccBB.
7843861d79fSDimitry Andric for (; BBI != BBE; ++BBI) {
7853861d79fSDimitry Andric for (MachineInstr::mop_iterator I = BBI->operands_begin(),
7863861d79fSDimitry Andric E = BBI->operands_end(); I != E; ++I) {
7873861d79fSDimitry Andric if (I->isReg() && TargetRegisterInfo::isVirtualRegister(I->getReg())) {
7883861d79fSDimitry Andric if (I->isDef())
7893861d79fSDimitry Andric Defs.insert(I->getReg());
7903861d79fSDimitry Andric else if (I->isKill())
7913861d79fSDimitry Andric Kills.insert(I->getReg());
7923861d79fSDimitry Andric }
7933861d79fSDimitry Andric }
7943861d79fSDimitry Andric }
795f22ef01cSRoman Divacky
796f22ef01cSRoman Divacky // Update info for all live variables
7972754fe60SDimitry Andric for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
7982754fe60SDimitry Andric unsigned Reg = TargetRegisterInfo::index2VirtReg(i);
7993861d79fSDimitry Andric
8003861d79fSDimitry Andric // If the Defs is defined in the successor it can't be live in BB.
8013861d79fSDimitry Andric if (Defs.count(Reg))
8023861d79fSDimitry Andric continue;
8033861d79fSDimitry Andric
8043861d79fSDimitry Andric // If the register is either killed in or live through SuccBB it's also live
8053861d79fSDimitry Andric // through BB.
806f22ef01cSRoman Divacky VarInfo &VI = getVarInfo(Reg);
8073861d79fSDimitry Andric if (Kills.count(Reg) || VI.AliveBlocks.test(SuccBB->getNumber()))
808f22ef01cSRoman Divacky VI.AliveBlocks.set(NumNew);
809f22ef01cSRoman Divacky }
810f22ef01cSRoman Divacky }
811