forked from OSchip/llvm-project
[GlobalISel] Make EnableGlobalISel always set when GISel is enabled
Change meaning of TargetOptions::EnableGlobalISel. The flag was previously set only when a target switched on GlobalISel but it is now always set when the GlobalISel pipeline is enabled. This makes the flag consistent with TargetOptions::EnableFastISel and allows its use in other parts of the compiler to determine when GlobalISel is enabled. The EnableGlobalISel flag had previouly only one use in TargetPassConfig::isGlobalISelAbortEnabled(). The method used its value to determine if GlobalISel was enabled by a target and returned false in such a case. To preserve the current behaviour, a new flag TargetOptions::GlobalISelAbort is introduced to separately record the abort behaviour. Differential Revision: https://reviews.llvm.org/D54518 llvm-svn: 347861
This commit is contained in:
parent
3e3696bf46
commit
e6406d568c
|
@ -201,6 +201,9 @@ public:
|
|||
bool getO0WantsFastISel() { return O0WantsFastISel; }
|
||||
void setO0WantsFastISel(bool Enable) { O0WantsFastISel = Enable; }
|
||||
void setGlobalISel(bool Enable) { Options.EnableGlobalISel = Enable; }
|
||||
void setGlobalISelAbort(GlobalISelAbortMode Mode) {
|
||||
Options.GlobalISelAbort = Mode;
|
||||
}
|
||||
void setMachineOutliner(bool Enable) {
|
||||
Options.EnableMachineOutliner = Enable;
|
||||
}
|
||||
|
|
|
@ -96,6 +96,14 @@ namespace llvm {
|
|||
SCE // Tune debug info for SCE targets (e.g. PS4).
|
||||
};
|
||||
|
||||
/// Enable abort calls when global instruction selection fails to lower/select
|
||||
/// an instruction.
|
||||
enum class GlobalISelAbortMode {
|
||||
Disable, // Disable the abort.
|
||||
Enable, // Enable the abort.
|
||||
DisableWithDiag // Disable the abort but emit a diagnostic on failure.
|
||||
};
|
||||
|
||||
class TargetOptions {
|
||||
public:
|
||||
TargetOptions()
|
||||
|
@ -192,6 +200,10 @@ namespace llvm {
|
|||
/// EnableGlobalISel - This flag enables global instruction selection.
|
||||
unsigned EnableGlobalISel : 1;
|
||||
|
||||
/// EnableGlobalISelAbort - Control abort behaviour when global instruction
|
||||
/// selection fails to lower/select an instruction.
|
||||
GlobalISelAbortMode GlobalISelAbort = GlobalISelAbortMode::Enable;
|
||||
|
||||
/// UseInitArray - Use .init_array instead of .ctors for static
|
||||
/// constructors.
|
||||
unsigned UseInitArray : 1;
|
||||
|
|
|
@ -137,13 +137,15 @@ static cl::opt<std::string> PrintMachineInstrs(
|
|||
"print-machineinstrs", cl::ValueOptional, cl::desc("Print machine instrs"),
|
||||
cl::value_desc("pass-name"), cl::init("option-unspecified"), cl::Hidden);
|
||||
|
||||
static cl::opt<int> EnableGlobalISelAbort(
|
||||
static cl::opt<GlobalISelAbortMode> EnableGlobalISelAbort(
|
||||
"global-isel-abort", cl::Hidden,
|
||||
cl::desc("Enable abort calls when \"global\" instruction selection "
|
||||
"fails to lower/select an instruction: 0 disable the abort, "
|
||||
"1 enable the abort, and "
|
||||
"2 disable the abort but emit a diagnostic on failure"),
|
||||
cl::init(1));
|
||||
"fails to lower/select an instruction"),
|
||||
cl::values(
|
||||
clEnumValN(GlobalISelAbortMode::Disable, "0", "Disable the abort"),
|
||||
clEnumValN(GlobalISelAbortMode::Enable, "1", "Enable the abort"),
|
||||
clEnumValN(GlobalISelAbortMode::DisableWithDiag, "2",
|
||||
"Disable the abort but emit a diagnostic on failure")));
|
||||
|
||||
// Temporary option to allow experimenting with MachineScheduler as a post-RA
|
||||
// scheduler. Targets can "properly" enable this with
|
||||
|
@ -384,6 +386,9 @@ TargetPassConfig::TargetPassConfig(LLVMTargetMachine &TM, PassManagerBase &pm)
|
|||
if (TM.Options.EnableIPRA)
|
||||
setRequiresCodeGenSCCOrder();
|
||||
|
||||
if (EnableGlobalISelAbort.getNumOccurrences())
|
||||
TM.Options.GlobalISelAbort = EnableGlobalISelAbort;
|
||||
|
||||
setStartStopPasses();
|
||||
}
|
||||
|
||||
|
@ -721,8 +726,11 @@ bool TargetPassConfig::addCoreISelPasses() {
|
|||
// Enable FastISel with -fast-isel, but allow that to be overridden.
|
||||
TM->setO0WantsFastISel(EnableFastISelOption != cl::BOU_FALSE);
|
||||
if (EnableFastISelOption == cl::BOU_TRUE ||
|
||||
(TM->getOptLevel() == CodeGenOpt::None && TM->getO0WantsFastISel()))
|
||||
(TM->getOptLevel() == CodeGenOpt::None && TM->getO0WantsFastISel() &&
|
||||
!TM->Options.EnableGlobalISel)) {
|
||||
TM->setFastISel(true);
|
||||
TM->setGlobalISel(false);
|
||||
}
|
||||
|
||||
// Ask the target for an instruction selector.
|
||||
// Explicitly enabling fast-isel should override implicitly enabled
|
||||
|
@ -730,6 +738,7 @@ bool TargetPassConfig::addCoreISelPasses() {
|
|||
if (EnableGlobalISelOption == cl::BOU_TRUE ||
|
||||
(EnableGlobalISelOption == cl::BOU_UNSET &&
|
||||
TM->Options.EnableGlobalISel && EnableFastISelOption != cl::BOU_TRUE)) {
|
||||
TM->setGlobalISel(true);
|
||||
TM->setFastISel(false);
|
||||
|
||||
SaveAndRestore<bool> SavedAddingMachinePasses(AddingMachinePasses, true);
|
||||
|
@ -1165,14 +1174,9 @@ void TargetPassConfig::addBlockPlacement() {
|
|||
/// GlobalISel Configuration
|
||||
//===---------------------------------------------------------------------===//
|
||||
bool TargetPassConfig::isGlobalISelAbortEnabled() const {
|
||||
if (EnableGlobalISelAbort.getNumOccurrences() > 0)
|
||||
return EnableGlobalISelAbort == 1;
|
||||
|
||||
// When no abort behaviour is specified, we don't abort if the target says
|
||||
// that GISel is enabled.
|
||||
return !TM->Options.EnableGlobalISel;
|
||||
return TM->Options.GlobalISelAbort == GlobalISelAbortMode::Enable;
|
||||
}
|
||||
|
||||
bool TargetPassConfig::reportDiagnosticWhenGlobalISelFallback() const {
|
||||
return EnableGlobalISelAbort == 2;
|
||||
return TM->Options.GlobalISelAbort == GlobalISelAbortMode::DisableWithDiag;
|
||||
}
|
||||
|
|
|
@ -275,8 +275,10 @@ AArch64TargetMachine::AArch64TargetMachine(const Target &T, const Triple &TT,
|
|||
}
|
||||
|
||||
// Enable GlobalISel at or below EnableGlobalISelAt0.
|
||||
if (getOptLevel() <= EnableGlobalISelAtO)
|
||||
if (getOptLevel() <= EnableGlobalISelAtO) {
|
||||
setGlobalISel(true);
|
||||
setGlobalISelAbort(GlobalISelAbortMode::Disable);
|
||||
}
|
||||
|
||||
// AArch64 supports the MachineOutliner.
|
||||
setMachineOutliner(true);
|
||||
|
|
Loading…
Reference in New Issue