mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-08 06:32:24 +00:00
pull inverse reg class mapping into a class that is sharable and out of the
target register description classes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5045 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
abe8dd592d
commit
dd444f9242
@ -11,6 +11,30 @@
|
||||
#include "Support/Statistic.h"
|
||||
#include <iostream>
|
||||
|
||||
/// PhysRegClassMap - Construct a mapping of physical register numbers to their
|
||||
/// register classes.
|
||||
///
|
||||
/// NOTE: This class will eventually be pulled out to somewhere shared.
|
||||
///
|
||||
class PhysRegClassMap {
|
||||
std::map<unsigned, const TargetRegisterClass*> PhysReg2RegClassMap;
|
||||
public:
|
||||
PhysRegClassMap(const MRegisterInfo *RI) {
|
||||
for (MRegisterInfo::const_iterator I = RI->regclass_begin(),
|
||||
E = RI->regclass_end(); I != E; ++I)
|
||||
for (unsigned i=0; i < (*I)->getNumRegs(); ++i)
|
||||
PhysReg2RegClassMap[(*I)->getRegister(i)] = *I;
|
||||
}
|
||||
|
||||
const TargetRegisterClass *operator[](unsigned Reg) {
|
||||
assert(PhysReg2RegClassMap[Reg] && "Register is not a known physreg!");
|
||||
return PhysReg2RegClassMap[Reg];
|
||||
}
|
||||
|
||||
const TargetRegisterClass *get(unsigned Reg) { return operator[](Reg); }
|
||||
};
|
||||
|
||||
|
||||
namespace {
|
||||
struct RegAllocSimple : public FunctionPass {
|
||||
TargetMachine &TM;
|
||||
@ -27,7 +51,7 @@ namespace {
|
||||
std::map<unsigned, unsigned> SSA2PhysRegMap;
|
||||
|
||||
// Maps physical register to their register classes
|
||||
std::map<unsigned, const TargetRegisterClass*> PhysReg2RegClassMap;
|
||||
PhysRegClassMap PhysRegClasses;
|
||||
|
||||
// Made to combat the incorrect allocation of r2 = add r1, r1
|
||||
std::map<unsigned, unsigned> VirtReg2PhysRegMap;
|
||||
@ -40,11 +64,9 @@ namespace {
|
||||
|
||||
RegAllocSimple(TargetMachine &tm) : TM(tm), CurrMBB(0), maxOffset(0),
|
||||
RegInfo(tm.getRegisterInfo()),
|
||||
ByteAlignment(4)
|
||||
ByteAlignment(4),
|
||||
PhysRegClasses(RegInfo)
|
||||
{
|
||||
// build reverse mapping for physReg -> register class
|
||||
RegInfo->buildReg2RegClassMap(PhysReg2RegClassMap);
|
||||
|
||||
RegsUsed[RegInfo->getFramePointer()] = 1;
|
||||
RegsUsed[RegInfo->getStackPointer()] = 1;
|
||||
|
||||
@ -248,7 +270,7 @@ bool RegAllocSimple::runOnMachineFunction(MachineFunction &Fn) {
|
||||
|
||||
// Find the register class of the target register: should be the
|
||||
// same as the values we're trying to store there
|
||||
const TargetRegisterClass* regClass = PhysReg2RegClassMap[physReg];
|
||||
const TargetRegisterClass* regClass = PhysRegClasses[physReg];
|
||||
assert(regClass && "Target register class not found!");
|
||||
unsigned dataSize = regClass->getDataSize();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user