RegisterScavenging.cpp revision 403c45dfcc74585b02339b5f55f739672e3d141a
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"
25using namespace llvm;
26
27RegScavenger::RegScavenger(MachineBasicBlock *mbb)
28  : MBB(mbb), MBBI(mbb->begin()) {
29  const MachineFunction &MF = *MBB->getParent();
30  const TargetMachine &TM = MF.getTarget();
31  const MRegisterInfo *RegInfo = TM.getRegisterInfo();
32
33  NumPhysRegs = RegInfo->getNumRegs();
34  RegStates.resize(NumPhysRegs, true);
35
36  // Create reserved registers bitvector.
37  ReservedRegs = RegInfo->getReservedRegs(MF);
38  RegStates ^= ReservedRegs;
39
40  // Create callee-saved registers bitvector.
41  CalleeSavedRegs.resize(NumPhysRegs);
42  const unsigned *CSRegs = RegInfo->getCalleeSavedRegs();
43  if (CSRegs != NULL)
44    for (unsigned i = 0; CSRegs[i]; ++i)
45      CalleeSavedRegs.set(CSRegs[i]);
46
47  // Live-in registers are in use.
48  if (!MBB->livein_empty())
49    for (MachineBasicBlock::const_livein_iterator I = MBB->livein_begin(),
50           E = MBB->livein_end(); I != E; ++I)
51      setUsed(*I);
52}
53
54void RegScavenger::forward() {
55  MachineInstr *MI = MBBI;
56  // Process uses first.
57  BitVector ChangedRegs(NumPhysRegs);
58  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
59    const MachineOperand &MO = MI->getOperand(i);
60    if (!MO.isReg() || !MO.isUse())
61      continue;
62    unsigned Reg = MO.getReg();
63    if (Reg == 0)
64      continue;
65    assert(isUsed(Reg));
66    if (MO.isKill() && !isReserved(Reg))
67      ChangedRegs.set(Reg);
68  }
69  // Change states of all registers after all the uses are processed to guard
70  // against multiple uses.
71  setUnused(ChangedRegs);
72
73  // Process defs.
74  const TargetInstrDescriptor *TID = MI->getInstrDescriptor();
75  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
76    const MachineOperand &MO = MI->getOperand(i);
77    if (!MO.isReg() || !MO.isDef())
78      continue;
79    // Skip two-address destination operand.
80    if (TID->findTiedToSrcOperand(i) != -1)
81      continue;
82    unsigned Reg = MO.getReg();
83    assert(isUnused(Reg) || isReserved(Reg));
84    if (!MO.isDead())
85      setUsed(Reg);
86  }
87
88  ++MBBI;
89}
90
91void RegScavenger::backward() {
92  MachineInstr *MI = --MBBI;
93  // Process defs first.
94  const TargetInstrDescriptor *TID = MI->getInstrDescriptor();
95  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
96    const MachineOperand &MO = MI->getOperand(i);
97    if (!MO.isReg() || !MO.isDef())
98      continue;
99    // Skip two-address destination operand.
100    if (TID->findTiedToSrcOperand(i) != -1)
101      continue;
102    unsigned Reg = MO.getReg();
103    assert(isUsed(Reg));
104    if (!isReserved(Reg))
105      setUnused(Reg);
106  }
107
108  // Process uses.
109  BitVector ChangedRegs(NumPhysRegs);
110  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
111    const MachineOperand &MO = MI->getOperand(i);
112    if (!MO.isReg() || !MO.isUse())
113      continue;
114    unsigned Reg = MO.getReg();
115    if (Reg == 0)
116      continue;
117    assert(isUnused(Reg) || isReserved(Reg));
118    ChangedRegs.set(Reg);
119  }
120  setUsed(ChangedRegs);
121}
122
123/// CreateRegClassMask - Set the bits that represent the registers in the
124/// TargetRegisterClass.
125static void CreateRegClassMask(const TargetRegisterClass *RC, BitVector &Mask) {
126  for (TargetRegisterClass::iterator I = RC->begin(), E = RC->end(); I != E;
127       ++I)
128    Mask.set(*I);
129}
130
131unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RegClass,
132                                     bool ExCalleeSaved) const {
133  // Mask off the registers which are not in the TargetRegisterClass.
134  BitVector RegStatesCopy(NumPhysRegs, false);
135  CreateRegClassMask(RegClass, RegStatesCopy);
136  RegStatesCopy &= RegStates;
137
138  // If looking for a non-callee-saved register, mask off all the callee-saved
139  // registers.
140  if (ExCalleeSaved)
141    RegStatesCopy &= ~CalleeSavedRegs;
142
143  // Returns the first unused (bit is set) register, or 0 is none is found.
144  int Reg = RegStatesCopy.find_first();
145  return (Reg == -1) ? 0 : Reg;
146}
147