mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-23 19:59:57 +00:00
Remove useMachineScheduler and replace it with subtarget options
that control, individually, all of the disparate things it was controlling. At the same time move a FIXME in the Hexagon port to a new subtarget function that will enable a user of the machine scheduler to avoid using the source scheduler for pre-RA-scheduling. The FIXME would have this removed, but involves either testcase changes or adding -pre-RA-sched=source to a few testcases. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231980 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
85aa6fd741
commit
fba5b65942
@ -94,16 +94,24 @@ public:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// \brief Temporary API to test migration to MI scheduler.
|
|
||||||
bool useMachineScheduler() const;
|
|
||||||
|
|
||||||
/// \brief True if the subtarget should run MachineScheduler after aggressive
|
/// \brief True if the subtarget should run MachineScheduler after aggressive
|
||||||
/// coalescing.
|
/// coalescing.
|
||||||
///
|
///
|
||||||
/// This currently replaces the SelectionDAG scheduler with the "source" order
|
/// This currently replaces the SelectionDAG scheduler with the "source" order
|
||||||
/// scheduler. It does not yet disable the postRA scheduler.
|
/// scheduler (though see below for an option to turn this off and use the
|
||||||
|
/// TargetLowering preference). It does not yet disable the postRA scheduler.
|
||||||
virtual bool enableMachineScheduler() const;
|
virtual bool enableMachineScheduler() const;
|
||||||
|
|
||||||
|
/// \brief True if the machine scheduler should disable the TLI preference
|
||||||
|
/// for preRA scheduling with the source level scheduler.
|
||||||
|
virtual bool enableMachineSchedDefaultSched() const { return true; }
|
||||||
|
|
||||||
|
/// \brief True if the subtarget should enable joining global copies.
|
||||||
|
///
|
||||||
|
/// By default this is enabled if the machine scheduler is enabled, but
|
||||||
|
/// can be overridden.
|
||||||
|
virtual bool enableJoinGlobalCopies() const;
|
||||||
|
|
||||||
/// \brief True if the subtarget should run PostMachineScheduler.
|
/// \brief True if the subtarget should run PostMachineScheduler.
|
||||||
///
|
///
|
||||||
/// This only takes effect if the target has configured the
|
/// This only takes effect if the target has configured the
|
||||||
|
@ -209,6 +209,11 @@ static MachineSchedRegistry
|
|||||||
DefaultSchedRegistry("default", "Use the target's default scheduler choice.",
|
DefaultSchedRegistry("default", "Use the target's default scheduler choice.",
|
||||||
useDefaultMachineSched);
|
useDefaultMachineSched);
|
||||||
|
|
||||||
|
static cl::opt<bool> EnableMachineSched(
|
||||||
|
"enable-misched",
|
||||||
|
cl::desc("Enable the machine instruction scheduling pass."), cl::init(true),
|
||||||
|
cl::Hidden);
|
||||||
|
|
||||||
/// Forward declare the standard machine scheduler. This will be used as the
|
/// Forward declare the standard machine scheduler. This will be used as the
|
||||||
/// default scheduler if the target does not set a default.
|
/// default scheduler if the target does not set a default.
|
||||||
static ScheduleDAGInstrs *createGenericSchedLive(MachineSchedContext *C);
|
static ScheduleDAGInstrs *createGenericSchedLive(MachineSchedContext *C);
|
||||||
@ -304,6 +309,12 @@ ScheduleDAGInstrs *PostMachineScheduler::createPostMachineScheduler() {
|
|||||||
/// design would be to split blocks at scheduling boundaries, but LLVM has a
|
/// design would be to split blocks at scheduling boundaries, but LLVM has a
|
||||||
/// general bias against block splitting purely for implementation simplicity.
|
/// general bias against block splitting purely for implementation simplicity.
|
||||||
bool MachineScheduler::runOnMachineFunction(MachineFunction &mf) {
|
bool MachineScheduler::runOnMachineFunction(MachineFunction &mf) {
|
||||||
|
if (EnableMachineSched.getNumOccurrences()) {
|
||||||
|
if (!EnableMachineSched)
|
||||||
|
return false;
|
||||||
|
} else if (!mf.getSubtarget().enableMachineScheduler())
|
||||||
|
return false;
|
||||||
|
|
||||||
DEBUG(dbgs() << "Before MISsched:\n"; mf.print(dbgs()));
|
DEBUG(dbgs() << "Before MISsched:\n"; mf.print(dbgs()));
|
||||||
|
|
||||||
// Initialize the context of the pass.
|
// Initialize the context of the pass.
|
||||||
|
@ -55,9 +55,6 @@ static cl::opt<bool> DisableMachineCSE("disable-machine-cse", cl::Hidden,
|
|||||||
static cl::opt<cl::boolOrDefault>
|
static cl::opt<cl::boolOrDefault>
|
||||||
OptimizeRegAlloc("optimize-regalloc", cl::Hidden,
|
OptimizeRegAlloc("optimize-regalloc", cl::Hidden,
|
||||||
cl::desc("Enable optimized register allocation compilation path."));
|
cl::desc("Enable optimized register allocation compilation path."));
|
||||||
static cl::opt<cl::boolOrDefault>
|
|
||||||
EnableMachineSched("enable-misched",
|
|
||||||
cl::desc("Enable the machine instruction scheduling pass."));
|
|
||||||
static cl::opt<bool> DisablePostRAMachineLICM("disable-postra-machine-licm",
|
static cl::opt<bool> DisablePostRAMachineLICM("disable-postra-machine-licm",
|
||||||
cl::Hidden,
|
cl::Hidden,
|
||||||
cl::desc("Disable Machine LICM"));
|
cl::desc("Disable Machine LICM"));
|
||||||
@ -116,28 +113,6 @@ static IdentifyingPassPtr applyDisable(IdentifyingPassPtr PassID,
|
|||||||
return PassID;
|
return PassID;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Allow Pass selection to be overriden by command line options. This supports
|
|
||||||
/// flags with ternary conditions. TargetID is passed through by default. The
|
|
||||||
/// pass is suppressed when the option is false. When the option is true, the
|
|
||||||
/// StandardID is selected if the target provides no default.
|
|
||||||
static IdentifyingPassPtr applyOverride(IdentifyingPassPtr TargetID,
|
|
||||||
cl::boolOrDefault Override,
|
|
||||||
AnalysisID StandardID) {
|
|
||||||
switch (Override) {
|
|
||||||
case cl::BOU_UNSET:
|
|
||||||
return TargetID;
|
|
||||||
case cl::BOU_TRUE:
|
|
||||||
if (TargetID.isValid())
|
|
||||||
return TargetID;
|
|
||||||
if (StandardID == nullptr)
|
|
||||||
report_fatal_error("Target cannot enable pass");
|
|
||||||
return StandardID;
|
|
||||||
case cl::BOU_FALSE:
|
|
||||||
return IdentifyingPassPtr();
|
|
||||||
}
|
|
||||||
llvm_unreachable("Invalid command line option state");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Allow standard passes to be disabled by the command line, regardless of who
|
/// Allow standard passes to be disabled by the command line, regardless of who
|
||||||
/// is adding the pass.
|
/// is adding the pass.
|
||||||
///
|
///
|
||||||
@ -182,9 +157,6 @@ static IdentifyingPassPtr overridePass(AnalysisID StandardID,
|
|||||||
if (StandardID == &MachineCSEID)
|
if (StandardID == &MachineCSEID)
|
||||||
return applyDisable(TargetID, DisableMachineCSE);
|
return applyDisable(TargetID, DisableMachineCSE);
|
||||||
|
|
||||||
if (StandardID == &MachineSchedulerID)
|
|
||||||
return applyOverride(TargetID, EnableMachineSched, StandardID);
|
|
||||||
|
|
||||||
if (StandardID == &TargetPassConfig::PostRAMachineLICMID)
|
if (StandardID == &TargetPassConfig::PostRAMachineLICMID)
|
||||||
return applyDisable(TargetID, DisablePostRAMachineLICM);
|
return applyDisable(TargetID, DisablePostRAMachineLICM);
|
||||||
|
|
||||||
@ -249,11 +221,6 @@ TargetPassConfig::TargetPassConfig(TargetMachine *tm, PassManagerBase &pm)
|
|||||||
// Substitute Pseudo Pass IDs for real ones.
|
// Substitute Pseudo Pass IDs for real ones.
|
||||||
substitutePass(&EarlyTailDuplicateID, &TailDuplicateID);
|
substitutePass(&EarlyTailDuplicateID, &TailDuplicateID);
|
||||||
substitutePass(&PostRAMachineLICMID, &MachineLICMID);
|
substitutePass(&PostRAMachineLICMID, &MachineLICMID);
|
||||||
|
|
||||||
// Temporarily disable experimental passes.
|
|
||||||
const TargetSubtargetInfo &ST = *TM->getSubtargetImpl();
|
|
||||||
if (!ST.useMachineScheduler())
|
|
||||||
disablePass(&MachineSchedulerID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Insert InsertedPassID pass after TargetPassID.
|
/// Insert InsertedPassID pass after TargetPassID.
|
||||||
|
@ -2771,7 +2771,7 @@ bool RegisterCoalescer::runOnMachineFunction(MachineFunction &fn) {
|
|||||||
AA = &getAnalysis<AliasAnalysis>();
|
AA = &getAnalysis<AliasAnalysis>();
|
||||||
Loops = &getAnalysis<MachineLoopInfo>();
|
Loops = &getAnalysis<MachineLoopInfo>();
|
||||||
if (EnableGlobalCopies == cl::BOU_UNSET)
|
if (EnableGlobalCopies == cl::BOU_UNSET)
|
||||||
JoinGlobalCopies = STI.useMachineScheduler();
|
JoinGlobalCopies = STI.enableJoinGlobalCopies();
|
||||||
else
|
else
|
||||||
JoinGlobalCopies = (EnableGlobalCopies == cl::BOU_TRUE);
|
JoinGlobalCopies = (EnableGlobalCopies == cl::BOU_TRUE);
|
||||||
|
|
||||||
|
@ -292,7 +292,8 @@ namespace llvm {
|
|||||||
const TargetLowering *TLI = IS->TLI;
|
const TargetLowering *TLI = IS->TLI;
|
||||||
const TargetSubtargetInfo &ST = IS->MF->getSubtarget();
|
const TargetSubtargetInfo &ST = IS->MF->getSubtarget();
|
||||||
|
|
||||||
if (OptLevel == CodeGenOpt::None || ST.useMachineScheduler() ||
|
if (OptLevel == CodeGenOpt::None ||
|
||||||
|
(ST.enableMachineScheduler() && ST.enableMachineSchedDefaultSched()) ||
|
||||||
TLI->getSchedulingPreference() == Sched::Source)
|
TLI->getSchedulingPreference() == Sched::Source)
|
||||||
return createSourceListDAGScheduler(IS, OptLevel);
|
return createSourceListDAGScheduler(IS, OptLevel);
|
||||||
if (TLI->getSchedulingPreference() == Sched::RegPressure)
|
if (TLI->getSchedulingPreference() == Sched::RegPressure)
|
||||||
|
@ -48,6 +48,10 @@ EnableIEEERndNear(
|
|||||||
cl::Hidden, cl::ZeroOrMore, cl::init(false),
|
cl::Hidden, cl::ZeroOrMore, cl::init(false),
|
||||||
cl::desc("Generate non-chopped conversion from fp to int."));
|
cl::desc("Generate non-chopped conversion from fp to int."));
|
||||||
|
|
||||||
|
static cl::opt<bool> DisableHexagonMISched("disable-hexagon-misched",
|
||||||
|
cl::Hidden, cl::ZeroOrMore, cl::init(false),
|
||||||
|
cl::desc("Disable Hexagon MI Scheduling"));
|
||||||
|
|
||||||
HexagonSubtarget &
|
HexagonSubtarget &
|
||||||
HexagonSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) {
|
HexagonSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) {
|
||||||
// If the programmer has not specified a Hexagon version, default to -mv4.
|
// If the programmer has not specified a Hexagon version, default to -mv4.
|
||||||
@ -91,3 +95,9 @@ HexagonSubtarget::HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS,
|
|||||||
|
|
||||||
// Pin the vtable to this file.
|
// Pin the vtable to this file.
|
||||||
void HexagonSubtarget::anchor() {}
|
void HexagonSubtarget::anchor() {}
|
||||||
|
|
||||||
|
bool HexagonSubtarget::enableMachineScheduler() const {
|
||||||
|
if (DisableHexagonMISched.getNumOccurrences())
|
||||||
|
return !DisableHexagonMISched;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@ -85,6 +85,11 @@ public:
|
|||||||
bool hasV5TOps() const { return getHexagonArchVersion() >= V5; }
|
bool hasV5TOps() const { return getHexagonArchVersion() >= V5; }
|
||||||
bool hasV5TOpsOnly() const { return getHexagonArchVersion() == V5; }
|
bool hasV5TOpsOnly() const { return getHexagonArchVersion() == V5; }
|
||||||
bool modeIEEERndNear() const { return ModeIEEERndNear; }
|
bool modeIEEERndNear() const { return ModeIEEERndNear; }
|
||||||
|
bool enableMachineScheduler() const override;
|
||||||
|
// Always use the TargetLowering default scheduler.
|
||||||
|
// FIXME: This will use the vliw scheduler which is probably just hurting
|
||||||
|
// compiler time and will be removed eventually anyway.
|
||||||
|
bool enableMachineSchedDefaultSched() const override { return false; }
|
||||||
|
|
||||||
const std::string &getCPUString () const { return CPUString; }
|
const std::string &getCPUString () const { return CPUString; }
|
||||||
|
|
||||||
|
@ -29,10 +29,6 @@ using namespace llvm;
|
|||||||
static cl:: opt<bool> DisableHardwareLoops("disable-hexagon-hwloops",
|
static cl:: opt<bool> DisableHardwareLoops("disable-hexagon-hwloops",
|
||||||
cl::Hidden, cl::desc("Disable Hardware Loops for Hexagon target"));
|
cl::Hidden, cl::desc("Disable Hardware Loops for Hexagon target"));
|
||||||
|
|
||||||
static cl::opt<bool> DisableHexagonMISched("disable-hexagon-misched",
|
|
||||||
cl::Hidden, cl::ZeroOrMore, cl::init(false),
|
|
||||||
cl::desc("Disable Hexagon MI Scheduling"));
|
|
||||||
|
|
||||||
static cl::opt<bool> DisableHexagonCFGOpt("disable-hexagon-cfgopt",
|
static cl::opt<bool> DisableHexagonCFGOpt("disable-hexagon-cfgopt",
|
||||||
cl::Hidden, cl::ZeroOrMore, cl::init(false),
|
cl::Hidden, cl::ZeroOrMore, cl::init(false),
|
||||||
cl::desc("Disable Hexagon CFG Optimization"));
|
cl::desc("Disable Hexagon CFG Optimization"));
|
||||||
@ -82,16 +78,7 @@ namespace {
|
|||||||
class HexagonPassConfig : public TargetPassConfig {
|
class HexagonPassConfig : public TargetPassConfig {
|
||||||
public:
|
public:
|
||||||
HexagonPassConfig(HexagonTargetMachine *TM, PassManagerBase &PM)
|
HexagonPassConfig(HexagonTargetMachine *TM, PassManagerBase &PM)
|
||||||
: TargetPassConfig(TM, PM) {
|
: TargetPassConfig(TM, PM) {}
|
||||||
// FIXME: Rather than calling enablePass(&MachineSchedulerID) below, define
|
|
||||||
// HexagonSubtarget::enableMachineScheduler() { return true; }.
|
|
||||||
// That will bypass the SelectionDAG VLIW scheduler, which is probably just
|
|
||||||
// hurting compile time and will be removed eventually anyway.
|
|
||||||
if (DisableHexagonMISched)
|
|
||||||
disablePass(&MachineSchedulerID);
|
|
||||||
else
|
|
||||||
enablePass(&MachineSchedulerID);
|
|
||||||
}
|
|
||||||
|
|
||||||
HexagonTargetMachine &getHexagonTargetMachine() const {
|
HexagonTargetMachine &getHexagonTargetMachine() const {
|
||||||
return getTM<HexagonTargetMachine>();
|
return getTM<HexagonTargetMachine>();
|
||||||
|
@ -23,22 +23,6 @@ TargetSubtargetInfo::TargetSubtargetInfo() {}
|
|||||||
|
|
||||||
TargetSubtargetInfo::~TargetSubtargetInfo() {}
|
TargetSubtargetInfo::~TargetSubtargetInfo() {}
|
||||||
|
|
||||||
// Temporary option to compare overall performance change when moving from the
|
|
||||||
// SD scheduler to the MachineScheduler pass pipeline. This is convenient for
|
|
||||||
// benchmarking during the transition from SD to MI scheduling. Once armv7 makes
|
|
||||||
// the switch, it should go away. The normal way to enable/disable the
|
|
||||||
// MachineScheduling pass itself is by using -enable-misched. For targets that
|
|
||||||
// already use MI sched (via MySubTarget::enableMachineScheduler())
|
|
||||||
// -misched-bench=false negates the subtarget hook.
|
|
||||||
static cl::opt<bool> BenchMachineSched("misched-bench", cl::Hidden,
|
|
||||||
cl::desc("Migrate from the target's default SD scheduler to MI scheduler"));
|
|
||||||
|
|
||||||
bool TargetSubtargetInfo::useMachineScheduler() const {
|
|
||||||
if (BenchMachineSched.getNumOccurrences())
|
|
||||||
return BenchMachineSched;
|
|
||||||
return enableMachineScheduler();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TargetSubtargetInfo::enableAtomicExpand() const {
|
bool TargetSubtargetInfo::enableAtomicExpand() const {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -47,6 +31,10 @@ bool TargetSubtargetInfo::enableMachineScheduler() const {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TargetSubtargetInfo::enableJoinGlobalCopies() const {
|
||||||
|
return enableMachineScheduler();
|
||||||
|
}
|
||||||
|
|
||||||
bool TargetSubtargetInfo::enableRALocalReassignment(
|
bool TargetSubtargetInfo::enableRALocalReassignment(
|
||||||
CodeGenOpt::Level OptLevel) const {
|
CodeGenOpt::Level OptLevel) const {
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
Reference in New Issue
Block a user