Use MCPhysReg for RegisterClassInfo allocation orders.

This saves a bit of memory.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168852 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jakob Stoklund Olesen 2012-11-29 03:34:17 +00:00
parent e26e8a64ab
commit 39b5c0c049
7 changed files with 20 additions and 18 deletions

View File

@ -29,10 +29,10 @@ class RegisterClassInfo {
unsigned Tag; unsigned Tag;
unsigned NumRegs; unsigned NumRegs;
bool ProperSubClass; bool ProperSubClass;
OwningArrayPtr<unsigned> Order; OwningArrayPtr<MCPhysReg> Order;
RCInfo() : Tag(0), NumRegs(0), ProperSubClass(false) {} RCInfo() : Tag(0), NumRegs(0), ProperSubClass(false) {}
operator ArrayRef<unsigned>() const { operator ArrayRef<MCPhysReg>() const {
return makeArrayRef(Order.get(), NumRegs); return makeArrayRef(Order.get(), NumRegs);
} }
}; };
@ -84,7 +84,7 @@ public:
/// getOrder - Returns the preferred allocation order for RC. The order /// getOrder - Returns the preferred allocation order for RC. The order
/// contains no reserved registers, and registers that alias callee saved /// contains no reserved registers, and registers that alias callee saved
/// registers come last. /// registers come last.
ArrayRef<unsigned> getOrder(const TargetRegisterClass *RC) const { ArrayRef<MCPhysReg> getOrder(const TargetRegisterClass *RC) const {
return get(RC); return get(RC);
} }

View File

@ -616,7 +616,7 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(
const TargetRegisterClass *SuperRC = const TargetRegisterClass *SuperRC =
TRI->getMinimalPhysRegClass(SuperReg, MVT::Other); TRI->getMinimalPhysRegClass(SuperReg, MVT::Other);
ArrayRef<unsigned> Order = RegClassInfo.getOrder(SuperRC); ArrayRef<MCPhysReg> Order = RegClassInfo.getOrder(SuperRC);
if (Order.empty()) { if (Order.empty()) {
DEBUG(dbgs() << "\tEmpty Super Regclass!!\n"); DEBUG(dbgs() << "\tEmpty Super Regclass!!\n");
return false; return false;

View File

@ -42,7 +42,7 @@ AllocationOrder::AllocationOrder(unsigned VirtReg,
if (HintPair.first) { if (HintPair.first) {
const TargetRegisterInfo &TRI = VRM.getTargetRegInfo(); const TargetRegisterInfo &TRI = VRM.getTargetRegInfo();
// The remaining allocation order may depend on the hint. // The remaining allocation order may depend on the hint.
ArrayRef<uint16_t> Order = ArrayRef<MCPhysReg> Order =
TRI.getRawAllocationOrder(RC, HintPair.first, Hint, TRI.getRawAllocationOrder(RC, HintPair.first, Hint,
VRM.getMachineFunction()); VRM.getMachineFunction());
if (Order.empty()) if (Order.empty())
@ -50,7 +50,7 @@ AllocationOrder::AllocationOrder(unsigned VirtReg,
// Copy the allocation order with reserved registers removed. // Copy the allocation order with reserved registers removed.
OwnedBegin = true; OwnedBegin = true;
unsigned *P = new unsigned[Order.size()]; MCPhysReg *P = new MCPhysReg[Order.size()];
Begin = P; Begin = P;
for (unsigned i = 0; i != Order.size(); ++i) for (unsigned i = 0; i != Order.size(); ++i)
if (!MRI.isReserved(Order[i])) if (!MRI.isReserved(Order[i]))
@ -63,7 +63,7 @@ AllocationOrder::AllocationOrder(unsigned VirtReg,
} else { } else {
// If there is no hint or just a normal hint, use the cached allocation // If there is no hint or just a normal hint, use the cached allocation
// order from RegisterClassInfo. // order from RegisterClassInfo.
ArrayRef<unsigned> O = RCI.getOrder(RC); ArrayRef<MCPhysReg> O = RCI.getOrder(RC);
Begin = O.begin(); Begin = O.begin();
End = O.end(); End = O.end();
} }

View File

@ -17,15 +17,17 @@
#ifndef LLVM_CODEGEN_ALLOCATIONORDER_H #ifndef LLVM_CODEGEN_ALLOCATIONORDER_H
#define LLVM_CODEGEN_ALLOCATIONORDER_H #define LLVM_CODEGEN_ALLOCATIONORDER_H
#include "llvm/MC/MCRegisterInfo.h"
namespace llvm { namespace llvm {
class RegisterClassInfo; class RegisterClassInfo;
class VirtRegMap; class VirtRegMap;
class AllocationOrder { class AllocationOrder {
const unsigned *Begin; const MCPhysReg *Begin;
const unsigned *End; const MCPhysReg *End;
const unsigned *Pos; const MCPhysReg *Pos;
const RegisterClassInfo &RCI; const RegisterClassInfo &RCI;
unsigned Hint; unsigned Hint;
bool OwnedBegin; bool OwnedBegin;

View File

@ -378,7 +378,7 @@ CriticalAntiDepBreaker::findSuitableFreeRegister(RegRefIter RegRefBegin,
unsigned LastNewReg, unsigned LastNewReg,
const TargetRegisterClass *RC) const TargetRegisterClass *RC)
{ {
ArrayRef<unsigned> Order = RegClassInfo.getOrder(RC); ArrayRef<MCPhysReg> Order = RegClassInfo.getOrder(RC);
for (unsigned i = 0; i != Order.size(); ++i) { for (unsigned i = 0; i != Order.size(); ++i) {
unsigned NewReg = Order[i]; unsigned NewReg = Order[i];
// Don't replace a register with itself. // Don't replace a register with itself.

View File

@ -527,10 +527,10 @@ RAFast::LiveRegMap::iterator RAFast::allocVirtReg(MachineInstr *MI,
} }
} }
ArrayRef<unsigned> AO = RegClassInfo.getOrder(RC); ArrayRef<MCPhysReg> AO = RegClassInfo.getOrder(RC);
// First try to find a completely free register. // First try to find a completely free register.
for (ArrayRef<unsigned>::iterator I = AO.begin(), E = AO.end(); I != E; ++I) { for (ArrayRef<MCPhysReg>::iterator I = AO.begin(), E = AO.end(); I != E; ++I){
unsigned PhysReg = *I; unsigned PhysReg = *I;
if (PhysRegState[PhysReg] == regFree && !UsedInInstr.count(PhysReg)) { if (PhysRegState[PhysReg] == regFree && !UsedInInstr.count(PhysReg)) {
assignVirtToPhysReg(*LRI, PhysReg); assignVirtToPhysReg(*LRI, PhysReg);
@ -542,7 +542,7 @@ RAFast::LiveRegMap::iterator RAFast::allocVirtReg(MachineInstr *MI,
<< RC->getName() << "\n"); << RC->getName() << "\n");
unsigned BestReg = 0, BestCost = spillImpossible; unsigned BestReg = 0, BestCost = spillImpossible;
for (ArrayRef<unsigned>::iterator I = AO.begin(), E = AO.end(); I != E; ++I) { for (ArrayRef<MCPhysReg>::iterator I = AO.begin(), E = AO.end(); I != E; ++I){
unsigned Cost = calcSpillCost(*I); unsigned Cost = calcSpillCost(*I);
DEBUG(dbgs() << "\tRegister: " << PrintReg(*I, TRI) << "\n"); DEBUG(dbgs() << "\tRegister: " << PrintReg(*I, TRI) << "\n");
DEBUG(dbgs() << "\tCost: " << Cost << "\n"); DEBUG(dbgs() << "\tCost: " << Cost << "\n");

View File

@ -44,7 +44,7 @@ void RegisterClassInfo::runOnMachineFunction(const MachineFunction &mf) {
} }
// Does this MF have different CSRs? // Does this MF have different CSRs?
const uint16_t *CSR = TRI->getCalleeSavedRegs(MF); const MCPhysReg *CSR = TRI->getCalleeSavedRegs(MF);
if (Update || CSR != CalleeSaved) { if (Update || CSR != CalleeSaved) {
// Build a CSRNum map. Every CSR alias gets an entry pointing to the last // Build a CSRNum map. Every CSR alias gets an entry pointing to the last
// overlapping CSR. // overlapping CSR.
@ -79,14 +79,14 @@ void RegisterClassInfo::compute(const TargetRegisterClass *RC) const {
unsigned NumRegs = RC->getNumRegs(); unsigned NumRegs = RC->getNumRegs();
if (!RCI.Order) if (!RCI.Order)
RCI.Order.reset(new unsigned[NumRegs]); RCI.Order.reset(new MCPhysReg[NumRegs]);
unsigned N = 0; unsigned N = 0;
SmallVector<unsigned, 16> CSRAlias; SmallVector<MCPhysReg, 16> CSRAlias;
// FIXME: Once targets reserve registers instead of removing them from the // FIXME: Once targets reserve registers instead of removing them from the
// allocation order, we can simply use begin/end here. // allocation order, we can simply use begin/end here.
ArrayRef<uint16_t> RawOrder = RC->getRawAllocationOrder(*MF); ArrayRef<MCPhysReg> RawOrder = RC->getRawAllocationOrder(*MF);
for (unsigned i = 0; i != RawOrder.size(); ++i) { for (unsigned i = 0; i != RawOrder.size(); ++i) {
unsigned PhysReg = RawOrder[i]; unsigned PhysReg = RawOrder[i];
// Remove reserved registers from the allocation order. // Remove reserved registers from the allocation order.