Switch most getReservedRegs() clients to the MRI equivalent.

Using the cached bit vector in MRI avoids comstantly allocating and
recomputing the reserved register bit vector.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165983 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jakob Stoklund Olesen
2012-10-15 21:57:41 +00:00
parent e4f273908b
commit fb9ebbf236
12 changed files with 28 additions and 52 deletions

View File

@ -126,12 +126,6 @@ private:
/// building live intervals. /// building live intervals.
SparseBitVector<> PHIJoins; SparseBitVector<> PHIJoins;
/// ReservedRegisters - This vector keeps track of which registers
/// are reserved register which are not allocatable by the target machine.
/// We can not track liveness for values that are in this set.
///
BitVector ReservedRegisters;
private: // Intermediate data structures private: // Intermediate data structures
MachineFunction *MF; MachineFunction *MF;

View File

@ -18,6 +18,7 @@
#define LLVM_CODEGEN_REGISTER_SCAVENGING_H #define LLVM_CODEGEN_REGISTER_SCAVENGING_H
#include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/ADT/BitVector.h" #include "llvm/ADT/BitVector.h"
namespace llvm { namespace llvm {
@ -59,10 +60,6 @@ class RegScavenger {
/// ///
BitVector CalleeSavedRegs; BitVector CalleeSavedRegs;
/// ReservedRegs - A bitvector of reserved registers.
///
BitVector ReservedRegs;
/// RegsAvailable - The current state of all the physical registers immediately /// RegsAvailable - The current state of all the physical registers immediately
/// before MBBI. One bit per physical register. If bit is set that means it's /// before MBBI. One bit per physical register. If bit is set that means it's
/// available, unset means the register is currently being used. /// available, unset means the register is currently being used.
@ -130,12 +127,12 @@ public:
void setUsed(unsigned Reg); void setUsed(unsigned Reg);
private: private:
/// isReserved - Returns true if a register is reserved. It is never "unused". /// isReserved - Returns true if a register is reserved. It is never "unused".
bool isReserved(unsigned Reg) const { return ReservedRegs.test(Reg); } bool isReserved(unsigned Reg) const { return MRI->isReserved(Reg); }
/// isUsed / isUnused - Test if a register is currently being used. /// isUsed / isUnused - Test if a register is currently being used.
/// ///
bool isUsed(unsigned Reg) const { bool isUsed(unsigned Reg) const {
return !RegsAvailable.test(Reg) || ReservedRegs.test(Reg); return !RegsAvailable.test(Reg) || isReserved(Reg);
} }
/// isAliasUsed - Is Reg or an alias currently in use? /// isAliasUsed - Is Reg or an alias currently in use?

View File

@ -33,7 +33,6 @@ namespace {
const MachineRegisterInfo *MRI; const MachineRegisterInfo *MRI;
const TargetInstrInfo *TII; const TargetInstrInfo *TII;
BitVector LivePhysRegs; BitVector LivePhysRegs;
BitVector ReservedRegs;
public: public:
static char ID; // Pass identification, replacement for typeid static char ID; // Pass identification, replacement for typeid
@ -70,7 +69,7 @@ bool DeadMachineInstructionElim::isDead(const MachineInstr *MI) const {
unsigned Reg = MO.getReg(); unsigned Reg = MO.getReg();
if (TargetRegisterInfo::isPhysicalRegister(Reg)) { if (TargetRegisterInfo::isPhysicalRegister(Reg)) {
// Don't delete live physreg defs, or any reserved register defs. // Don't delete live physreg defs, or any reserved register defs.
if (LivePhysRegs.test(Reg) || ReservedRegs.test(Reg)) if (LivePhysRegs.test(Reg) || MRI->isReserved(Reg))
return false; return false;
} else { } else {
if (!MRI->use_nodbg_empty(Reg)) if (!MRI->use_nodbg_empty(Reg))
@ -90,9 +89,6 @@ bool DeadMachineInstructionElim::runOnMachineFunction(MachineFunction &MF) {
TRI = MF.getTarget().getRegisterInfo(); TRI = MF.getTarget().getRegisterInfo();
TII = MF.getTarget().getInstrInfo(); TII = MF.getTarget().getInstrInfo();
// Treat reserved registers as always live.
ReservedRegs = TRI->getReservedRegs(MF);
// Loop over all instructions in all blocks, from bottom to top, so that it's // Loop over all instructions in all blocks, from bottom to top, so that it's
// more likely that chains of dependent but ultimately dead instructions will // more likely that chains of dependent but ultimately dead instructions will
// be cleaned up. // be cleaned up.
@ -101,7 +97,7 @@ bool DeadMachineInstructionElim::runOnMachineFunction(MachineFunction &MF) {
MachineBasicBlock *MBB = &*I; MachineBasicBlock *MBB = &*I;
// Start out assuming that reserved registers are live out of this block. // Start out assuming that reserved registers are live out of this block.
LivePhysRegs = ReservedRegs; LivePhysRegs = MRI->getReservedRegs();
// Also add any explicit live-out physregs for this block. // Also add any explicit live-out physregs for this block.
if (!MBB->empty() && MBB->back().isReturn()) if (!MBB->empty() && MBB->back().isReturn())

View File

@ -503,8 +503,6 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &mf) {
MRI = &mf.getRegInfo(); MRI = &mf.getRegInfo();
TRI = MF->getTarget().getRegisterInfo(); TRI = MF->getTarget().getRegisterInfo();
ReservedRegisters = TRI->getReservedRegs(mf);
unsigned NumRegs = TRI->getNumRegs(); unsigned NumRegs = TRI->getNumRegs();
PhysRegDef = new MachineInstr*[NumRegs]; PhysRegDef = new MachineInstr*[NumRegs];
PhysRegUse = new MachineInstr*[NumRegs]; PhysRegUse = new MachineInstr*[NumRegs];
@ -588,7 +586,7 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &mf) {
unsigned MOReg = UseRegs[i]; unsigned MOReg = UseRegs[i];
if (TargetRegisterInfo::isVirtualRegister(MOReg)) if (TargetRegisterInfo::isVirtualRegister(MOReg))
HandleVirtRegUse(MOReg, MBB, MI); HandleVirtRegUse(MOReg, MBB, MI);
else if (!ReservedRegisters[MOReg]) else if (!MRI->isReserved(MOReg))
HandlePhysRegUse(MOReg, MI); HandlePhysRegUse(MOReg, MI);
} }
@ -601,7 +599,7 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &mf) {
unsigned MOReg = DefRegs[i]; unsigned MOReg = DefRegs[i];
if (TargetRegisterInfo::isVirtualRegister(MOReg)) if (TargetRegisterInfo::isVirtualRegister(MOReg))
HandleVirtRegDef(MOReg, MI); HandleVirtRegDef(MOReg, MI);
else if (!ReservedRegisters[MOReg]) else if (!MRI->isReserved(MOReg))
HandlePhysRegDef(MOReg, MI, Defs); HandlePhysRegDef(MOReg, MI, Defs);
} }
UpdatePhysRegDefs(MI, Defs); UpdatePhysRegDefs(MI, Defs);

View File

@ -64,7 +64,6 @@ namespace {
ScopeMap.clear(); ScopeMap.clear();
Exps.clear(); Exps.clear();
AllocatableRegs.clear(); AllocatableRegs.clear();
ReservedRegs.clear();
} }
private: private:
@ -79,7 +78,6 @@ namespace {
SmallVector<MachineInstr*, 64> Exps; SmallVector<MachineInstr*, 64> Exps;
unsigned CurrVN; unsigned CurrVN;
BitVector AllocatableRegs; BitVector AllocatableRegs;
BitVector ReservedRegs;
bool PerformTrivialCoalescing(MachineInstr *MI, MachineBasicBlock *MBB); bool PerformTrivialCoalescing(MachineInstr *MI, MachineBasicBlock *MBB);
bool isPhysDefTriviallyDead(unsigned Reg, bool isPhysDefTriviallyDead(unsigned Reg,
@ -242,7 +240,7 @@ bool MachineCSE::PhysRegDefsReach(MachineInstr *CSMI, MachineInstr *MI,
return false; return false;
for (unsigned i = 0, e = PhysDefs.size(); i != e; ++i) { for (unsigned i = 0, e = PhysDefs.size(); i != e; ++i) {
if (AllocatableRegs.test(PhysDefs[i]) || ReservedRegs.test(PhysDefs[i])) if (MRI->isAllocatable(PhysDefs[i]) || MRI->isReserved(PhysDefs[i]))
// Avoid extending live range of physical registers if they are // Avoid extending live range of physical registers if they are
//allocatable or reserved. //allocatable or reserved.
return false; return false;
@ -636,6 +634,5 @@ bool MachineCSE::runOnMachineFunction(MachineFunction &MF) {
AA = &getAnalysis<AliasAnalysis>(); AA = &getAnalysis<AliasAnalysis>();
DT = &getAnalysis<MachineDominatorTree>(); DT = &getAnalysis<MachineDominatorTree>();
AllocatableRegs = TRI->getAllocatableSet(MF); AllocatableRegs = TRI->getAllocatableSet(MF);
ReservedRegs = TRI->getReservedRegs(MF);
return PerformCSE(DT->getRootNode()); return PerformCSE(DT->getRootNode());
} }

View File

@ -16,6 +16,7 @@
#include "llvm/Pass.h" #include "llvm/Pass.h"
#include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/Target/TargetRegisterInfo.h" #include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/Support/Debug.h" #include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ErrorHandling.h"
@ -32,7 +33,7 @@ STATISTIC(NumDeletes, "Number of dead copies deleted");
namespace { namespace {
class MachineCopyPropagation : public MachineFunctionPass { class MachineCopyPropagation : public MachineFunctionPass {
const TargetRegisterInfo *TRI; const TargetRegisterInfo *TRI;
BitVector ReservedRegs; MachineRegisterInfo *MRI;
public: public:
static char ID; // Pass identification, replacement for typeid static char ID; // Pass identification, replacement for typeid
@ -146,8 +147,8 @@ bool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
DenseMap<unsigned, MachineInstr*>::iterator CI = AvailCopyMap.find(Src); DenseMap<unsigned, MachineInstr*>::iterator CI = AvailCopyMap.find(Src);
if (CI != AvailCopyMap.end()) { if (CI != AvailCopyMap.end()) {
MachineInstr *CopyMI = CI->second; MachineInstr *CopyMI = CI->second;
if (!ReservedRegs.test(Def) && if (!MRI->isReserved(Def) &&
(!ReservedRegs.test(Src) || NoInterveningSideEffect(CopyMI, MI)) && (!MRI->isReserved(Src) || NoInterveningSideEffect(CopyMI, MI)) &&
isNopCopy(CopyMI, Def, Src, TRI)) { isNopCopy(CopyMI, Def, Src, TRI)) {
// The two copies cancel out and the source of the first copy // The two copies cancel out and the source of the first copy
// hasn't been overridden, eliminate the second one. e.g. // hasn't been overridden, eliminate the second one. e.g.
@ -259,7 +260,7 @@ bool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
DI = MaybeDeadCopies.begin(), DE = MaybeDeadCopies.end(); DI = MaybeDeadCopies.begin(), DE = MaybeDeadCopies.end();
DI != DE; ++DI) { DI != DE; ++DI) {
unsigned Reg = (*DI)->getOperand(0).getReg(); unsigned Reg = (*DI)->getOperand(0).getReg();
if (ReservedRegs.test(Reg) || !MaskMO.clobbersPhysReg(Reg)) if (MRI->isReserved(Reg) || !MaskMO.clobbersPhysReg(Reg))
continue; continue;
(*DI)->eraseFromParent(); (*DI)->eraseFromParent();
Changed = true; Changed = true;
@ -296,7 +297,7 @@ bool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
for (SmallSetVector<MachineInstr*, 8>::iterator for (SmallSetVector<MachineInstr*, 8>::iterator
DI = MaybeDeadCopies.begin(), DE = MaybeDeadCopies.end(); DI = MaybeDeadCopies.begin(), DE = MaybeDeadCopies.end();
DI != DE; ++DI) { DI != DE; ++DI) {
if (!ReservedRegs.test((*DI)->getOperand(0).getReg())) { if (!MRI->isReserved((*DI)->getOperand(0).getReg())) {
(*DI)->eraseFromParent(); (*DI)->eraseFromParent();
Changed = true; Changed = true;
++NumDeletes; ++NumDeletes;
@ -311,7 +312,7 @@ bool MachineCopyPropagation::runOnMachineFunction(MachineFunction &MF) {
bool Changed = false; bool Changed = false;
TRI = MF.getTarget().getRegisterInfo(); TRI = MF.getTarget().getRegisterInfo();
ReservedRegs = TRI->getReservedRegs(MF); MRI = &MF.getRegInfo();
for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I)
Changed |= CopyPropagateBlock(*I); Changed |= CopyPropagateBlock(*I);

View File

@ -427,7 +427,7 @@ void MachineVerifier::markReachable(const MachineBasicBlock *MBB) {
void MachineVerifier::visitMachineFunctionBefore() { void MachineVerifier::visitMachineFunctionBefore() {
lastIndex = SlotIndex(); lastIndex = SlotIndex();
regsReserved = TRI->getReservedRegs(*MF); regsReserved = MRI->getReservedRegs();
// A sub-register of a reserved register is also reserved // A sub-register of a reserved register is also reserved
for (int Reg = regsReserved.find_first(); Reg>=0; for (int Reg = regsReserved.find_first(); Reg>=0;

View File

@ -490,7 +490,6 @@ void SchedulePostRATDList::FixupKills(MachineBasicBlock *MBB) {
DEBUG(dbgs() << "Fixup kills for BB#" << MBB->getNumber() << '\n'); DEBUG(dbgs() << "Fixup kills for BB#" << MBB->getNumber() << '\n');
BitVector killedRegs(TRI->getNumRegs()); BitVector killedRegs(TRI->getNumRegs());
BitVector ReservedRegs = TRI->getReservedRegs(MF);
StartBlockForKills(MBB); StartBlockForKills(MBB);
@ -531,7 +530,7 @@ void SchedulePostRATDList::FixupKills(MachineBasicBlock *MBB) {
MachineOperand &MO = MI->getOperand(i); MachineOperand &MO = MI->getOperand(i);
if (!MO.isReg() || !MO.isUse()) continue; if (!MO.isReg() || !MO.isUse()) continue;
unsigned Reg = MO.getReg(); unsigned Reg = MO.getReg();
if ((Reg == 0) || ReservedRegs.test(Reg)) continue; if ((Reg == 0) || MRI.isReserved(Reg)) continue;
bool kill = false; bool kill = false;
if (!killedRegs.test(Reg)) { if (!killedRegs.test(Reg)) {
@ -566,7 +565,7 @@ void SchedulePostRATDList::FixupKills(MachineBasicBlock *MBB) {
MachineOperand &MO = MI->getOperand(i); MachineOperand &MO = MI->getOperand(i);
if (!MO.isReg() || !MO.isUse() || MO.isUndef()) continue; if (!MO.isReg() || !MO.isUse() || MO.isUndef()) continue;
unsigned Reg = MO.getReg(); unsigned Reg = MO.getReg();
if ((Reg == 0) || ReservedRegs.test(Reg)) continue; if ((Reg == 0) || MRI.isReserved(Reg)) continue;
LiveRegs.set(Reg); LiveRegs.set(Reg);

View File

@ -208,8 +208,6 @@ std::auto_ptr<PBQPRAProblem> PBQPBuilder::build(MachineFunction *mf,
mri->setPhysRegUsed(Reg); mri->setPhysRegUsed(Reg);
} }
BitVector reservedRegs = tri->getReservedRegs(*mf);
// Iterate over vregs. // Iterate over vregs.
for (RegSet::const_iterator vregItr = vregs.begin(), vregEnd = vregs.end(); for (RegSet::const_iterator vregItr = vregs.begin(), vregEnd = vregs.end();
vregItr != vregEnd; ++vregItr) { vregItr != vregEnd; ++vregItr) {
@ -227,7 +225,7 @@ std::auto_ptr<PBQPRAProblem> PBQPBuilder::build(MachineFunction *mf,
ArrayRef<uint16_t> rawOrder = trc->getRawAllocationOrder(*mf); ArrayRef<uint16_t> rawOrder = trc->getRawAllocationOrder(*mf);
for (unsigned i = 0; i != rawOrder.size(); ++i) { for (unsigned i = 0; i != rawOrder.size(); ++i) {
unsigned preg = rawOrder[i]; unsigned preg = rawOrder[i];
if (reservedRegs.test(preg)) if (mri->isReserved(preg))
continue; continue;
// vregLI crosses a regmask operand that clobbers preg. // vregLI crosses a regmask operand that clobbers preg.

View File

@ -15,8 +15,9 @@
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#define DEBUG_TYPE "regalloc" #define DEBUG_TYPE "regalloc"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/RegisterClassInfo.h" #include "llvm/CodeGen/RegisterClassInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetMachine.h"
#include "llvm/Support/CommandLine.h" #include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h" #include "llvm/Support/Debug.h"
@ -57,10 +58,11 @@ void RegisterClassInfo::runOnMachineFunction(const MachineFunction &mf) {
CalleeSaved = CSR; CalleeSaved = CSR;
// Different reserved registers? // Different reserved registers?
BitVector RR = TRI->getReservedRegs(*MF); const BitVector &RR = MF->getRegInfo().getReservedRegs();
if (RR != Reserved) if (Reserved.size() != RR.size() || RR != Reserved) {
Update = true; Update = true;
Reserved = RR; Reserved = RR;
}
// Invalidate cached information from previous function. // Invalidate cached information from previous function.
if (Update) if (Update)

View File

@ -92,9 +92,6 @@ void RegScavenger::enterBasicBlock(MachineBasicBlock *mbb) {
KillRegs.resize(NumPhysRegs); KillRegs.resize(NumPhysRegs);
DefRegs.resize(NumPhysRegs); DefRegs.resize(NumPhysRegs);
// Create reserved registers bitvector.
ReservedRegs = TRI->getReservedRegs(MF);
// Create callee-saved registers bitvector. // Create callee-saved registers bitvector.
CalleeSavedRegs.resize(NumPhysRegs); CalleeSavedRegs.resize(NumPhysRegs);
const uint16_t *CSRegs = TRI->getCalleeSavedRegs(&MF); const uint16_t *CSRegs = TRI->getCalleeSavedRegs(&MF);
@ -225,9 +222,9 @@ void RegScavenger::getRegsUsed(BitVector &used, bool includeReserved) {
used = RegsAvailable; used = RegsAvailable;
used.flip(); used.flip();
if (includeReserved) if (includeReserved)
used |= ReservedRegs; used |= MRI->getReservedRegs();
else else
used.reset(ReservedRegs); used.reset(MRI->getReservedRegs());
} }
unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RC) const { unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RC) const {

View File

@ -257,9 +257,6 @@ void VirtRegRewriter::rewrite() {
SmallVector<unsigned, 8> SuperDeads; SmallVector<unsigned, 8> SuperDeads;
SmallVector<unsigned, 8> SuperDefs; SmallVector<unsigned, 8> SuperDefs;
SmallVector<unsigned, 8> SuperKills; SmallVector<unsigned, 8> SuperKills;
#ifndef NDEBUG
BitVector Reserved = TRI->getReservedRegs(*MF);
#endif
for (MachineFunction::iterator MBBI = MF->begin(), MBBE = MF->end(); for (MachineFunction::iterator MBBI = MF->begin(), MBBE = MF->end();
MBBI != MBBE; ++MBBI) { MBBI != MBBE; ++MBBI) {
@ -283,7 +280,7 @@ void VirtRegRewriter::rewrite() {
unsigned PhysReg = VRM->getPhys(VirtReg); unsigned PhysReg = VRM->getPhys(VirtReg);
assert(PhysReg != VirtRegMap::NO_PHYS_REG && assert(PhysReg != VirtRegMap::NO_PHYS_REG &&
"Instruction uses unmapped VirtReg"); "Instruction uses unmapped VirtReg");
assert(!Reserved.test(PhysReg) && "Reserved register assignment"); assert(!MRI->isReserved(PhysReg) && "Reserved register assignment");
// Preserve semantics of sub-register operands. // Preserve semantics of sub-register operands.
if (MO.getSubReg()) { if (MO.getSubReg()) {