RegisterScavenging.cpp revision 1dc7869025d91906e8305e921ddb82dac780d70e
1//===-- RegisterScavenging.cpp - Machine register scavenging --------------===//
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// This file implements the machine register scavenger. It can provide
11// information, such as unused registers, at any point in a machine basic block.
12// It also provides a mechanism to make registers available by evicting them to
13// spill slots.
14//
15//===----------------------------------------------------------------------===//
16
17#define DEBUG_TYPE "reg-scavenging"
18#include "llvm/CodeGen/RegisterScavenging.h"
19#include "llvm/CodeGen/MachineFunction.h"
20#include "llvm/CodeGen/MachineBasicBlock.h"
21#include "llvm/CodeGen/MachineInstr.h"
22#include "llvm/CodeGen/MachineRegisterInfo.h"
23#include "llvm/Target/TargetRegisterInfo.h"
24#include "llvm/Target/TargetInstrInfo.h"
25#include "llvm/Target/TargetMachine.h"
26#include "llvm/ADT/SmallPtrSet.h"
27#include "llvm/ADT/STLExtras.h"
28using namespace llvm;
29
30/// RedefinesSuperRegPart - Return true if the specified register is redefining
31/// part of a super-register.
32static bool RedefinesSuperRegPart(const MachineInstr *MI, unsigned SubReg,
33                                  const TargetRegisterInfo *TRI) {
34  bool SeenSuperUse = false;
35  bool SeenSuperDef = false;
36  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
37    const MachineOperand &MO = MI->getOperand(i);
38    if (!MO.isRegister())
39      continue;
40    if (TRI->isSuperRegister(SubReg, MO.getReg()))
41      if (MO.isUse())
42        SeenSuperUse = true;
43      else if (MO.isImplicit())
44        SeenSuperDef = true;
45  }
46
47  return SeenSuperDef && SeenSuperUse;
48}
49
50static bool RedefinesSuperRegPart(const MachineInstr *MI,
51                                  const MachineOperand &MO,
52                                  const TargetRegisterInfo *TRI) {
53  assert(MO.isRegister() && MO.isDef() && "Not a register def!");
54  return RedefinesSuperRegPart(MI, MO.getReg(), TRI);
55}
56
57/// setUsed - Set the register and its sub-registers as being used.
58void RegScavenger::setUsed(unsigned Reg) {
59  RegsAvailable.reset(Reg);
60
61  for (const unsigned *SubRegs = TRI->getSubRegisters(Reg);
62       unsigned SubReg = *SubRegs; ++SubRegs)
63    RegsAvailable.reset(SubReg);
64}
65
66/// setUnused - Set the register and its sub-registers as being unused.
67void RegScavenger::setUnused(unsigned Reg, const MachineInstr *MI) {
68  RegsAvailable.set(Reg);
69
70  for (const unsigned *SubRegs = TRI->getSubRegisters(Reg);
71       unsigned SubReg = *SubRegs; ++SubRegs)
72    if (!RedefinesSuperRegPart(MI, Reg, TRI))
73      RegsAvailable.set(SubReg);
74}
75
76void RegScavenger::enterBasicBlock(MachineBasicBlock *mbb) {
77  const MachineFunction &MF = *mbb->getParent();
78  const TargetMachine &TM = MF.getTarget();
79  TII = TM.getInstrInfo();
80  TRI = TM.getRegisterInfo();
81  MRI = &MF.getRegInfo();
82
83  assert((NumPhysRegs == 0 || NumPhysRegs == TRI->getNumRegs()) &&
84         "Target changed?");
85
86  if (!MBB) {
87    NumPhysRegs = TRI->getNumRegs();
88    RegsAvailable.resize(NumPhysRegs);
89
90    // Create reserved registers bitvector.
91    ReservedRegs = TRI->getReservedRegs(MF);
92
93    // Create callee-saved registers bitvector.
94    CalleeSavedRegs.resize(NumPhysRegs);
95    const unsigned *CSRegs = TRI->getCalleeSavedRegs();
96    if (CSRegs != NULL)
97      for (unsigned i = 0; CSRegs[i]; ++i)
98        CalleeSavedRegs.set(CSRegs[i]);
99  }
100
101  MBB = mbb;
102  ScavengedReg = 0;
103  ScavengedRC = NULL;
104
105  // All registers started out unused.
106  RegsAvailable.set();
107
108  // Reserved registers are always used.
109  RegsAvailable ^= ReservedRegs;
110
111  // Live-in registers are in use.
112  if (!MBB->livein_empty())
113    for (MachineBasicBlock::const_livein_iterator I = MBB->livein_begin(),
114           E = MBB->livein_end(); I != E; ++I)
115      setUsed(*I);
116
117  Tracking = false;
118}
119
120void RegScavenger::restoreScavengedReg() {
121  if (!ScavengedReg)
122    return;
123
124  TII->loadRegFromStackSlot(*MBB, MBBI, ScavengedReg,
125                            ScavengingFrameIndex, ScavengedRC);
126  MachineBasicBlock::iterator II = prior(MBBI);
127  TRI->eliminateFrameIndex(II, 0, this);
128  setUsed(ScavengedReg);
129  ScavengedReg = 0;
130  ScavengedRC = NULL;
131}
132
133/// isLiveInButUnusedBefore - Return true if register is livein the MBB not
134/// not used before it reaches the MI that defines register.
135static bool isLiveInButUnusedBefore(unsigned Reg, MachineInstr *MI,
136                                    MachineBasicBlock *MBB,
137                                    const TargetRegisterInfo *TRI,
138                                    MachineRegisterInfo* MRI) {
139  // First check if register is livein.
140  bool isLiveIn = false;
141  for (MachineBasicBlock::const_livein_iterator I = MBB->livein_begin(),
142         E = MBB->livein_end(); I != E; ++I)
143    if (Reg == *I || TRI->isSuperRegister(Reg, *I)) {
144      isLiveIn = true;
145      break;
146    }
147  if (!isLiveIn)
148    return false;
149
150  // Is there any use of it before the specified MI?
151  SmallPtrSet<MachineInstr*, 4> UsesInMBB;
152  for (MachineRegisterInfo::use_iterator UI = MRI->use_begin(Reg),
153         UE = MRI->use_end(); UI != UE; ++UI) {
154    MachineInstr *UseMI = &*UI;
155    if (UseMI->getParent() == MBB)
156      UsesInMBB.insert(UseMI);
157  }
158  if (UsesInMBB.empty())
159    return true;
160
161  for (MachineBasicBlock::iterator I = MBB->begin(), E = MI; I != E; ++I)
162    if (UsesInMBB.count(&*I))
163      return false;
164  return true;
165}
166
167void RegScavenger::forward() {
168  // Move ptr forward.
169  if (!Tracking) {
170    MBBI = MBB->begin();
171    Tracking = true;
172  } else {
173    assert(MBBI != MBB->end() && "Already at the end of the basic block!");
174    MBBI = next(MBBI);
175  }
176
177  MachineInstr *MI = MBBI;
178  const TargetInstrDesc &TID = MI->getDesc();
179
180  // Reaching a terminator instruction. Restore a scavenged register (which
181  // must be life out.
182  if (TID.isTerminator())
183    restoreScavengedReg();
184
185  // Process uses first.
186  BitVector ChangedRegs(NumPhysRegs);
187  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
188    const MachineOperand &MO = MI->getOperand(i);
189    if (!MO.isRegister() || !MO.isUse())
190      continue;
191
192    unsigned Reg = MO.getReg();
193    if (Reg == 0) continue;
194
195    if (!isUsed(Reg)) {
196      // Register has been scavenged. Restore it!
197      if (Reg != ScavengedReg)
198        assert(false && "Using an undefined register!");
199      else
200        restoreScavengedReg();
201    }
202
203    if (MO.isKill() && !isReserved(Reg)) {
204      ChangedRegs.set(Reg);
205
206      // Mark sub-registers as changed if they aren't defined in the same
207      // instruction.
208      for (const unsigned *SubRegs = TRI->getSubRegisters(Reg);
209           unsigned SubReg = *SubRegs; ++SubRegs)
210        ChangedRegs.set(SubReg);
211    }
212  }
213
214  // Change states of all registers after all the uses are processed to guard
215  // against multiple uses.
216  setUnused(ChangedRegs);
217
218  // Process defs.
219  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
220    const MachineOperand &MO = MI->getOperand(i);
221
222    if (!MO.isRegister() || !MO.isDef())
223      continue;
224
225    unsigned Reg = MO.getReg();
226
227    // If it's dead upon def, then it is now free.
228    if (MO.isDead()) {
229      setUnused(Reg, MI);
230      continue;
231    }
232
233    // Skip two-address destination operand.
234    if (TID.findTiedToSrcOperand(i) != -1) {
235      assert(isUsed(Reg) && "Using an undefined register!");
236      continue;
237    }
238
239    // Skip is this is merely redefining part of a super-register.
240    if (RedefinesSuperRegPart(MI, MO, TRI))
241      continue;
242
243    // Implicit def is allowed to "re-define" any register.
244    assert((isReserved(Reg) || isUnused(Reg) ||
245            MI->getOpcode() == TargetInstrInfo::IMPLICIT_DEF ||
246            isLiveInButUnusedBefore(Reg, MI, MBB, TRI, MRI)) &&
247           "Re-defining a live register!");
248    setUsed(Reg);
249  }
250}
251
252void RegScavenger::backward() {
253  assert(Tracking && "Not tracking states!");
254  assert(MBBI != MBB->begin() && "Already at start of basic block!");
255  // Move ptr backward.
256  MBBI = prior(MBBI);
257
258  MachineInstr *MI = MBBI;
259  // Process defs first.
260  const TargetInstrDesc &TID = MI->getDesc();
261  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
262    const MachineOperand &MO = MI->getOperand(i);
263    if (!MO.isRegister() || !MO.isDef())
264      continue;
265    // Skip two-address destination operand.
266    if (TID.findTiedToSrcOperand(i) != -1)
267      continue;
268    unsigned Reg = MO.getReg();
269    assert(isUsed(Reg));
270    if (!isReserved(Reg))
271      setUnused(Reg, MI);
272  }
273
274  // Process uses.
275  BitVector ChangedRegs(NumPhysRegs);
276  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
277    const MachineOperand &MO = MI->getOperand(i);
278    if (!MO.isRegister() || !MO.isUse())
279      continue;
280    unsigned Reg = MO.getReg();
281    if (Reg == 0)
282      continue;
283    assert(isUnused(Reg) || isReserved(Reg));
284    ChangedRegs.set(Reg);
285
286    // Set the sub-registers as "used".
287    for (const unsigned *SubRegs = TRI->getSubRegisters(Reg);
288         unsigned SubReg = *SubRegs; ++SubRegs)
289      ChangedRegs.set(SubReg);
290  }
291  setUsed(ChangedRegs);
292}
293
294void RegScavenger::getRegsUsed(BitVector &used, bool includeReserved) {
295  if (includeReserved)
296    used = ~RegsAvailable;
297  else
298    used = ~RegsAvailable & ~ReservedRegs;
299}
300
301/// CreateRegClassMask - Set the bits that represent the registers in the
302/// TargetRegisterClass.
303static void CreateRegClassMask(const TargetRegisterClass *RC, BitVector &Mask) {
304  for (TargetRegisterClass::iterator I = RC->begin(), E = RC->end(); I != E;
305       ++I)
306    Mask.set(*I);
307}
308
309unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RegClass,
310                                     const BitVector &Candidates) const {
311  // Mask off the registers which are not in the TargetRegisterClass.
312  BitVector RegsAvailableCopy(NumPhysRegs, false);
313  CreateRegClassMask(RegClass, RegsAvailableCopy);
314  RegsAvailableCopy &= RegsAvailable;
315
316  // Restrict the search to candidates.
317  RegsAvailableCopy &= Candidates;
318
319  // Returns the first unused (bit is set) register, or 0 is none is found.
320  int Reg = RegsAvailableCopy.find_first();
321  return (Reg == -1) ? 0 : Reg;
322}
323
324unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RegClass,
325                                     bool ExCalleeSaved) const {
326  // Mask off the registers which are not in the TargetRegisterClass.
327  BitVector RegsAvailableCopy(NumPhysRegs, false);
328  CreateRegClassMask(RegClass, RegsAvailableCopy);
329  RegsAvailableCopy &= RegsAvailable;
330
331  // If looking for a non-callee-saved register, mask off all the callee-saved
332  // registers.
333  if (ExCalleeSaved)
334    RegsAvailableCopy &= ~CalleeSavedRegs;
335
336  // Returns the first unused (bit is set) register, or 0 is none is found.
337  int Reg = RegsAvailableCopy.find_first();
338  return (Reg == -1) ? 0 : Reg;
339}
340
341/// calcDistanceToUse - Calculate the distance to the first use of the
342/// specified register.
343static unsigned calcDistanceToUse(MachineBasicBlock *MBB,
344                                  MachineBasicBlock::iterator I, unsigned Reg,
345                                  const TargetRegisterInfo *TRI) {
346  unsigned Dist = 0;
347  I = next(I);
348  while (I != MBB->end()) {
349    Dist++;
350    if (I->readsRegister(Reg, TRI))
351        return Dist;
352    I = next(I);
353  }
354  return Dist + 1;
355}
356
357unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC,
358                                        MachineBasicBlock::iterator I,
359                                        int SPAdj) {
360  assert(ScavengingFrameIndex >= 0 &&
361         "Cannot scavenge a register without an emergency spill slot!");
362
363  // Mask off the registers which are not in the TargetRegisterClass.
364  BitVector Candidates(NumPhysRegs, false);
365  CreateRegClassMask(RC, Candidates);
366  Candidates ^= ReservedRegs;  // Do not include reserved registers.
367
368  // Exclude all the registers being used by the instruction.
369  for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) {
370    MachineOperand &MO = I->getOperand(i);
371    if (MO.isRegister())
372      Candidates.reset(MO.getReg());
373  }
374
375  // Find the register whose use is furthest away.
376  unsigned SReg = 0;
377  unsigned MaxDist = 0;
378  int Reg = Candidates.find_first();
379  while (Reg != -1) {
380    unsigned Dist = calcDistanceToUse(MBB, I, Reg, TRI);
381    if (Dist >= MaxDist) {
382      MaxDist = Dist;
383      SReg = Reg;
384    }
385    Reg = Candidates.find_next(Reg);
386  }
387
388  if (ScavengedReg != 0) {
389    // First restore previously scavenged register.
390    TII->loadRegFromStackSlot(*MBB, I, ScavengedReg,
391                              ScavengingFrameIndex, ScavengedRC);
392    MachineBasicBlock::iterator II = prior(I);
393    TRI->eliminateFrameIndex(II, SPAdj, this);
394  }
395
396  TII->storeRegToStackSlot(*MBB, I, SReg, true, ScavengingFrameIndex, RC);
397  MachineBasicBlock::iterator II = prior(I);
398  TRI->eliminateFrameIndex(II, SPAdj, this);
399  ScavengedReg = SReg;
400  ScavengedRC = RC;
401
402  return SReg;
403}
404