xref: /aosp_15_r20/external/llvm/lib/CodeGen/MachineRegisterInfo.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- lib/Codegen/MachineRegisterInfo.cpp -------------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // Implementation of the MachineRegisterInfo class.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineRegisterInfo.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineInstrBuilder.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Function.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_os_ostream.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetInstrInfo.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetMachine.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetSubtargetInfo.h"
21*9880d681SAndroid Build Coastguard Worker 
22*9880d681SAndroid Build Coastguard Worker using namespace llvm;
23*9880d681SAndroid Build Coastguard Worker 
24*9880d681SAndroid Build Coastguard Worker // Pin the vtable to this file.
anchor()25*9880d681SAndroid Build Coastguard Worker void MachineRegisterInfo::Delegate::anchor() {}
26*9880d681SAndroid Build Coastguard Worker 
MachineRegisterInfo(MachineFunction * MF)27*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo::MachineRegisterInfo(MachineFunction *MF)
28*9880d681SAndroid Build Coastguard Worker     : MF(MF), TheDelegate(nullptr), TracksSubRegLiveness(false) {
29*9880d681SAndroid Build Coastguard Worker   unsigned NumRegs = getTargetRegisterInfo()->getNumRegs();
30*9880d681SAndroid Build Coastguard Worker   VRegInfo.reserve(256);
31*9880d681SAndroid Build Coastguard Worker   RegAllocHints.reserve(256);
32*9880d681SAndroid Build Coastguard Worker   UsedPhysRegMask.resize(NumRegs);
33*9880d681SAndroid Build Coastguard Worker   PhysRegUseDefLists.reset(new MachineOperand*[NumRegs]());
34*9880d681SAndroid Build Coastguard Worker }
35*9880d681SAndroid Build Coastguard Worker 
36*9880d681SAndroid Build Coastguard Worker /// setRegClass - Set the register class of the specified virtual register.
37*9880d681SAndroid Build Coastguard Worker ///
38*9880d681SAndroid Build Coastguard Worker void
setRegClass(unsigned Reg,const TargetRegisterClass * RC)39*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo::setRegClass(unsigned Reg, const TargetRegisterClass *RC) {
40*9880d681SAndroid Build Coastguard Worker   assert(RC && RC->isAllocatable() && "Invalid RC for virtual register");
41*9880d681SAndroid Build Coastguard Worker   VRegInfo[Reg].first = RC;
42*9880d681SAndroid Build Coastguard Worker }
43*9880d681SAndroid Build Coastguard Worker 
setRegBank(unsigned Reg,const RegisterBank & RegBank)44*9880d681SAndroid Build Coastguard Worker void MachineRegisterInfo::setRegBank(unsigned Reg,
45*9880d681SAndroid Build Coastguard Worker                                      const RegisterBank &RegBank) {
46*9880d681SAndroid Build Coastguard Worker   VRegInfo[Reg].first = &RegBank;
47*9880d681SAndroid Build Coastguard Worker }
48*9880d681SAndroid Build Coastguard Worker 
49*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass *
constrainRegClass(unsigned Reg,const TargetRegisterClass * RC,unsigned MinNumRegs)50*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo::constrainRegClass(unsigned Reg,
51*9880d681SAndroid Build Coastguard Worker                                        const TargetRegisterClass *RC,
52*9880d681SAndroid Build Coastguard Worker                                        unsigned MinNumRegs) {
53*9880d681SAndroid Build Coastguard Worker   const TargetRegisterClass *OldRC = getRegClass(Reg);
54*9880d681SAndroid Build Coastguard Worker   if (OldRC == RC)
55*9880d681SAndroid Build Coastguard Worker     return RC;
56*9880d681SAndroid Build Coastguard Worker   const TargetRegisterClass *NewRC =
57*9880d681SAndroid Build Coastguard Worker     getTargetRegisterInfo()->getCommonSubClass(OldRC, RC);
58*9880d681SAndroid Build Coastguard Worker   if (!NewRC || NewRC == OldRC)
59*9880d681SAndroid Build Coastguard Worker     return NewRC;
60*9880d681SAndroid Build Coastguard Worker   if (NewRC->getNumRegs() < MinNumRegs)
61*9880d681SAndroid Build Coastguard Worker     return nullptr;
62*9880d681SAndroid Build Coastguard Worker   setRegClass(Reg, NewRC);
63*9880d681SAndroid Build Coastguard Worker   return NewRC;
64*9880d681SAndroid Build Coastguard Worker }
65*9880d681SAndroid Build Coastguard Worker 
66*9880d681SAndroid Build Coastguard Worker bool
recomputeRegClass(unsigned Reg)67*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo::recomputeRegClass(unsigned Reg) {
68*9880d681SAndroid Build Coastguard Worker   const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();
69*9880d681SAndroid Build Coastguard Worker   const TargetRegisterClass *OldRC = getRegClass(Reg);
70*9880d681SAndroid Build Coastguard Worker   const TargetRegisterClass *NewRC =
71*9880d681SAndroid Build Coastguard Worker       getTargetRegisterInfo()->getLargestLegalSuperClass(OldRC, *MF);
72*9880d681SAndroid Build Coastguard Worker 
73*9880d681SAndroid Build Coastguard Worker   // Stop early if there is no room to grow.
74*9880d681SAndroid Build Coastguard Worker   if (NewRC == OldRC)
75*9880d681SAndroid Build Coastguard Worker     return false;
76*9880d681SAndroid Build Coastguard Worker 
77*9880d681SAndroid Build Coastguard Worker   // Accumulate constraints from all uses.
78*9880d681SAndroid Build Coastguard Worker   for (MachineOperand &MO : reg_nodbg_operands(Reg)) {
79*9880d681SAndroid Build Coastguard Worker     // Apply the effect of the given operand to NewRC.
80*9880d681SAndroid Build Coastguard Worker     MachineInstr *MI = MO.getParent();
81*9880d681SAndroid Build Coastguard Worker     unsigned OpNo = &MO - &MI->getOperand(0);
82*9880d681SAndroid Build Coastguard Worker     NewRC = MI->getRegClassConstraintEffect(OpNo, NewRC, TII,
83*9880d681SAndroid Build Coastguard Worker                                             getTargetRegisterInfo());
84*9880d681SAndroid Build Coastguard Worker     if (!NewRC || NewRC == OldRC)
85*9880d681SAndroid Build Coastguard Worker       return false;
86*9880d681SAndroid Build Coastguard Worker   }
87*9880d681SAndroid Build Coastguard Worker   setRegClass(Reg, NewRC);
88*9880d681SAndroid Build Coastguard Worker   return true;
89*9880d681SAndroid Build Coastguard Worker }
90*9880d681SAndroid Build Coastguard Worker 
91*9880d681SAndroid Build Coastguard Worker /// createVirtualRegister - Create and return a new virtual register in the
92*9880d681SAndroid Build Coastguard Worker /// function with the specified register class.
93*9880d681SAndroid Build Coastguard Worker ///
94*9880d681SAndroid Build Coastguard Worker unsigned
createVirtualRegister(const TargetRegisterClass * RegClass)95*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo::createVirtualRegister(const TargetRegisterClass *RegClass){
96*9880d681SAndroid Build Coastguard Worker   assert(RegClass && "Cannot create register without RegClass!");
97*9880d681SAndroid Build Coastguard Worker   assert(RegClass->isAllocatable() &&
98*9880d681SAndroid Build Coastguard Worker          "Virtual register RegClass must be allocatable.");
99*9880d681SAndroid Build Coastguard Worker 
100*9880d681SAndroid Build Coastguard Worker   // New virtual register number.
101*9880d681SAndroid Build Coastguard Worker   unsigned Reg = TargetRegisterInfo::index2VirtReg(getNumVirtRegs());
102*9880d681SAndroid Build Coastguard Worker   VRegInfo.grow(Reg);
103*9880d681SAndroid Build Coastguard Worker   VRegInfo[Reg].first = RegClass;
104*9880d681SAndroid Build Coastguard Worker   RegAllocHints.grow(Reg);
105*9880d681SAndroid Build Coastguard Worker   if (TheDelegate)
106*9880d681SAndroid Build Coastguard Worker     TheDelegate->MRI_NoteNewVirtualRegister(Reg);
107*9880d681SAndroid Build Coastguard Worker   return Reg;
108*9880d681SAndroid Build Coastguard Worker }
109*9880d681SAndroid Build Coastguard Worker 
110*9880d681SAndroid Build Coastguard Worker unsigned
getSize(unsigned VReg) const111*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo::getSize(unsigned VReg) const {
112*9880d681SAndroid Build Coastguard Worker   VRegToSizeMap::const_iterator SizeIt = getVRegToSize().find(VReg);
113*9880d681SAndroid Build Coastguard Worker   return SizeIt != getVRegToSize().end() ? SizeIt->second : 0;
114*9880d681SAndroid Build Coastguard Worker }
115*9880d681SAndroid Build Coastguard Worker 
setSize(unsigned VReg,unsigned Size)116*9880d681SAndroid Build Coastguard Worker void MachineRegisterInfo::setSize(unsigned VReg, unsigned Size) {
117*9880d681SAndroid Build Coastguard Worker   getVRegToSize()[VReg] = Size;
118*9880d681SAndroid Build Coastguard Worker }
119*9880d681SAndroid Build Coastguard Worker 
120*9880d681SAndroid Build Coastguard Worker unsigned
createGenericVirtualRegister(unsigned Size)121*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo::createGenericVirtualRegister(unsigned Size) {
122*9880d681SAndroid Build Coastguard Worker   assert(Size && "Cannot create empty virtual register");
123*9880d681SAndroid Build Coastguard Worker 
124*9880d681SAndroid Build Coastguard Worker   // New virtual register number.
125*9880d681SAndroid Build Coastguard Worker   unsigned Reg = TargetRegisterInfo::index2VirtReg(getNumVirtRegs());
126*9880d681SAndroid Build Coastguard Worker   VRegInfo.grow(Reg);
127*9880d681SAndroid Build Coastguard Worker   // FIXME: Should we use a dummy register class?
128*9880d681SAndroid Build Coastguard Worker   VRegInfo[Reg].first = static_cast<TargetRegisterClass *>(nullptr);
129*9880d681SAndroid Build Coastguard Worker   getVRegToSize()[Reg] = Size;
130*9880d681SAndroid Build Coastguard Worker   RegAllocHints.grow(Reg);
131*9880d681SAndroid Build Coastguard Worker   if (TheDelegate)
132*9880d681SAndroid Build Coastguard Worker     TheDelegate->MRI_NoteNewVirtualRegister(Reg);
133*9880d681SAndroid Build Coastguard Worker   return Reg;
134*9880d681SAndroid Build Coastguard Worker }
135*9880d681SAndroid Build Coastguard Worker 
136*9880d681SAndroid Build Coastguard Worker /// clearVirtRegs - Remove all virtual registers (after physreg assignment).
clearVirtRegs()137*9880d681SAndroid Build Coastguard Worker void MachineRegisterInfo::clearVirtRegs() {
138*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
139*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0, e = getNumVirtRegs(); i != e; ++i) {
140*9880d681SAndroid Build Coastguard Worker     unsigned Reg = TargetRegisterInfo::index2VirtReg(i);
141*9880d681SAndroid Build Coastguard Worker     if (!VRegInfo[Reg].second)
142*9880d681SAndroid Build Coastguard Worker       continue;
143*9880d681SAndroid Build Coastguard Worker     verifyUseList(Reg);
144*9880d681SAndroid Build Coastguard Worker     llvm_unreachable("Remaining virtual register operands");
145*9880d681SAndroid Build Coastguard Worker   }
146*9880d681SAndroid Build Coastguard Worker #endif
147*9880d681SAndroid Build Coastguard Worker   VRegInfo.clear();
148*9880d681SAndroid Build Coastguard Worker   for (auto &I : LiveIns)
149*9880d681SAndroid Build Coastguard Worker     I.second = 0;
150*9880d681SAndroid Build Coastguard Worker }
151*9880d681SAndroid Build Coastguard Worker 
verifyUseList(unsigned Reg) const152*9880d681SAndroid Build Coastguard Worker void MachineRegisterInfo::verifyUseList(unsigned Reg) const {
153*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
154*9880d681SAndroid Build Coastguard Worker   bool Valid = true;
155*9880d681SAndroid Build Coastguard Worker   for (MachineOperand &M : reg_operands(Reg)) {
156*9880d681SAndroid Build Coastguard Worker     MachineOperand *MO = &M;
157*9880d681SAndroid Build Coastguard Worker     MachineInstr *MI = MO->getParent();
158*9880d681SAndroid Build Coastguard Worker     if (!MI) {
159*9880d681SAndroid Build Coastguard Worker       errs() << PrintReg(Reg, getTargetRegisterInfo())
160*9880d681SAndroid Build Coastguard Worker              << " use list MachineOperand " << MO
161*9880d681SAndroid Build Coastguard Worker              << " has no parent instruction.\n";
162*9880d681SAndroid Build Coastguard Worker       Valid = false;
163*9880d681SAndroid Build Coastguard Worker       continue;
164*9880d681SAndroid Build Coastguard Worker     }
165*9880d681SAndroid Build Coastguard Worker     MachineOperand *MO0 = &MI->getOperand(0);
166*9880d681SAndroid Build Coastguard Worker     unsigned NumOps = MI->getNumOperands();
167*9880d681SAndroid Build Coastguard Worker     if (!(MO >= MO0 && MO < MO0+NumOps)) {
168*9880d681SAndroid Build Coastguard Worker       errs() << PrintReg(Reg, getTargetRegisterInfo())
169*9880d681SAndroid Build Coastguard Worker              << " use list MachineOperand " << MO
170*9880d681SAndroid Build Coastguard Worker              << " doesn't belong to parent MI: " << *MI;
171*9880d681SAndroid Build Coastguard Worker       Valid = false;
172*9880d681SAndroid Build Coastguard Worker     }
173*9880d681SAndroid Build Coastguard Worker     if (!MO->isReg()) {
174*9880d681SAndroid Build Coastguard Worker       errs() << PrintReg(Reg, getTargetRegisterInfo())
175*9880d681SAndroid Build Coastguard Worker              << " MachineOperand " << MO << ": " << *MO
176*9880d681SAndroid Build Coastguard Worker              << " is not a register\n";
177*9880d681SAndroid Build Coastguard Worker       Valid = false;
178*9880d681SAndroid Build Coastguard Worker     }
179*9880d681SAndroid Build Coastguard Worker     if (MO->getReg() != Reg) {
180*9880d681SAndroid Build Coastguard Worker       errs() << PrintReg(Reg, getTargetRegisterInfo())
181*9880d681SAndroid Build Coastguard Worker              << " use-list MachineOperand " << MO << ": "
182*9880d681SAndroid Build Coastguard Worker              << *MO << " is the wrong register\n";
183*9880d681SAndroid Build Coastguard Worker       Valid = false;
184*9880d681SAndroid Build Coastguard Worker     }
185*9880d681SAndroid Build Coastguard Worker   }
186*9880d681SAndroid Build Coastguard Worker   assert(Valid && "Invalid use list");
187*9880d681SAndroid Build Coastguard Worker #endif
188*9880d681SAndroid Build Coastguard Worker }
189*9880d681SAndroid Build Coastguard Worker 
verifyUseLists() const190*9880d681SAndroid Build Coastguard Worker void MachineRegisterInfo::verifyUseLists() const {
191*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
192*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0, e = getNumVirtRegs(); i != e; ++i)
193*9880d681SAndroid Build Coastguard Worker     verifyUseList(TargetRegisterInfo::index2VirtReg(i));
194*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 1, e = getTargetRegisterInfo()->getNumRegs(); i != e; ++i)
195*9880d681SAndroid Build Coastguard Worker     verifyUseList(i);
196*9880d681SAndroid Build Coastguard Worker #endif
197*9880d681SAndroid Build Coastguard Worker }
198*9880d681SAndroid Build Coastguard Worker 
199*9880d681SAndroid Build Coastguard Worker /// Add MO to the linked list of operands for its register.
addRegOperandToUseList(MachineOperand * MO)200*9880d681SAndroid Build Coastguard Worker void MachineRegisterInfo::addRegOperandToUseList(MachineOperand *MO) {
201*9880d681SAndroid Build Coastguard Worker   assert(!MO->isOnRegUseList() && "Already on list");
202*9880d681SAndroid Build Coastguard Worker   MachineOperand *&HeadRef = getRegUseDefListHead(MO->getReg());
203*9880d681SAndroid Build Coastguard Worker   MachineOperand *const Head = HeadRef;
204*9880d681SAndroid Build Coastguard Worker 
205*9880d681SAndroid Build Coastguard Worker   // Head points to the first list element.
206*9880d681SAndroid Build Coastguard Worker   // Next is NULL on the last list element.
207*9880d681SAndroid Build Coastguard Worker   // Prev pointers are circular, so Head->Prev == Last.
208*9880d681SAndroid Build Coastguard Worker 
209*9880d681SAndroid Build Coastguard Worker   // Head is NULL for an empty list.
210*9880d681SAndroid Build Coastguard Worker   if (!Head) {
211*9880d681SAndroid Build Coastguard Worker     MO->Contents.Reg.Prev = MO;
212*9880d681SAndroid Build Coastguard Worker     MO->Contents.Reg.Next = nullptr;
213*9880d681SAndroid Build Coastguard Worker     HeadRef = MO;
214*9880d681SAndroid Build Coastguard Worker     return;
215*9880d681SAndroid Build Coastguard Worker   }
216*9880d681SAndroid Build Coastguard Worker   assert(MO->getReg() == Head->getReg() && "Different regs on the same list!");
217*9880d681SAndroid Build Coastguard Worker 
218*9880d681SAndroid Build Coastguard Worker   // Insert MO between Last and Head in the circular Prev chain.
219*9880d681SAndroid Build Coastguard Worker   MachineOperand *Last = Head->Contents.Reg.Prev;
220*9880d681SAndroid Build Coastguard Worker   assert(Last && "Inconsistent use list");
221*9880d681SAndroid Build Coastguard Worker   assert(MO->getReg() == Last->getReg() && "Different regs on the same list!");
222*9880d681SAndroid Build Coastguard Worker   Head->Contents.Reg.Prev = MO;
223*9880d681SAndroid Build Coastguard Worker   MO->Contents.Reg.Prev = Last;
224*9880d681SAndroid Build Coastguard Worker 
225*9880d681SAndroid Build Coastguard Worker   // Def operands always precede uses. This allows def_iterator to stop early.
226*9880d681SAndroid Build Coastguard Worker   // Insert def operands at the front, and use operands at the back.
227*9880d681SAndroid Build Coastguard Worker   if (MO->isDef()) {
228*9880d681SAndroid Build Coastguard Worker     // Insert def at the front.
229*9880d681SAndroid Build Coastguard Worker     MO->Contents.Reg.Next = Head;
230*9880d681SAndroid Build Coastguard Worker     HeadRef = MO;
231*9880d681SAndroid Build Coastguard Worker   } else {
232*9880d681SAndroid Build Coastguard Worker     // Insert use at the end.
233*9880d681SAndroid Build Coastguard Worker     MO->Contents.Reg.Next = nullptr;
234*9880d681SAndroid Build Coastguard Worker     Last->Contents.Reg.Next = MO;
235*9880d681SAndroid Build Coastguard Worker   }
236*9880d681SAndroid Build Coastguard Worker }
237*9880d681SAndroid Build Coastguard Worker 
238*9880d681SAndroid Build Coastguard Worker /// Remove MO from its use-def list.
removeRegOperandFromUseList(MachineOperand * MO)239*9880d681SAndroid Build Coastguard Worker void MachineRegisterInfo::removeRegOperandFromUseList(MachineOperand *MO) {
240*9880d681SAndroid Build Coastguard Worker   assert(MO->isOnRegUseList() && "Operand not on use list");
241*9880d681SAndroid Build Coastguard Worker   MachineOperand *&HeadRef = getRegUseDefListHead(MO->getReg());
242*9880d681SAndroid Build Coastguard Worker   MachineOperand *const Head = HeadRef;
243*9880d681SAndroid Build Coastguard Worker   assert(Head && "List already empty");
244*9880d681SAndroid Build Coastguard Worker 
245*9880d681SAndroid Build Coastguard Worker   // Unlink this from the doubly linked list of operands.
246*9880d681SAndroid Build Coastguard Worker   MachineOperand *Next = MO->Contents.Reg.Next;
247*9880d681SAndroid Build Coastguard Worker   MachineOperand *Prev = MO->Contents.Reg.Prev;
248*9880d681SAndroid Build Coastguard Worker 
249*9880d681SAndroid Build Coastguard Worker   // Prev links are circular, next link is NULL instead of looping back to Head.
250*9880d681SAndroid Build Coastguard Worker   if (MO == Head)
251*9880d681SAndroid Build Coastguard Worker     HeadRef = Next;
252*9880d681SAndroid Build Coastguard Worker   else
253*9880d681SAndroid Build Coastguard Worker     Prev->Contents.Reg.Next = Next;
254*9880d681SAndroid Build Coastguard Worker 
255*9880d681SAndroid Build Coastguard Worker   (Next ? Next : Head)->Contents.Reg.Prev = Prev;
256*9880d681SAndroid Build Coastguard Worker 
257*9880d681SAndroid Build Coastguard Worker   MO->Contents.Reg.Prev = nullptr;
258*9880d681SAndroid Build Coastguard Worker   MO->Contents.Reg.Next = nullptr;
259*9880d681SAndroid Build Coastguard Worker }
260*9880d681SAndroid Build Coastguard Worker 
261*9880d681SAndroid Build Coastguard Worker /// Move NumOps operands from Src to Dst, updating use-def lists as needed.
262*9880d681SAndroid Build Coastguard Worker ///
263*9880d681SAndroid Build Coastguard Worker /// The Dst range is assumed to be uninitialized memory. (Or it may contain
264*9880d681SAndroid Build Coastguard Worker /// operands that won't be destroyed, which is OK because the MO destructor is
265*9880d681SAndroid Build Coastguard Worker /// trivial anyway).
266*9880d681SAndroid Build Coastguard Worker ///
267*9880d681SAndroid Build Coastguard Worker /// The Src and Dst ranges may overlap.
moveOperands(MachineOperand * Dst,MachineOperand * Src,unsigned NumOps)268*9880d681SAndroid Build Coastguard Worker void MachineRegisterInfo::moveOperands(MachineOperand *Dst,
269*9880d681SAndroid Build Coastguard Worker                                        MachineOperand *Src,
270*9880d681SAndroid Build Coastguard Worker                                        unsigned NumOps) {
271*9880d681SAndroid Build Coastguard Worker   assert(Src != Dst && NumOps && "Noop moveOperands");
272*9880d681SAndroid Build Coastguard Worker 
273*9880d681SAndroid Build Coastguard Worker   // Copy backwards if Dst is within the Src range.
274*9880d681SAndroid Build Coastguard Worker   int Stride = 1;
275*9880d681SAndroid Build Coastguard Worker   if (Dst >= Src && Dst < Src + NumOps) {
276*9880d681SAndroid Build Coastguard Worker     Stride = -1;
277*9880d681SAndroid Build Coastguard Worker     Dst += NumOps - 1;
278*9880d681SAndroid Build Coastguard Worker     Src += NumOps - 1;
279*9880d681SAndroid Build Coastguard Worker   }
280*9880d681SAndroid Build Coastguard Worker 
281*9880d681SAndroid Build Coastguard Worker   // Copy one operand at a time.
282*9880d681SAndroid Build Coastguard Worker   do {
283*9880d681SAndroid Build Coastguard Worker     new (Dst) MachineOperand(*Src);
284*9880d681SAndroid Build Coastguard Worker 
285*9880d681SAndroid Build Coastguard Worker     // Dst takes Src's place in the use-def chain.
286*9880d681SAndroid Build Coastguard Worker     if (Src->isReg()) {
287*9880d681SAndroid Build Coastguard Worker       MachineOperand *&Head = getRegUseDefListHead(Src->getReg());
288*9880d681SAndroid Build Coastguard Worker       MachineOperand *Prev = Src->Contents.Reg.Prev;
289*9880d681SAndroid Build Coastguard Worker       MachineOperand *Next = Src->Contents.Reg.Next;
290*9880d681SAndroid Build Coastguard Worker       assert(Head && "List empty, but operand is chained");
291*9880d681SAndroid Build Coastguard Worker       assert(Prev && "Operand was not on use-def list");
292*9880d681SAndroid Build Coastguard Worker 
293*9880d681SAndroid Build Coastguard Worker       // Prev links are circular, next link is NULL instead of looping back to
294*9880d681SAndroid Build Coastguard Worker       // Head.
295*9880d681SAndroid Build Coastguard Worker       if (Src == Head)
296*9880d681SAndroid Build Coastguard Worker         Head = Dst;
297*9880d681SAndroid Build Coastguard Worker       else
298*9880d681SAndroid Build Coastguard Worker         Prev->Contents.Reg.Next = Dst;
299*9880d681SAndroid Build Coastguard Worker 
300*9880d681SAndroid Build Coastguard Worker       // Update Prev pointer. This also works when Src was pointing to itself
301*9880d681SAndroid Build Coastguard Worker       // in a 1-element list. In that case Head == Dst.
302*9880d681SAndroid Build Coastguard Worker       (Next ? Next : Head)->Contents.Reg.Prev = Dst;
303*9880d681SAndroid Build Coastguard Worker     }
304*9880d681SAndroid Build Coastguard Worker 
305*9880d681SAndroid Build Coastguard Worker     Dst += Stride;
306*9880d681SAndroid Build Coastguard Worker     Src += Stride;
307*9880d681SAndroid Build Coastguard Worker   } while (--NumOps);
308*9880d681SAndroid Build Coastguard Worker }
309*9880d681SAndroid Build Coastguard Worker 
310*9880d681SAndroid Build Coastguard Worker /// replaceRegWith - Replace all instances of FromReg with ToReg in the
311*9880d681SAndroid Build Coastguard Worker /// machine function.  This is like llvm-level X->replaceAllUsesWith(Y),
312*9880d681SAndroid Build Coastguard Worker /// except that it also changes any definitions of the register as well.
313*9880d681SAndroid Build Coastguard Worker /// If ToReg is a physical register we apply the sub register to obtain the
314*9880d681SAndroid Build Coastguard Worker /// final/proper physical register.
replaceRegWith(unsigned FromReg,unsigned ToReg)315*9880d681SAndroid Build Coastguard Worker void MachineRegisterInfo::replaceRegWith(unsigned FromReg, unsigned ToReg) {
316*9880d681SAndroid Build Coastguard Worker   assert(FromReg != ToReg && "Cannot replace a reg with itself");
317*9880d681SAndroid Build Coastguard Worker 
318*9880d681SAndroid Build Coastguard Worker   const TargetRegisterInfo *TRI = getTargetRegisterInfo();
319*9880d681SAndroid Build Coastguard Worker 
320*9880d681SAndroid Build Coastguard Worker   // TODO: This could be more efficient by bulk changing the operands.
321*9880d681SAndroid Build Coastguard Worker   for (reg_iterator I = reg_begin(FromReg), E = reg_end(); I != E; ) {
322*9880d681SAndroid Build Coastguard Worker     MachineOperand &O = *I;
323*9880d681SAndroid Build Coastguard Worker     ++I;
324*9880d681SAndroid Build Coastguard Worker     if (TargetRegisterInfo::isPhysicalRegister(ToReg)) {
325*9880d681SAndroid Build Coastguard Worker       O.substPhysReg(ToReg, *TRI);
326*9880d681SAndroid Build Coastguard Worker     } else {
327*9880d681SAndroid Build Coastguard Worker       O.setReg(ToReg);
328*9880d681SAndroid Build Coastguard Worker     }
329*9880d681SAndroid Build Coastguard Worker   }
330*9880d681SAndroid Build Coastguard Worker }
331*9880d681SAndroid Build Coastguard Worker 
332*9880d681SAndroid Build Coastguard Worker /// getVRegDef - Return the machine instr that defines the specified virtual
333*9880d681SAndroid Build Coastguard Worker /// register or null if none is found.  This assumes that the code is in SSA
334*9880d681SAndroid Build Coastguard Worker /// form, so there should only be one definition.
getVRegDef(unsigned Reg) const335*9880d681SAndroid Build Coastguard Worker MachineInstr *MachineRegisterInfo::getVRegDef(unsigned Reg) const {
336*9880d681SAndroid Build Coastguard Worker   // Since we are in SSA form, we can use the first definition.
337*9880d681SAndroid Build Coastguard Worker   def_instr_iterator I = def_instr_begin(Reg);
338*9880d681SAndroid Build Coastguard Worker   assert((I.atEnd() || std::next(I) == def_instr_end()) &&
339*9880d681SAndroid Build Coastguard Worker          "getVRegDef assumes a single definition or no definition");
340*9880d681SAndroid Build Coastguard Worker   return !I.atEnd() ? &*I : nullptr;
341*9880d681SAndroid Build Coastguard Worker }
342*9880d681SAndroid Build Coastguard Worker 
343*9880d681SAndroid Build Coastguard Worker /// getUniqueVRegDef - Return the unique machine instr that defines the
344*9880d681SAndroid Build Coastguard Worker /// specified virtual register or null if none is found.  If there are
345*9880d681SAndroid Build Coastguard Worker /// multiple definitions or no definition, return null.
getUniqueVRegDef(unsigned Reg) const346*9880d681SAndroid Build Coastguard Worker MachineInstr *MachineRegisterInfo::getUniqueVRegDef(unsigned Reg) const {
347*9880d681SAndroid Build Coastguard Worker   if (def_empty(Reg)) return nullptr;
348*9880d681SAndroid Build Coastguard Worker   def_instr_iterator I = def_instr_begin(Reg);
349*9880d681SAndroid Build Coastguard Worker   if (std::next(I) != def_instr_end())
350*9880d681SAndroid Build Coastguard Worker     return nullptr;
351*9880d681SAndroid Build Coastguard Worker   return &*I;
352*9880d681SAndroid Build Coastguard Worker }
353*9880d681SAndroid Build Coastguard Worker 
hasOneNonDBGUse(unsigned RegNo) const354*9880d681SAndroid Build Coastguard Worker bool MachineRegisterInfo::hasOneNonDBGUse(unsigned RegNo) const {
355*9880d681SAndroid Build Coastguard Worker   use_nodbg_iterator UI = use_nodbg_begin(RegNo);
356*9880d681SAndroid Build Coastguard Worker   if (UI == use_nodbg_end())
357*9880d681SAndroid Build Coastguard Worker     return false;
358*9880d681SAndroid Build Coastguard Worker   return ++UI == use_nodbg_end();
359*9880d681SAndroid Build Coastguard Worker }
360*9880d681SAndroid Build Coastguard Worker 
361*9880d681SAndroid Build Coastguard Worker /// clearKillFlags - Iterate over all the uses of the given register and
362*9880d681SAndroid Build Coastguard Worker /// clear the kill flag from the MachineOperand. This function is used by
363*9880d681SAndroid Build Coastguard Worker /// optimization passes which extend register lifetimes and need only
364*9880d681SAndroid Build Coastguard Worker /// preserve conservative kill flag information.
clearKillFlags(unsigned Reg) const365*9880d681SAndroid Build Coastguard Worker void MachineRegisterInfo::clearKillFlags(unsigned Reg) const {
366*9880d681SAndroid Build Coastguard Worker   for (MachineOperand &MO : use_operands(Reg))
367*9880d681SAndroid Build Coastguard Worker     MO.setIsKill(false);
368*9880d681SAndroid Build Coastguard Worker }
369*9880d681SAndroid Build Coastguard Worker 
isLiveIn(unsigned Reg) const370*9880d681SAndroid Build Coastguard Worker bool MachineRegisterInfo::isLiveIn(unsigned Reg) const {
371*9880d681SAndroid Build Coastguard Worker   for (livein_iterator I = livein_begin(), E = livein_end(); I != E; ++I)
372*9880d681SAndroid Build Coastguard Worker     if (I->first == Reg || I->second == Reg)
373*9880d681SAndroid Build Coastguard Worker       return true;
374*9880d681SAndroid Build Coastguard Worker   return false;
375*9880d681SAndroid Build Coastguard Worker }
376*9880d681SAndroid Build Coastguard Worker 
377*9880d681SAndroid Build Coastguard Worker /// getLiveInPhysReg - If VReg is a live-in virtual register, return the
378*9880d681SAndroid Build Coastguard Worker /// corresponding live-in physical register.
getLiveInPhysReg(unsigned VReg) const379*9880d681SAndroid Build Coastguard Worker unsigned MachineRegisterInfo::getLiveInPhysReg(unsigned VReg) const {
380*9880d681SAndroid Build Coastguard Worker   for (livein_iterator I = livein_begin(), E = livein_end(); I != E; ++I)
381*9880d681SAndroid Build Coastguard Worker     if (I->second == VReg)
382*9880d681SAndroid Build Coastguard Worker       return I->first;
383*9880d681SAndroid Build Coastguard Worker   return 0;
384*9880d681SAndroid Build Coastguard Worker }
385*9880d681SAndroid Build Coastguard Worker 
386*9880d681SAndroid Build Coastguard Worker /// getLiveInVirtReg - If PReg is a live-in physical register, return the
387*9880d681SAndroid Build Coastguard Worker /// corresponding live-in physical register.
getLiveInVirtReg(unsigned PReg) const388*9880d681SAndroid Build Coastguard Worker unsigned MachineRegisterInfo::getLiveInVirtReg(unsigned PReg) const {
389*9880d681SAndroid Build Coastguard Worker   for (livein_iterator I = livein_begin(), E = livein_end(); I != E; ++I)
390*9880d681SAndroid Build Coastguard Worker     if (I->first == PReg)
391*9880d681SAndroid Build Coastguard Worker       return I->second;
392*9880d681SAndroid Build Coastguard Worker   return 0;
393*9880d681SAndroid Build Coastguard Worker }
394*9880d681SAndroid Build Coastguard Worker 
395*9880d681SAndroid Build Coastguard Worker /// EmitLiveInCopies - Emit copies to initialize livein virtual registers
396*9880d681SAndroid Build Coastguard Worker /// into the given entry block.
397*9880d681SAndroid Build Coastguard Worker void
EmitLiveInCopies(MachineBasicBlock * EntryMBB,const TargetRegisterInfo & TRI,const TargetInstrInfo & TII)398*9880d681SAndroid Build Coastguard Worker MachineRegisterInfo::EmitLiveInCopies(MachineBasicBlock *EntryMBB,
399*9880d681SAndroid Build Coastguard Worker                                       const TargetRegisterInfo &TRI,
400*9880d681SAndroid Build Coastguard Worker                                       const TargetInstrInfo &TII) {
401*9880d681SAndroid Build Coastguard Worker   // Emit the copies into the top of the block.
402*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0, e = LiveIns.size(); i != e; ++i)
403*9880d681SAndroid Build Coastguard Worker     if (LiveIns[i].second) {
404*9880d681SAndroid Build Coastguard Worker       if (use_empty(LiveIns[i].second)) {
405*9880d681SAndroid Build Coastguard Worker         // The livein has no uses. Drop it.
406*9880d681SAndroid Build Coastguard Worker         //
407*9880d681SAndroid Build Coastguard Worker         // It would be preferable to have isel avoid creating live-in
408*9880d681SAndroid Build Coastguard Worker         // records for unused arguments in the first place, but it's
409*9880d681SAndroid Build Coastguard Worker         // complicated by the debug info code for arguments.
410*9880d681SAndroid Build Coastguard Worker         LiveIns.erase(LiveIns.begin() + i);
411*9880d681SAndroid Build Coastguard Worker         --i; --e;
412*9880d681SAndroid Build Coastguard Worker       } else {
413*9880d681SAndroid Build Coastguard Worker         // Emit a copy.
414*9880d681SAndroid Build Coastguard Worker         BuildMI(*EntryMBB, EntryMBB->begin(), DebugLoc(),
415*9880d681SAndroid Build Coastguard Worker                 TII.get(TargetOpcode::COPY), LiveIns[i].second)
416*9880d681SAndroid Build Coastguard Worker           .addReg(LiveIns[i].first);
417*9880d681SAndroid Build Coastguard Worker 
418*9880d681SAndroid Build Coastguard Worker         // Add the register to the entry block live-in set.
419*9880d681SAndroid Build Coastguard Worker         EntryMBB->addLiveIn(LiveIns[i].first);
420*9880d681SAndroid Build Coastguard Worker       }
421*9880d681SAndroid Build Coastguard Worker     } else {
422*9880d681SAndroid Build Coastguard Worker       // Add the register to the entry block live-in set.
423*9880d681SAndroid Build Coastguard Worker       EntryMBB->addLiveIn(LiveIns[i].first);
424*9880d681SAndroid Build Coastguard Worker     }
425*9880d681SAndroid Build Coastguard Worker }
426*9880d681SAndroid Build Coastguard Worker 
getMaxLaneMaskForVReg(unsigned Reg) const427*9880d681SAndroid Build Coastguard Worker LaneBitmask MachineRegisterInfo::getMaxLaneMaskForVReg(unsigned Reg) const {
428*9880d681SAndroid Build Coastguard Worker   // Lane masks are only defined for vregs.
429*9880d681SAndroid Build Coastguard Worker   assert(TargetRegisterInfo::isVirtualRegister(Reg));
430*9880d681SAndroid Build Coastguard Worker   const TargetRegisterClass &TRC = *getRegClass(Reg);
431*9880d681SAndroid Build Coastguard Worker   return TRC.getLaneMask();
432*9880d681SAndroid Build Coastguard Worker }
433*9880d681SAndroid Build Coastguard Worker 
434*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
dumpUses(unsigned Reg) const435*9880d681SAndroid Build Coastguard Worker void MachineRegisterInfo::dumpUses(unsigned Reg) const {
436*9880d681SAndroid Build Coastguard Worker   for (MachineInstr &I : use_instructions(Reg))
437*9880d681SAndroid Build Coastguard Worker     I.dump();
438*9880d681SAndroid Build Coastguard Worker }
439*9880d681SAndroid Build Coastguard Worker #endif
440*9880d681SAndroid Build Coastguard Worker 
freezeReservedRegs(const MachineFunction & MF)441*9880d681SAndroid Build Coastguard Worker void MachineRegisterInfo::freezeReservedRegs(const MachineFunction &MF) {
442*9880d681SAndroid Build Coastguard Worker   ReservedRegs = getTargetRegisterInfo()->getReservedRegs(MF);
443*9880d681SAndroid Build Coastguard Worker   assert(ReservedRegs.size() == getTargetRegisterInfo()->getNumRegs() &&
444*9880d681SAndroid Build Coastguard Worker          "Invalid ReservedRegs vector from target");
445*9880d681SAndroid Build Coastguard Worker }
446*9880d681SAndroid Build Coastguard Worker 
isConstantPhysReg(unsigned PhysReg,const MachineFunction & MF) const447*9880d681SAndroid Build Coastguard Worker bool MachineRegisterInfo::isConstantPhysReg(unsigned PhysReg,
448*9880d681SAndroid Build Coastguard Worker                                             const MachineFunction &MF) const {
449*9880d681SAndroid Build Coastguard Worker   assert(TargetRegisterInfo::isPhysicalRegister(PhysReg));
450*9880d681SAndroid Build Coastguard Worker 
451*9880d681SAndroid Build Coastguard Worker   // Check if any overlapping register is modified, or allocatable so it may be
452*9880d681SAndroid Build Coastguard Worker   // used later.
453*9880d681SAndroid Build Coastguard Worker   for (MCRegAliasIterator AI(PhysReg, getTargetRegisterInfo(), true);
454*9880d681SAndroid Build Coastguard Worker        AI.isValid(); ++AI)
455*9880d681SAndroid Build Coastguard Worker     if (!def_empty(*AI) || isAllocatable(*AI))
456*9880d681SAndroid Build Coastguard Worker       return false;
457*9880d681SAndroid Build Coastguard Worker   return true;
458*9880d681SAndroid Build Coastguard Worker }
459*9880d681SAndroid Build Coastguard Worker 
460*9880d681SAndroid Build Coastguard Worker /// markUsesInDebugValueAsUndef - Mark every DBG_VALUE referencing the
461*9880d681SAndroid Build Coastguard Worker /// specified register as undefined which causes the DBG_VALUE to be
462*9880d681SAndroid Build Coastguard Worker /// deleted during LiveDebugVariables analysis.
markUsesInDebugValueAsUndef(unsigned Reg) const463*9880d681SAndroid Build Coastguard Worker void MachineRegisterInfo::markUsesInDebugValueAsUndef(unsigned Reg) const {
464*9880d681SAndroid Build Coastguard Worker   // Mark any DBG_VALUE that uses Reg as undef (but don't delete it.)
465*9880d681SAndroid Build Coastguard Worker   MachineRegisterInfo::use_instr_iterator nextI;
466*9880d681SAndroid Build Coastguard Worker   for (use_instr_iterator I = use_instr_begin(Reg), E = use_instr_end();
467*9880d681SAndroid Build Coastguard Worker        I != E; I = nextI) {
468*9880d681SAndroid Build Coastguard Worker     nextI = std::next(I);  // I is invalidated by the setReg
469*9880d681SAndroid Build Coastguard Worker     MachineInstr *UseMI = &*I;
470*9880d681SAndroid Build Coastguard Worker     if (UseMI->isDebugValue())
471*9880d681SAndroid Build Coastguard Worker       UseMI->getOperand(0).setReg(0U);
472*9880d681SAndroid Build Coastguard Worker   }
473*9880d681SAndroid Build Coastguard Worker }
474*9880d681SAndroid Build Coastguard Worker 
getCalledFunction(const MachineInstr & MI)475*9880d681SAndroid Build Coastguard Worker static const Function *getCalledFunction(const MachineInstr &MI) {
476*9880d681SAndroid Build Coastguard Worker   for (const MachineOperand &MO : MI.operands()) {
477*9880d681SAndroid Build Coastguard Worker     if (!MO.isGlobal())
478*9880d681SAndroid Build Coastguard Worker       continue;
479*9880d681SAndroid Build Coastguard Worker     const Function *Func = dyn_cast<Function>(MO.getGlobal());
480*9880d681SAndroid Build Coastguard Worker     if (Func != nullptr)
481*9880d681SAndroid Build Coastguard Worker       return Func;
482*9880d681SAndroid Build Coastguard Worker   }
483*9880d681SAndroid Build Coastguard Worker   return nullptr;
484*9880d681SAndroid Build Coastguard Worker }
485*9880d681SAndroid Build Coastguard Worker 
isNoReturnDef(const MachineOperand & MO)486*9880d681SAndroid Build Coastguard Worker static bool isNoReturnDef(const MachineOperand &MO) {
487*9880d681SAndroid Build Coastguard Worker   // Anything which is not a noreturn function is a real def.
488*9880d681SAndroid Build Coastguard Worker   const MachineInstr &MI = *MO.getParent();
489*9880d681SAndroid Build Coastguard Worker   if (!MI.isCall())
490*9880d681SAndroid Build Coastguard Worker     return false;
491*9880d681SAndroid Build Coastguard Worker   const MachineBasicBlock &MBB = *MI.getParent();
492*9880d681SAndroid Build Coastguard Worker   if (!MBB.succ_empty())
493*9880d681SAndroid Build Coastguard Worker     return false;
494*9880d681SAndroid Build Coastguard Worker   const MachineFunction &MF = *MBB.getParent();
495*9880d681SAndroid Build Coastguard Worker   // We need to keep correct unwind information even if the function will
496*9880d681SAndroid Build Coastguard Worker   // not return, since the runtime may need it.
497*9880d681SAndroid Build Coastguard Worker   if (MF.getFunction()->hasFnAttribute(Attribute::UWTable))
498*9880d681SAndroid Build Coastguard Worker     return false;
499*9880d681SAndroid Build Coastguard Worker   const Function *Called = getCalledFunction(MI);
500*9880d681SAndroid Build Coastguard Worker   return !(Called == nullptr || !Called->hasFnAttribute(Attribute::NoReturn) ||
501*9880d681SAndroid Build Coastguard Worker            !Called->hasFnAttribute(Attribute::NoUnwind));
502*9880d681SAndroid Build Coastguard Worker }
503*9880d681SAndroid Build Coastguard Worker 
isPhysRegModified(unsigned PhysReg,bool SkipNoReturnDef) const504*9880d681SAndroid Build Coastguard Worker bool MachineRegisterInfo::isPhysRegModified(unsigned PhysReg,
505*9880d681SAndroid Build Coastguard Worker                                             bool SkipNoReturnDef) const {
506*9880d681SAndroid Build Coastguard Worker   if (UsedPhysRegMask.test(PhysReg))
507*9880d681SAndroid Build Coastguard Worker     return true;
508*9880d681SAndroid Build Coastguard Worker   const TargetRegisterInfo *TRI = getTargetRegisterInfo();
509*9880d681SAndroid Build Coastguard Worker   for (MCRegAliasIterator AI(PhysReg, TRI, true); AI.isValid(); ++AI) {
510*9880d681SAndroid Build Coastguard Worker     for (const MachineOperand &MO : make_range(def_begin(*AI), def_end())) {
511*9880d681SAndroid Build Coastguard Worker       if (!SkipNoReturnDef && isNoReturnDef(MO))
512*9880d681SAndroid Build Coastguard Worker         continue;
513*9880d681SAndroid Build Coastguard Worker       return true;
514*9880d681SAndroid Build Coastguard Worker     }
515*9880d681SAndroid Build Coastguard Worker   }
516*9880d681SAndroid Build Coastguard Worker   return false;
517*9880d681SAndroid Build Coastguard Worker }
518*9880d681SAndroid Build Coastguard Worker 
isPhysRegUsed(unsigned PhysReg) const519*9880d681SAndroid Build Coastguard Worker bool MachineRegisterInfo::isPhysRegUsed(unsigned PhysReg) const {
520*9880d681SAndroid Build Coastguard Worker   if (UsedPhysRegMask.test(PhysReg))
521*9880d681SAndroid Build Coastguard Worker     return true;
522*9880d681SAndroid Build Coastguard Worker   const TargetRegisterInfo *TRI = getTargetRegisterInfo();
523*9880d681SAndroid Build Coastguard Worker   for (MCRegAliasIterator AliasReg(PhysReg, TRI, true); AliasReg.isValid();
524*9880d681SAndroid Build Coastguard Worker        ++AliasReg) {
525*9880d681SAndroid Build Coastguard Worker     if (!reg_nodbg_empty(*AliasReg))
526*9880d681SAndroid Build Coastguard Worker       return true;
527*9880d681SAndroid Build Coastguard Worker   }
528*9880d681SAndroid Build Coastguard Worker   return false;
529*9880d681SAndroid Build Coastguard Worker }
530