[Mlir-commits] [mlir] 94647ee - [mlir][spirv] Remove destroyed values from ValueIDMap (#164098)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Oct 20 03:38:52 PDT 2025
Author: Igor Wodiany
Date: 2025-10-20T11:38:48+01:00
New Revision: 94647eea7fc0fcdf1c953b8ff6bd6ef9981d7890
URL: https://github.com/llvm/llvm-project/commit/94647eea7fc0fcdf1c953b8ff6bd6ef9981d7890
DIFF: https://github.com/llvm/llvm-project/commit/94647eea7fc0fcdf1c953b8ff6bd6ef9981d7890.diff
LOG: [mlir][spirv] Remove destroyed values from ValueIDMap (#164098)
When serializing SPIR-V MLIR containing externally linked function with
debug enabled, the serialization crashes as `printValueIDMap` tries to
print a key value that has been already destroyed. This happen as for
externally linked function the body of the function is erased, that
causes arguments to be destroyed as well, but the valueIDMap was never
updated.
Added:
Modified:
mlir/lib/Target/SPIRV/Serialization/SerializeOps.cpp
mlir/test/Target/SPIRV/function-decorations.mlir
Removed:
################################################################################
diff --git a/mlir/lib/Target/SPIRV/Serialization/SerializeOps.cpp b/mlir/lib/Target/SPIRV/Serialization/SerializeOps.cpp
index e9b180a70bb23..85e92c7ced394 100644
--- a/mlir/lib/Target/SPIRV/Serialization/SerializeOps.cpp
+++ b/mlir/lib/Target/SPIRV/Serialization/SerializeOps.cpp
@@ -311,6 +311,14 @@ LogicalResult Serializer::processFuncOp(spirv::FuncOp op) {
op.addEntryBlock();
if (failed(processFuncParameter(op)))
return failure();
+
+ // Erasing the body of the function destroys arguments, so we need to remove
+ // them from the map to avoid problems when processing invalid values used
+ // as keys. We have already serialized function arguments so we probably can
+ // remove them from the map as external function will not have any uses.
+ for (Value arg : op.getArguments())
+ valueIDMap.erase(arg);
+
// Don't need to process the added block, there is nothing to process,
// the fake body was added just to get the arguments, remove the body,
// since it's use is done.
diff --git a/mlir/test/Target/SPIRV/function-decorations.mlir b/mlir/test/Target/SPIRV/function-decorations.mlir
index ef627145aac3e..6098e42f063a2 100644
--- a/mlir/test/Target/SPIRV/function-decorations.mlir
+++ b/mlir/test/Target/SPIRV/function-decorations.mlir
@@ -1,4 +1,5 @@
-// RUN: mlir-translate -no-implicit-module -test-spirv-roundtrip -split-input-file -verify-diagnostics %s | FileCheck %s
+// RUN: mlir-translate --no-implicit-module --test-spirv-roundtrip --split-input-file %s | FileCheck %s
+// RUN: mlir-translate --no-implicit-module --test-spirv-roundtrip --split-input-file --debug %s | FileCheck %s
spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader, Linkage], []> {
spirv.func @linkage_attr_test_kernel() "DontInline" attributes {} {
More information about the Mlir-commits
mailing list