summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/TargetPassConfig.cpp
diff options
context:
space:
mode:
authorPetr Pavlu <petr.pavlu@arm.com>2019-01-08 14:19:06 +0000
committerPetr Pavlu <petr.pavlu@arm.com>2019-01-08 14:19:06 +0000
commitbf4fdecc5160205ce966044d59bc35a406de65e5 (patch)
tree12e31850035d8fb6f56a9afe7e1eb131cdc5f34f /llvm/lib/CodeGen/TargetPassConfig.cpp
parent2e6dc538be1a694ad569496b917c5e653ed21c1d (diff)
downloadbcm5719-llvm-bf4fdecc5160205ce966044d59bc35a406de65e5.tar.gz
bcm5719-llvm-bf4fdecc5160205ce966044d59bc35a406de65e5.zip
[GlobalISel] Fix choice of instruction selector for AArch64 at -O0 with -global-isel=0
Commit rL347861 introduced an unintentional change in the behaviour when compiling for AArch64 at -O0 with -global-isel=0. Previously, explicitly disabling GlobalISel resulted in using FastISel but an updated condition in the commit changed it to using SelectionDAG. The patch fixes this condition and slightly better organizes the code that chooses the instruction selector. Fixes PR40131. Differential Revision: https://reviews.llvm.org/D56266 llvm-svn: 350626
Diffstat (limited to 'llvm/lib/CodeGen/TargetPassConfig.cpp')
-rw-r--r--llvm/lib/CodeGen/TargetPassConfig.cpp35
1 files changed, 23 insertions, 12 deletions
diff --git a/llvm/lib/CodeGen/TargetPassConfig.cpp b/llvm/lib/CodeGen/TargetPassConfig.cpp
index defb165fe0f..28126fcf766 100644
--- a/llvm/lib/CodeGen/TargetPassConfig.cpp
+++ b/llvm/lib/CodeGen/TargetPassConfig.cpp
@@ -755,22 +755,33 @@ void TargetPassConfig::addISelPrepare() {
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->Options.EnableGlobalISel)) {
+
+ // Determine an instruction selector.
+ enum class SelectorType { SelectionDAG, FastISel, GlobalISel };
+ SelectorType Selector;
+
+ if (EnableFastISelOption == cl::BOU_TRUE)
+ Selector = SelectorType::FastISel;
+ else if (EnableGlobalISelOption == cl::BOU_TRUE ||
+ (TM->Options.EnableGlobalISel &&
+ EnableGlobalISelOption != cl::BOU_FALSE))
+ Selector = SelectorType::GlobalISel;
+ else if (TM->getOptLevel() == CodeGenOpt::None && TM->getO0WantsFastISel())
+ Selector = SelectorType::FastISel;
+ else
+ Selector = SelectorType::SelectionDAG;
+
+ // Set consistently TM->Options.EnableFastISel and EnableGlobalISel.
+ if (Selector == SelectorType::FastISel) {
TM->setFastISel(true);
TM->setGlobalISel(false);
- }
-
- // Ask the target for an instruction selector.
- // Explicitly enabling fast-isel should override implicitly enabled
- // global-isel.
- if (EnableGlobalISelOption == cl::BOU_TRUE ||
- (EnableGlobalISelOption == cl::BOU_UNSET &&
- TM->Options.EnableGlobalISel && EnableFastISelOption != cl::BOU_TRUE)) {
- TM->setGlobalISel(true);
+ } else if (Selector == SelectorType::GlobalISel) {
TM->setFastISel(false);
+ TM->setGlobalISel(true);
+ }
+ // Add instruction selector passes.
+ if (Selector == SelectorType::GlobalISel) {
SaveAndRestore<bool> SavedAddingMachinePasses(AddingMachinePasses, true);
if (addIRTranslator())
return true;
OpenPOWER on IntegriCloud