mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
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:
@@ -126,12 +126,6 @@ private:
|
||||
/// building live intervals.
|
||||
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
|
||||
MachineFunction *MF;
|
||||
|
||||
|
@@ -18,6 +18,7 @@
|
||||
#define LLVM_CODEGEN_REGISTER_SCAVENGING_H
|
||||
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
|
||||
namespace llvm {
|
||||
@@ -59,10 +60,6 @@ class RegScavenger {
|
||||
///
|
||||
BitVector CalleeSavedRegs;
|
||||
|
||||
/// ReservedRegs - A bitvector of reserved registers.
|
||||
///
|
||||
BitVector ReservedRegs;
|
||||
|
||||
/// 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
|
||||
/// available, unset means the register is currently being used.
|
||||
@@ -130,12 +127,12 @@ public:
|
||||
void setUsed(unsigned Reg);
|
||||
private:
|
||||
/// 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.
|
||||
///
|
||||
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?
|
||||
|
@@ -33,7 +33,6 @@ namespace {
|
||||
const MachineRegisterInfo *MRI;
|
||||
const TargetInstrInfo *TII;
|
||||
BitVector LivePhysRegs;
|
||||
BitVector ReservedRegs;
|
||||
|
||||
public:
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
@@ -70,7 +69,7 @@ bool DeadMachineInstructionElim::isDead(const MachineInstr *MI) const {
|
||||
unsigned Reg = MO.getReg();
|
||||
if (TargetRegisterInfo::isPhysicalRegister(Reg)) {
|
||||
// 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;
|
||||
} else {
|
||||
if (!MRI->use_nodbg_empty(Reg))
|
||||
@@ -90,9 +89,6 @@ bool DeadMachineInstructionElim::runOnMachineFunction(MachineFunction &MF) {
|
||||
TRI = MF.getTarget().getRegisterInfo();
|
||||
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
|
||||
// more likely that chains of dependent but ultimately dead instructions will
|
||||
// be cleaned up.
|
||||
@@ -101,7 +97,7 @@ bool DeadMachineInstructionElim::runOnMachineFunction(MachineFunction &MF) {
|
||||
MachineBasicBlock *MBB = &*I;
|
||||
|
||||
// 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.
|
||||
if (!MBB->empty() && MBB->back().isReturn())
|
||||
|
@@ -503,8 +503,6 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &mf) {
|
||||
MRI = &mf.getRegInfo();
|
||||
TRI = MF->getTarget().getRegisterInfo();
|
||||
|
||||
ReservedRegisters = TRI->getReservedRegs(mf);
|
||||
|
||||
unsigned NumRegs = TRI->getNumRegs();
|
||||
PhysRegDef = new MachineInstr*[NumRegs];
|
||||
PhysRegUse = new MachineInstr*[NumRegs];
|
||||
@@ -588,7 +586,7 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &mf) {
|
||||
unsigned MOReg = UseRegs[i];
|
||||
if (TargetRegisterInfo::isVirtualRegister(MOReg))
|
||||
HandleVirtRegUse(MOReg, MBB, MI);
|
||||
else if (!ReservedRegisters[MOReg])
|
||||
else if (!MRI->isReserved(MOReg))
|
||||
HandlePhysRegUse(MOReg, MI);
|
||||
}
|
||||
|
||||
@@ -601,7 +599,7 @@ bool LiveVariables::runOnMachineFunction(MachineFunction &mf) {
|
||||
unsigned MOReg = DefRegs[i];
|
||||
if (TargetRegisterInfo::isVirtualRegister(MOReg))
|
||||
HandleVirtRegDef(MOReg, MI);
|
||||
else if (!ReservedRegisters[MOReg])
|
||||
else if (!MRI->isReserved(MOReg))
|
||||
HandlePhysRegDef(MOReg, MI, Defs);
|
||||
}
|
||||
UpdatePhysRegDefs(MI, Defs);
|
||||
|
@@ -64,7 +64,6 @@ namespace {
|
||||
ScopeMap.clear();
|
||||
Exps.clear();
|
||||
AllocatableRegs.clear();
|
||||
ReservedRegs.clear();
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -79,7 +78,6 @@ namespace {
|
||||
SmallVector<MachineInstr*, 64> Exps;
|
||||
unsigned CurrVN;
|
||||
BitVector AllocatableRegs;
|
||||
BitVector ReservedRegs;
|
||||
|
||||
bool PerformTrivialCoalescing(MachineInstr *MI, MachineBasicBlock *MBB);
|
||||
bool isPhysDefTriviallyDead(unsigned Reg,
|
||||
@@ -242,7 +240,7 @@ bool MachineCSE::PhysRegDefsReach(MachineInstr *CSMI, MachineInstr *MI,
|
||||
return false;
|
||||
|
||||
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
|
||||
//allocatable or reserved.
|
||||
return false;
|
||||
@@ -636,6 +634,5 @@ bool MachineCSE::runOnMachineFunction(MachineFunction &MF) {
|
||||
AA = &getAnalysis<AliasAnalysis>();
|
||||
DT = &getAnalysis<MachineDominatorTree>();
|
||||
AllocatableRegs = TRI->getAllocatableSet(MF);
|
||||
ReservedRegs = TRI->getReservedRegs(MF);
|
||||
return PerformCSE(DT->getRootNode());
|
||||
}
|
||||
|
@@ -16,6 +16,7 @@
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
@@ -32,7 +33,7 @@ STATISTIC(NumDeletes, "Number of dead copies deleted");
|
||||
namespace {
|
||||
class MachineCopyPropagation : public MachineFunctionPass {
|
||||
const TargetRegisterInfo *TRI;
|
||||
BitVector ReservedRegs;
|
||||
MachineRegisterInfo *MRI;
|
||||
|
||||
public:
|
||||
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);
|
||||
if (CI != AvailCopyMap.end()) {
|
||||
MachineInstr *CopyMI = CI->second;
|
||||
if (!ReservedRegs.test(Def) &&
|
||||
(!ReservedRegs.test(Src) || NoInterveningSideEffect(CopyMI, MI)) &&
|
||||
if (!MRI->isReserved(Def) &&
|
||||
(!MRI->isReserved(Src) || NoInterveningSideEffect(CopyMI, MI)) &&
|
||||
isNopCopy(CopyMI, Def, Src, TRI)) {
|
||||
// The two copies cancel out and the source of the first copy
|
||||
// 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 != DE; ++DI) {
|
||||
unsigned Reg = (*DI)->getOperand(0).getReg();
|
||||
if (ReservedRegs.test(Reg) || !MaskMO.clobbersPhysReg(Reg))
|
||||
if (MRI->isReserved(Reg) || !MaskMO.clobbersPhysReg(Reg))
|
||||
continue;
|
||||
(*DI)->eraseFromParent();
|
||||
Changed = true;
|
||||
@@ -296,7 +297,7 @@ bool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
|
||||
for (SmallSetVector<MachineInstr*, 8>::iterator
|
||||
DI = MaybeDeadCopies.begin(), DE = MaybeDeadCopies.end();
|
||||
DI != DE; ++DI) {
|
||||
if (!ReservedRegs.test((*DI)->getOperand(0).getReg())) {
|
||||
if (!MRI->isReserved((*DI)->getOperand(0).getReg())) {
|
||||
(*DI)->eraseFromParent();
|
||||
Changed = true;
|
||||
++NumDeletes;
|
||||
@@ -311,7 +312,7 @@ bool MachineCopyPropagation::runOnMachineFunction(MachineFunction &MF) {
|
||||
bool Changed = false;
|
||||
|
||||
TRI = MF.getTarget().getRegisterInfo();
|
||||
ReservedRegs = TRI->getReservedRegs(MF);
|
||||
MRI = &MF.getRegInfo();
|
||||
|
||||
for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I)
|
||||
Changed |= CopyPropagateBlock(*I);
|
||||
|
@@ -427,7 +427,7 @@ void MachineVerifier::markReachable(const MachineBasicBlock *MBB) {
|
||||
|
||||
void MachineVerifier::visitMachineFunctionBefore() {
|
||||
lastIndex = SlotIndex();
|
||||
regsReserved = TRI->getReservedRegs(*MF);
|
||||
regsReserved = MRI->getReservedRegs();
|
||||
|
||||
// A sub-register of a reserved register is also reserved
|
||||
for (int Reg = regsReserved.find_first(); Reg>=0;
|
||||
|
@@ -490,7 +490,6 @@ void SchedulePostRATDList::FixupKills(MachineBasicBlock *MBB) {
|
||||
DEBUG(dbgs() << "Fixup kills for BB#" << MBB->getNumber() << '\n');
|
||||
|
||||
BitVector killedRegs(TRI->getNumRegs());
|
||||
BitVector ReservedRegs = TRI->getReservedRegs(MF);
|
||||
|
||||
StartBlockForKills(MBB);
|
||||
|
||||
@@ -531,7 +530,7 @@ void SchedulePostRATDList::FixupKills(MachineBasicBlock *MBB) {
|
||||
MachineOperand &MO = MI->getOperand(i);
|
||||
if (!MO.isReg() || !MO.isUse()) continue;
|
||||
unsigned Reg = MO.getReg();
|
||||
if ((Reg == 0) || ReservedRegs.test(Reg)) continue;
|
||||
if ((Reg == 0) || MRI.isReserved(Reg)) continue;
|
||||
|
||||
bool kill = false;
|
||||
if (!killedRegs.test(Reg)) {
|
||||
@@ -566,7 +565,7 @@ void SchedulePostRATDList::FixupKills(MachineBasicBlock *MBB) {
|
||||
MachineOperand &MO = MI->getOperand(i);
|
||||
if (!MO.isReg() || !MO.isUse() || MO.isUndef()) continue;
|
||||
unsigned Reg = MO.getReg();
|
||||
if ((Reg == 0) || ReservedRegs.test(Reg)) continue;
|
||||
if ((Reg == 0) || MRI.isReserved(Reg)) continue;
|
||||
|
||||
LiveRegs.set(Reg);
|
||||
|
||||
|
@@ -208,8 +208,6 @@ std::auto_ptr<PBQPRAProblem> PBQPBuilder::build(MachineFunction *mf,
|
||||
mri->setPhysRegUsed(Reg);
|
||||
}
|
||||
|
||||
BitVector reservedRegs = tri->getReservedRegs(*mf);
|
||||
|
||||
// Iterate over vregs.
|
||||
for (RegSet::const_iterator vregItr = vregs.begin(), vregEnd = vregs.end();
|
||||
vregItr != vregEnd; ++vregItr) {
|
||||
@@ -227,7 +225,7 @@ std::auto_ptr<PBQPRAProblem> PBQPBuilder::build(MachineFunction *mf,
|
||||
ArrayRef<uint16_t> rawOrder = trc->getRawAllocationOrder(*mf);
|
||||
for (unsigned i = 0; i != rawOrder.size(); ++i) {
|
||||
unsigned preg = rawOrder[i];
|
||||
if (reservedRegs.test(preg))
|
||||
if (mri->isReserved(preg))
|
||||
continue;
|
||||
|
||||
// vregLI crosses a regmask operand that clobbers preg.
|
||||
|
@@ -15,8 +15,9 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#define DEBUG_TYPE "regalloc"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/RegisterClassInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
@@ -57,10 +58,11 @@ void RegisterClassInfo::runOnMachineFunction(const MachineFunction &mf) {
|
||||
CalleeSaved = CSR;
|
||||
|
||||
// Different reserved registers?
|
||||
BitVector RR = TRI->getReservedRegs(*MF);
|
||||
if (RR != Reserved)
|
||||
const BitVector &RR = MF->getRegInfo().getReservedRegs();
|
||||
if (Reserved.size() != RR.size() || RR != Reserved) {
|
||||
Update = true;
|
||||
Reserved = RR;
|
||||
}
|
||||
|
||||
// Invalidate cached information from previous function.
|
||||
if (Update)
|
||||
|
@@ -92,9 +92,6 @@ void RegScavenger::enterBasicBlock(MachineBasicBlock *mbb) {
|
||||
KillRegs.resize(NumPhysRegs);
|
||||
DefRegs.resize(NumPhysRegs);
|
||||
|
||||
// Create reserved registers bitvector.
|
||||
ReservedRegs = TRI->getReservedRegs(MF);
|
||||
|
||||
// Create callee-saved registers bitvector.
|
||||
CalleeSavedRegs.resize(NumPhysRegs);
|
||||
const uint16_t *CSRegs = TRI->getCalleeSavedRegs(&MF);
|
||||
@@ -225,9 +222,9 @@ void RegScavenger::getRegsUsed(BitVector &used, bool includeReserved) {
|
||||
used = RegsAvailable;
|
||||
used.flip();
|
||||
if (includeReserved)
|
||||
used |= ReservedRegs;
|
||||
used |= MRI->getReservedRegs();
|
||||
else
|
||||
used.reset(ReservedRegs);
|
||||
used.reset(MRI->getReservedRegs());
|
||||
}
|
||||
|
||||
unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RC) const {
|
||||
|
@@ -257,9 +257,6 @@ void VirtRegRewriter::rewrite() {
|
||||
SmallVector<unsigned, 8> SuperDeads;
|
||||
SmallVector<unsigned, 8> SuperDefs;
|
||||
SmallVector<unsigned, 8> SuperKills;
|
||||
#ifndef NDEBUG
|
||||
BitVector Reserved = TRI->getReservedRegs(*MF);
|
||||
#endif
|
||||
|
||||
for (MachineFunction::iterator MBBI = MF->begin(), MBBE = MF->end();
|
||||
MBBI != MBBE; ++MBBI) {
|
||||
@@ -283,7 +280,7 @@ void VirtRegRewriter::rewrite() {
|
||||
unsigned PhysReg = VRM->getPhys(VirtReg);
|
||||
assert(PhysReg != VirtRegMap::NO_PHYS_REG &&
|
||||
"Instruction uses unmapped VirtReg");
|
||||
assert(!Reserved.test(PhysReg) && "Reserved register assignment");
|
||||
assert(!MRI->isReserved(PhysReg) && "Reserved register assignment");
|
||||
|
||||
// Preserve semantics of sub-register operands.
|
||||
if (MO.getSubReg()) {
|
||||
|
Reference in New Issue
Block a user