mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-13 22:24:07 +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.
|
/// 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;
|
||||||
|
|
||||||
|
@ -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?
|
||||||
|
@ -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())
|
||||||
|
@ -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);
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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)
|
||||||
|
@ -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 {
|
||||||
|
@ -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()) {
|
||||||
|
Reference in New Issue
Block a user