mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-19 04:32:19 +00:00
Add a new hook for providing register allocator hints more flexibly.
The TargetRegisterInfo::getRegAllocationHints() function is going to replace the existing mechanisms for providing target-dependent hints to the register allocator: ResolveRegAllocHint() and getRawAllocationOrder(). The new hook is more flexible because it allows the target to provide multiple preferred candidate registers for each virtual register, and it is easier to use because targets are not required to return a reference to a constant array like getRawAllocationOrder(). An optional VirtRegMap argument can be used to provide target-dependent hints that depend on the provisional assignments of other virtual registers. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169154 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b434a8130f
commit
7eafc3e7be
@ -30,6 +30,7 @@ class BitVector;
|
||||
class MachineFunction;
|
||||
class RegScavenger;
|
||||
template<class T> class SmallVectorImpl;
|
||||
class VirtRegMap;
|
||||
class raw_ostream;
|
||||
|
||||
class TargetRegisterClass {
|
||||
@ -626,6 +627,26 @@ public:
|
||||
return RC->getRawAllocationOrder(MF);
|
||||
}
|
||||
|
||||
/// Get a list of 'hint' registers that the register allocator should try
|
||||
/// first when allocating a physical register for the virtual register
|
||||
/// VirtReg. These registers are effectively moved to the front of the
|
||||
/// allocation order.
|
||||
///
|
||||
/// The Order argument is the allocation order for VirtReg's register class
|
||||
/// as returned from RegisterClassInfo::getOrder(). The hint registers must
|
||||
/// come from Order, and they must not be reserved.
|
||||
///
|
||||
/// The default implementation of this function can resolve
|
||||
/// target-independent hints provided to MRI::setRegAllocationHint with
|
||||
/// HintType == 0. Targets that override this function should defer to the
|
||||
/// default implementation if they have no reason to change the allocation
|
||||
/// order for VirtReg. There may be target-independent hints.
|
||||
virtual void getRegAllocationHints(unsigned VirtReg,
|
||||
ArrayRef<MCPhysReg> Order,
|
||||
SmallVectorImpl<MCPhysReg> &Hints,
|
||||
const MachineFunction &MF,
|
||||
const VirtRegMap *VRM = 0) const;
|
||||
|
||||
/// ResolveRegAllocHint - Resolves the specified register allocation hint
|
||||
/// to a physical register. Returns the physical register if it is successful.
|
||||
virtual unsigned ResolveRegAllocHint(unsigned Type, unsigned Reg,
|
||||
|
@ -13,6 +13,9 @@
|
||||
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/VirtRegMap.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
|
||||
@ -246,3 +249,38 @@ getCommonSuperRegClass(const TargetRegisterClass *RCA, unsigned SubA,
|
||||
}
|
||||
return BestRC;
|
||||
}
|
||||
|
||||
// Compute target-independent register allocator hints to help eliminate copies.
|
||||
void
|
||||
TargetRegisterInfo::getRegAllocationHints(unsigned VirtReg,
|
||||
ArrayRef<MCPhysReg> Order,
|
||||
SmallVectorImpl<MCPhysReg> &Hints,
|
||||
const MachineFunction &MF,
|
||||
const VirtRegMap *VRM) const {
|
||||
const MachineRegisterInfo &MRI = MF.getRegInfo();
|
||||
std::pair<unsigned, unsigned> Hint = MRI.getRegAllocationHint(VirtReg);
|
||||
|
||||
// Hints with HintType != 0 were set by target-dependent code.
|
||||
// Such targets must provide their own implementation of
|
||||
// TRI::getRegAllocationHints to interpret those hint types.
|
||||
assert(Hint.first == 0 && "Target must implement TRI::getRegAllocationHints");
|
||||
|
||||
// Target-independent hints are either a physical or a virtual register.
|
||||
unsigned Phys = Hint.second;
|
||||
if (VRM && isVirtualRegister(Phys))
|
||||
Phys = VRM->getPhys(Phys);
|
||||
|
||||
// Check that Phys is a valid hint in VirtReg's register class.
|
||||
if (!isPhysicalRegister(Phys))
|
||||
return;
|
||||
if (MRI.isReserved(Phys))
|
||||
return;
|
||||
// Check that Phys is in the allocation order. We shouldn't heed hints
|
||||
// from VirtReg's register class if they aren't in the allocation order. The
|
||||
// target probably has a reason for removing the register.
|
||||
if (std::find(Order.begin(), Order.end(), Phys) == Order.end())
|
||||
return;
|
||||
|
||||
// All clear, tell the register allocator to prefer this register.
|
||||
Hints.push_back(Phys);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user