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