diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/CodeGen/TargetPassConfig.cpp | 35 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/GlobalISel/gisel-commandline-option-fastisel.ll | 35 |
2 files changed, 58 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; diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/gisel-commandline-option-fastisel.ll b/llvm/test/CodeGen/AArch64/GlobalISel/gisel-commandline-option-fastisel.ll new file mode 100644 index 00000000000..73158f54325 --- /dev/null +++ b/llvm/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 +} |