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