[CodeGen] Move MISched target hooks into TargetMachine (#125700)
The createSIMachineScheduler & createPostMachineScheduler target hooks are currently placed in the PassConfig interface. Moving it out to TargetMachine so that both legacy and the new pass manager can effectively use them.
This commit is contained in:
parent
b85e71b9f2
commit
a47c35a699
@ -17,7 +17,7 @@
|
||||
// scheduled. Targets can override the DAG builder and scheduler without
|
||||
// replacing the pass as follows:
|
||||
//
|
||||
// ScheduleDAGInstrs *<Target>PassConfig::
|
||||
// ScheduleDAGInstrs *<Target>TargetMachine::
|
||||
// createMachineScheduler(MachineSchedContext *C) {
|
||||
// return new CustomMachineScheduler(C);
|
||||
// }
|
||||
@ -29,7 +29,7 @@
|
||||
// plugin an alternate MachineSchedStrategy. The strategy is responsible for
|
||||
// selecting the highest priority node from the list:
|
||||
//
|
||||
// ScheduleDAGInstrs *<Target>PassConfig::
|
||||
// ScheduleDAGInstrs *<Target>TargetMachine::
|
||||
// createMachineScheduler(MachineSchedContext *C) {
|
||||
// return new ScheduleDAGMILive(C, CustomStrategy(C));
|
||||
// }
|
||||
@ -39,7 +39,7 @@
|
||||
// can adjust dependencies based on target-specific knowledge or add weak edges
|
||||
// to aid heuristics:
|
||||
//
|
||||
// ScheduleDAGInstrs *<Target>PassConfig::
|
||||
// ScheduleDAGInstrs *<Target>TargetMachine::
|
||||
// createMachineScheduler(MachineSchedContext *C) {
|
||||
// ScheduleDAGMI *DAG = createGenericSchedLive(C);
|
||||
// DAG->addMutation(new CustomDAGMutation(...));
|
||||
@ -137,7 +137,7 @@ struct MachineSchedContext {
|
||||
MachineFunction *MF = nullptr;
|
||||
const MachineLoopInfo *MLI = nullptr;
|
||||
const MachineDominatorTree *MDT = nullptr;
|
||||
const TargetPassConfig *PassConfig = nullptr;
|
||||
const TargetMachine *TM = nullptr;
|
||||
AAResults *AA = nullptr;
|
||||
LiveIntervals *LIS = nullptr;
|
||||
|
||||
|
@ -1566,7 +1566,7 @@ public:
|
||||
/// DAG->addMutation(createLoadClusterDAGMutation(DAG->TII, DAG->TRI));
|
||||
/// or
|
||||
/// DAG->addMutation(createStoreClusterDAGMutation(DAG->TII, DAG->TRI));
|
||||
/// to TargetPassConfig::createMachineScheduler() to have an effect.
|
||||
/// to TargetMachine::createMachineScheduler() to have an effect.
|
||||
///
|
||||
/// \p BaseOps1 and \p BaseOps2 are memory operands of two memory operations.
|
||||
/// \p Offset1 and \p Offset2 are the byte offsets for the memory
|
||||
|
@ -22,9 +22,7 @@
|
||||
namespace llvm {
|
||||
|
||||
class TargetMachine;
|
||||
struct MachineSchedContext;
|
||||
class PassConfigImpl;
|
||||
class ScheduleDAGInstrs;
|
||||
class CSEConfigBase;
|
||||
class PassInstrumentationCallbacks;
|
||||
|
||||
@ -300,27 +298,6 @@ public:
|
||||
/// Fully developed targets will not generally override this.
|
||||
virtual void addMachinePasses();
|
||||
|
||||
/// Create an instance of ScheduleDAGInstrs to be run within the standard
|
||||
/// MachineScheduler pass for this function and target at the current
|
||||
/// optimization level.
|
||||
///
|
||||
/// This can also be used to plug a new MachineSchedStrategy into an instance
|
||||
/// of the standard ScheduleDAGMI:
|
||||
/// return new ScheduleDAGMI(C, std::make_unique<MyStrategy>(C), /*RemoveKillFlags=*/false)
|
||||
///
|
||||
/// Return NULL to select the default (generic) machine scheduler.
|
||||
virtual ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/// Similar to createMachineScheduler but used when postRA machine scheduling
|
||||
/// is enabled.
|
||||
virtual ScheduleDAGInstrs *
|
||||
createPostMachineScheduler(MachineSchedContext *C) const {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/// printAndVerify - Add a pass to dump then verify the machine function, if
|
||||
/// those steps are enabled.
|
||||
void printAndVerify(const std::string &Banner);
|
||||
|
@ -39,6 +39,7 @@ using ModulePassManager = PassManager<Module>;
|
||||
class Function;
|
||||
class GlobalValue;
|
||||
class MachineModuleInfoWrapperPass;
|
||||
struct MachineSchedContext;
|
||||
class Mangler;
|
||||
class MCAsmInfo;
|
||||
class MCContext;
|
||||
@ -50,6 +51,7 @@ class raw_pwrite_stream;
|
||||
class PassBuilder;
|
||||
class PassInstrumentationCallbacks;
|
||||
struct PerFunctionMIParsingState;
|
||||
class ScheduleDAGInstrs;
|
||||
class SMDiagnostic;
|
||||
class SMRange;
|
||||
class Target;
|
||||
@ -147,6 +149,28 @@ public:
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/// Create an instance of ScheduleDAGInstrs to be run within the standard
|
||||
/// MachineScheduler pass for this function and target at the current
|
||||
/// optimization level.
|
||||
///
|
||||
/// This can also be used to plug a new MachineSchedStrategy into an instance
|
||||
/// of the standard ScheduleDAGMI:
|
||||
/// return new ScheduleDAGMI(C, std::make_unique<MyStrategy>(C),
|
||||
/// /*RemoveKillFlags=*/false)
|
||||
///
|
||||
/// Return NULL to select the default (generic) machine scheduler.
|
||||
virtual ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/// Similar to createMachineScheduler but used when postRA machine scheduling
|
||||
/// is enabled.
|
||||
virtual ScheduleDAGInstrs *
|
||||
createPostMachineScheduler(MachineSchedContext *C) const {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/// Allocate and return a default initialized instance of the YAML
|
||||
/// representation for the MachineFunctionInfo.
|
||||
virtual yaml::MachineFunctionInfo *createDefaultFuncInfoYAML() const {
|
||||
|
@ -511,7 +511,7 @@ bool MachinePipeliner::runWindowScheduler(MachineLoop &L) {
|
||||
Context.MF = MF;
|
||||
Context.MLI = MLI;
|
||||
Context.MDT = MDT;
|
||||
Context.PassConfig = &getAnalysis<TargetPassConfig>();
|
||||
Context.TM = &getAnalysis<TargetPassConfig>().getTM<TargetMachine>();
|
||||
Context.AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
|
||||
Context.LIS = &getAnalysis<LiveIntervalsWrapperPass>().getLIS();
|
||||
Context.RegClassInfo->runOnMachineFunction(*MF);
|
||||
|
@ -58,6 +58,7 @@
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/GraphWriter.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
@ -392,8 +393,11 @@ ScheduleDAGInstrs *MachineScheduler::createMachineScheduler() {
|
||||
if (Ctor != useDefaultMachineSched)
|
||||
return Ctor(this);
|
||||
|
||||
const TargetMachine &TM =
|
||||
getAnalysis<TargetPassConfig>().getTM<TargetMachine>();
|
||||
|
||||
// Get the default scheduler set by the target for this function.
|
||||
ScheduleDAGInstrs *Scheduler = PassConfig->createMachineScheduler(this);
|
||||
ScheduleDAGInstrs *Scheduler = TM.createMachineScheduler(this);
|
||||
if (Scheduler)
|
||||
return Scheduler;
|
||||
|
||||
@ -405,8 +409,10 @@ ScheduleDAGInstrs *MachineScheduler::createMachineScheduler() {
|
||||
/// the caller. We don't have a command line option to override the postRA
|
||||
/// scheduler. The Target must configure it.
|
||||
ScheduleDAGInstrs *PostMachineScheduler::createPostMachineScheduler() {
|
||||
const TargetMachine &TM =
|
||||
getAnalysis<TargetPassConfig>().getTM<TargetMachine>();
|
||||
// Get the postRA scheduler set by the target for this function.
|
||||
ScheduleDAGInstrs *Scheduler = PassConfig->createPostMachineScheduler(this);
|
||||
ScheduleDAGInstrs *Scheduler = TM.createPostMachineScheduler(this);
|
||||
if (Scheduler)
|
||||
return Scheduler;
|
||||
|
||||
@ -446,7 +452,6 @@ bool MachineScheduler::runOnMachineFunction(MachineFunction &mf) {
|
||||
MF = &mf;
|
||||
MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
|
||||
MDT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
|
||||
PassConfig = &getAnalysis<TargetPassConfig>();
|
||||
AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
|
||||
|
||||
LIS = &getAnalysis<LiveIntervalsWrapperPass>().getLIS();
|
||||
@ -484,7 +489,6 @@ bool PostMachineScheduler::runOnMachineFunction(MachineFunction &mf) {
|
||||
// Initialize the context of the pass.
|
||||
MF = &mf;
|
||||
MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
|
||||
PassConfig = &getAnalysis<TargetPassConfig>();
|
||||
AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
|
||||
|
||||
if (VerifyScheduling)
|
||||
|
@ -45,6 +45,7 @@
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/TimeProfiler.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
@ -167,7 +168,7 @@ WindowScheduler::createMachineScheduler(bool OnlyBuildGraph) {
|
||||
? new ScheduleDAGMI(
|
||||
Context, std::make_unique<PostGenericScheduler>(Context),
|
||||
true)
|
||||
: Context->PassConfig->createMachineScheduler(Context);
|
||||
: Context->TM->createMachineScheduler(Context);
|
||||
}
|
||||
|
||||
bool WindowScheduler::initialize() {
|
||||
|
@ -20,7 +20,7 @@ namespace llvm {
|
||||
|
||||
/// Note that you have to add:
|
||||
/// DAG.addMutation(createAArch64MacroFusionDAGMutation());
|
||||
/// to AArch64PassConfig::createMachineScheduler() to have an effect.
|
||||
/// to AArch64TargetMachine::createMachineScheduler() to have an effect.
|
||||
std::unique_ptr<ScheduleDAGMutation> createAArch64MacroFusionDAGMutation();
|
||||
|
||||
} // llvm
|
||||
|
@ -480,6 +480,33 @@ AArch64TargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
return I.get();
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
AArch64TargetMachine::createMachineScheduler(MachineSchedContext *C) const {
|
||||
const AArch64Subtarget &ST = C->MF->getSubtarget<AArch64Subtarget>();
|
||||
ScheduleDAGMILive *DAG = createGenericSchedLive(C);
|
||||
DAG->addMutation(createLoadClusterDAGMutation(DAG->TII, DAG->TRI));
|
||||
DAG->addMutation(createStoreClusterDAGMutation(DAG->TII, DAG->TRI));
|
||||
if (ST.hasFusion())
|
||||
DAG->addMutation(createAArch64MacroFusionDAGMutation());
|
||||
return DAG;
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
AArch64TargetMachine::createPostMachineScheduler(MachineSchedContext *C) const {
|
||||
const AArch64Subtarget &ST = C->MF->getSubtarget<AArch64Subtarget>();
|
||||
ScheduleDAGMI *DAG =
|
||||
new ScheduleDAGMI(C, std::make_unique<AArch64PostRASchedStrategy>(C),
|
||||
/* RemoveKillFlags=*/true);
|
||||
if (ST.hasFusion()) {
|
||||
// Run the Macro Fusion after RA again since literals are expanded from
|
||||
// pseudos then (v. addPreSched2()).
|
||||
DAG->addMutation(createAArch64MacroFusionDAGMutation());
|
||||
return DAG;
|
||||
}
|
||||
|
||||
return DAG;
|
||||
}
|
||||
|
||||
void AArch64leTargetMachine::anchor() { }
|
||||
|
||||
AArch64leTargetMachine::AArch64leTargetMachine(
|
||||
@ -512,33 +539,6 @@ public:
|
||||
return getTM<AArch64TargetMachine>();
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override {
|
||||
const AArch64Subtarget &ST = C->MF->getSubtarget<AArch64Subtarget>();
|
||||
ScheduleDAGMILive *DAG = createGenericSchedLive(C);
|
||||
DAG->addMutation(createLoadClusterDAGMutation(DAG->TII, DAG->TRI));
|
||||
DAG->addMutation(createStoreClusterDAGMutation(DAG->TII, DAG->TRI));
|
||||
if (ST.hasFusion())
|
||||
DAG->addMutation(createAArch64MacroFusionDAGMutation());
|
||||
return DAG;
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
createPostMachineScheduler(MachineSchedContext *C) const override {
|
||||
const AArch64Subtarget &ST = C->MF->getSubtarget<AArch64Subtarget>();
|
||||
ScheduleDAGMI *DAG =
|
||||
new ScheduleDAGMI(C, std::make_unique<AArch64PostRASchedStrategy>(C),
|
||||
/* RemoveKillFlags=*/true);
|
||||
if (ST.hasFusion()) {
|
||||
// Run the Macro Fusion after RA again since literals are expanded from
|
||||
// pseudos then (v. addPreSched2()).
|
||||
DAG->addMutation(createAArch64MacroFusionDAGMutation());
|
||||
return DAG;
|
||||
}
|
||||
|
||||
return DAG;
|
||||
}
|
||||
|
||||
void addIRPasses() override;
|
||||
bool addPreISel() override;
|
||||
void addCodeGenPrepare() override;
|
||||
|
@ -70,6 +70,11 @@ public:
|
||||
bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override {
|
||||
return getPointerSize(SrcAS) == getPointerSize(DestAS);
|
||||
}
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override;
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
createPostMachineScheduler(MachineSchedContext *C) const override;
|
||||
|
||||
private:
|
||||
bool isLittle;
|
||||
|
@ -16,7 +16,7 @@ namespace llvm {
|
||||
|
||||
/// Note that you have to add:
|
||||
/// DAG.addMutation(createAMDGPUMacroFusionDAGMutation());
|
||||
/// to AMDGPUPassConfig::createMachineScheduler() to have an effect.
|
||||
/// to AMDGPUTargetMachine::createMachineScheduler() to have an effect.
|
||||
std::unique_ptr<ScheduleDAGMutation> createAMDGPUMacroFusionDAGMutation();
|
||||
|
||||
} // llvm
|
||||
|
@ -729,6 +729,16 @@ StringRef AMDGPUTargetMachine::getFeatureString(const Function &F) const {
|
||||
: getTargetFeatureString();
|
||||
}
|
||||
|
||||
llvm::ScheduleDAGInstrs *
|
||||
AMDGPUTargetMachine::createMachineScheduler(MachineSchedContext *C) const {
|
||||
const GCNSubtarget &ST = C->MF->getSubtarget<GCNSubtarget>();
|
||||
ScheduleDAGMILive *DAG = createGenericSchedLive(C);
|
||||
DAG->addMutation(createLoadClusterDAGMutation(DAG->TII, DAG->TRI));
|
||||
if (ST.shouldClusterStores())
|
||||
DAG->addMutation(createStoreClusterDAGMutation(DAG->TII, DAG->TRI));
|
||||
return DAG;
|
||||
}
|
||||
|
||||
/// Predicate for Internalize pass.
|
||||
static bool mustPreserveGV(const GlobalValue &GV) {
|
||||
if (const Function *F = dyn_cast<Function>(&GV))
|
||||
@ -1046,6 +1056,43 @@ Error GCNTargetMachine::buildCodeGenPipeline(
|
||||
return CGPB.buildPipeline(MPM, Out, DwoOut, FileType);
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
GCNTargetMachine::createMachineScheduler(MachineSchedContext *C) const {
|
||||
const GCNSubtarget &ST = C->MF->getSubtarget<GCNSubtarget>();
|
||||
if (ST.enableSIScheduler())
|
||||
return createSIMachineScheduler(C);
|
||||
|
||||
Attribute SchedStrategyAttr =
|
||||
C->MF->getFunction().getFnAttribute("amdgpu-sched-strategy");
|
||||
StringRef SchedStrategy = SchedStrategyAttr.isValid()
|
||||
? SchedStrategyAttr.getValueAsString()
|
||||
: AMDGPUSchedStrategy;
|
||||
|
||||
if (SchedStrategy == "max-ilp")
|
||||
return createGCNMaxILPMachineScheduler(C);
|
||||
|
||||
if (SchedStrategy == "max-memory-clause")
|
||||
return createGCNMaxMemoryClauseMachineScheduler(C);
|
||||
|
||||
return createGCNMaxOccupancyMachineScheduler(C);
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
GCNTargetMachine::createPostMachineScheduler(MachineSchedContext *C) const {
|
||||
ScheduleDAGMI *DAG =
|
||||
new GCNPostScheduleDAGMILive(C, std::make_unique<PostGenericScheduler>(C),
|
||||
/*RemoveKillFlags=*/true);
|
||||
const GCNSubtarget &ST = C->MF->getSubtarget<GCNSubtarget>();
|
||||
DAG->addMutation(createLoadClusterDAGMutation(DAG->TII, DAG->TRI));
|
||||
if (ST.shouldClusterStores())
|
||||
DAG->addMutation(createStoreClusterDAGMutation(DAG->TII, DAG->TRI));
|
||||
DAG->addMutation(createIGroupLPDAGMutation(AMDGPU::SchedulingPhase::PostRA));
|
||||
if ((EnableVOPD.getNumOccurrences() ||
|
||||
getOptLevel() >= CodeGenOptLevel::Less) &&
|
||||
EnableVOPD)
|
||||
DAG->addMutation(createVOPDPairingMutation());
|
||||
return DAG;
|
||||
}
|
||||
//===----------------------------------------------------------------------===//
|
||||
// AMDGPU Legacy Pass Setup
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -1071,25 +1118,6 @@ public:
|
||||
return getTM<GCNTargetMachine>();
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override;
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
createPostMachineScheduler(MachineSchedContext *C) const override {
|
||||
ScheduleDAGMI *DAG = new GCNPostScheduleDAGMILive(
|
||||
C, std::make_unique<PostGenericScheduler>(C),
|
||||
/*RemoveKillFlags=*/true);
|
||||
const GCNSubtarget &ST = C->MF->getSubtarget<GCNSubtarget>();
|
||||
DAG->addMutation(createLoadClusterDAGMutation(DAG->TII, DAG->TRI));
|
||||
if (ST.shouldClusterStores())
|
||||
DAG->addMutation(createStoreClusterDAGMutation(DAG->TII, DAG->TRI));
|
||||
DAG->addMutation(
|
||||
createIGroupLPDAGMutation(AMDGPU::SchedulingPhase::PostRA));
|
||||
if (isPassEnabled(EnableVOPD, CodeGenOptLevel::Less))
|
||||
DAG->addMutation(createVOPDPairingMutation());
|
||||
return DAG;
|
||||
}
|
||||
|
||||
bool addPreISel() override;
|
||||
void addMachineSSAOptimization() override;
|
||||
bool addILPOpts() override;
|
||||
@ -1316,41 +1344,10 @@ bool AMDGPUPassConfig::addGCPasses() {
|
||||
return false;
|
||||
}
|
||||
|
||||
llvm::ScheduleDAGInstrs *
|
||||
AMDGPUPassConfig::createMachineScheduler(MachineSchedContext *C) const {
|
||||
const GCNSubtarget &ST = C->MF->getSubtarget<GCNSubtarget>();
|
||||
ScheduleDAGMILive *DAG = createGenericSchedLive(C);
|
||||
DAG->addMutation(createLoadClusterDAGMutation(DAG->TII, DAG->TRI));
|
||||
if (ST.shouldClusterStores())
|
||||
DAG->addMutation(createStoreClusterDAGMutation(DAG->TII, DAG->TRI));
|
||||
return DAG;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// GCN Legacy Pass Setup
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
ScheduleDAGInstrs *GCNPassConfig::createMachineScheduler(
|
||||
MachineSchedContext *C) const {
|
||||
const GCNSubtarget &ST = C->MF->getSubtarget<GCNSubtarget>();
|
||||
if (ST.enableSIScheduler())
|
||||
return createSIMachineScheduler(C);
|
||||
|
||||
Attribute SchedStrategyAttr =
|
||||
C->MF->getFunction().getFnAttribute("amdgpu-sched-strategy");
|
||||
StringRef SchedStrategy = SchedStrategyAttr.isValid()
|
||||
? SchedStrategyAttr.getValueAsString()
|
||||
: AMDGPUSchedStrategy;
|
||||
|
||||
if (SchedStrategy == "max-ilp")
|
||||
return createGCNMaxILPMachineScheduler(C);
|
||||
|
||||
if (SchedStrategy == "max-memory-clause")
|
||||
return createGCNMaxMemoryClauseMachineScheduler(C);
|
||||
|
||||
return createGCNMaxOccupancyMachineScheduler(C);
|
||||
}
|
||||
|
||||
bool GCNPassConfig::addPreISel() {
|
||||
AMDGPUPassConfig::addPreISel();
|
||||
|
||||
|
@ -71,6 +71,8 @@ public:
|
||||
bool splitModule(Module &M, unsigned NumParts,
|
||||
function_ref<void(std::unique_ptr<Module> MPart)>
|
||||
ModuleCallback) override;
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override;
|
||||
};
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -115,6 +117,10 @@ public:
|
||||
PerFunctionMIParsingState &PFS,
|
||||
SMDiagnostic &Error,
|
||||
SMRange &SourceRange) const override;
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override;
|
||||
ScheduleDAGInstrs *
|
||||
createPostMachineScheduler(MachineSchedContext *C) const override;
|
||||
};
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -128,10 +134,6 @@ public:
|
||||
AMDGPUTargetMachine &getAMDGPUTargetMachine() const {
|
||||
return getTM<AMDGPUTargetMachine>();
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override;
|
||||
|
||||
void addEarlyCSEOrGVNPass();
|
||||
void addStraightLineScalarOptimizationPasses();
|
||||
void addIRPasses() override;
|
||||
|
@ -90,17 +90,17 @@ R600TargetMachine::getTargetTransformInfo(const Function &F) const {
|
||||
return TargetTransformInfo(R600TTIImpl(this, F));
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
R600TargetMachine::createMachineScheduler(MachineSchedContext *C) const {
|
||||
return createR600MachineScheduler(C);
|
||||
}
|
||||
|
||||
namespace {
|
||||
class R600PassConfig final : public AMDGPUPassConfig {
|
||||
public:
|
||||
R600PassConfig(TargetMachine &TM, PassManagerBase &PM)
|
||||
: AMDGPUPassConfig(TM, PM) {}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override {
|
||||
return createR600MachineScheduler(C);
|
||||
}
|
||||
|
||||
bool addPreISel() override;
|
||||
bool addInstSelector() override;
|
||||
void addPreRegAlloc() override;
|
||||
|
@ -53,6 +53,8 @@ public:
|
||||
MachineFunctionInfo *
|
||||
createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F,
|
||||
const TargetSubtargetInfo *STI) const override;
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override;
|
||||
};
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -47,7 +47,7 @@ protected:
|
||||
|
||||
/// Note that you have to add:
|
||||
/// DAG.addMutation(createARMLatencyMutation(ST, AA));
|
||||
/// to ARMPassConfig::createMachineScheduler() to have an effect.
|
||||
/// to ARMTargetMachine::createMachineScheduler() to have an effect.
|
||||
std::unique_ptr<ScheduleDAGMutation>
|
||||
createARMLatencyMutations(const class ARMSubtarget &, AAResults *AA);
|
||||
|
||||
|
@ -20,7 +20,7 @@ namespace llvm {
|
||||
|
||||
/// Note that you have to add:
|
||||
/// DAG.addMutation(createARMMacroFusionDAGMutation());
|
||||
/// to ARMPassConfig::createMachineScheduler() to have an effect.
|
||||
/// to ARMTargetMachine::createMachineScheduler() to have an effect.
|
||||
std::unique_ptr<ScheduleDAGMutation> createARMMacroFusionDAGMutation();
|
||||
|
||||
} // llvm
|
||||
|
@ -325,6 +325,28 @@ ARMBaseTargetMachine::getTargetTransformInfo(const Function &F) const {
|
||||
return TargetTransformInfo(ARMTTIImpl(this, F));
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
ARMBaseTargetMachine::createMachineScheduler(MachineSchedContext *C) const {
|
||||
ScheduleDAGMILive *DAG = createGenericSchedLive(C);
|
||||
// add DAG Mutations here.
|
||||
const ARMSubtarget &ST = C->MF->getSubtarget<ARMSubtarget>();
|
||||
if (ST.hasFusion())
|
||||
DAG->addMutation(createARMMacroFusionDAGMutation());
|
||||
return DAG;
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
ARMBaseTargetMachine::createPostMachineScheduler(MachineSchedContext *C) const {
|
||||
ScheduleDAGMI *DAG = createGenericSchedPostRA(C);
|
||||
// add DAG Mutations here.
|
||||
const ARMSubtarget &ST = C->MF->getSubtarget<ARMSubtarget>();
|
||||
if (ST.hasFusion())
|
||||
DAG->addMutation(createARMMacroFusionDAGMutation());
|
||||
if (auto Mutation = createARMLatencyMutations(ST, C->AA))
|
||||
DAG->addMutation(std::move(Mutation));
|
||||
return DAG;
|
||||
}
|
||||
|
||||
ARMLETargetMachine::ARMLETargetMachine(const Target &T, const Triple &TT,
|
||||
StringRef CPU, StringRef FS,
|
||||
const TargetOptions &Options,
|
||||
@ -353,28 +375,6 @@ public:
|
||||
return getTM<ARMBaseTargetMachine>();
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override {
|
||||
ScheduleDAGMILive *DAG = createGenericSchedLive(C);
|
||||
// add DAG Mutations here.
|
||||
const ARMSubtarget &ST = C->MF->getSubtarget<ARMSubtarget>();
|
||||
if (ST.hasFusion())
|
||||
DAG->addMutation(createARMMacroFusionDAGMutation());
|
||||
return DAG;
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
createPostMachineScheduler(MachineSchedContext *C) const override {
|
||||
ScheduleDAGMI *DAG = createGenericSchedPostRA(C);
|
||||
// add DAG Mutations here.
|
||||
const ARMSubtarget &ST = C->MF->getSubtarget<ARMSubtarget>();
|
||||
if (ST.hasFusion())
|
||||
DAG->addMutation(createARMMacroFusionDAGMutation());
|
||||
if (auto Mutation = createARMLatencyMutations(ST, C->AA))
|
||||
DAG->addMutation(std::move(Mutation));
|
||||
return DAG;
|
||||
}
|
||||
|
||||
void addIRPasses() override;
|
||||
void addCodeGenPrepare() override;
|
||||
bool addPreISel() override;
|
||||
|
@ -96,6 +96,10 @@ public:
|
||||
PerFunctionMIParsingState &PFS,
|
||||
SMDiagnostic &Error,
|
||||
SMRange &SourceRange) const override;
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override;
|
||||
ScheduleDAGInstrs *
|
||||
createPostMachineScheduler(MachineSchedContext *C) const override;
|
||||
};
|
||||
|
||||
/// ARM/Thumb little endian target machine.
|
||||
|
@ -351,6 +351,11 @@ MachineFunctionInfo *HexagonTargetMachine::createMachineFunctionInfo(
|
||||
|
||||
HexagonTargetMachine::~HexagonTargetMachine() = default;
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
HexagonTargetMachine::createMachineScheduler(MachineSchedContext *C) const {
|
||||
return createVLIWMachineSched(C);
|
||||
}
|
||||
|
||||
namespace {
|
||||
/// Hexagon Code Generator Pass Configuration Options.
|
||||
class HexagonPassConfig : public TargetPassConfig {
|
||||
@ -362,11 +367,6 @@ public:
|
||||
return getTM<HexagonTargetMachine>();
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override {
|
||||
return createVLIWMachineSched(C);
|
||||
}
|
||||
|
||||
void addIRPasses() override;
|
||||
bool addInstSelector() override;
|
||||
void addPreRegAlloc() override;
|
||||
|
@ -50,6 +50,8 @@ public:
|
||||
bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override {
|
||||
return true;
|
||||
}
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override;
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
@ -20,7 +20,7 @@ namespace llvm {
|
||||
|
||||
/// Note that you have to add:
|
||||
/// DAG.addMutation(createPowerPCMacroFusionDAGMutation());
|
||||
/// to PPCPassConfig::createMachineScheduler() to have an effect.
|
||||
/// to PPCTargetMachine::createMachineScheduler() to have an effect.
|
||||
std::unique_ptr<ScheduleDAGMutation> createPowerPCMacroFusionDAGMutation();
|
||||
} // llvm
|
||||
|
||||
|
@ -403,6 +403,16 @@ PPCTargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
return I.get();
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
PPCTargetMachine::createMachineScheduler(MachineSchedContext *C) const {
|
||||
return createPPCMachineScheduler(C);
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
PPCTargetMachine::createPostMachineScheduler(MachineSchedContext *C) const {
|
||||
return createPPCPostMachineScheduler(C);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Pass Pipeline Configuration
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -438,15 +448,6 @@ public:
|
||||
bool addLegalizeMachineIR() override;
|
||||
bool addRegBankSelect() override;
|
||||
bool addGlobalInstructionSelect() override;
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override {
|
||||
return createPPCMachineScheduler(C);
|
||||
}
|
||||
ScheduleDAGInstrs *
|
||||
createPostMachineScheduler(MachineSchedContext *C) const override {
|
||||
return createPPCPostMachineScheduler(C);
|
||||
}
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
@ -63,6 +63,10 @@ public:
|
||||
MachineFunctionInfo *
|
||||
createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F,
|
||||
const TargetSubtargetInfo *STI) const override;
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override;
|
||||
ScheduleDAGInstrs *
|
||||
createPostMachineScheduler(MachineSchedContext *C) const override;
|
||||
|
||||
bool isELFv2ABI() const { return TargetABI == PPC_ABI_ELFv2; }
|
||||
bool hasGlibcHWCAPAccess() const { return HasGlibcHWCAPAccess; }
|
||||
|
@ -287,6 +287,39 @@ bool RISCVTargetMachine::isNoopAddrSpaceCast(unsigned SrcAS,
|
||||
return true;
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
RISCVTargetMachine::createMachineScheduler(MachineSchedContext *C) const {
|
||||
ScheduleDAGMILive *DAG = nullptr;
|
||||
if (EnableMISchedLoadStoreClustering) {
|
||||
DAG = createGenericSchedLive(C);
|
||||
DAG->addMutation(createLoadClusterDAGMutation(
|
||||
DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
|
||||
DAG->addMutation(createStoreClusterDAGMutation(
|
||||
DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
|
||||
}
|
||||
|
||||
const RISCVSubtarget &ST = C->MF->getSubtarget<RISCVSubtarget>();
|
||||
if (!DisableVectorMaskMutation && ST.hasVInstructions()) {
|
||||
DAG = DAG ? DAG : createGenericSchedLive(C);
|
||||
DAG->addMutation(createRISCVVectorMaskDAGMutation(DAG->TRI));
|
||||
}
|
||||
return DAG;
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
RISCVTargetMachine::createPostMachineScheduler(MachineSchedContext *C) const {
|
||||
ScheduleDAGMI *DAG = nullptr;
|
||||
if (EnablePostMISchedLoadStoreClustering) {
|
||||
DAG = createGenericSchedPostRA(C);
|
||||
DAG->addMutation(createLoadClusterDAGMutation(
|
||||
DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
|
||||
DAG->addMutation(createStoreClusterDAGMutation(
|
||||
DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
|
||||
}
|
||||
|
||||
return DAG;
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
class RVVRegisterRegAlloc : public RegisterRegAllocBase<RVVRegisterRegAlloc> {
|
||||
@ -360,39 +393,6 @@ public:
|
||||
return getTM<RISCVTargetMachine>();
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override {
|
||||
ScheduleDAGMILive *DAG = nullptr;
|
||||
if (EnableMISchedLoadStoreClustering) {
|
||||
DAG = createGenericSchedLive(C);
|
||||
DAG->addMutation(createLoadClusterDAGMutation(
|
||||
DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
|
||||
DAG->addMutation(createStoreClusterDAGMutation(
|
||||
DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
|
||||
}
|
||||
|
||||
const RISCVSubtarget &ST = C->MF->getSubtarget<RISCVSubtarget>();
|
||||
if (!DisableVectorMaskMutation && ST.hasVInstructions()) {
|
||||
DAG = DAG ? DAG : createGenericSchedLive(C);
|
||||
DAG->addMutation(createRISCVVectorMaskDAGMutation(DAG->TRI));
|
||||
}
|
||||
return DAG;
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
createPostMachineScheduler(MachineSchedContext *C) const override {
|
||||
ScheduleDAGMI *DAG = nullptr;
|
||||
if (EnablePostMISchedLoadStoreClustering) {
|
||||
DAG = createGenericSchedPostRA(C);
|
||||
DAG->addMutation(createLoadClusterDAGMutation(
|
||||
DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
|
||||
DAG->addMutation(createStoreClusterDAGMutation(
|
||||
DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
|
||||
}
|
||||
|
||||
return DAG;
|
||||
}
|
||||
|
||||
void addIRPasses() override;
|
||||
bool addPreISel() override;
|
||||
void addCodeGenPrepare() override;
|
||||
|
@ -59,6 +59,10 @@ public:
|
||||
SMDiagnostic &Error,
|
||||
SMRange &SourceRange) const override;
|
||||
void registerPassBuilderCallbacks(PassBuilder &PB) override;
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override;
|
||||
ScheduleDAGInstrs *
|
||||
createPostMachineScheduler(MachineSchedContext *C) const override;
|
||||
};
|
||||
|
||||
std::unique_ptr<ScheduleDAGMutation>
|
||||
|
@ -205,6 +205,12 @@ SystemZTargetMachine::getSubtargetImpl(const Function &F) const {
|
||||
return I.get();
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
SystemZTargetMachine::createPostMachineScheduler(MachineSchedContext *C) const {
|
||||
return new ScheduleDAGMI(C, std::make_unique<SystemZPostRASchedStrategy>(C),
|
||||
/*RemoveKillFlags=*/true);
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
/// SystemZ Code Generator Pass Configuration Options.
|
||||
@ -217,13 +223,6 @@ public:
|
||||
return getTM<SystemZTargetMachine>();
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
createPostMachineScheduler(MachineSchedContext *C) const override {
|
||||
return new ScheduleDAGMI(C,
|
||||
std::make_unique<SystemZPostRASchedStrategy>(C),
|
||||
/*RemoveKillFlags=*/true);
|
||||
}
|
||||
|
||||
void addIRPasses() override;
|
||||
bool addInstSelector() override;
|
||||
bool addILPOpts() override;
|
||||
|
@ -55,6 +55,8 @@ public:
|
||||
MachineFunctionInfo *
|
||||
createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F,
|
||||
const TargetSubtargetInfo *STI) const override;
|
||||
ScheduleDAGInstrs *
|
||||
createPostMachineScheduler(MachineSchedContext *C) const override;
|
||||
|
||||
bool targetSchedulesPostRAScheduling() const override { return true; };
|
||||
};
|
||||
|
@ -22,7 +22,7 @@ class ScheduleDAGMutation;
|
||||
|
||||
/// Note that you have to add:
|
||||
/// DAG.addMutation(createX86MacroFusionDAGMutation());
|
||||
/// to X86PassConfig::createMachineScheduler() to have an effect.
|
||||
/// to X86TargetMachine::createMachineScheduler() to have an effect.
|
||||
std::unique_ptr<ScheduleDAGMutation>
|
||||
createX86MacroFusionDAGMutation();
|
||||
|
||||
|
@ -374,6 +374,20 @@ bool X86TargetMachine::isNoopAddrSpaceCast(unsigned SrcAS,
|
||||
|
||||
void X86TargetMachine::reset() { SubtargetMap.clear(); }
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
X86TargetMachine::createMachineScheduler(MachineSchedContext *C) const {
|
||||
ScheduleDAGMILive *DAG = createGenericSchedLive(C);
|
||||
DAG->addMutation(createX86MacroFusionDAGMutation());
|
||||
return DAG;
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
X86TargetMachine::createPostMachineScheduler(MachineSchedContext *C) const {
|
||||
ScheduleDAGMI *DAG = createGenericSchedPostRA(C);
|
||||
DAG->addMutation(createX86MacroFusionDAGMutation());
|
||||
return DAG;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// X86 TTI query.
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -399,20 +413,6 @@ public:
|
||||
return getTM<X86TargetMachine>();
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override {
|
||||
ScheduleDAGMILive *DAG = createGenericSchedLive(C);
|
||||
DAG->addMutation(createX86MacroFusionDAGMutation());
|
||||
return DAG;
|
||||
}
|
||||
|
||||
ScheduleDAGInstrs *
|
||||
createPostMachineScheduler(MachineSchedContext *C) const override {
|
||||
ScheduleDAGMI *DAG = createGenericSchedPostRA(C);
|
||||
DAG->addMutation(createX86MacroFusionDAGMutation());
|
||||
return DAG;
|
||||
}
|
||||
|
||||
void addIRPasses() override;
|
||||
bool addInstSelector() override;
|
||||
bool addIRTranslator() override;
|
||||
|
@ -79,6 +79,10 @@ public:
|
||||
bool isJIT() const { return IsJIT; }
|
||||
|
||||
bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override;
|
||||
ScheduleDAGInstrs *
|
||||
createMachineScheduler(MachineSchedContext *C) const override;
|
||||
ScheduleDAGInstrs *
|
||||
createPostMachineScheduler(MachineSchedContext *C) const override;
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
Loading…
x
Reference in New Issue
Block a user