RegisterScavenging.cpp revision 159abc0158542e0a7fe3a1200e93df0af32e163c
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/Support/ErrorHandling.h"
24#include "llvm/Target/TargetRegisterInfo.h"
25#include "llvm/Target/TargetInstrInfo.h"
26#include "llvm/Target/TargetMachine.h"
27#include "llvm/ADT/SmallPtrSet.h"
28#include "llvm/ADT/SmallVector.h"
29#include "llvm/ADT/STLExtras.h"
30using namespace llvm;
31
32/// RedefinesSuperRegPart - Return true if the specified register is redefining
33/// part of a super-register.
34static bool RedefinesSuperRegPart(const MachineInstr *MI, unsigned SubReg,
35                                  const TargetRegisterInfo *TRI) {
36  bool SeenSuperUse = false;
37  bool SeenSuperDef = false;
38  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
39    const MachineOperand &MO = MI->getOperand(i);
40    if (!MO.isReg() || MO.isUndef())
41      continue;
42    if (TRI->isSuperRegister(SubReg, MO.getReg())) {
43      if (MO.isUse())
44        SeenSuperUse = true;
45      else if (MO.isImplicit())
46        SeenSuperDef = true;
47    }
48  }
49
50  return SeenSuperDef && SeenSuperUse;
51}
52
53static bool RedefinesSuperRegPart(const MachineInstr *MI,
54                                  const MachineOperand &MO,
55                                  const TargetRegisterInfo *TRI) {
56  assert(MO.isReg() && MO.isDef() && "Not a register def!");
57  return RedefinesSuperRegPart(MI, MO.getReg(), TRI);
58}
59
60bool RegScavenger::isSuperRegUsed(unsigned Reg) const {
61  for (const unsigned *SuperRegs = TRI->getSuperRegisters(Reg);
62       unsigned SuperReg = *SuperRegs; ++SuperRegs)
63    if (isUsed(SuperReg))
64      return true;
65  return false;
66}
67
68/// setUsed - Set the register and its sub-registers as being used.
69void RegScavenger::setUsed(unsigned Reg) {
70  RegsAvailable.reset(Reg);
71
72  for (const unsigned *SubRegs = TRI->getSubRegisters(Reg);
73       unsigned SubReg = *SubRegs; ++SubRegs)
74    RegsAvailable.reset(SubReg);
75}
76
77/// setUnused - Set the register and its sub-registers as being unused.
78void RegScavenger::setUnused(unsigned Reg, const MachineInstr *MI) {
79  RegsAvailable.set(Reg);
80
81  for (const unsigned *SubRegs = TRI->getSubRegisters(Reg);
82       unsigned SubReg = *SubRegs; ++SubRegs)
83    if (!RedefinesSuperRegPart(MI, Reg, TRI))
84      RegsAvailable.set(SubReg);
85}
86
87void RegScavenger::enterBasicBlock(MachineBasicBlock *mbb) {
88  MachineFunction &MF = *mbb->getParent();
89  const TargetMachine &TM = MF.getTarget();
90  TII = TM.getInstrInfo();
91  TRI = TM.getRegisterInfo();
92  MRI = &MF.getRegInfo();
93
94  assert((NumPhysRegs == 0 || NumPhysRegs == TRI->getNumRegs()) &&
95         "Target changed?");
96
97  if (!MBB) {
98    NumPhysRegs = TRI->getNumRegs();
99    RegsAvailable.resize(NumPhysRegs);
100
101    // Create reserved registers bitvector.
102    ReservedRegs = TRI->getReservedRegs(MF);
103
104    // Create callee-saved registers bitvector.
105    CalleeSavedRegs.resize(NumPhysRegs);
106    const unsigned *CSRegs = TRI->getCalleeSavedRegs();
107    if (CSRegs != NULL)
108      for (unsigned i = 0; CSRegs[i]; ++i)
109        CalleeSavedRegs.set(CSRegs[i]);
110  }
111
112  MBB = mbb;
113  ScavengedReg = 0;
114  ScavengedRC = NULL;
115  ScavengeRestore = NULL;
116  CurrDist = 0;
117  DistanceMap.clear();
118
119  // All registers started out unused.
120  RegsAvailable.set();
121
122  // Reserved registers are always used.
123  RegsAvailable ^= ReservedRegs;
124
125  // Live-in registers are in use.
126  if (!MBB->livein_empty())
127    for (MachineBasicBlock::const_livein_iterator I = MBB->livein_begin(),
128           E = MBB->livein_end(); I != E; ++I)
129      setUsed(*I);
130
131  Tracking = false;
132}
133
134void RegScavenger::restoreScavengedReg() {
135  TII->loadRegFromStackSlot(*MBB, MBBI, ScavengedReg,
136                            ScavengingFrameIndex, ScavengedRC);
137  MachineBasicBlock::iterator II = prior(MBBI);
138  TRI->eliminateFrameIndex(II, 0, this);
139  setUsed(ScavengedReg);
140  ScavengedReg = 0;
141  ScavengedRC = NULL;
142}
143
144#ifndef NDEBUG
145/// isLiveInButUnusedBefore - Return true if register is livein the MBB not
146/// not used before it reaches the MI that defines register.
147static bool isLiveInButUnusedBefore(unsigned Reg, MachineInstr *MI,
148                                    MachineBasicBlock *MBB,
149                                    const TargetRegisterInfo *TRI,
150                                    MachineRegisterInfo* MRI) {
151  // First check if register is livein.
152  bool isLiveIn = false;
153  for (MachineBasicBlock::const_livein_iterator I = MBB->livein_begin(),
154         E = MBB->livein_end(); I != E; ++I)
155    if (Reg == *I || TRI->isSuperRegister(Reg, *I)) {
156      isLiveIn = true;
157      break;
158    }
159  if (!isLiveIn)
160    return false;
161
162  // Is there any use of it before the specified MI?
163  SmallPtrSet<MachineInstr*, 4> UsesInMBB;
164  for (MachineRegisterInfo::use_iterator UI = MRI->use_begin(Reg),
165         UE = MRI->use_end(); UI != UE; ++UI) {
166    MachineOperand &UseMO = UI.getOperand();
167    if (UseMO.isReg() && UseMO.isUndef())
168      continue;
169    MachineInstr *UseMI = &*UI;
170    if (UseMI->getParent() == MBB)
171      UsesInMBB.insert(UseMI);
172  }
173  if (UsesInMBB.empty())
174    return true;
175
176  for (MachineBasicBlock::iterator I = MBB->begin(), E = MI; I != E; ++I)
177    if (UsesInMBB.count(&*I))
178      return false;
179  return true;
180}
181#endif
182
183void RegScavenger::forward() {
184  // Move ptr forward.
185  if (!Tracking) {
186    MBBI = MBB->begin();
187    Tracking = true;
188  } else {
189    assert(MBBI != MBB->end() && "Already at the end of the basic block!");
190    MBBI = next(MBBI);
191  }
192
193  MachineInstr *MI = MBBI;
194  DistanceMap.insert(std::make_pair(MI, CurrDist++));
195
196  if (MI == ScavengeRestore) {
197    ScavengedReg = 0;
198    ScavengedRC = NULL;
199    ScavengeRestore = NULL;
200  }
201
202#if 0
203  if (MI->getOpcode() == TargetInstrInfo::IMPLICIT_DEF)
204    return;
205#endif
206
207  // Separate register operands into 3 classes: uses, defs, earlyclobbers.
208  SmallVector<std::pair<const MachineOperand*,unsigned>, 4> UseMOs;
209  SmallVector<std::pair<const MachineOperand*,unsigned>, 4> DefMOs;
210  SmallVector<std::pair<const MachineOperand*,unsigned>, 4> EarlyClobberMOs;
211  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
212    const MachineOperand &MO = MI->getOperand(i);
213    if (!MO.isReg() || MO.getReg() == 0 || MO.isUndef())
214      continue;
215    if (MO.isUse())
216      UseMOs.push_back(std::make_pair(&MO,i));
217    else if (MO.isEarlyClobber())
218      EarlyClobberMOs.push_back(std::make_pair(&MO,i));
219    else
220      DefMOs.push_back(std::make_pair(&MO,i));
221  }
222
223  // Process uses first.
224  BitVector KillRegs(NumPhysRegs);
225  for (unsigned i = 0, e = UseMOs.size(); i != e; ++i) {
226    const MachineOperand MO = *UseMOs[i].first;
227    unsigned Reg = MO.getReg();
228
229    assert((MO.isImplicit() || isUsed(Reg)) && "Using an undefined register!");
230
231    if (MO.isKill() && !isReserved(Reg)) {
232      KillRegs.set(Reg);
233
234      // Mark sub-registers as used.
235      for (const unsigned *SubRegs = TRI->getSubRegisters(Reg);
236           unsigned SubReg = *SubRegs; ++SubRegs)
237        KillRegs.set(SubReg);
238    }
239  }
240
241  // Change states of all registers after all the uses are processed to guard
242  // against multiple uses.
243  setUnused(KillRegs);
244
245  // Process early clobber defs then process defs. We can have a early clobber
246  // that is dead, it should not conflict with a def that happens one "slot"
247  // (see InstrSlots in LiveIntervalAnalysis.h) later.
248  unsigned NumECs = EarlyClobberMOs.size();
249  unsigned NumDefs = DefMOs.size();
250
251  for (unsigned i = 0, e = NumECs + NumDefs; i != e; ++i) {
252    const MachineOperand &MO = (i < NumECs)
253      ? *EarlyClobberMOs[i].first : *DefMOs[i-NumECs].first;
254    unsigned Idx = (i < NumECs)
255      ? EarlyClobberMOs[i].second : DefMOs[i-NumECs].second;
256    unsigned Reg = MO.getReg();
257    if (MO.isUndef())
258      continue;
259
260    // If it's dead upon def, then it is now free.
261    if (MO.isDead()) {
262      setUnused(Reg, MI);
263      continue;
264    }
265
266    // Skip two-address destination operand.
267    unsigned UseIdx;
268    if (MI->isRegTiedToUseOperand(Idx, &UseIdx) &&
269        !MI->getOperand(UseIdx).isUndef()) {
270      assert(isUsed(Reg) && "Using an undefined register!");
271      continue;
272    }
273
274    // Skip if this is merely redefining part of a super-register.
275    if (RedefinesSuperRegPart(MI, MO, TRI))
276      continue;
277
278    // Implicit def is allowed to "re-define" any register. Similarly,
279    // implicitly defined registers can be clobbered.
280    assert((MO.isImplicit() || isReserved(Reg) || isUnused(Reg) ||
281            isSuperRegUsed(Reg) ||
282            isLiveInButUnusedBefore(Reg, MI, MBB, TRI, MRI)) &&
283           "Re-defining a live register!");
284    setUsed(Reg);
285  }
286}
287
288void RegScavenger::backward() {
289  assert(Tracking && "Not tracking states!");
290  assert(MBBI != MBB->begin() && "Already at start of basic block!");
291  // Move ptr backward.
292  MBBI = prior(MBBI);
293
294  MachineInstr *MI = MBBI;
295  DistanceMap.erase(MI);
296  --CurrDist;
297
298  // Separate register operands into 3 classes: uses, defs, earlyclobbers.
299  SmallVector<std::pair<const MachineOperand*,unsigned>, 4> UseMOs;
300  SmallVector<std::pair<const MachineOperand*,unsigned>, 4> DefMOs;
301  SmallVector<std::pair<const MachineOperand*,unsigned>, 4> EarlyClobberMOs;
302  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
303    const MachineOperand &MO = MI->getOperand(i);
304    if (!MO.isReg() || MO.getReg() == 0 || MO.isUndef())
305      continue;
306    if (MO.isUse())
307      UseMOs.push_back(std::make_pair(&MO,i));
308    else if (MO.isEarlyClobber())
309      EarlyClobberMOs.push_back(std::make_pair(&MO,i));
310    else
311      DefMOs.push_back(std::make_pair(&MO,i));
312  }
313
314
315  // Process defs first.
316  unsigned NumECs = EarlyClobberMOs.size();
317  unsigned NumDefs = DefMOs.size();
318  for (unsigned i = 0, e = NumECs + NumDefs; i != e; ++i) {
319    const MachineOperand &MO = (i < NumDefs)
320      ? *DefMOs[i].first : *EarlyClobberMOs[i-NumDefs].first;
321    unsigned Idx = (i < NumECs)
322      ? DefMOs[i].second : EarlyClobberMOs[i-NumDefs].second;
323    if (MO.isUndef())
324      continue;
325
326    // Skip two-address destination operand.
327    if (MI->isRegTiedToUseOperand(Idx))
328      continue;
329
330    unsigned Reg = MO.getReg();
331    assert(isUsed(Reg));
332    if (!isReserved(Reg))
333      setUnused(Reg, MI);
334  }
335
336  // Process uses.
337  BitVector UseRegs(NumPhysRegs);
338  for (unsigned i = 0, e = UseMOs.size(); i != e; ++i) {
339    const MachineOperand MO = *UseMOs[i].first;
340    unsigned Reg = MO.getReg();
341    assert(isUnused(Reg) || isReserved(Reg));
342    UseRegs.set(Reg);
343
344    // Set the sub-registers as "used".
345    for (const unsigned *SubRegs = TRI->getSubRegisters(Reg);
346         unsigned SubReg = *SubRegs; ++SubRegs)
347      UseRegs.set(SubReg);
348  }
349  setUsed(UseRegs);
350}
351
352void RegScavenger::getRegsUsed(BitVector &used, bool includeReserved) {
353  if (includeReserved)
354    used = ~RegsAvailable;
355  else
356    used = ~RegsAvailable & ~ReservedRegs;
357}
358
359/// CreateRegClassMask - Set the bits that represent the registers in the
360/// TargetRegisterClass.
361static void CreateRegClassMask(const TargetRegisterClass *RC, BitVector &Mask) {
362  for (TargetRegisterClass::iterator I = RC->begin(), E = RC->end(); I != E;
363       ++I)
364    Mask.set(*I);
365}
366
367unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RegClass,
368                                     const BitVector &Candidates) const {
369  // Mask off the registers which are not in the TargetRegisterClass.
370  BitVector RegsAvailableCopy(NumPhysRegs, false);
371  CreateRegClassMask(RegClass, RegsAvailableCopy);
372  RegsAvailableCopy &= RegsAvailable;
373
374  // Restrict the search to candidates.
375  RegsAvailableCopy &= Candidates;
376
377  // Returns the first unused (bit is set) register, or 0 is none is found.
378  int Reg = RegsAvailableCopy.find_first();
379  return (Reg == -1) ? 0 : Reg;
380}
381
382unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RegClass,
383                                     bool ExCalleeSaved) const {
384  // Mask off the registers which are not in the TargetRegisterClass.
385  BitVector RegsAvailableCopy(NumPhysRegs, false);
386  CreateRegClassMask(RegClass, RegsAvailableCopy);
387  RegsAvailableCopy &= RegsAvailable;
388
389  // If looking for a non-callee-saved register, mask off all the callee-saved
390  // registers.
391  if (ExCalleeSaved)
392    RegsAvailableCopy &= ~CalleeSavedRegs;
393
394  // Returns the first unused (bit is set) register, or 0 is none is found.
395  int Reg = RegsAvailableCopy.find_first();
396  return (Reg == -1) ? 0 : Reg;
397}
398
399/// findFirstUse - Calculate the distance to the first use of the
400/// specified register.
401MachineInstr*
402RegScavenger::findFirstUse(MachineBasicBlock *MBB,
403                           MachineBasicBlock::iterator I, unsigned Reg,
404                           unsigned &Dist) {
405  MachineInstr *UseMI = 0;
406  Dist = ~0U;
407  for (MachineRegisterInfo::reg_iterator RI = MRI->reg_begin(Reg),
408         RE = MRI->reg_end(); RI != RE; ++RI) {
409    MachineInstr *UDMI = &*RI;
410    if (UDMI->getParent() != MBB)
411      continue;
412    DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.find(UDMI);
413    if (DI == DistanceMap.end()) {
414      // If it's not in map, it's below current MI, let's initialize the
415      // map.
416      I = next(I);
417      unsigned Dist = CurrDist + 1;
418      while (I != MBB->end()) {
419        DistanceMap.insert(std::make_pair(I, Dist++));
420        I = next(I);
421      }
422    }
423    DI = DistanceMap.find(UDMI);
424    if (DI->second > CurrDist && DI->second < Dist) {
425      Dist = DI->second;
426      UseMI = UDMI;
427    }
428  }
429  return UseMI;
430}
431
432unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC,
433                                        MachineBasicBlock::iterator I,
434                                        int SPAdj) {
435  assert(ScavengingFrameIndex >= 0 &&
436         "Cannot scavenge a register without an emergency spill slot!");
437
438  // Mask off the registers which are not in the TargetRegisterClass.
439  BitVector Candidates(NumPhysRegs, false);
440  CreateRegClassMask(RC, Candidates);
441  Candidates ^= ReservedRegs & Candidates; // Do not include reserved registers.
442
443  // Exclude all the registers being used by the instruction.
444  for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) {
445    MachineOperand &MO = I->getOperand(i);
446    if (MO.isReg())
447      Candidates.reset(MO.getReg());
448  }
449
450  // Find the register whose use is furthest away.
451  unsigned SReg = 0;
452  unsigned MaxDist = 0;
453  MachineInstr *MaxUseMI = 0;
454  int Reg = Candidates.find_first();
455  while (Reg != -1) {
456    unsigned Dist;
457    MachineInstr *UseMI = findFirstUse(MBB, I, Reg, Dist);
458    for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS) {
459      unsigned AsDist;
460      MachineInstr *AsUseMI = findFirstUse(MBB, I, *AS, AsDist);
461      if (AsDist < Dist) {
462        Dist = AsDist;
463        UseMI = AsUseMI;
464      }
465    }
466    if (Dist >= MaxDist) {
467      MaxDist = Dist;
468      MaxUseMI = UseMI;
469      SReg = Reg;
470    }
471    Reg = Candidates.find_next(Reg);
472  }
473
474  assert(ScavengedReg == 0 &&
475         "Scavenger slot is live, unable to scavenge another register!");
476
477  // Make sure SReg is marked as used. It could be considered available if it is
478  // one of the callee saved registers, but hasn't been spilled.
479  if (!isUsed(SReg)) {
480    MBB->addLiveIn(SReg);
481    setUsed(SReg);
482  }
483
484  // Spill the scavenged register before I.
485  TII->storeRegToStackSlot(*MBB, I, SReg, true, ScavengingFrameIndex, RC);
486  MachineBasicBlock::iterator II = prior(I);
487  TRI->eliminateFrameIndex(II, SPAdj, this);
488
489  // Restore the scavenged register before its use (or first terminator).
490  II = MaxUseMI
491    ? MachineBasicBlock::iterator(MaxUseMI) : MBB->getFirstTerminator();
492  TII->loadRegFromStackSlot(*MBB, II, SReg, ScavengingFrameIndex, RC);
493  ScavengeRestore = prior(II);
494  ScavengedReg = SReg;
495  ScavengedRC = RC;
496
497  return SReg;
498}
499