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 { spirv.func @linkage_attr_test_kernel() "DontInline" attributes {} {