[llvm] CodeGen: Fix CGPassBuilderOption::EnableGlobalISelOption for -global-isel=0 (PR #201871)

Petar Avramovic via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 5 08:59:46 PDT 2026


https://github.com/petar-avramovic created https://github.com/llvm/llvm-project/pull/201871

SET_OPTION assigned the cl::boolOrDefault into std::optional<bool>;
BOU_FALSE (=2) converts to true, so -global-isel=0 was stored as true
instead of false.

>From efd80081f485c05a81c5449f6be12f78123048c9 Mon Sep 17 00:00:00 2001
From: Petar Avramovic <Petar.Avramovic at amd.com>
Date: Fri, 5 Jun 2026 17:58:41 +0200
Subject: [PATCH] CodeGen: Fix CGPassBuilderOption::EnableGlobalISelOption for
 -global-isel=0

SET_OPTION assigned the cl::boolOrDefault into std::optional<bool>;
BOU_FALSE (=2) converts to true, so -global-isel=0 was stored as true
instead of false.
---
 llvm/lib/CodeGen/TargetPassConfig.cpp         |  3 +-
 .../lib/Target/AMDGPU/AMDGPUTargetMachine.cpp |  4 +-
 .../CodeGen/CGPassBuilderOptionTest.cpp       | 51 +++++++++++++++++++
 llvm/unittests/CodeGen/CMakeLists.txt         |  1 +
 4 files changed, 56 insertions(+), 3 deletions(-)
 create mode 100644 llvm/unittests/CodeGen/CGPassBuilderOptionTest.cpp

diff --git a/llvm/lib/CodeGen/TargetPassConfig.cpp b/llvm/lib/CodeGen/TargetPassConfig.cpp
index 6231ab1ba0734..5ec2f0e1372f2 100644
--- a/llvm/lib/CodeGen/TargetPassConfig.cpp
+++ b/llvm/lib/CodeGen/TargetPassConfig.cpp
@@ -505,7 +505,8 @@ CGPassBuilderOption llvm::getCGPassBuilderOption() {
 
   SET_OPTION(EnableFastISelOption)
   SET_OPTION(EnableGlobalISelAbort)
-  SET_OPTION(EnableGlobalISelOption)
+  if (EnableGlobalISelOption.getNumOccurrences())
+    Opt.EnableGlobalISelOption = (EnableGlobalISelOption == cl::BOU_TRUE);
   SET_OPTION(EnableIPRA)
   SET_OPTION(OptimizeRegAlloc)
   SET_OPTION(VerifyMachineCode)
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
index b572e47ce0f21..5659908a9b362 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
@@ -1630,7 +1630,7 @@ bool GCNPassConfig::addPreISel() {
 
   // SDAG requires LCSSA, GlobalISel does not. Disable LCSSA for -global-isel
   // with -new-reg-bank-select and without any of the fallback options.
-  if (!getCGPassBuilderOption().EnableGlobalISelOption ||
+  if (getCGPassBuilderOption().EnableGlobalISelOption != true ||
       !isGlobalISelAbortEnabled() || !NewRegBankSelect)
     addPass(createLCSSAPass());
 
@@ -2394,7 +2394,7 @@ void AMDGPUCodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW) const {
   // control flow modifications.
   addFunctionPass(AMDGPURewriteUndefForPHIPass(), PMW);
 
-  if (!getCGPassBuilderOption().EnableGlobalISelOption ||
+  if (getCGPassBuilderOption().EnableGlobalISelOption != true ||
       !isGlobalISelAbortEnabled() || !NewRegBankSelect)
     addFunctionPass(LCSSAPass(), PMW);
 
diff --git a/llvm/unittests/CodeGen/CGPassBuilderOptionTest.cpp b/llvm/unittests/CodeGen/CGPassBuilderOptionTest.cpp
new file mode 100644
index 0000000000000..7c79239ef9124
--- /dev/null
+++ b/llvm/unittests/CodeGen/CGPassBuilderOptionTest.cpp
@@ -0,0 +1,51 @@
+//===- CGPassBuilderOptionTest.cpp ----------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Target/CGPassBuilderOption.h"
+#include "llvm/Support/CommandLine.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+
+namespace {
+
+// Round-trip "-global-isel=<v>" through the cl::opt parser into
+// CGPassBuilderOption and check the optional<bool> reflects the user's choice.
+// This guards against the enum->bool conversion that previously collapsed
+// BOU_FALSE (=2) to `true`.
+
+static void parseArgs(std::initializer_list<const char *> Args) {
+  cl::ResetAllOptionOccurrences();
+  SmallVector<const char *, 4> Argv;
+  Argv.push_back("CGPassBuilderOptionTest");
+  for (const char *A : Args)
+    Argv.push_back(A);
+  cl::ParseCommandLineOptions(Argv.size(), Argv.data());
+}
+
+TEST(CGPassBuilderOption, GlobalISelNotSpecified) {
+  parseArgs({});
+  auto Opt = getCGPassBuilderOption();
+  EXPECT_FALSE(Opt.EnableGlobalISelOption.has_value());
+}
+
+TEST(CGPassBuilderOption, GlobalISelEnabled) {
+  parseArgs({"-global-isel=1"});
+  auto Opt = getCGPassBuilderOption();
+  ASSERT_TRUE(Opt.EnableGlobalISelOption.has_value());
+  EXPECT_TRUE(*Opt.EnableGlobalISelOption);
+}
+
+TEST(CGPassBuilderOption, GlobalISelDisabled) {
+  parseArgs({"-global-isel=0"});
+  auto Opt = getCGPassBuilderOption();
+  ASSERT_TRUE(Opt.EnableGlobalISelOption.has_value());
+  EXPECT_FALSE(*Opt.EnableGlobalISelOption);
+}
+
+} // namespace
diff --git a/llvm/unittests/CodeGen/CMakeLists.txt b/llvm/unittests/CodeGen/CMakeLists.txt
index 709017380fa4e..42b542a7fb5bb 100644
--- a/llvm/unittests/CodeGen/CMakeLists.txt
+++ b/llvm/unittests/CodeGen/CMakeLists.txt
@@ -24,6 +24,7 @@ add_llvm_unittest(CodeGenTests
   AMDGPUMetadataTest.cpp
   AsmPrinterDwarfTest.cpp
   CCStateTest.cpp
+  CGPassBuilderOptionTest.cpp
   DIEHashTest.cpp
   DIETest.cpp
   DroppedVariableStatsMIRTest.cpp



More information about the llvm-commits mailing list