[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:
Petr Pavlu 2018-11-29 12:56:32 +00:00
parent 3e3696bf46
commit e6406d568c
4 changed files with 35 additions and 14 deletions

View File

@ -201,6 +201,9 @@ public:
bool getO0WantsFastISel() { return O0WantsFastISel; } bool getO0WantsFastISel() { return O0WantsFastISel; }
void setO0WantsFastISel(bool Enable) { O0WantsFastISel = Enable; } void setO0WantsFastISel(bool Enable) { O0WantsFastISel = Enable; }
void setGlobalISel(bool Enable) { Options.EnableGlobalISel = Enable; } void setGlobalISel(bool Enable) { Options.EnableGlobalISel = Enable; }
void setGlobalISelAbort(GlobalISelAbortMode Mode) {
Options.GlobalISelAbort = Mode;
}
void setMachineOutliner(bool Enable) { void setMachineOutliner(bool Enable) {
Options.EnableMachineOutliner = Enable; Options.EnableMachineOutliner = Enable;
} }

View File

@ -96,6 +96,14 @@ namespace llvm {
SCE // Tune debug info for SCE targets (e.g. PS4). 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 { class TargetOptions {
public: public:
TargetOptions() TargetOptions()
@ -192,6 +200,10 @@ namespace llvm {
/// EnableGlobalISel - This flag enables global instruction selection. /// EnableGlobalISel - This flag enables global instruction selection.
unsigned EnableGlobalISel : 1; 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 /// UseInitArray - Use .init_array instead of .ctors for static
/// constructors. /// constructors.
unsigned UseInitArray : 1; unsigned UseInitArray : 1;

View File

@ -137,13 +137,15 @@ static cl::opt<std::string> PrintMachineInstrs(
"print-machineinstrs", cl::ValueOptional, cl::desc("Print machine instrs"), "print-machineinstrs", cl::ValueOptional, cl::desc("Print machine instrs"),
cl::value_desc("pass-name"), cl::init("option-unspecified"), cl::Hidden); 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, "global-isel-abort", cl::Hidden,
cl::desc("Enable abort calls when \"global\" instruction selection " cl::desc("Enable abort calls when \"global\" instruction selection "
"fails to lower/select an instruction: 0 disable the abort, " "fails to lower/select an instruction"),
"1 enable the abort, and " cl::values(
"2 disable the abort but emit a diagnostic on failure"), clEnumValN(GlobalISelAbortMode::Disable, "0", "Disable the abort"),
cl::init(1)); 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 // Temporary option to allow experimenting with MachineScheduler as a post-RA
// scheduler. Targets can "properly" enable this with // scheduler. Targets can "properly" enable this with
@ -384,6 +386,9 @@ TargetPassConfig::TargetPassConfig(LLVMTargetMachine &TM, PassManagerBase &pm)
if (TM.Options.EnableIPRA) if (TM.Options.EnableIPRA)
setRequiresCodeGenSCCOrder(); setRequiresCodeGenSCCOrder();
if (EnableGlobalISelAbort.getNumOccurrences())
TM.Options.GlobalISelAbort = EnableGlobalISelAbort;
setStartStopPasses(); setStartStopPasses();
} }
@ -721,8 +726,11 @@ bool TargetPassConfig::addCoreISelPasses() {
// Enable FastISel with -fast-isel, but allow that to be overridden. // Enable FastISel with -fast-isel, but allow that to be overridden.
TM->setO0WantsFastISel(EnableFastISelOption != cl::BOU_FALSE); TM->setO0WantsFastISel(EnableFastISelOption != cl::BOU_FALSE);
if (EnableFastISelOption == cl::BOU_TRUE || if (EnableFastISelOption == cl::BOU_TRUE ||
(TM->getOptLevel() == CodeGenOpt::None && TM->getO0WantsFastISel())) (TM->getOptLevel() == CodeGenOpt::None && TM->getO0WantsFastISel() &&
!TM->Options.EnableGlobalISel)) {
TM->setFastISel(true); TM->setFastISel(true);
TM->setGlobalISel(false);
}
// Ask the target for an instruction selector. // Ask the target for an instruction selector.
// Explicitly enabling fast-isel should override implicitly enabled // Explicitly enabling fast-isel should override implicitly enabled
@ -730,6 +738,7 @@ bool TargetPassConfig::addCoreISelPasses() {
if (EnableGlobalISelOption == cl::BOU_TRUE || if (EnableGlobalISelOption == cl::BOU_TRUE ||
(EnableGlobalISelOption == cl::BOU_UNSET && (EnableGlobalISelOption == cl::BOU_UNSET &&
TM->Options.EnableGlobalISel && EnableFastISelOption != cl::BOU_TRUE)) { TM->Options.EnableGlobalISel && EnableFastISelOption != cl::BOU_TRUE)) {
TM->setGlobalISel(true);
TM->setFastISel(false); TM->setFastISel(false);
SaveAndRestore<bool> SavedAddingMachinePasses(AddingMachinePasses, true); SaveAndRestore<bool> SavedAddingMachinePasses(AddingMachinePasses, true);
@ -1165,14 +1174,9 @@ void TargetPassConfig::addBlockPlacement() {
/// GlobalISel Configuration /// GlobalISel Configuration
//===---------------------------------------------------------------------===// //===---------------------------------------------------------------------===//
bool TargetPassConfig::isGlobalISelAbortEnabled() const { bool TargetPassConfig::isGlobalISelAbortEnabled() const {
if (EnableGlobalISelAbort.getNumOccurrences() > 0) return TM->Options.GlobalISelAbort == GlobalISelAbortMode::Enable;
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;
} }
bool TargetPassConfig::reportDiagnosticWhenGlobalISelFallback() const { bool TargetPassConfig::reportDiagnosticWhenGlobalISelFallback() const {
return EnableGlobalISelAbort == 2; return TM->Options.GlobalISelAbort == GlobalISelAbortMode::DisableWithDiag;
} }

View File

@ -275,8 +275,10 @@ AArch64TargetMachine::AArch64TargetMachine(const Target &T, const Triple &TT,
} }
// Enable GlobalISel at or below EnableGlobalISelAt0. // Enable GlobalISel at or below EnableGlobalISelAt0.
if (getOptLevel() <= EnableGlobalISelAtO) if (getOptLevel() <= EnableGlobalISelAtO) {
setGlobalISel(true); setGlobalISel(true);
setGlobalISelAbort(GlobalISelAbortMode::Disable);
}
// AArch64 supports the MachineOutliner. // AArch64 supports the MachineOutliner.
setMachineOutliner(true); setMachineOutliner(true);