mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 23:23:38 -04:00
[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
This commit is contained in:
@@ -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);
|
||||
} else if (Selector == SelectorType::GlobalISel) {
|
||||
TM->setFastISel(false);
|
||||
TM->setGlobalISel(true);
|
||||
}
|
||||
|
||||
// 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);
|
||||
TM->setFastISel(false);
|
||||
|
||||
// Add instruction selector passes.
|
||||
if (Selector == SelectorType::GlobalISel) {
|
||||
SaveAndRestore<bool> SavedAddingMachinePasses(AddingMachinePasses, true);
|
||||
if (addIRTranslator())
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user