llvm / llvm/llvm-project

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

Open
#159,485 3 comments 0 reactions 1 assignee Claimed by @efric View on GitHub
code-quality mlir mlir:spirv
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

Test commit: [5a86dc996c26299de63effc927075dcbfb924167](https://github.com/llvm/llvm-project/pull/157520/commits/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)
```mlir
"builtin.module"() ({
"spirv.module"() <{
addressing_model = #spirv.addressing_model,
memory_model = #spirv.memory_model
}> ({
"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) /workdir/llvm-project/mlir/lib/IR/BuiltinDialect.cpp:125:22
#3 0x55c77336f3f5 in mlir::ModuleOp mlir::OpBuilder::create >(mlir::Location, std::optional&&) /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::matchAndRewrite(mlir::spirv::ModuleOp, mlir::spirv::ModuleOpGenericAdaptor >, mlir::ConversionPatternRewriter&) const /workdir/llvm-project/mlir/include/mlir/Transforms/DialectConversion.h:625:12
#6 0x55c77336ea47 in mlir::OpConversionPattern::matchAndRewrite(mlir::Operation*, llvm::ArrayRef, 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, llvm::function_ref, llvm::function_ref)::$_2::operator()() const /workdir/llvm-project/mlir/lib/Rewrite/PatternApplicator.cpp:212:31
#9 0x55c77b3f3a60 in void llvm::function_ref::callback_fn, llvm::function_ref, llvm::function_ref)::$_2>(long) /workdir/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:12
#10 0x55c77b3e91cd in llvm::function_ref::operator()() const /workdir/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
#11 0x55c77b3e91cd in void mlir::MLIRContext::executeAction(llvm::function_ref, llvm::ArrayRef, 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, llvm::function_ref, llvm::function_ref) /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) /workdir/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:2750:16
#17 0x55c7737ddf0d in applyConversion(llvm::ArrayRef, 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::callback_fn, 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::operator()() const /workdir/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
#20 0x55c7737c8a9a in void mlir::MLIRContext::executeAction(llvm::function_ref, llvm::ArrayRef) /workdir/llvm-project/mlir/include/mlir/IR/MLIRContext.h:280:7
#21 0x55c7737c8a9a in applyConversion(llvm::ArrayRef, 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::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::callback_fn(long) /workdir/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:12
#27 0x55c773682e1e in llvm::function_ref::operator()() const /workdir/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
#28 0x55c773682e1e in void mlir::MLIRContext::executeAction(llvm::function_ref, llvm::ArrayRef, 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 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 >, 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 >, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_3::operator()(std::unique_ptr >, 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::raw_ostream&)>::callback_fn >, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_3>(long, std::unique_ptr >, llvm::raw_ostream&) /workdir/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:12
#37 0x55c7738aceab in llvm::function_ref >, llvm::raw_ostream&)>::operator()(std::unique_ptr >, llvm::raw_ostream&) const /workdir/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
#38 0x55c7738ac4c2 in mlir::splitAndProcessBuffer(std::unique_ptr >, llvm::function_ref >, 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 >, 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).
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.