[llvm] [SPIR-V] Reset SPIRVGlobalRegistry at module entry (PR #196058)

via llvm-commits llvm-commits at lists.llvm.org
Wed May 6 05:42:24 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-spir-v

Author: Arseniy Obolenskiy (aobolensk)

<details>
<summary>Changes</summary>

GlobalRegistry is owned by the TartgetMaching lifetime Subtarget but caches IR pointers, so a reused TargetMachine (e.g. in case of JIT, libFuzzer) would carry stale entries from a prior module

The bug was caught by `llvm-isel-fuzzer` ran for `spirv64-unknown-unknown`

---
Full diff: https://github.com/llvm/llvm-project/pull/196058.diff


2 Files Affected:

- (modified) llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp (+2) 
- (modified) llvm/unittests/Target/SPIRV/SPIRVGlobalRegistryTests.cpp (+30) 


``````````diff
diff --git a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp
index e4c98984bf0af..5619748965112 100644
--- a/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVSubtarget.cpp
@@ -193,6 +193,8 @@ void SPIRVSubtarget::setEnv(SPIRVEnvType E) {
 }
 
 void SPIRVSubtarget::resolveEnvFromModule(const Module &M) {
+  *GR = SPIRVGlobalRegistry(M.getDataLayout());
+
   if (Env != Unknown) {
     assert(!(isKernel() && any_of(M,
                                   [](const Function &F) {
diff --git a/llvm/unittests/Target/SPIRV/SPIRVGlobalRegistryTests.cpp b/llvm/unittests/Target/SPIRV/SPIRVGlobalRegistryTests.cpp
index e65a9321b403e..c7d4072cbf32e 100644
--- a/llvm/unittests/Target/SPIRV/SPIRVGlobalRegistryTests.cpp
+++ b/llvm/unittests/Target/SPIRV/SPIRVGlobalRegistryTests.cpp
@@ -6,15 +6,22 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "SPIRV.h"
 #include "SPIRVGlobalRegistry.h"
+#include "SPIRVISelLowering.h"
 #include "SPIRVInstrInfo.h"
+#include "SPIRVSubtarget.h"
+#include "SPIRVTargetMachine.h"
 #include "llvm/CodeGen/MachineInstrBuilder.h"
 #include "llvm/CodeGen/MachineModuleInfo.h"
+#include "llvm/CodeGen/MachineRegisterInfo.h"
+#include "llvm/IR/LegacyPassManager.h"
 #include "llvm/IR/Module.h"
 #include "llvm/MC/TargetRegistry.h"
 #include "llvm/Support/TargetSelect.h"
 #include "llvm/Target/TargetMachine.h"
 #include "gtest/gtest.h"
+#include <optional>
 
 using namespace llvm;
 
@@ -71,3 +78,26 @@ TEST_F(SPIRVGlobalRegistryTest, IsAggregateType) {
   EXPECT_FALSE(GR.isAggregateType(makeTypeInstr(SPIRV::OpTypeFloat)));
   EXPECT_FALSE(GR.isAggregateType(SPIRVTypeInst(nullptr)));
 }
+
+TEST_F(SPIRVGlobalRegistryTest, PrepareFunctionsClearsStalePointers) {
+  auto *STM = static_cast<SPIRVTargetMachine *>(TM.get());
+  auto *GR = STM->getSubtargetImpl()->getSPIRVGlobalRegistry();
+
+  Function *F = Mod->getFunction("f");
+  ASSERT_NE(F, nullptr);
+  Type *I32 = Type::getInt32Ty(*Ctx);
+  GR->addDeducedElementType(F, I32);
+  ASSERT_EQ(GR->findDeducedElementType(F), I32);
+
+  LLVMContext Ctx2;
+  Module Mod2("M2", Ctx2);
+  Mod2.setDataLayout(TM->createDataLayout());
+  Function::Create(FunctionType::get(Type::getVoidTy(Ctx2), false),
+                   GlobalValue::ExternalLinkage, "g", Mod2);
+
+  legacy::PassManager PM;
+  PM.add(createSPIRVPrepareFunctionsPass(*STM));
+  PM.run(Mod2);
+
+  EXPECT_EQ(GR->findDeducedElementType(F), nullptr);
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/196058


More information about the llvm-commits mailing list