Skip to content

[MLIR][SPIR-V] Memory leak and failed legalization in SPIR-V to LLVM conversion with spirv.SpecConstant #159485

@sairam2661

Description

@sairam2661

Test commit: 5a86dc996c26299de63effc927075dcbfb924167

Description:
The SPIR-V to LLVM conversion pass (-convert-spirv-to-llvm) fails to handle spirv.SpecConstant operations, resulting in a legalization error and a memory leak.

Steps to reproduce

  • Minimal MLIR program (test.mlir)
"builtin.module"() ({
  "spirv.module"() <{
    addressing_model = #spirv.addressing_model<Logical>,
    memory_model = #spirv.memory_model<GLSL450>
  }> ({
    "spirv.SpecConstant"() <{
      default_value = -5 : i32,
      sym_name = "foo"
    }> : () -> ()
  }) : () -> ()
}) : () -> ()

Command

mlir-opt -convert-spirv-to-llvm test.mlir

Output

/workdir/test.mlir:6:5: error: failed to legalize operation 'spirv.SpecConstant' that was explicitly marked illegal
    "spirv.SpecConstant"() <{
    ^
/workdir/test.mlir:6:5: note: see current operation: "spirv.SpecConstant"() <{default_value = -5 : i32, sym_name = "foo"}> : () -> ()

=================================================================
==4143037==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 72 byte(s) in 1 object(s) allocated from:
    #0 0x55c769594b7d in operator new(unsigned long) (/workdir/llvm-project/build/bin/mlir-opt+0xf673b7d) (BuildId: e970ca4352d984cb)
    #1 0x55c76a7041b2 in mlir::Region::emplaceBlock() /workdir/llvm-project/mlir/include/mlir/IR/Region.h:47:15
    #2 0x55c773a3534c in mlir::ModuleOp::build(mlir::OpBuilder&, mlir::OperationState&, std::optional<llvm::StringRef>) /workdir/llvm-project/mlir/lib/IR/BuiltinDialect.cpp:125:22
    #3 0x55c77336f3f5 in mlir::ModuleOp mlir::OpBuilder::create<mlir::ModuleOp, std::optional<llvm::StringRef> >(mlir::Location, std::optional<llvm::StringRef>&&) /workdir/llvm-project/mlir/include/mlir/IR/Builders.h:506:5
    #4 0x55c77336ece7 in (anonymous namespace)::ModuleConversionPattern::matchAndRewrite(mlir::spirv::ModuleOp, mlir::spirv::ModuleOpAdaptor, mlir::ConversionPatternRewriter&) const /workdir/llvm-project/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp:1713:18
    #5 0x55c77336f167 in mlir::OpConversionPattern<mlir::spirv::ModuleOp>::matchAndRewrite(mlir::spirv::ModuleOp, mlir::spirv::ModuleOpGenericAdaptor<llvm::ArrayRef<mlir::ValueRange> >, mlir::ConversionPatternRewriter&) const /workdir/llvm-project/mlir/include/mlir/Transforms/DialectConversion.h:625:12
    #6 0x55c77336ea47 in mlir::OpConversionPattern<mlir::spirv::ModuleOp>::matchAndRewrite(mlir::Operation*, llvm::ArrayRef<mlir::ValueRange>, mlir::ConversionPatternRewriter&) const /workdir/llvm-project/mlir/include/mlir/Transforms/DialectConversion.h:609:12
    #7 0x55c7737b7967 in mlir::ConversionPattern::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&) const /workdir/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:1931:10
    #8 0x55c77b3f3a60 in mlir::PatternApplicator::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&, llvm::function_ref<bool (mlir::Pattern const&)>, llvm::function_ref<void (mlir::Pattern const&)>, llvm::function_ref<llvm::LogicalResult (mlir::Pattern const&)>)::$_2::operator()() const /workdir/llvm-project/mlir/lib/Rewrite/PatternApplicator.cpp:212:31
    #9 0x55c77b3f3a60 in void llvm::function_ref<void ()>::callback_fn<mlir::PatternApplicator::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&, llvm::function_ref<bool (mlir::Pattern const&)>, llvm::function_ref<void (mlir::Pattern const&)>, llvm::function_ref<llvm::LogicalResult (mlir::Pattern const&)>)::$_2>(long) /workdir/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:12
    #10 0x55c77b3e91cd in llvm::function_ref<void ()>::operator()() const /workdir/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
    #11 0x55c77b3e91cd in void mlir::MLIRContext::executeAction<mlir::ApplyPatternAction, mlir::Pattern const&>(llvm::function_ref<void ()>, llvm::ArrayRef<mlir::IRUnit>, mlir::Pattern const&) /workdir/llvm-project/mlir/include/mlir/IR/MLIRContext.h:280:7
    #12 0x55c77b3e91cd in mlir::PatternApplicator::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&, llvm::function_ref<bool (mlir::Pattern const&)>, llvm::function_ref<void (mlir::Pattern const&)>, llvm::function_ref<llvm::LogicalResult (mlir::Pattern const&)>) /workdir/llvm-project/mlir/lib/Rewrite/PatternApplicator.cpp:195:23
    #13 0x55c7737b9d61 in (anonymous namespace)::OperationLegalizer::legalizeWithPattern(mlir::Operation*, mlir::ConversionPatternRewriter&) /workdir/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:2278:21
    #14 0x55c7737b9d61 in (anonymous namespace)::OperationLegalizer::legalize(mlir::Operation*, mlir::ConversionPatternRewriter&) /workdir/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:2143:17
    #15 0x55c7737b7e06 in mlir::OperationConverter::convert(mlir::ConversionPatternRewriter&, mlir::Operation*) /workdir/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:2651:26
    #16 0x55c7737baeec in mlir::OperationConverter::convertOperations(llvm::ArrayRef<mlir::Operation*>) /workdir/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:2750:16
    #17 0x55c7737ddf0d in applyConversion(llvm::ArrayRef<mlir::Operation*>, mlir::ConversionTarget const&, mlir::FrozenRewritePatternSet const&, mlir::ConversionConfig, (anonymous namespace)::OpConversionMode)::$_30::operator()() const /workdir/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:3457:30
    #18 0x55c7737ddf0d in void llvm::function_ref<void ()>::callback_fn<applyConversion(llvm::ArrayRef<mlir::Operation*>, mlir::ConversionTarget const&, mlir::FrozenRewritePatternSet const&, mlir::ConversionConfig, (anonymous namespace)::OpConversionMode)::$_30>(long) /workdir/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:12
    #19 0x55c7737c8a9a in llvm::function_ref<void ()>::operator()() const /workdir/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
    #20 0x55c7737c8a9a in void mlir::MLIRContext::executeAction<ApplyConversionAction>(llvm::function_ref<void ()>, llvm::ArrayRef<mlir::IRUnit>) /workdir/llvm-project/mlir/include/mlir/IR/MLIRContext.h:280:7
    #21 0x55c7737c8a9a in applyConversion(llvm::ArrayRef<mlir::Operation*>, mlir::ConversionTarget const&, mlir::FrozenRewritePatternSet const&, mlir::ConversionConfig, (anonymous namespace)::OpConversionMode) /workdir/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:3454:8
    #22 0x55c7737c8db7 in mlir::applyPartialConversion(llvm::ArrayRef<mlir::Operation*>, mlir::ConversionTarget const&, mlir::FrozenRewritePatternSet const&, mlir::ConversionConfig) /workdir/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:3470:10
    #23 0x55c7737c8db7 in mlir::applyPartialConversion(mlir::Operation*, mlir::ConversionTarget const&, mlir::FrozenRewritePatternSet const&, mlir::ConversionConfig) /workdir/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:3477:10
    #24 0x55c7733723f8 in (anonymous namespace)::ConvertSPIRVToLLVMPass::runOnOperation() /workdir/llvm-project/mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVMPass.cpp:71:14
    #25 0x55c7736945e3 in mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_7::operator()() const /workdir/llvm-project/mlir/lib/Pass/Pass.cpp:557:17
    #26 0x55c7736945e3 in void llvm::function_ref<void ()>::callback_fn<mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_7>(long) /workdir/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:12
    #27 0x55c773682e1e in llvm::function_ref<void ()>::operator()() const /workdir/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
    #28 0x55c773682e1e in void mlir::MLIRContext::executeAction<mlir::PassExecutionAction, mlir::Pass&>(llvm::function_ref<void ()>, llvm::ArrayRef<mlir::IRUnit>, mlir::Pass&) /workdir/llvm-project/mlir/include/mlir/IR/MLIRContext.h:280:7
    #29 0x55c773682e1e in mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) /workdir/llvm-project/mlir/lib/Pass/Pass.cpp:551:21
    #30 0x55c7736847f2 in mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) /workdir/llvm-project/mlir/lib/Pass/Pass.cpp:623:16
    #31 0x55c77368b089 in mlir::PassManager::runPasses(mlir::Operation*, mlir::AnalysisManager) /workdir/llvm-project/mlir/lib/Pass/Pass.cpp:937:10
    #32 0x55c77368acf8 in mlir::PassManager::run(mlir::Operation*) /workdir/llvm-project/mlir/lib/Pass/Pass.cpp:917:60
    #33 0x55c77367492e in performActions(llvm::raw_ostream&, std::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, mlir::MlirOptMainConfig const&) /workdir/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:484:17
    #34 0x55c773673fe3 in processBuffer(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, mlir::MlirOptMainConfig const&, mlir::DialectRegistry&, llvm::ThreadPoolInterface*) /workdir/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:551:12
    #35 0x55c773673fe3 in mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_3::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&) const /workdir/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:635:12
    #36 0x55c773673fe3 in llvm::LogicalResult llvm::function_ref<llvm::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&)>::callback_fn<mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_3>(long, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&) /workdir/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:12
    #37 0x55c7738aceab in llvm::function_ref<llvm::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&)>::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&) const /workdir/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
    #38 0x55c7738ac4c2 in mlir::splitAndProcessBuffer(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::function_ref<llvm::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::raw_ostream&)>, llvm::raw_ostream&, llvm::StringRef, llvm::StringRef) /workdir/llvm-project/mlir/lib/Support/ToolUtilities.cpp:27:12
    #39 0x55c773662b1c in mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&) /workdir/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:638:10
    #40 0x55c773663404 in mlir::MlirOptMain(int, char**, llvm::StringRef, llvm::StringRef, mlir::DialectRegistry&) /workdir/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:679:14
    #41 0x55c773663b52 in mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&) /workdir/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:695:10
    #42 0x55c769597986 in main /workdir/llvm-project/mlir/tools/mlir-opt/mlir-opt.cpp:339:33

SUMMARY: AddressSanitizer: 72 byte(s) leaked in 1 allocation(s).

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions