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