RegisterScavenging.cpp revision ed570dedad945e1fe9a4bfeaa47276d875f1feed
1//===-- RegisterScavenging.cpp - Machine register scavenging --------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file was developed by the Evan Cheng and is distributed under the
6// University of Illinois Open Source 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 register at any point in a machine basic block.
12// It also provides a mechanism to make registers availbale by evicting them
13// to 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/Target/MRegisterInfo.h"
23#include "llvm/Target/TargetInstrInfo.h"
24#include "llvm/Target/TargetMachine.h"
25#include "llvm/ADT/STLExtras.h"
26using namespace llvm;
27
28RegScavenger::RegScavenger(MachineBasicBlock *mbb)
29  : MBB(mbb), MBBIInited(false) {
30  const MachineFunction &MF = *MBB->getParent();
31  const TargetMachine &TM = MF.getTarget();
32  const MRegisterInfo *RegInfo = TM.getRegisterInfo();
33
34  NumPhysRegs = RegInfo->getNumRegs();
35  RegStates.resize(NumPhysRegs, true);
36
37  // Create reserved registers bitvector.
38  ReservedRegs = RegInfo->getReservedRegs(MF);
39  RegStates ^= ReservedRegs;
40
41  // Create callee-saved registers bitvector.
42  CalleeSavedRegs.resize(NumPhysRegs);
43  const unsigned *CSRegs = RegInfo->getCalleeSavedRegs();
44  if (CSRegs != NULL)
45    for (unsigned i = 0; CSRegs[i]; ++i)
46      CalleeSavedRegs.set(CSRegs[i]);
47
48  // Live-in registers are in use.
49  if (!MBB->livein_empty())
50    for (MachineBasicBlock::const_livein_iterator I = MBB->livein_begin(),
51           E = MBB->livein_end(); I != E; ++I)
52      setUsed(*I);
53}
54
55void RegScavenger::forward() {
56  assert(MBBI != MBB->end() && "Already at the end of the basic block!");
57  // Move ptr forward.
58  if (!MBBIInited) {
59    MBBI = MBB->begin();
60    MBBIInited = true;
61  } else
62    MBBI = next(MBBI);
63
64  MachineInstr *MI = MBBI;
65  // Process uses first.
66  BitVector ChangedRegs(NumPhysRegs);
67  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
68    const MachineOperand &MO = MI->getOperand(i);
69    if (!MO.isReg() || !MO.isUse())
70      continue;
71    unsigned Reg = MO.getReg();
72    if (Reg == 0)
73      continue;
74    assert(isUsed(Reg));
75    if (MO.isKill() && !isReserved(Reg))
76      ChangedRegs.set(Reg);
77  }
78  // Change states of all registers after all the uses are processed to guard
79  // against multiple uses.
80  setUnused(ChangedRegs);
81
82  // Process defs.
83  const TargetInstrDescriptor *TID = MI->getInstrDescriptor();
84  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
85    const MachineOperand &MO = MI->getOperand(i);
86    if (!MO.isReg() || !MO.isDef())
87      continue;
88    unsigned Reg = MO.getReg();
89    // Skip two-address destination operand.
90    if (TID->findTiedToSrcOperand(i) != -1) {
91      assert(isUsed(Reg));
92      continue;
93    }
94    assert(isUnused(Reg) || isReserved(Reg));
95    if (!MO.isDead())
96      setUsed(Reg);
97  }
98}
99
100void RegScavenger::backward() {
101  assert(MBBI != MBB->begin() && "Already at start of basic block!");
102  // Move ptr backward.
103  MBBI = prior(MBBI);
104
105  MachineInstr *MI = MBBI;
106  // Process defs first.
107  const TargetInstrDescriptor *TID = MI->getInstrDescriptor();
108  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
109    const MachineOperand &MO = MI->getOperand(i);
110    if (!MO.isReg() || !MO.isDef())
111      continue;
112    // Skip two-address destination operand.
113    if (TID->findTiedToSrcOperand(i) != -1)
114      continue;
115    unsigned Reg = MO.getReg();
116    assert(isUsed(Reg));
117    if (!isReserved(Reg))
118      setUnused(Reg);
119  }
120
121  // Process uses.
122  BitVector ChangedRegs(NumPhysRegs);
123  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
124    const MachineOperand &MO = MI->getOperand(i);
125    if (!MO.isReg() || !MO.isUse())
126      continue;
127    unsigned Reg = MO.getReg();
128    if (Reg == 0)
129      continue;
130    assert(isUnused(Reg) || isReserved(Reg));
131    ChangedRegs.set(Reg);
132  }
133  setUsed(ChangedRegs);
134}
135
136void RegScavenger::forward(MachineBasicBlock::iterator I) {
137  while (MBBI != I)
138    forward();
139}
140
141void RegScavenger::backward(MachineBasicBlock::iterator I) {
142  while (MBBI != I)
143    backward();
144}
145
146/// CreateRegClassMask - Set the bits that represent the registers in the
147/// TargetRegisterClass.
148static void CreateRegClassMask(const TargetRegisterClass *RC, BitVector &Mask) {
149  for (TargetRegisterClass::iterator I = RC->begin(), E = RC->end(); I != E;
150       ++I)
151    Mask.set(*I);
152}
153
154unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RegClass,
155                                     bool ExCalleeSaved) const {
156  // Mask off the registers which are not in the TargetRegisterClass.
157  BitVector RegStatesCopy(NumPhysRegs, false);
158  CreateRegClassMask(RegClass, RegStatesCopy);
159  RegStatesCopy &= RegStates;
160
161  // If looking for a non-callee-saved register, mask off all the callee-saved
162  // registers.
163  if (ExCalleeSaved)
164    RegStatesCopy &= ~CalleeSavedRegs;
165
166  // Returns the first unused (bit is set) register, or 0 is none is found.
167  int Reg = RegStatesCopy.find_first();
168  return (Reg == -1) ? 0 : Reg;
169}
170