From 7885d2ca5ae8da146dcb51232ea8754aa07b5708 Mon Sep 17 00:00:00 2001 From: Petr Pavlu Date: Tue, 8 Jan 2019 14:19:06 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350626 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/TargetPassConfig.cpp | 35 ++++++++++++++-------- .../gisel-commandline-option-fastisel.ll | 35 ++++++++++++++++++++++ 2 files changed, 58 insertions(+), 12 deletions(-) create mode 100644 test/CodeGen/AArch64/GlobalISel/gisel-commandline-option-fastisel.ll diff --git a/lib/CodeGen/TargetPassConfig.cpp b/lib/CodeGen/TargetPassConfig.cpp index defb165fe0f..28126fcf766 100644 --- a/lib/CodeGen/TargetPassConfig.cpp +++ b/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 SavedAddingMachinePasses(AddingMachinePasses, true); if (addIRTranslator()) return true; diff --git a/test/CodeGen/AArch64/GlobalISel/gisel-commandline-option-fastisel.ll b/test/CodeGen/AArch64/GlobalISel/gisel-commandline-option-fastisel.ll new file mode 100644 index 00000000000..73158f54325 --- /dev/null +++ b/test/CodeGen/AArch64/GlobalISel/gisel-commandline-option-fastisel.ll @@ -0,0 +1,35 @@ +; REQUIRES: asserts + +; RUN: llc -mtriple=aarch64-- -debug-pass=Structure %s -o /dev/null 2>&1 \ +; RUN: -verify-machineinstrs=0 -O0 -global-isel=false -debug-only=isel \ +; RUN: | FileCheck %s --check-prefixes=DISABLED,FASTISEL + +; RUN: llc -mtriple=aarch64-- -debug-pass=Structure %s -o /dev/null 2>&1 \ +; RUN: -verify-machineinstrs=0 -O1 -global-isel=false -debug-only=isel \ +; RUN: | FileCheck %s --check-prefixes=DISABLED,NOFASTISEL + +; RUN: llc -mtriple=aarch64-- -debug-pass=Structure %s -o /dev/null 2>&1 \ +; RUN: -verify-machineinstrs=0 -O0 -fast-isel=false -global-isel=false \ +; RUN: -debug-only=isel \ +; RUN: | FileCheck %s --check-prefixes=DISABLED,NOFASTISEL + +; RUN: llc -mtriple=aarch64-- -debug-pass=Structure %s -o /dev/null 2>&1 \ +; RUN: -verify-machineinstrs=0 -O1 -fast-isel=false -global-isel=false \ +; RUN: -debug-only=isel \ +; RUN: | FileCheck %s --check-prefixes=DISABLED,NOFASTISEL + +; Check that the right instruction selector is chosen when using +; -global-isel=false. FastISel should be used at -O0 (unless -fast-isel=false is +; also present) and SelectionDAG otherwise. + +; DISABLED-NOT: IRTranslator + +; DISABLED: AArch64 Instruction Selection +; DISABLED: Expand ISel Pseudo-instructions + +; FASTISEL: Enabling fast-isel +; NOFASTISEL-NOT: Enabling fast-isel + +define void @empty() { + ret void +} -- 2.11.0