-
Notifications
You must be signed in to change notification settings - Fork 15k
Open
Labels
Description
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).