mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 12:43:36 +01:00
Move CalculateRegClass to MRI::recomputeRegClass.
This function doesn't have anything to do with spill weights, and MRI already has functions for manipulating the register class of a virtual register. llvm-svn: 137123
This commit is contained in:
parent
dc14179294
commit
cbd8bcf3b8
@ -49,11 +49,6 @@ namespace llvm {
|
||||
const MachineLoopInfo &loops) :
|
||||
MF(mf), LIS(lis), Loops(loops) {}
|
||||
|
||||
/// CalculateRegClass - recompute the register class for reg from its uses.
|
||||
/// Since the register class can affect the allocation hint, this function
|
||||
/// should be called before CalculateWeightAndHint if both are called.
|
||||
void CalculateRegClass(unsigned reg);
|
||||
|
||||
/// CalculateWeightAndHint - (re)compute li's spill weight and allocation
|
||||
/// hint.
|
||||
void CalculateWeightAndHint(LiveInterval &li);
|
||||
|
@ -219,9 +219,20 @@ public:
|
||||
/// Return the new register class, or NULL if no such class exists.
|
||||
/// This should only be used when the constraint is known to be trivial, like
|
||||
/// GR32 -> GR32_NOSP. Beware of increasing register pressure.
|
||||
///
|
||||
const TargetRegisterClass *constrainRegClass(unsigned Reg,
|
||||
const TargetRegisterClass *RC);
|
||||
|
||||
/// recomputeRegClass - Try to find a legal super-class of Reg's register
|
||||
/// class that still satisfies the constraints from the instructions using
|
||||
/// Reg. Returns true if Reg was upgraded.
|
||||
///
|
||||
/// This method can be used after constraints have been removed from a
|
||||
/// virtual register, for example after removing instructions or splitting
|
||||
/// the live range.
|
||||
///
|
||||
bool recomputeRegClass(unsigned Reg, const TargetMachine&);
|
||||
|
||||
/// createVirtualRegister - Create and return a new virtual register in the
|
||||
/// function with the specified register class.
|
||||
///
|
||||
|
@ -185,35 +185,3 @@ void VirtRegAuxInfo::CalculateWeightAndHint(LiveInterval &li) {
|
||||
|
||||
li.weight = normalizeSpillWeight(totalWeight, li.getSize());
|
||||
}
|
||||
|
||||
void VirtRegAuxInfo::CalculateRegClass(unsigned reg) {
|
||||
MachineRegisterInfo &MRI = MF.getRegInfo();
|
||||
const TargetInstrInfo *TII = MF.getTarget().getInstrInfo();
|
||||
const TargetRegisterInfo *TRI = MF.getTarget().getRegisterInfo();
|
||||
const TargetRegisterClass *OldRC = MRI.getRegClass(reg);
|
||||
const TargetRegisterClass *NewRC = TRI->getLargestLegalSuperClass(OldRC);
|
||||
|
||||
// Stop early if there is no room to grow.
|
||||
if (NewRC == OldRC)
|
||||
return;
|
||||
|
||||
// Accumulate constraints from all uses.
|
||||
for (MachineRegisterInfo::reg_nodbg_iterator I = MRI.reg_nodbg_begin(reg),
|
||||
E = MRI.reg_nodbg_end(); I != E; ++I) {
|
||||
// TRI doesn't have accurate enough information to model this yet.
|
||||
if (I.getOperand().getSubReg())
|
||||
return;
|
||||
// Inline asm instuctions don't remember their constraints.
|
||||
if (I->isInlineAsm())
|
||||
return;
|
||||
const TargetRegisterClass *OpRC =
|
||||
TII->getRegClass(I->getDesc(), I.getOperandNo(), TRI);
|
||||
if (OpRC)
|
||||
NewRC = getCommonSubClass(NewRC, OpRC);
|
||||
if (!NewRC || NewRC == OldRC)
|
||||
return;
|
||||
}
|
||||
DEBUG(dbgs() << "Inflating " << OldRC->getName() << ':' << PrintReg(reg)
|
||||
<< " to " << NewRC->getName() <<".\n");
|
||||
MRI.setRegClass(reg, NewRC);
|
||||
}
|
||||
|
@ -319,9 +319,12 @@ void LiveRangeEdit::calculateRegClassAndHint(MachineFunction &MF,
|
||||
LiveIntervals &LIS,
|
||||
const MachineLoopInfo &Loops) {
|
||||
VirtRegAuxInfo VRAI(MF, LIS, Loops);
|
||||
MachineRegisterInfo &MRI = MF.getRegInfo();
|
||||
for (iterator I = begin(), E = end(); I != E; ++I) {
|
||||
LiveInterval &LI = **I;
|
||||
VRAI.CalculateRegClass(LI.reg);
|
||||
if (MRI.recomputeRegClass(LI.reg, MF.getTarget()))
|
||||
DEBUG(dbgs() << "Inflated " << PrintReg(LI.reg) << " to "
|
||||
<< MRI.getRegClass(LI.reg)->getName() << '\n');
|
||||
VRAI.CalculateWeightAndHint(LI);
|
||||
}
|
||||
}
|
||||
|
@ -14,7 +14,7 @@
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
using namespace llvm;
|
||||
|
||||
MachineRegisterInfo::MachineRegisterInfo(const TargetRegisterInfo &TRI)
|
||||
@ -61,6 +61,37 @@ MachineRegisterInfo::constrainRegClass(unsigned Reg,
|
||||
return NewRC;
|
||||
}
|
||||
|
||||
bool
|
||||
MachineRegisterInfo::recomputeRegClass(unsigned Reg, const TargetMachine &TM) {
|
||||
const TargetInstrInfo *TII = TM.getInstrInfo();
|
||||
const TargetRegisterInfo *TRI = TM.getRegisterInfo();
|
||||
const TargetRegisterClass *OldRC = getRegClass(Reg);
|
||||
const TargetRegisterClass *NewRC = TRI->getLargestLegalSuperClass(OldRC);
|
||||
|
||||
// Stop early if there is no room to grow.
|
||||
if (NewRC == OldRC)
|
||||
return false;
|
||||
|
||||
// Accumulate constraints from all uses.
|
||||
for (reg_nodbg_iterator I = reg_nodbg_begin(Reg), E = reg_nodbg_end(); I != E;
|
||||
++I) {
|
||||
// TRI doesn't have accurate enough information to model this yet.
|
||||
if (I.getOperand().getSubReg())
|
||||
return false;
|
||||
// Inline asm instuctions don't remember their constraints.
|
||||
if (I->isInlineAsm())
|
||||
return false;
|
||||
const TargetRegisterClass *OpRC =
|
||||
TII->getRegClass(I->getDesc(), I.getOperandNo(), TRI);
|
||||
if (OpRC)
|
||||
NewRC = getCommonSubClass(NewRC, OpRC);
|
||||
if (!NewRC || NewRC == OldRC)
|
||||
return false;
|
||||
}
|
||||
setRegClass(Reg, NewRC);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// createVirtualRegister - Create and return a new virtual register in the
|
||||
/// function with the specified register class.
|
||||
///
|
||||
|
Loading…
Reference in New Issue
Block a user