forked from OSchip/llvm-project
IfConverter: Use TargetSchedule for instruction latencies
For targets that have instruction itineraries this means no change. Targets that move over to the new schedule model will use be able the new schedule module for instruction latencies in the if-converter (the logic is such that if there is no itineary we will use the new sched model for the latencies). Before, we queried "TTI->getInstructionLatency()" for the instruction latency and the extra prediction cost. Now, we query the TargetSchedule abstraction for the instruction latency and TargetInstrInfo for the extra predictation cost. The TargetSchedule abstraction will internally call "TTI->getInstructionLatency" if an itinerary exists, otherwise it will use the new schedule model. ATTENTION: Out of tree targets! (I will also send out an email later to LLVMDev) This means, if your target implements unsigned getInstrLatency(const InstrItineraryData *ItinData, const MachineInstr *MI, unsigned *PredCost); and returns a value for "PredCost", you now also need to implement unsigned getPredictationCost(const MachineInstr *MI); (if your target uses the IfConversion.cpp pass) radar://15077010 llvm-svn: 191671
This commit is contained in:
parent
e693181c10
commit
d2f96b91ca
|
@ -152,7 +152,13 @@ public:
|
||||||
/// Compute and return the expected latency of this instruction independent of
|
/// Compute and return the expected latency of this instruction independent of
|
||||||
/// a particular use. computeOperandLatency is the prefered API, but this is
|
/// a particular use. computeOperandLatency is the prefered API, but this is
|
||||||
/// occasionally useful to help estimate instruction cost.
|
/// occasionally useful to help estimate instruction cost.
|
||||||
unsigned computeInstrLatency(const MachineInstr *MI) const;
|
///
|
||||||
|
/// If UseDefaultDefLatency is false and no new machine sched model is
|
||||||
|
/// present this method falls back to TII->getInstrLatency with an empty
|
||||||
|
/// instruction itinerary (this is so we preserve the previous behavior of the
|
||||||
|
/// if converter after moving it to TargetSchedModel).
|
||||||
|
unsigned computeInstrLatency(const MachineInstr *MI,
|
||||||
|
bool UseDefaultDefLatency = true) const;
|
||||||
|
|
||||||
/// \brief Output dependency latency of a pair of defs of the same register.
|
/// \brief Output dependency latency of a pair of defs of the same register.
|
||||||
///
|
///
|
||||||
|
|
|
@ -823,6 +823,8 @@ public:
|
||||||
const MachineInstr *MI,
|
const MachineInstr *MI,
|
||||||
unsigned *PredCost = 0) const;
|
unsigned *PredCost = 0) const;
|
||||||
|
|
||||||
|
virtual unsigned getPredicationCost(const MachineInstr *MI) const;
|
||||||
|
|
||||||
virtual int getInstrLatency(const InstrItineraryData *ItinData,
|
virtual int getInstrLatency(const InstrItineraryData *ItinData,
|
||||||
SDNode *Node) const;
|
SDNode *Node) const;
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||||
|
#include "llvm/CodeGen/TargetSchedule.h"
|
||||||
#include "llvm/MC/MCInstrItineraries.h"
|
#include "llvm/MC/MCInstrItineraries.h"
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
|
@ -31,6 +32,8 @@
|
||||||
#include "llvm/Target/TargetLowering.h"
|
#include "llvm/Target/TargetLowering.h"
|
||||||
#include "llvm/Target/TargetMachine.h"
|
#include "llvm/Target/TargetMachine.h"
|
||||||
#include "llvm/Target/TargetRegisterInfo.h"
|
#include "llvm/Target/TargetRegisterInfo.h"
|
||||||
|
#include "llvm/Target/TargetSubtargetInfo.h"
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
// Hidden options for help debugging.
|
// Hidden options for help debugging.
|
||||||
|
@ -150,11 +153,11 @@ namespace {
|
||||||
/// BBAnalysis - Results of if-conversion feasibility analysis indexed by
|
/// BBAnalysis - Results of if-conversion feasibility analysis indexed by
|
||||||
/// basic block number.
|
/// basic block number.
|
||||||
std::vector<BBInfo> BBAnalysis;
|
std::vector<BBInfo> BBAnalysis;
|
||||||
|
TargetSchedModel SchedModel;
|
||||||
|
|
||||||
const TargetLoweringBase *TLI;
|
const TargetLoweringBase *TLI;
|
||||||
const TargetInstrInfo *TII;
|
const TargetInstrInfo *TII;
|
||||||
const TargetRegisterInfo *TRI;
|
const TargetRegisterInfo *TRI;
|
||||||
const InstrItineraryData *InstrItins;
|
|
||||||
const MachineBranchProbabilityInfo *MBPI;
|
const MachineBranchProbabilityInfo *MBPI;
|
||||||
MachineRegisterInfo *MRI;
|
MachineRegisterInfo *MRI;
|
||||||
|
|
||||||
|
@ -267,7 +270,11 @@ bool IfConverter::runOnMachineFunction(MachineFunction &MF) {
|
||||||
TRI = MF.getTarget().getRegisterInfo();
|
TRI = MF.getTarget().getRegisterInfo();
|
||||||
MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
|
MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
|
||||||
MRI = &MF.getRegInfo();
|
MRI = &MF.getRegInfo();
|
||||||
InstrItins = MF.getTarget().getInstrItineraryData();
|
|
||||||
|
const TargetSubtargetInfo &ST =
|
||||||
|
MF.getTarget().getSubtarget<TargetSubtargetInfo>();
|
||||||
|
SchedModel.init(*ST.getSchedModel(), &ST, TII);
|
||||||
|
|
||||||
if (!TII) return false;
|
if (!TII) return false;
|
||||||
|
|
||||||
PreRegAlloc = MRI->isSSA();
|
PreRegAlloc = MRI->isSSA();
|
||||||
|
@ -672,9 +679,8 @@ void IfConverter::ScanInstructions(BBInfo &BBI) {
|
||||||
|
|
||||||
if (!isPredicated) {
|
if (!isPredicated) {
|
||||||
BBI.NonPredSize++;
|
BBI.NonPredSize++;
|
||||||
unsigned ExtraPredCost = 0;
|
unsigned ExtraPredCost = TII->getPredicationCost(&*I);
|
||||||
unsigned NumCycles = TII->getInstrLatency(InstrItins, &*I,
|
unsigned NumCycles = SchedModel.computeInstrLatency(&*I, false);
|
||||||
&ExtraPredCost);
|
|
||||||
if (NumCycles > 1)
|
if (NumCycles > 1)
|
||||||
BBI.ExtraCost += NumCycles-1;
|
BBI.ExtraCost += NumCycles-1;
|
||||||
BBI.ExtraCost2 += ExtraPredCost;
|
BBI.ExtraCost2 += ExtraPredCost;
|
||||||
|
@ -1511,8 +1517,8 @@ void IfConverter::CopyAndPredicateBlock(BBInfo &ToBBI, BBInfo &FromBBI,
|
||||||
MachineInstr *MI = MF.CloneMachineInstr(I);
|
MachineInstr *MI = MF.CloneMachineInstr(I);
|
||||||
ToBBI.BB->insert(ToBBI.BB->end(), MI);
|
ToBBI.BB->insert(ToBBI.BB->end(), MI);
|
||||||
ToBBI.NonPredSize++;
|
ToBBI.NonPredSize++;
|
||||||
unsigned ExtraPredCost = 0;
|
unsigned ExtraPredCost = TII->getPredicationCost(&*I);
|
||||||
unsigned NumCycles = TII->getInstrLatency(InstrItins, &*I, &ExtraPredCost);
|
unsigned NumCycles = SchedModel.computeInstrLatency(&*I, false);
|
||||||
if (NumCycles > 1)
|
if (NumCycles > 1)
|
||||||
ToBBI.ExtraCost += NumCycles-1;
|
ToBBI.ExtraCost += NumCycles-1;
|
||||||
ToBBI.ExtraCost2 += ExtraPredCost;
|
ToBBI.ExtraCost2 += ExtraPredCost;
|
||||||
|
|
|
@ -630,6 +630,10 @@ unsigned TargetInstrInfo::defaultDefLatency(const MCSchedModel *SchedModel,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned TargetInstrInfo::getPredicationCost(const MachineInstr *) const {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned TargetInstrInfo::
|
unsigned TargetInstrInfo::
|
||||||
getInstrLatency(const InstrItineraryData *ItinData,
|
getInstrLatency(const InstrItineraryData *ItinData,
|
||||||
const MachineInstr *MI,
|
const MachineInstr *MI,
|
||||||
|
|
|
@ -225,10 +225,13 @@ unsigned TargetSchedModel::computeOperandLatency(
|
||||||
return DefMI->isTransient() ? 0 : TII->defaultDefLatency(&SchedModel, DefMI);
|
return DefMI->isTransient() ? 0 : TII->defaultDefLatency(&SchedModel, DefMI);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned TargetSchedModel::computeInstrLatency(const MachineInstr *MI) const {
|
unsigned
|
||||||
|
TargetSchedModel::computeInstrLatency(const MachineInstr *MI,
|
||||||
|
bool UseDefaultDefLatency) const {
|
||||||
// For the itinerary model, fall back to the old subtarget hook.
|
// For the itinerary model, fall back to the old subtarget hook.
|
||||||
// Allow subtargets to compute Bundle latencies outside the machine model.
|
// Allow subtargets to compute Bundle latencies outside the machine model.
|
||||||
if (hasInstrItineraries() || MI->isBundle())
|
if (hasInstrItineraries() || MI->isBundle() ||
|
||||||
|
(!hasInstrSchedModel() && !UseDefaultDefLatency))
|
||||||
return TII->getInstrLatency(&InstrItins, MI);
|
return TII->getInstrLatency(&InstrItins, MI);
|
||||||
|
|
||||||
if (hasInstrSchedModel()) {
|
if (hasInstrSchedModel()) {
|
||||||
|
|
|
@ -3669,6 +3669,24 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
|
||||||
return Latency;
|
return Latency;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned ARMBaseInstrInfo::getPredicationCost(const MachineInstr *MI) const {
|
||||||
|
if (MI->isCopyLike() || MI->isInsertSubreg() ||
|
||||||
|
MI->isRegSequence() || MI->isImplicitDef())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (MI->isBundle())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
const MCInstrDesc &MCID = MI->getDesc();
|
||||||
|
|
||||||
|
if (MCID.isCall() || MCID.hasImplicitDefOfPhysReg(ARM::CPSR)) {
|
||||||
|
// When predicated, CPSR is an additional source operand for CPSR updating
|
||||||
|
// instructions, this apparently increases their latencies.
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned ARMBaseInstrInfo::getInstrLatency(const InstrItineraryData *ItinData,
|
unsigned ARMBaseInstrInfo::getInstrLatency(const InstrItineraryData *ItinData,
|
||||||
const MachineInstr *MI,
|
const MachineInstr *MI,
|
||||||
unsigned *PredCost) const {
|
unsigned *PredCost) const {
|
||||||
|
|
|
@ -264,6 +264,8 @@ private:
|
||||||
const MCInstrDesc &UseMCID,
|
const MCInstrDesc &UseMCID,
|
||||||
unsigned UseIdx, unsigned UseAlign) const;
|
unsigned UseIdx, unsigned UseAlign) const;
|
||||||
|
|
||||||
|
unsigned getPredicationCost(const MachineInstr *MI) const;
|
||||||
|
|
||||||
unsigned getInstrLatency(const InstrItineraryData *ItinData,
|
unsigned getInstrLatency(const InstrItineraryData *ItinData,
|
||||||
const MachineInstr *MI,
|
const MachineInstr *MI,
|
||||||
unsigned *PredCost = 0) const;
|
unsigned *PredCost = 0) const;
|
||||||
|
|
|
@ -989,6 +989,10 @@ R600InstrInfo::PredicateInstruction(MachineInstr *MI,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int R600InstrInfo::getPredicationCost(const MachineInstr *) const {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int R600InstrInfo::getInstrLatency(const InstrItineraryData *ItinData,
|
unsigned int R600InstrInfo::getInstrLatency(const InstrItineraryData *ItinData,
|
||||||
const MachineInstr *MI,
|
const MachineInstr *MI,
|
||||||
unsigned *PredCost) const {
|
unsigned *PredCost) const {
|
||||||
|
|
|
@ -181,6 +181,8 @@ namespace llvm {
|
||||||
bool PredicateInstruction(MachineInstr *MI,
|
bool PredicateInstruction(MachineInstr *MI,
|
||||||
const SmallVectorImpl<MachineOperand> &Pred) const;
|
const SmallVectorImpl<MachineOperand> &Pred) const;
|
||||||
|
|
||||||
|
unsigned int getPredicationCost(const MachineInstr *) const;
|
||||||
|
|
||||||
unsigned int getInstrLatency(const InstrItineraryData *ItinData,
|
unsigned int getInstrLatency(const InstrItineraryData *ItinData,
|
||||||
const MachineInstr *MI,
|
const MachineInstr *MI,
|
||||||
unsigned *PredCost = 0) const;
|
unsigned *PredCost = 0) const;
|
||||||
|
|
Loading…
Reference in New Issue