Page MenuHomePhabricator

D54518.diff
No OneTemporary

File Metadata

Created
Thu, Nov 21, 8:55 PM

D54518.diff

Index: llvm/trunk/include/llvm/Target/TargetMachine.h
===================================================================
--- llvm/trunk/include/llvm/Target/TargetMachine.h
+++ llvm/trunk/include/llvm/Target/TargetMachine.h
@@ -201,6 +201,9 @@
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;
}
Index: llvm/trunk/include/llvm/Target/TargetOptions.h
===================================================================
--- llvm/trunk/include/llvm/Target/TargetOptions.h
+++ llvm/trunk/include/llvm/Target/TargetOptions.h
@@ -96,6 +96,14 @@
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 @@
/// 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;
Index: llvm/trunk/lib/CodeGen/TargetPassConfig.cpp
===================================================================
--- llvm/trunk/lib/CodeGen/TargetPassConfig.cpp
+++ llvm/trunk/lib/CodeGen/TargetPassConfig.cpp
@@ -137,13 +137,15 @@
"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 @@
if (TM.Options.EnableIPRA)
setRequiresCodeGenSCCOrder();
+ if (EnableGlobalISelAbort.getNumOccurrences())
+ TM.Options.GlobalISelAbort = EnableGlobalISelAbort;
+
setStartStopPasses();
}
@@ -721,8 +726,11 @@
// 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 @@
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 @@
/// 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;
}
Index: llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp
===================================================================
--- llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp
+++ llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp
@@ -275,8 +275,10 @@
}
// Enable GlobalISel at or below EnableGlobalISelAt0.
- if (getOptLevel() <= EnableGlobalISelAtO)
+ if (getOptLevel() <= EnableGlobalISelAtO) {
setGlobalISel(true);
+ setGlobalISelAbort(GlobalISelAbortMode::Disable);
+ }
// AArch64 supports the MachineOutliner.
setMachineOutliner(true);

Event Timeline