[llvm-branch-commits] [llvm] [SPIRV] Drop the DebugTypeFunction operand cache. (PR #229486)
Manuel Carrasco via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Oct 8 03:31:40 PDT 2026
https://github.com/mgcarrasco updated https://github.com/llvm/llvm-project/pull/229486
>From a917948989efaad4dc8b0b29f8ca913f88e1ac5a Mon Sep 17 00:00:00 2001
From: Manuel Carrasco <Manuel.Carrasco at amd.com>
Date: Tue, 6 Oct 2026 08:03:06 -0500
Subject: [PATCH] [SPIRV] Drop the DebugTypeFunction operand cache.
Each DISubroutineType is already emitted once through DebugScopeRegs.
---
.../SPIRV/SPIRVNonSemanticDebugHandler.cpp | 18 ++----------------
.../SPIRV/SPIRVNonSemanticDebugHandler.h | 11 -----------
.../debug-type-function-void-prototypes.ll | 5 +++--
3 files changed, 5 insertions(+), 29 deletions(-)
diff --git a/llvm/lib/Target/SPIRV/SPIRVNonSemanticDebugHandler.cpp b/llvm/lib/Target/SPIRV/SPIRVNonSemanticDebugHandler.cpp
index 8618fb9acbb7e..e63785c343c2c 100644
--- a/llvm/lib/Target/SPIRV/SPIRVNonSemanticDebugHandler.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVNonSemanticDebugHandler.cpp
@@ -348,7 +348,6 @@ void SPIRVNonSemanticDebugHandler::beginModule(Module *M) {
ScalarTypeCache.clear();
ScalarConstantCache.clear();
ConstantValueRegs.clear();
- DebugTypeFunctionCache.clear();
DebugOperationCache.clear();
DebugExpressionCache.clear();
ModuleScopeIds.clear();
@@ -555,20 +554,6 @@ MCRegister SPIRVNonSemanticDebugHandler::emitExtInst(
return Reg;
}
-MCRegister SPIRVNonSemanticDebugHandler::getOrEmitDebugTypeFunction(
- ArrayRef<MCRegister> Ops, MCRegister VoidTypeReg, MCRegister ExtInstSetReg,
- SPIRV::ModuleAnalysisInfo &MAI) {
- auto [It, Inserted] =
- DebugTypeFunctionCache.try_emplace(SmallVector<MCRegister, 8>(Ops));
- if (!Inserted)
- return It->second;
-
- MCRegister Reg = emitExtInst(SPIRV::NonSemanticExtInst::DebugTypeFunction,
- VoidTypeReg, ExtInstSetReg, Ops, MAI);
- It->second = Reg;
- return Reg;
-}
-
MCRegister SPIRVNonSemanticDebugHandler::getOrEmitOpTypeVoidReg(
SPIRV::ModuleAnalysisInfo &MAI) {
if (!CachedOpTypeVoidReg.isValid())
@@ -985,7 +970,8 @@ SPIRVNonSemanticDebugHandler::emitDebugTypeFunctionForSubroutineType(
}
}
return EmitResult::emitted(
- getOrEmitDebugTypeFunction(Ops, VoidTypeReg, ExtInstSetReg, MAI));
+ emitExtInst(SPIRV::NonSemanticExtInst::DebugTypeFunction, VoidTypeReg,
+ ExtInstSetReg, Ops, MAI));
}
// Match SPIRV-LLVM-Translator's selection logic for the Parent operand.
diff --git a/llvm/lib/Target/SPIRV/SPIRVNonSemanticDebugHandler.h b/llvm/lib/Target/SPIRV/SPIRVNonSemanticDebugHandler.h
index a96ac8e33afed..0a7690efbab7b 100644
--- a/llvm/lib/Target/SPIRV/SPIRVNonSemanticDebugHandler.h
+++ b/llvm/lib/Target/SPIRV/SPIRVNonSemanticDebugHandler.h
@@ -190,10 +190,6 @@ class SPIRVNonSemanticDebugHandler : public DebugHandlerBase {
DenseMap<std::pair<const DIBasicType *, uint64_t>, MCRegister>
ConstantValueRegs;
- // Cache of already-emitted DebugTypeFunction instructions, keyed by operand
- // ids (flags, return type, parameters).
- DenseMap<SmallVector<MCRegister, 8>, MCRegister> DebugTypeFunctionCache;
-
// Cache of already-emitted DebugOperation instructions, keyed by NonSemantic
// opcode followed by the 32-bit operation arguments. Inline size 3 is the
// spec maximum (opcode plus at most two operands: BitPiece, Fragment).
@@ -362,13 +358,6 @@ class SPIRVNonSemanticDebugHandler : public DebugHandlerBase {
ArrayRef<MCRegister> Operands,
SPIRV::ModuleAnalysisInfo &MAI);
- /// Return a cached DebugTypeFunction id when \p Ops matches a prior emission,
- /// otherwise emit and cache a new instruction.
- MCRegister getOrEmitDebugTypeFunction(ArrayRef<MCRegister> Ops,
- MCRegister VoidTypeReg,
- MCRegister ExtInstSetReg,
- SPIRV::ModuleAnalysisInfo &MAI);
-
/// Return OpTypeVoid id for this module (lazy lookup / emit, then cache).
MCRegister getOrEmitOpTypeVoidReg(SPIRV::ModuleAnalysisInfo &MAI);
diff --git a/llvm/test/CodeGen/SPIRV/debug-info/debug-type-function-void-prototypes.ll b/llvm/test/CodeGen/SPIRV/debug-info/debug-type-function-void-prototypes.ll
index d9f41f4cf0bab..10ef297e37876 100644
--- a/llvm/test/CodeGen/SPIRV/debug-info/debug-type-function-void-prototypes.ll
+++ b/llvm/test/CodeGen/SPIRV/debug-info/debug-type-function-void-prototypes.ll
@@ -2,13 +2,14 @@
; RUN: %if spirv-tools %{ llc --verify-machineinstrs --spirv-ext=+SPV_KHR_non_semantic_info -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
; Void function types in LLVM metadata may be written as an empty type list (!{}) or with an explicit
-; null return slot (!{null}); both should produce the same SPIR-V DebugTypeFunction (flags + void only).
+; null return slot (!{null}). Those are two DISubroutineType nodes, so each gets its own
+; DebugTypeFunction. Both instructions have the same operands: flags and OpTypeVoid.
; CHECK: [[ext:%[0-9]+]] = OpExtInstImport "NonSemantic.Shader.DebugInfo.100"
; CHECK-DAG: [[type_void:%[0-9]+]] = OpTypeVoid
; CHECK-DAG: [[type_int32:%[0-9]+]] = OpTypeInt 32 0
; CHECK-DAG: [[flag_zero:%[0-9]+]] = OpConstant [[type_int32]] 0{{$}}
-; CHECK-COUNT-1: OpExtInst [[type_void]] [[ext]] DebugTypeFunction [[flag_zero]] [[type_void]]
+; CHECK-COUNT-2: OpExtInst [[type_void]] [[ext]] DebugTypeFunction [[flag_zero]] [[type_void]]
target triple = "spirv64-unknown-unknown"
More information about the llvm-branch-commits
mailing list