1*9880d681SAndroid Build Coastguard Worker //===-- RegisterScavenging.cpp - Machine register scavenging --------------===//
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 /// \file
11*9880d681SAndroid Build Coastguard Worker /// This file implements the machine register scavenger. It can provide
12*9880d681SAndroid Build Coastguard Worker /// information, such as unused registers, at any point in a machine basic
13*9880d681SAndroid Build Coastguard Worker /// block. It also provides a mechanism to make registers available by evicting
14*9880d681SAndroid Build Coastguard Worker /// them to spill slots.
15*9880d681SAndroid Build Coastguard Worker //
16*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/RegisterScavenging.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineBasicBlock.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFrameInfo.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFunction.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineInstr.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineRegisterInfo.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetInstrInfo.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetRegisterInfo.h"
29*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetSubtargetInfo.h"
30*9880d681SAndroid Build Coastguard Worker using namespace llvm;
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "reg-scavenging"
33*9880d681SAndroid Build Coastguard Worker
setRegUsed(unsigned Reg,LaneBitmask LaneMask)34*9880d681SAndroid Build Coastguard Worker void RegScavenger::setRegUsed(unsigned Reg, LaneBitmask LaneMask) {
35*9880d681SAndroid Build Coastguard Worker for (MCRegUnitMaskIterator RUI(Reg, TRI); RUI.isValid(); ++RUI) {
36*9880d681SAndroid Build Coastguard Worker LaneBitmask UnitMask = (*RUI).second;
37*9880d681SAndroid Build Coastguard Worker if (UnitMask == 0 || (LaneMask & UnitMask) != 0)
38*9880d681SAndroid Build Coastguard Worker RegUnitsAvailable.reset((*RUI).first);
39*9880d681SAndroid Build Coastguard Worker }
40*9880d681SAndroid Build Coastguard Worker }
41*9880d681SAndroid Build Coastguard Worker
initRegState()42*9880d681SAndroid Build Coastguard Worker void RegScavenger::initRegState() {
43*9880d681SAndroid Build Coastguard Worker for (SmallVectorImpl<ScavengedInfo>::iterator I = Scavenged.begin(),
44*9880d681SAndroid Build Coastguard Worker IE = Scavenged.end(); I != IE; ++I) {
45*9880d681SAndroid Build Coastguard Worker I->Reg = 0;
46*9880d681SAndroid Build Coastguard Worker I->Restore = nullptr;
47*9880d681SAndroid Build Coastguard Worker }
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker // All register units start out unused.
50*9880d681SAndroid Build Coastguard Worker RegUnitsAvailable.set();
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker // Live-in registers are in use.
53*9880d681SAndroid Build Coastguard Worker for (const auto &LI : MBB->liveins())
54*9880d681SAndroid Build Coastguard Worker setRegUsed(LI.PhysReg, LI.LaneMask);
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker // Pristine CSRs are also unavailable.
57*9880d681SAndroid Build Coastguard Worker const MachineFunction &MF = *MBB->getParent();
58*9880d681SAndroid Build Coastguard Worker BitVector PR = MF.getFrameInfo()->getPristineRegs(MF);
59*9880d681SAndroid Build Coastguard Worker for (int I = PR.find_first(); I>0; I = PR.find_next(I))
60*9880d681SAndroid Build Coastguard Worker setRegUsed(I);
61*9880d681SAndroid Build Coastguard Worker }
62*9880d681SAndroid Build Coastguard Worker
enterBasicBlock(MachineBasicBlock & MBB)63*9880d681SAndroid Build Coastguard Worker void RegScavenger::enterBasicBlock(MachineBasicBlock &MBB) {
64*9880d681SAndroid Build Coastguard Worker MachineFunction &MF = *MBB.getParent();
65*9880d681SAndroid Build Coastguard Worker TII = MF.getSubtarget().getInstrInfo();
66*9880d681SAndroid Build Coastguard Worker TRI = MF.getSubtarget().getRegisterInfo();
67*9880d681SAndroid Build Coastguard Worker MRI = &MF.getRegInfo();
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker assert((NumRegUnits == 0 || NumRegUnits == TRI->getNumRegUnits()) &&
70*9880d681SAndroid Build Coastguard Worker "Target changed?");
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker // It is not possible to use the register scavenger after late optimization
73*9880d681SAndroid Build Coastguard Worker // passes that don't preserve accurate liveness information.
74*9880d681SAndroid Build Coastguard Worker assert(MRI->tracksLiveness() &&
75*9880d681SAndroid Build Coastguard Worker "Cannot use register scavenger with inaccurate liveness");
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker // Self-initialize.
78*9880d681SAndroid Build Coastguard Worker if (!this->MBB) {
79*9880d681SAndroid Build Coastguard Worker NumRegUnits = TRI->getNumRegUnits();
80*9880d681SAndroid Build Coastguard Worker RegUnitsAvailable.resize(NumRegUnits);
81*9880d681SAndroid Build Coastguard Worker KillRegUnits.resize(NumRegUnits);
82*9880d681SAndroid Build Coastguard Worker DefRegUnits.resize(NumRegUnits);
83*9880d681SAndroid Build Coastguard Worker TmpRegUnits.resize(NumRegUnits);
84*9880d681SAndroid Build Coastguard Worker }
85*9880d681SAndroid Build Coastguard Worker this->MBB = &MBB;
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker initRegState();
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker Tracking = false;
90*9880d681SAndroid Build Coastguard Worker }
91*9880d681SAndroid Build Coastguard Worker
addRegUnits(BitVector & BV,unsigned Reg)92*9880d681SAndroid Build Coastguard Worker void RegScavenger::addRegUnits(BitVector &BV, unsigned Reg) {
93*9880d681SAndroid Build Coastguard Worker for (MCRegUnitIterator RUI(Reg, TRI); RUI.isValid(); ++RUI)
94*9880d681SAndroid Build Coastguard Worker BV.set(*RUI);
95*9880d681SAndroid Build Coastguard Worker }
96*9880d681SAndroid Build Coastguard Worker
determineKillsAndDefs()97*9880d681SAndroid Build Coastguard Worker void RegScavenger::determineKillsAndDefs() {
98*9880d681SAndroid Build Coastguard Worker assert(Tracking && "Must be tracking to determine kills and defs");
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker MachineInstr &MI = *MBBI;
101*9880d681SAndroid Build Coastguard Worker assert(!MI.isDebugValue() && "Debug values have no kills or defs");
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker // Find out which registers are early clobbered, killed, defined, and marked
104*9880d681SAndroid Build Coastguard Worker // def-dead in this instruction.
105*9880d681SAndroid Build Coastguard Worker KillRegUnits.reset();
106*9880d681SAndroid Build Coastguard Worker DefRegUnits.reset();
107*9880d681SAndroid Build Coastguard Worker for (const MachineOperand &MO : MI.operands()) {
108*9880d681SAndroid Build Coastguard Worker if (MO.isRegMask()) {
109*9880d681SAndroid Build Coastguard Worker TmpRegUnits.clear();
110*9880d681SAndroid Build Coastguard Worker for (unsigned RU = 0, RUEnd = TRI->getNumRegUnits(); RU != RUEnd; ++RU) {
111*9880d681SAndroid Build Coastguard Worker for (MCRegUnitRootIterator RURI(RU, TRI); RURI.isValid(); ++RURI) {
112*9880d681SAndroid Build Coastguard Worker if (MO.clobbersPhysReg(*RURI)) {
113*9880d681SAndroid Build Coastguard Worker TmpRegUnits.set(RU);
114*9880d681SAndroid Build Coastguard Worker break;
115*9880d681SAndroid Build Coastguard Worker }
116*9880d681SAndroid Build Coastguard Worker }
117*9880d681SAndroid Build Coastguard Worker }
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker // Apply the mask.
120*9880d681SAndroid Build Coastguard Worker KillRegUnits |= TmpRegUnits;
121*9880d681SAndroid Build Coastguard Worker }
122*9880d681SAndroid Build Coastguard Worker if (!MO.isReg())
123*9880d681SAndroid Build Coastguard Worker continue;
124*9880d681SAndroid Build Coastguard Worker unsigned Reg = MO.getReg();
125*9880d681SAndroid Build Coastguard Worker if (!TargetRegisterInfo::isPhysicalRegister(Reg) || isReserved(Reg))
126*9880d681SAndroid Build Coastguard Worker continue;
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker if (MO.isUse()) {
129*9880d681SAndroid Build Coastguard Worker // Ignore undef uses.
130*9880d681SAndroid Build Coastguard Worker if (MO.isUndef())
131*9880d681SAndroid Build Coastguard Worker continue;
132*9880d681SAndroid Build Coastguard Worker if (MO.isKill())
133*9880d681SAndroid Build Coastguard Worker addRegUnits(KillRegUnits, Reg);
134*9880d681SAndroid Build Coastguard Worker } else {
135*9880d681SAndroid Build Coastguard Worker assert(MO.isDef());
136*9880d681SAndroid Build Coastguard Worker if (MO.isDead())
137*9880d681SAndroid Build Coastguard Worker addRegUnits(KillRegUnits, Reg);
138*9880d681SAndroid Build Coastguard Worker else
139*9880d681SAndroid Build Coastguard Worker addRegUnits(DefRegUnits, Reg);
140*9880d681SAndroid Build Coastguard Worker }
141*9880d681SAndroid Build Coastguard Worker }
142*9880d681SAndroid Build Coastguard Worker }
143*9880d681SAndroid Build Coastguard Worker
unprocess()144*9880d681SAndroid Build Coastguard Worker void RegScavenger::unprocess() {
145*9880d681SAndroid Build Coastguard Worker assert(Tracking && "Cannot unprocess because we're not tracking");
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker MachineInstr &MI = *MBBI;
148*9880d681SAndroid Build Coastguard Worker if (!MI.isDebugValue()) {
149*9880d681SAndroid Build Coastguard Worker determineKillsAndDefs();
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker // Commit the changes.
152*9880d681SAndroid Build Coastguard Worker setUsed(KillRegUnits);
153*9880d681SAndroid Build Coastguard Worker setUnused(DefRegUnits);
154*9880d681SAndroid Build Coastguard Worker }
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker if (MBBI == MBB->begin()) {
157*9880d681SAndroid Build Coastguard Worker MBBI = MachineBasicBlock::iterator(nullptr);
158*9880d681SAndroid Build Coastguard Worker Tracking = false;
159*9880d681SAndroid Build Coastguard Worker } else
160*9880d681SAndroid Build Coastguard Worker --MBBI;
161*9880d681SAndroid Build Coastguard Worker }
162*9880d681SAndroid Build Coastguard Worker
forward()163*9880d681SAndroid Build Coastguard Worker void RegScavenger::forward() {
164*9880d681SAndroid Build Coastguard Worker // Move ptr forward.
165*9880d681SAndroid Build Coastguard Worker if (!Tracking) {
166*9880d681SAndroid Build Coastguard Worker MBBI = MBB->begin();
167*9880d681SAndroid Build Coastguard Worker Tracking = true;
168*9880d681SAndroid Build Coastguard Worker } else {
169*9880d681SAndroid Build Coastguard Worker assert(MBBI != MBB->end() && "Already past the end of the basic block!");
170*9880d681SAndroid Build Coastguard Worker MBBI = std::next(MBBI);
171*9880d681SAndroid Build Coastguard Worker }
172*9880d681SAndroid Build Coastguard Worker assert(MBBI != MBB->end() && "Already at the end of the basic block!");
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Worker MachineInstr &MI = *MBBI;
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Worker for (SmallVectorImpl<ScavengedInfo>::iterator I = Scavenged.begin(),
177*9880d681SAndroid Build Coastguard Worker IE = Scavenged.end(); I != IE; ++I) {
178*9880d681SAndroid Build Coastguard Worker if (I->Restore != &MI)
179*9880d681SAndroid Build Coastguard Worker continue;
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Worker I->Reg = 0;
182*9880d681SAndroid Build Coastguard Worker I->Restore = nullptr;
183*9880d681SAndroid Build Coastguard Worker }
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Worker if (MI.isDebugValue())
186*9880d681SAndroid Build Coastguard Worker return;
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker determineKillsAndDefs();
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Worker // Verify uses and defs.
191*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
192*9880d681SAndroid Build Coastguard Worker for (const MachineOperand &MO : MI.operands()) {
193*9880d681SAndroid Build Coastguard Worker if (!MO.isReg())
194*9880d681SAndroid Build Coastguard Worker continue;
195*9880d681SAndroid Build Coastguard Worker unsigned Reg = MO.getReg();
196*9880d681SAndroid Build Coastguard Worker if (!TargetRegisterInfo::isPhysicalRegister(Reg) || isReserved(Reg))
197*9880d681SAndroid Build Coastguard Worker continue;
198*9880d681SAndroid Build Coastguard Worker if (MO.isUse()) {
199*9880d681SAndroid Build Coastguard Worker if (MO.isUndef())
200*9880d681SAndroid Build Coastguard Worker continue;
201*9880d681SAndroid Build Coastguard Worker if (!isRegUsed(Reg)) {
202*9880d681SAndroid Build Coastguard Worker // Check if it's partial live: e.g.
203*9880d681SAndroid Build Coastguard Worker // D0 = insert_subreg D0<undef>, S0
204*9880d681SAndroid Build Coastguard Worker // ... D0
205*9880d681SAndroid Build Coastguard Worker // The problem is the insert_subreg could be eliminated. The use of
206*9880d681SAndroid Build Coastguard Worker // D0 is using a partially undef value. This is not *incorrect* since
207*9880d681SAndroid Build Coastguard Worker // S1 is can be freely clobbered.
208*9880d681SAndroid Build Coastguard Worker // Ideally we would like a way to model this, but leaving the
209*9880d681SAndroid Build Coastguard Worker // insert_subreg around causes both correctness and performance issues.
210*9880d681SAndroid Build Coastguard Worker bool SubUsed = false;
211*9880d681SAndroid Build Coastguard Worker for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
212*9880d681SAndroid Build Coastguard Worker if (isRegUsed(*SubRegs)) {
213*9880d681SAndroid Build Coastguard Worker SubUsed = true;
214*9880d681SAndroid Build Coastguard Worker break;
215*9880d681SAndroid Build Coastguard Worker }
216*9880d681SAndroid Build Coastguard Worker bool SuperUsed = false;
217*9880d681SAndroid Build Coastguard Worker for (MCSuperRegIterator SR(Reg, TRI); SR.isValid(); ++SR) {
218*9880d681SAndroid Build Coastguard Worker if (isRegUsed(*SR)) {
219*9880d681SAndroid Build Coastguard Worker SuperUsed = true;
220*9880d681SAndroid Build Coastguard Worker break;
221*9880d681SAndroid Build Coastguard Worker }
222*9880d681SAndroid Build Coastguard Worker }
223*9880d681SAndroid Build Coastguard Worker if (!SubUsed && !SuperUsed) {
224*9880d681SAndroid Build Coastguard Worker MBB->getParent()->verify(nullptr, "In Register Scavenger");
225*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Using an undefined register!");
226*9880d681SAndroid Build Coastguard Worker }
227*9880d681SAndroid Build Coastguard Worker (void)SubUsed;
228*9880d681SAndroid Build Coastguard Worker (void)SuperUsed;
229*9880d681SAndroid Build Coastguard Worker }
230*9880d681SAndroid Build Coastguard Worker } else {
231*9880d681SAndroid Build Coastguard Worker assert(MO.isDef());
232*9880d681SAndroid Build Coastguard Worker #if 0
233*9880d681SAndroid Build Coastguard Worker // FIXME: Enable this once we've figured out how to correctly transfer
234*9880d681SAndroid Build Coastguard Worker // implicit kills during codegen passes like the coalescer.
235*9880d681SAndroid Build Coastguard Worker assert((KillRegs.test(Reg) || isUnused(Reg) ||
236*9880d681SAndroid Build Coastguard Worker isLiveInButUnusedBefore(Reg, MI, MBB, TRI, MRI)) &&
237*9880d681SAndroid Build Coastguard Worker "Re-defining a live register!");
238*9880d681SAndroid Build Coastguard Worker #endif
239*9880d681SAndroid Build Coastguard Worker }
240*9880d681SAndroid Build Coastguard Worker }
241*9880d681SAndroid Build Coastguard Worker #endif // NDEBUG
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Worker // Commit the changes.
244*9880d681SAndroid Build Coastguard Worker setUnused(KillRegUnits);
245*9880d681SAndroid Build Coastguard Worker setUsed(DefRegUnits);
246*9880d681SAndroid Build Coastguard Worker }
247*9880d681SAndroid Build Coastguard Worker
isRegUsed(unsigned Reg,bool includeReserved) const248*9880d681SAndroid Build Coastguard Worker bool RegScavenger::isRegUsed(unsigned Reg, bool includeReserved) const {
249*9880d681SAndroid Build Coastguard Worker if (includeReserved && isReserved(Reg))
250*9880d681SAndroid Build Coastguard Worker return true;
251*9880d681SAndroid Build Coastguard Worker for (MCRegUnitIterator RUI(Reg, TRI); RUI.isValid(); ++RUI)
252*9880d681SAndroid Build Coastguard Worker if (!RegUnitsAvailable.test(*RUI))
253*9880d681SAndroid Build Coastguard Worker return true;
254*9880d681SAndroid Build Coastguard Worker return false;
255*9880d681SAndroid Build Coastguard Worker }
256*9880d681SAndroid Build Coastguard Worker
FindUnusedReg(const TargetRegisterClass * RC) const257*9880d681SAndroid Build Coastguard Worker unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RC) const {
258*9880d681SAndroid Build Coastguard Worker for (unsigned Reg : *RC) {
259*9880d681SAndroid Build Coastguard Worker if (!isRegUsed(Reg)) {
260*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Scavenger found unused reg: " << TRI->getName(Reg) <<
261*9880d681SAndroid Build Coastguard Worker "\n");
262*9880d681SAndroid Build Coastguard Worker return Reg;
263*9880d681SAndroid Build Coastguard Worker }
264*9880d681SAndroid Build Coastguard Worker }
265*9880d681SAndroid Build Coastguard Worker return 0;
266*9880d681SAndroid Build Coastguard Worker }
267*9880d681SAndroid Build Coastguard Worker
getRegsAvailable(const TargetRegisterClass * RC)268*9880d681SAndroid Build Coastguard Worker BitVector RegScavenger::getRegsAvailable(const TargetRegisterClass *RC) {
269*9880d681SAndroid Build Coastguard Worker BitVector Mask(TRI->getNumRegs());
270*9880d681SAndroid Build Coastguard Worker for (unsigned Reg : *RC)
271*9880d681SAndroid Build Coastguard Worker if (!isRegUsed(Reg))
272*9880d681SAndroid Build Coastguard Worker Mask.set(Reg);
273*9880d681SAndroid Build Coastguard Worker return Mask;
274*9880d681SAndroid Build Coastguard Worker }
275*9880d681SAndroid Build Coastguard Worker
findSurvivorReg(MachineBasicBlock::iterator StartMI,BitVector & Candidates,unsigned InstrLimit,MachineBasicBlock::iterator & UseMI)276*9880d681SAndroid Build Coastguard Worker unsigned RegScavenger::findSurvivorReg(MachineBasicBlock::iterator StartMI,
277*9880d681SAndroid Build Coastguard Worker BitVector &Candidates,
278*9880d681SAndroid Build Coastguard Worker unsigned InstrLimit,
279*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator &UseMI) {
280*9880d681SAndroid Build Coastguard Worker int Survivor = Candidates.find_first();
281*9880d681SAndroid Build Coastguard Worker assert(Survivor > 0 && "No candidates for scavenging");
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator ME = MBB->getFirstTerminator();
284*9880d681SAndroid Build Coastguard Worker assert(StartMI != ME && "MI already at terminator");
285*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator RestorePointMI = StartMI;
286*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator MI = StartMI;
287*9880d681SAndroid Build Coastguard Worker
288*9880d681SAndroid Build Coastguard Worker bool inVirtLiveRange = false;
289*9880d681SAndroid Build Coastguard Worker for (++MI; InstrLimit > 0 && MI != ME; ++MI, --InstrLimit) {
290*9880d681SAndroid Build Coastguard Worker if (MI->isDebugValue()) {
291*9880d681SAndroid Build Coastguard Worker ++InstrLimit; // Don't count debug instructions
292*9880d681SAndroid Build Coastguard Worker continue;
293*9880d681SAndroid Build Coastguard Worker }
294*9880d681SAndroid Build Coastguard Worker bool isVirtKillInsn = false;
295*9880d681SAndroid Build Coastguard Worker bool isVirtDefInsn = false;
296*9880d681SAndroid Build Coastguard Worker // Remove any candidates touched by instruction.
297*9880d681SAndroid Build Coastguard Worker for (const MachineOperand &MO : MI->operands()) {
298*9880d681SAndroid Build Coastguard Worker if (MO.isRegMask())
299*9880d681SAndroid Build Coastguard Worker Candidates.clearBitsNotInMask(MO.getRegMask());
300*9880d681SAndroid Build Coastguard Worker if (!MO.isReg() || MO.isUndef() || !MO.getReg())
301*9880d681SAndroid Build Coastguard Worker continue;
302*9880d681SAndroid Build Coastguard Worker if (TargetRegisterInfo::isVirtualRegister(MO.getReg())) {
303*9880d681SAndroid Build Coastguard Worker if (MO.isDef())
304*9880d681SAndroid Build Coastguard Worker isVirtDefInsn = true;
305*9880d681SAndroid Build Coastguard Worker else if (MO.isKill())
306*9880d681SAndroid Build Coastguard Worker isVirtKillInsn = true;
307*9880d681SAndroid Build Coastguard Worker continue;
308*9880d681SAndroid Build Coastguard Worker }
309*9880d681SAndroid Build Coastguard Worker for (MCRegAliasIterator AI(MO.getReg(), TRI, true); AI.isValid(); ++AI)
310*9880d681SAndroid Build Coastguard Worker Candidates.reset(*AI);
311*9880d681SAndroid Build Coastguard Worker }
312*9880d681SAndroid Build Coastguard Worker // If we're not in a virtual reg's live range, this is a valid
313*9880d681SAndroid Build Coastguard Worker // restore point.
314*9880d681SAndroid Build Coastguard Worker if (!inVirtLiveRange) RestorePointMI = MI;
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Worker // Update whether we're in the live range of a virtual register
317*9880d681SAndroid Build Coastguard Worker if (isVirtKillInsn) inVirtLiveRange = false;
318*9880d681SAndroid Build Coastguard Worker if (isVirtDefInsn) inVirtLiveRange = true;
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Worker // Was our survivor untouched by this instruction?
321*9880d681SAndroid Build Coastguard Worker if (Candidates.test(Survivor))
322*9880d681SAndroid Build Coastguard Worker continue;
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Worker // All candidates gone?
325*9880d681SAndroid Build Coastguard Worker if (Candidates.none())
326*9880d681SAndroid Build Coastguard Worker break;
327*9880d681SAndroid Build Coastguard Worker
328*9880d681SAndroid Build Coastguard Worker Survivor = Candidates.find_first();
329*9880d681SAndroid Build Coastguard Worker }
330*9880d681SAndroid Build Coastguard Worker // If we ran off the end, that's where we want to restore.
331*9880d681SAndroid Build Coastguard Worker if (MI == ME) RestorePointMI = ME;
332*9880d681SAndroid Build Coastguard Worker assert(RestorePointMI != StartMI &&
333*9880d681SAndroid Build Coastguard Worker "No available scavenger restore location!");
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Worker // We ran out of candidates, so stop the search.
336*9880d681SAndroid Build Coastguard Worker UseMI = RestorePointMI;
337*9880d681SAndroid Build Coastguard Worker return Survivor;
338*9880d681SAndroid Build Coastguard Worker }
339*9880d681SAndroid Build Coastguard Worker
getFrameIndexOperandNum(MachineInstr & MI)340*9880d681SAndroid Build Coastguard Worker static unsigned getFrameIndexOperandNum(MachineInstr &MI) {
341*9880d681SAndroid Build Coastguard Worker unsigned i = 0;
342*9880d681SAndroid Build Coastguard Worker while (!MI.getOperand(i).isFI()) {
343*9880d681SAndroid Build Coastguard Worker ++i;
344*9880d681SAndroid Build Coastguard Worker assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
345*9880d681SAndroid Build Coastguard Worker }
346*9880d681SAndroid Build Coastguard Worker return i;
347*9880d681SAndroid Build Coastguard Worker }
348*9880d681SAndroid Build Coastguard Worker
scavengeRegister(const TargetRegisterClass * RC,MachineBasicBlock::iterator I,int SPAdj)349*9880d681SAndroid Build Coastguard Worker unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC,
350*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator I,
351*9880d681SAndroid Build Coastguard Worker int SPAdj) {
352*9880d681SAndroid Build Coastguard Worker MachineInstr &MI = *I;
353*9880d681SAndroid Build Coastguard Worker const MachineFunction &MF = *MI.getParent()->getParent();
354*9880d681SAndroid Build Coastguard Worker // Consider all allocatable registers in the register class initially
355*9880d681SAndroid Build Coastguard Worker BitVector Candidates = TRI->getAllocatableSet(MF, RC);
356*9880d681SAndroid Build Coastguard Worker
357*9880d681SAndroid Build Coastguard Worker // Exclude all the registers being used by the instruction.
358*9880d681SAndroid Build Coastguard Worker for (const MachineOperand &MO : MI.operands()) {
359*9880d681SAndroid Build Coastguard Worker if (MO.isReg() && MO.getReg() != 0 && !(MO.isUse() && MO.isUndef()) &&
360*9880d681SAndroid Build Coastguard Worker !TargetRegisterInfo::isVirtualRegister(MO.getReg()))
361*9880d681SAndroid Build Coastguard Worker Candidates.reset(MO.getReg());
362*9880d681SAndroid Build Coastguard Worker }
363*9880d681SAndroid Build Coastguard Worker
364*9880d681SAndroid Build Coastguard Worker // Try to find a register that's unused if there is one, as then we won't
365*9880d681SAndroid Build Coastguard Worker // have to spill.
366*9880d681SAndroid Build Coastguard Worker BitVector Available = getRegsAvailable(RC);
367*9880d681SAndroid Build Coastguard Worker Available &= Candidates;
368*9880d681SAndroid Build Coastguard Worker if (Available.any())
369*9880d681SAndroid Build Coastguard Worker Candidates = Available;
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Worker // Find the register whose use is furthest away.
372*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator UseMI;
373*9880d681SAndroid Build Coastguard Worker unsigned SReg = findSurvivorReg(I, Candidates, 25, UseMI);
374*9880d681SAndroid Build Coastguard Worker
375*9880d681SAndroid Build Coastguard Worker // If we found an unused register there is no reason to spill it.
376*9880d681SAndroid Build Coastguard Worker if (!isRegUsed(SReg)) {
377*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Scavenged register: " << TRI->getName(SReg) << "\n");
378*9880d681SAndroid Build Coastguard Worker return SReg;
379*9880d681SAndroid Build Coastguard Worker }
380*9880d681SAndroid Build Coastguard Worker
381*9880d681SAndroid Build Coastguard Worker // Find an available scavenging slot with size and alignment matching
382*9880d681SAndroid Build Coastguard Worker // the requirements of the class RC.
383*9880d681SAndroid Build Coastguard Worker const MachineFrameInfo &MFI = *MF.getFrameInfo();
384*9880d681SAndroid Build Coastguard Worker unsigned NeedSize = RC->getSize();
385*9880d681SAndroid Build Coastguard Worker unsigned NeedAlign = RC->getAlignment();
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Worker unsigned SI = Scavenged.size(), Diff = UINT_MAX;
388*9880d681SAndroid Build Coastguard Worker int FIB = MFI.getObjectIndexBegin(), FIE = MFI.getObjectIndexEnd();
389*9880d681SAndroid Build Coastguard Worker for (unsigned I = 0; I < Scavenged.size(); ++I) {
390*9880d681SAndroid Build Coastguard Worker if (Scavenged[I].Reg != 0)
391*9880d681SAndroid Build Coastguard Worker continue;
392*9880d681SAndroid Build Coastguard Worker // Verify that this slot is valid for this register.
393*9880d681SAndroid Build Coastguard Worker int FI = Scavenged[I].FrameIndex;
394*9880d681SAndroid Build Coastguard Worker if (FI < FIB || FI >= FIE)
395*9880d681SAndroid Build Coastguard Worker continue;
396*9880d681SAndroid Build Coastguard Worker unsigned S = MFI.getObjectSize(FI);
397*9880d681SAndroid Build Coastguard Worker unsigned A = MFI.getObjectAlignment(FI);
398*9880d681SAndroid Build Coastguard Worker if (NeedSize > S || NeedAlign > A)
399*9880d681SAndroid Build Coastguard Worker continue;
400*9880d681SAndroid Build Coastguard Worker // Avoid wasting slots with large size and/or large alignment. Pick one
401*9880d681SAndroid Build Coastguard Worker // that is the best fit for this register class (in street metric).
402*9880d681SAndroid Build Coastguard Worker // Picking a larger slot than necessary could happen if a slot for a
403*9880d681SAndroid Build Coastguard Worker // larger register is reserved before a slot for a smaller one. When
404*9880d681SAndroid Build Coastguard Worker // trying to spill a smaller register, the large slot would be found
405*9880d681SAndroid Build Coastguard Worker // first, thus making it impossible to spill the larger register later.
406*9880d681SAndroid Build Coastguard Worker unsigned D = (S-NeedSize) + (A-NeedAlign);
407*9880d681SAndroid Build Coastguard Worker if (D < Diff) {
408*9880d681SAndroid Build Coastguard Worker SI = I;
409*9880d681SAndroid Build Coastguard Worker Diff = D;
410*9880d681SAndroid Build Coastguard Worker }
411*9880d681SAndroid Build Coastguard Worker }
412*9880d681SAndroid Build Coastguard Worker
413*9880d681SAndroid Build Coastguard Worker if (SI == Scavenged.size()) {
414*9880d681SAndroid Build Coastguard Worker // We need to scavenge a register but have no spill slot, the target
415*9880d681SAndroid Build Coastguard Worker // must know how to do it (if not, we'll assert below).
416*9880d681SAndroid Build Coastguard Worker Scavenged.push_back(ScavengedInfo(FIE));
417*9880d681SAndroid Build Coastguard Worker }
418*9880d681SAndroid Build Coastguard Worker
419*9880d681SAndroid Build Coastguard Worker // Avoid infinite regress
420*9880d681SAndroid Build Coastguard Worker Scavenged[SI].Reg = SReg;
421*9880d681SAndroid Build Coastguard Worker
422*9880d681SAndroid Build Coastguard Worker // If the target knows how to save/restore the register, let it do so;
423*9880d681SAndroid Build Coastguard Worker // otherwise, use the emergency stack spill slot.
424*9880d681SAndroid Build Coastguard Worker if (!TRI->saveScavengerRegister(*MBB, I, UseMI, RC, SReg)) {
425*9880d681SAndroid Build Coastguard Worker // Spill the scavenged register before I.
426*9880d681SAndroid Build Coastguard Worker int FI = Scavenged[SI].FrameIndex;
427*9880d681SAndroid Build Coastguard Worker if (FI < FIB || FI >= FIE) {
428*9880d681SAndroid Build Coastguard Worker std::string Msg = std::string("Error while trying to spill ") +
429*9880d681SAndroid Build Coastguard Worker TRI->getName(SReg) + " from class " + TRI->getRegClassName(RC) +
430*9880d681SAndroid Build Coastguard Worker ": Cannot scavenge register without an emergency spill slot!";
431*9880d681SAndroid Build Coastguard Worker report_fatal_error(Msg.c_str());
432*9880d681SAndroid Build Coastguard Worker }
433*9880d681SAndroid Build Coastguard Worker TII->storeRegToStackSlot(*MBB, I, SReg, true, Scavenged[SI].FrameIndex,
434*9880d681SAndroid Build Coastguard Worker RC, TRI);
435*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator II = std::prev(I);
436*9880d681SAndroid Build Coastguard Worker
437*9880d681SAndroid Build Coastguard Worker unsigned FIOperandNum = getFrameIndexOperandNum(*II);
438*9880d681SAndroid Build Coastguard Worker TRI->eliminateFrameIndex(II, SPAdj, FIOperandNum, this);
439*9880d681SAndroid Build Coastguard Worker
440*9880d681SAndroid Build Coastguard Worker // Restore the scavenged register before its use (or first terminator).
441*9880d681SAndroid Build Coastguard Worker TII->loadRegFromStackSlot(*MBB, UseMI, SReg, Scavenged[SI].FrameIndex,
442*9880d681SAndroid Build Coastguard Worker RC, TRI);
443*9880d681SAndroid Build Coastguard Worker II = std::prev(UseMI);
444*9880d681SAndroid Build Coastguard Worker
445*9880d681SAndroid Build Coastguard Worker FIOperandNum = getFrameIndexOperandNum(*II);
446*9880d681SAndroid Build Coastguard Worker TRI->eliminateFrameIndex(II, SPAdj, FIOperandNum, this);
447*9880d681SAndroid Build Coastguard Worker }
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Worker Scavenged[SI].Restore = &*std::prev(UseMI);
450*9880d681SAndroid Build Coastguard Worker
451*9880d681SAndroid Build Coastguard Worker // Doing this here leads to infinite regress.
452*9880d681SAndroid Build Coastguard Worker // Scavenged[SI].Reg = SReg;
453*9880d681SAndroid Build Coastguard Worker
454*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Scavenged register (with spill): " << TRI->getName(SReg) <<
455*9880d681SAndroid Build Coastguard Worker "\n");
456*9880d681SAndroid Build Coastguard Worker
457*9880d681SAndroid Build Coastguard Worker return SReg;
458*9880d681SAndroid Build Coastguard Worker }
459