mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-25 04:39:44 +00:00
MachineLICM: Use TargetSchedModel instead of just itineraries
This will use Itinieraries if available, but will also work if just a MCSchedModel is available. Differential Revision: http://reviews.llvm.org/D10428 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239658 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
953c681473
commit
6fee0b00e2
@ -40,6 +40,7 @@ class TargetRegisterClass;
|
||||
class TargetRegisterInfo;
|
||||
class BranchProbability;
|
||||
class TargetSubtargetInfo;
|
||||
class TargetSchedModel;
|
||||
class DFAPacketizer;
|
||||
|
||||
template<class T> class SmallVectorImpl;
|
||||
@ -1054,7 +1055,7 @@ public:
|
||||
/// determine whether it makes sense to hoist an instruction out even in a
|
||||
/// high register pressure situation.
|
||||
virtual
|
||||
bool hasHighOperandLatency(const InstrItineraryData *ItinData,
|
||||
bool hasHighOperandLatency(const TargetSchedModel &SchedModel,
|
||||
const MachineRegisterInfo *MRI,
|
||||
const MachineInstr *DefMI, unsigned DefIdx,
|
||||
const MachineInstr *UseMI, unsigned UseIdx) const {
|
||||
@ -1064,7 +1065,7 @@ public:
|
||||
/// Compute operand latency of a def of 'Reg'. Return true
|
||||
/// if the target considered it 'low'.
|
||||
virtual
|
||||
bool hasLowDefLatency(const InstrItineraryData *ItinData,
|
||||
bool hasLowDefLatency(const TargetSchedModel &SchedModel,
|
||||
const MachineInstr *DefMI, unsigned DefIdx) const;
|
||||
|
||||
/// Perform target-specific instruction verification.
|
||||
|
@ -27,7 +27,7 @@
|
||||
#include "llvm/CodeGen/MachineMemOperand.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/PseudoSourceValue.h"
|
||||
#include "llvm/MC/MCInstrItineraries.h"
|
||||
#include "llvm/CodeGen/TargetSchedule.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
@ -74,7 +74,7 @@ namespace {
|
||||
const TargetRegisterInfo *TRI;
|
||||
const MachineFrameInfo *MFI;
|
||||
MachineRegisterInfo *MRI;
|
||||
const InstrItineraryData *InstrItins;
|
||||
TargetSchedModel SchedModel;
|
||||
bool PreRegAlloc;
|
||||
|
||||
// Various analyses that we use...
|
||||
@ -338,12 +338,13 @@ bool MachineLICM::runOnMachineFunction(MachineFunction &MF) {
|
||||
return false;
|
||||
|
||||
Changed = FirstInLoop = false;
|
||||
TII = MF.getSubtarget().getInstrInfo();
|
||||
TLI = MF.getSubtarget().getTargetLowering();
|
||||
TRI = MF.getSubtarget().getRegisterInfo();
|
||||
const TargetSubtargetInfo &ST = MF.getSubtarget();
|
||||
TII = ST.getInstrInfo();
|
||||
TLI = ST.getTargetLowering();
|
||||
TRI = ST.getRegisterInfo();
|
||||
MFI = MF.getFrameInfo();
|
||||
MRI = &MF.getRegInfo();
|
||||
InstrItins = MF.getSubtarget().getInstrItineraryData();
|
||||
SchedModel.init(ST.getSchedModel(), &ST, TII);
|
||||
|
||||
PreRegAlloc = MRI->isSSA();
|
||||
|
||||
@ -1046,7 +1047,7 @@ bool MachineLICM::HasLoopPHIUse(const MachineInstr *MI) const {
|
||||
/// it 'high'.
|
||||
bool MachineLICM::HasHighOperandLatency(MachineInstr &MI,
|
||||
unsigned DefIdx, unsigned Reg) const {
|
||||
if (!InstrItins || InstrItins->isEmpty() || MRI->use_nodbg_empty(Reg))
|
||||
if (MRI->use_nodbg_empty(Reg))
|
||||
return false;
|
||||
|
||||
for (MachineInstr &UseMI : MRI->use_nodbg_instructions(Reg)) {
|
||||
@ -1062,7 +1063,7 @@ bool MachineLICM::HasHighOperandLatency(MachineInstr &MI,
|
||||
if (MOReg != Reg)
|
||||
continue;
|
||||
|
||||
if (TII->hasHighOperandLatency(InstrItins, MRI, &MI, DefIdx, &UseMI, i))
|
||||
if (TII->hasHighOperandLatency(SchedModel, MRI, &MI, DefIdx, &UseMI, i))
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -1078,8 +1079,6 @@ bool MachineLICM::HasHighOperandLatency(MachineInstr &MI,
|
||||
bool MachineLICM::IsCheapInstruction(MachineInstr &MI) const {
|
||||
if (TII->isAsCheapAsAMove(&MI) || MI.isCopyLike())
|
||||
return true;
|
||||
if (!InstrItins || InstrItins->isEmpty())
|
||||
return false;
|
||||
|
||||
bool isCheap = false;
|
||||
unsigned NumDefs = MI.getDesc().getNumDefs();
|
||||
@ -1092,7 +1091,7 @@ bool MachineLICM::IsCheapInstruction(MachineInstr &MI) const {
|
||||
if (TargetRegisterInfo::isPhysicalRegister(Reg))
|
||||
continue;
|
||||
|
||||
if (!TII->hasLowDefLatency(InstrItins, &MI, i))
|
||||
if (!TII->hasLowDefLatency(SchedModel, &MI, i))
|
||||
return false;
|
||||
isCheap = true;
|
||||
}
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "llvm/CodeGen/PseudoSourceValue.h"
|
||||
#include "llvm/CodeGen/ScoreboardHazardRecognizer.h"
|
||||
#include "llvm/CodeGen/StackMaps.h"
|
||||
#include "llvm/CodeGen/TargetSchedule.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/MC/MCAsmInfo.h"
|
||||
#include "llvm/MC/MCInstrItineraries.h"
|
||||
@ -801,9 +802,10 @@ getInstrLatency(const InstrItineraryData *ItinData,
|
||||
return ItinData->getStageLatency(MI->getDesc().getSchedClass());
|
||||
}
|
||||
|
||||
bool TargetInstrInfo::hasLowDefLatency(const InstrItineraryData *ItinData,
|
||||
bool TargetInstrInfo::hasLowDefLatency(const TargetSchedModel &SchedModel,
|
||||
const MachineInstr *DefMI,
|
||||
unsigned DefIdx) const {
|
||||
const InstrItineraryData *ItinData = SchedModel.getInstrItineraries();
|
||||
if (!ItinData || ItinData->isEmpty())
|
||||
return false;
|
||||
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "llvm/CodeGen/MachineMemOperand.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/SelectionDAGNodes.h"
|
||||
#include "llvm/CodeGen/TargetSchedule.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/GlobalValue.h"
|
||||
@ -3993,7 +3994,7 @@ int ARMBaseInstrInfo::getInstrLatency(const InstrItineraryData *ItinData,
|
||||
}
|
||||
|
||||
bool ARMBaseInstrInfo::
|
||||
hasHighOperandLatency(const InstrItineraryData *ItinData,
|
||||
hasHighOperandLatency(const TargetSchedModel &SchedModel,
|
||||
const MachineRegisterInfo *MRI,
|
||||
const MachineInstr *DefMI, unsigned DefIdx,
|
||||
const MachineInstr *UseMI, unsigned UseIdx) const {
|
||||
@ -4005,9 +4006,8 @@ hasHighOperandLatency(const InstrItineraryData *ItinData,
|
||||
return true;
|
||||
|
||||
// Hoist VFP / NEON instructions with 4 or higher latency.
|
||||
int Latency = computeOperandLatency(ItinData, DefMI, DefIdx, UseMI, UseIdx);
|
||||
if (Latency < 0)
|
||||
Latency = getInstrLatency(ItinData, DefMI);
|
||||
unsigned Latency
|
||||
= SchedModel.computeOperandLatency(DefMI, DefIdx, UseMI, UseIdx);
|
||||
if (Latency <= 3)
|
||||
return false;
|
||||
return DDomain == ARMII::DomainVFP || DDomain == ARMII::DomainNEON ||
|
||||
@ -4015,8 +4015,9 @@ hasHighOperandLatency(const InstrItineraryData *ItinData,
|
||||
}
|
||||
|
||||
bool ARMBaseInstrInfo::
|
||||
hasLowDefLatency(const InstrItineraryData *ItinData,
|
||||
hasLowDefLatency(const TargetSchedModel &SchedModel,
|
||||
const MachineInstr *DefMI, unsigned DefIdx) const {
|
||||
const InstrItineraryData *ItinData = SchedModel.getInstrItineraries();
|
||||
if (!ItinData || ItinData->isEmpty())
|
||||
return false;
|
||||
|
||||
|
@ -327,12 +327,12 @@ private:
|
||||
int getInstrLatency(const InstrItineraryData *ItinData,
|
||||
SDNode *Node) const override;
|
||||
|
||||
bool hasHighOperandLatency(const InstrItineraryData *ItinData,
|
||||
bool hasHighOperandLatency(const TargetSchedModel &SchedModel,
|
||||
const MachineRegisterInfo *MRI,
|
||||
const MachineInstr *DefMI, unsigned DefIdx,
|
||||
const MachineInstr *UseMI,
|
||||
unsigned UseIdx) const override;
|
||||
bool hasLowDefLatency(const InstrItineraryData *ItinData,
|
||||
bool hasLowDefLatency(const TargetSchedModel &SchedModel,
|
||||
const MachineInstr *DefMI,
|
||||
unsigned DefIdx) const override;
|
||||
|
||||
|
@ -106,7 +106,7 @@ public:
|
||||
UseNode, UseIdx);
|
||||
}
|
||||
|
||||
bool hasLowDefLatency(const InstrItineraryData *ItinData,
|
||||
bool hasLowDefLatency(const TargetSchedModel &SchedModel,
|
||||
const MachineInstr *DefMI,
|
||||
unsigned DefIdx) const override {
|
||||
// Machine LICM should hoist all instructions in low-register-pressure
|
||||
|
@ -6217,7 +6217,7 @@ bool X86InstrInfo::isHighLatencyDef(int opc) const {
|
||||
}
|
||||
|
||||
bool X86InstrInfo::
|
||||
hasHighOperandLatency(const InstrItineraryData *ItinData,
|
||||
hasHighOperandLatency(const TargetSchedModel &SchedModel,
|
||||
const MachineRegisterInfo *MRI,
|
||||
const MachineInstr *DefMI, unsigned DefIdx,
|
||||
const MachineInstr *UseMI, unsigned UseIdx) const {
|
||||
|
@ -433,7 +433,7 @@ public:
|
||||
|
||||
bool isHighLatencyDef(int opc) const override;
|
||||
|
||||
bool hasHighOperandLatency(const InstrItineraryData *ItinData,
|
||||
bool hasHighOperandLatency(const TargetSchedModel &SchedModel,
|
||||
const MachineRegisterInfo *MRI,
|
||||
const MachineInstr *DefMI, unsigned DefIdx,
|
||||
const MachineInstr *UseMI,
|
||||
|
Loading…
Reference in New Issue
Block a user