Index: llvm/trunk/lib/CodeGen/TargetPassConfig.cpp =================================================================== --- llvm/trunk/lib/CodeGen/TargetPassConfig.cpp +++ llvm/trunk/lib/CodeGen/TargetPassConfig.cpp @@ -755,22 +755,33 @@ 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; Index: llvm/trunk/test/CodeGen/AArch64/GlobalISel/gisel-commandline-option-fastisel.ll =================================================================== --- llvm/trunk/test/CodeGen/AArch64/GlobalISel/gisel-commandline-option-fastisel.ll +++ llvm/trunk/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 +}