mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Teach antidependency breakers to use RegisterClassInfo.
No functional change was intended. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@133202 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
354eee7c8a
commit
fa796dd720
@ -16,6 +16,7 @@
|
||||
|
||||
#define DEBUG_TYPE "post-RA-sched"
|
||||
#include "AggressiveAntiDepBreaker.h"
|
||||
#include "RegisterClassInfo.h"
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineInstr.h"
|
||||
@ -114,12 +115,13 @@ bool AggressiveAntiDepState::IsLive(unsigned Reg)
|
||||
|
||||
AggressiveAntiDepBreaker::
|
||||
AggressiveAntiDepBreaker(MachineFunction& MFi,
|
||||
const RegisterClassInfo &RCI,
|
||||
TargetSubtarget::RegClassVector& CriticalPathRCs) :
|
||||
AntiDepBreaker(), MF(MFi),
|
||||
MRI(MF.getRegInfo()),
|
||||
TII(MF.getTarget().getInstrInfo()),
|
||||
TRI(MF.getTarget().getRegisterInfo()),
|
||||
AllocatableSet(TRI->getAllocatableSet(MF)),
|
||||
RegClassInfo(RCI),
|
||||
State(NULL) {
|
||||
/* Collect a bitset of all registers that are only broken if they
|
||||
are on the critical path. */
|
||||
@ -618,9 +620,8 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(
|
||||
const TargetRegisterClass *SuperRC =
|
||||
TRI->getMinimalPhysRegClass(SuperReg, MVT::Other);
|
||||
|
||||
const TargetRegisterClass::iterator RB = SuperRC->allocation_order_begin(MF);
|
||||
const TargetRegisterClass::iterator RE = SuperRC->allocation_order_end(MF);
|
||||
if (RB == RE) {
|
||||
ArrayRef<unsigned> Order = RegClassInfo.getOrder(SuperRC);
|
||||
if (Order.empty()) {
|
||||
DEBUG(dbgs() << "\tEmpty Super Regclass!!\n");
|
||||
return false;
|
||||
}
|
||||
@ -628,17 +629,17 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(
|
||||
DEBUG(dbgs() << "\tFind Registers:");
|
||||
|
||||
if (RenameOrder.count(SuperRC) == 0)
|
||||
RenameOrder.insert(RenameOrderType::value_type(SuperRC, RE));
|
||||
RenameOrder.insert(RenameOrderType::value_type(SuperRC, Order.size()));
|
||||
|
||||
const TargetRegisterClass::iterator OrigR = RenameOrder[SuperRC];
|
||||
const TargetRegisterClass::iterator EndR = ((OrigR == RE) ? RB : OrigR);
|
||||
TargetRegisterClass::iterator R = OrigR;
|
||||
unsigned OrigR = RenameOrder[SuperRC];
|
||||
unsigned EndR = ((OrigR == Order.size()) ? 0 : OrigR);
|
||||
unsigned R = OrigR;
|
||||
do {
|
||||
if (R == RB) R = RE;
|
||||
if (R == 0) R = Order.size();
|
||||
--R;
|
||||
const unsigned NewSuperReg = *R;
|
||||
const unsigned NewSuperReg = Order[R];
|
||||
// Don't consider non-allocatable registers
|
||||
if (!AllocatableSet.test(NewSuperReg)) continue;
|
||||
if (!RegClassInfo.isAllocatable(NewSuperReg)) continue;
|
||||
// Don't replace a register with itself.
|
||||
if (NewSuperReg == SuperReg) continue;
|
||||
|
||||
@ -819,7 +820,7 @@ unsigned AggressiveAntiDepBreaker::BreakAntiDependencies(
|
||||
DEBUG(dbgs() << "\tAntidep reg: " << TRI->getName(AntiDepReg));
|
||||
assert(AntiDepReg != 0 && "Anti-dependence on reg0?");
|
||||
|
||||
if (!AllocatableSet.test(AntiDepReg)) {
|
||||
if (!RegClassInfo.isAllocatable(AntiDepReg)) {
|
||||
// Don't break anti-dependencies on non-allocatable registers.
|
||||
DEBUG(dbgs() << " (non-allocatable)\n");
|
||||
continue;
|
||||
|
@ -30,6 +30,8 @@
|
||||
#include <map>
|
||||
|
||||
namespace llvm {
|
||||
class RegisterClassInfo;
|
||||
|
||||
/// Class AggressiveAntiDepState
|
||||
/// Contains all the state necessary for anti-dep breaking.
|
||||
class AggressiveAntiDepState {
|
||||
@ -117,11 +119,7 @@ namespace llvm {
|
||||
MachineRegisterInfo &MRI;
|
||||
const TargetInstrInfo *TII;
|
||||
const TargetRegisterInfo *TRI;
|
||||
|
||||
/// AllocatableSet - The set of allocatable registers.
|
||||
/// We'll be ignoring anti-dependencies on non-allocatable registers,
|
||||
/// because they may not be safe to break.
|
||||
const BitVector AllocatableSet;
|
||||
const RegisterClassInfo &RegClassInfo;
|
||||
|
||||
/// CriticalPathSet - The set of registers that should only be
|
||||
/// renamed if they are on the critical path.
|
||||
@ -133,6 +131,7 @@ namespace llvm {
|
||||
|
||||
public:
|
||||
AggressiveAntiDepBreaker(MachineFunction& MFi,
|
||||
const RegisterClassInfo &RCI,
|
||||
TargetSubtarget::RegClassVector& CriticalPathRCs);
|
||||
~AggressiveAntiDepBreaker();
|
||||
|
||||
@ -158,8 +157,8 @@ namespace llvm {
|
||||
void FinishBlock();
|
||||
|
||||
private:
|
||||
typedef std::map<const TargetRegisterClass *,
|
||||
TargetRegisterClass::const_iterator> RenameOrderType;
|
||||
/// Keep track of a position in the allocation order for each regclass.
|
||||
typedef std::map<const TargetRegisterClass *, unsigned> RenameOrderType;
|
||||
|
||||
/// IsImplicitDefUse - Return true if MO represents a register
|
||||
/// that is both implicitly used and defined in MI
|
||||
|
@ -27,12 +27,12 @@
|
||||
using namespace llvm;
|
||||
|
||||
CriticalAntiDepBreaker::
|
||||
CriticalAntiDepBreaker(MachineFunction& MFi) :
|
||||
CriticalAntiDepBreaker(MachineFunction& MFi, const RegisterClassInfo &RCI) :
|
||||
AntiDepBreaker(), MF(MFi),
|
||||
MRI(MF.getRegInfo()),
|
||||
TII(MF.getTarget().getInstrInfo()),
|
||||
TRI(MF.getTarget().getRegisterInfo()),
|
||||
AllocatableSet(TRI->getAllocatableSet(MF)),
|
||||
RegClassInfo(RCI),
|
||||
Classes(TRI->getNumRegs(), static_cast<const TargetRegisterClass *>(0)),
|
||||
KillIndices(TRI->getNumRegs(), 0),
|
||||
DefIndices(TRI->getNumRegs(), 0) {}
|
||||
@ -385,11 +385,9 @@ CriticalAntiDepBreaker::findSuitableFreeRegister(RegRefIter RegRefBegin,
|
||||
unsigned LastNewReg,
|
||||
const TargetRegisterClass *RC)
|
||||
{
|
||||
for (TargetRegisterClass::iterator R = RC->allocation_order_begin(MF),
|
||||
RE = RC->allocation_order_end(MF); R != RE; ++R) {
|
||||
unsigned NewReg = *R;
|
||||
// Don't consider non-allocatable registers
|
||||
if (!AllocatableSet.test(NewReg)) continue;
|
||||
ArrayRef<unsigned> Order = RegClassInfo.getOrder(RC);
|
||||
for (unsigned i = 0; i != Order.size(); ++i) {
|
||||
unsigned NewReg = Order[i];
|
||||
// Don't replace a register with itself.
|
||||
if (NewReg == AntiDepReg) continue;
|
||||
// Don't replace a register with one that was recently used to repair
|
||||
@ -534,7 +532,7 @@ BreakAntiDependencies(const std::vector<SUnit>& SUnits,
|
||||
if (Edge->getKind() == SDep::Anti) {
|
||||
AntiDepReg = Edge->getReg();
|
||||
assert(AntiDepReg != 0 && "Anti-dependence on reg0?");
|
||||
if (!AllocatableSet.test(AntiDepReg))
|
||||
if (!RegClassInfo.isAllocatable(AntiDepReg))
|
||||
// Don't break anti-dependencies on non-allocatable registers.
|
||||
AntiDepReg = 0;
|
||||
else if (KeepRegs.count(AntiDepReg))
|
||||
|
@ -17,6 +17,7 @@
|
||||
#define LLVM_CODEGEN_CRITICALANTIDEPBREAKER_H
|
||||
|
||||
#include "AntiDepBreaker.h"
|
||||
#include "RegisterClassInfo.h"
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
@ -27,6 +28,7 @@
|
||||
#include <map>
|
||||
|
||||
namespace llvm {
|
||||
class RegisterClassInfo;
|
||||
class TargetInstrInfo;
|
||||
class TargetRegisterInfo;
|
||||
|
||||
@ -35,6 +37,7 @@ class TargetRegisterInfo;
|
||||
MachineRegisterInfo &MRI;
|
||||
const TargetInstrInfo *TII;
|
||||
const TargetRegisterInfo *TRI;
|
||||
const RegisterClassInfo &RegClassInfo;
|
||||
|
||||
/// AllocatableSet - The set of allocatable registers.
|
||||
/// We'll be ignoring anti-dependencies on non-allocatable registers,
|
||||
@ -66,7 +69,7 @@ class TargetRegisterInfo;
|
||||
SmallSet<unsigned, 4> KeepRegs;
|
||||
|
||||
public:
|
||||
CriticalAntiDepBreaker(MachineFunction& MFi);
|
||||
CriticalAntiDepBreaker(MachineFunction& MFi, const RegisterClassInfo&);
|
||||
~CriticalAntiDepBreaker();
|
||||
|
||||
/// Start - Initialize anti-dep breaking for a new basic block.
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include "AntiDepBreaker.h"
|
||||
#include "AggressiveAntiDepBreaker.h"
|
||||
#include "CriticalAntiDepBreaker.h"
|
||||
#include "RegisterClassInfo.h"
|
||||
#include "ScheduleDAGInstrs.h"
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
#include "llvm/CodeGen/LatencyPriorityQueue.h"
|
||||
@ -80,6 +81,7 @@ namespace {
|
||||
class PostRAScheduler : public MachineFunctionPass {
|
||||
AliasAnalysis *AA;
|
||||
const TargetInstrInfo *TII;
|
||||
RegisterClassInfo RegClassInfo;
|
||||
CodeGenOpt::Level OptLevel;
|
||||
|
||||
public:
|
||||
@ -135,7 +137,8 @@ namespace {
|
||||
public:
|
||||
SchedulePostRATDList(
|
||||
MachineFunction &MF, MachineLoopInfo &MLI, MachineDominatorTree &MDT,
|
||||
AliasAnalysis *AA, TargetSubtarget::AntiDepBreakMode AntiDepMode,
|
||||
AliasAnalysis *AA, const RegisterClassInfo&,
|
||||
TargetSubtarget::AntiDepBreakMode AntiDepMode,
|
||||
SmallVectorImpl<TargetRegisterClass*> &CriticalPathRCs);
|
||||
|
||||
~SchedulePostRATDList();
|
||||
@ -179,7 +182,8 @@ namespace {
|
||||
|
||||
SchedulePostRATDList::SchedulePostRATDList(
|
||||
MachineFunction &MF, MachineLoopInfo &MLI, MachineDominatorTree &MDT,
|
||||
AliasAnalysis *AA, TargetSubtarget::AntiDepBreakMode AntiDepMode,
|
||||
AliasAnalysis *AA, const RegisterClassInfo &RCI,
|
||||
TargetSubtarget::AntiDepBreakMode AntiDepMode,
|
||||
SmallVectorImpl<TargetRegisterClass*> &CriticalPathRCs)
|
||||
: ScheduleDAGInstrs(MF, MLI, MDT), Topo(SUnits), AA(AA),
|
||||
KillIndices(TRI->getNumRegs())
|
||||
@ -190,9 +194,9 @@ SchedulePostRATDList::SchedulePostRATDList(
|
||||
TM.getInstrInfo()->CreateTargetPostRAHazardRecognizer(InstrItins, this);
|
||||
AntiDepBreak =
|
||||
((AntiDepMode == TargetSubtarget::ANTIDEP_ALL) ?
|
||||
(AntiDepBreaker *)new AggressiveAntiDepBreaker(MF, CriticalPathRCs) :
|
||||
(AntiDepBreaker *)new AggressiveAntiDepBreaker(MF, RCI, CriticalPathRCs) :
|
||||
((AntiDepMode == TargetSubtarget::ANTIDEP_CRITICAL) ?
|
||||
(AntiDepBreaker *)new CriticalAntiDepBreaker(MF) : NULL));
|
||||
(AntiDepBreaker *)new CriticalAntiDepBreaker(MF, RCI) : NULL));
|
||||
}
|
||||
|
||||
SchedulePostRATDList::~SchedulePostRATDList() {
|
||||
@ -205,6 +209,7 @@ bool PostRAScheduler::runOnMachineFunction(MachineFunction &Fn) {
|
||||
MachineLoopInfo &MLI = getAnalysis<MachineLoopInfo>();
|
||||
MachineDominatorTree &MDT = getAnalysis<MachineDominatorTree>();
|
||||
AliasAnalysis *AA = &getAnalysis<AliasAnalysis>();
|
||||
RegClassInfo.runOnMachineFunction(Fn);
|
||||
|
||||
// Check for explicit enable/disable of post-ra scheduling.
|
||||
TargetSubtarget::AntiDepBreakMode AntiDepMode = TargetSubtarget::ANTIDEP_NONE;
|
||||
@ -230,7 +235,7 @@ bool PostRAScheduler::runOnMachineFunction(MachineFunction &Fn) {
|
||||
|
||||
DEBUG(dbgs() << "PostRAScheduler\n");
|
||||
|
||||
SchedulePostRATDList Scheduler(Fn, MLI, MDT, AA, AntiDepMode,
|
||||
SchedulePostRATDList Scheduler(Fn, MLI, MDT, AA, RegClassInfo, AntiDepMode,
|
||||
CriticalPathRCs);
|
||||
|
||||
// Loop over all of the basic blocks
|
||||
|
Loading…
Reference in New Issue
Block a user