llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
28.02k stars 11.57k forks source link

Pass --remove-dead-values crashes when calling functions. #98935

Open AzizZayed opened 2 months ago

AzizZayed commented 2 months ago

I'm trying to remove dead values in the following code (as an example) with the --remove-dead-values pass.

func.func private @printF64(f64)
func.func private @printNewline()
func.func @main() -> f32 {
    %cst = arith.constant 1.500000e+00 : f64
    %cst_0 = arith.constant 1.500000e+00 : f64
    %cst_1 = arith.constant 2.000000e+00 : f64
    %cst_2 = arith.constant 2.000000e+00 : f64
    %cst_3 = arith.constant 3.500000e+00 : f64
    %0 = arith.addf %cst_1, %cst : f64
    call @printF64(%cst_3) : (f64) -> ()
    call @printNewline() : () -> ()
    %cst_4 = arith.constant 2.000000e+00 : f64
    %cst_5 = arith.constant 1.500000e+00 : f64
    %1 = arith.subf %cst_4, %cst_5 : f64
    %2 = arith.subf %cst_1, %cst : f64
    call @printF64(%1) : (f64) -> ()
    call @printNewline() : () -> ()
    %cst_6 = arith.constant 0.000000e+00 : f32
    %cst_7 = arith.constant 0.000000e+00 : f32
    return %cst_6 : f32
}

With this command:

~/dev/lib/llvm/build/bin/mlir-opt --mlir-disable-threading --remove-dead-values arith_add_sub.mlir

And I get the following stack dump after it crashes:

0.      Program arguments: /Users/aziz/dev/lib/llvm/build/bin/mlir-opt --mlir-disable-threading --remove-dead-values res/primitive/arith_add_sub_extracted.mlir
 #0 0x000000010068de6c llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1002f5e6c)
 #1 0x000000010068e490 PrintStackTraceSignalHandler(void*) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1002f6490)
 #2 0x000000010068bf64 llvm::sys::RunSignalHandlers() (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1002f3f64)
 #3 0x000000010068fde8 SignalHandler(int) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1002f7de8)
 #4 0x0000000183df7584 (/usr/lib/system/libsystem_platform.dylib+0x180477584)
 #5 0x0000000183dc6c20 (/usr/lib/system/libsystem_pthread.dylib+0x180446c20)
 #6 0x0000000183cd3a30 (/usr/lib/system/libsystem_c.dylib+0x180353a30)
 #7 0x0000000183cd2d20 (/usr/lib/system/libsystem_c.dylib+0x180352d20)
 #8 0x00000001006e63d8 llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Block, true, false, void, false>, false, false>::operator*() const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x10034e3d8)
 #9 0x00000001006e6344 llvm::simple_ilist<mlir::Block>::front() (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x10034e344)
#10 0x000000010069f634 mlir::Region::front() (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100307634)
#11 0x000000010a7defc8 mlir::function_interface_impl::eraseFunctionArguments(mlir::FunctionOpInterface, llvm::BitVector const&, mlir::Type) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x10a446fc8)
#12 0x0000000105e47b4c mlir::FunctionOpInterface::eraseArguments(llvm::BitVector const&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105aafb4c)
#13 0x00000001061faa10 (anonymous namespace)::cleanFuncOp(mlir::FunctionOpInterface, mlir::Operation*, mlir::dataflow::RunLivenessAnalysis&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e62a10)
#14 0x00000001061fa79c (anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1::operator()(mlir::Operation*) const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e6279c)
#15 0x00000001061fa72c void llvm::function_ref<void (mlir::Operation*)>::callback_fn<(anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1>(long, mlir::Operation*) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e6272c)
#16 0x0000000100809d28 llvm::function_ref<void (mlir::Operation*)>::operator()(mlir::Operation*) const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100471d28)
#17 0x0000000100809cac void mlir::detail::walk<mlir::ForwardIterator>(mlir::Operation*, llvm::function_ref<void (mlir::Operation*)>, mlir::WalkOrder) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100471cac)
#18 0x0000000100809c58 void mlir::detail::walk<mlir::ForwardIterator>(mlir::Operation*, llvm::function_ref<void (mlir::Operation*)>, mlir::WalkOrder) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100471c58)
#19 0x00000001061fa688 std::__1::enable_if<llvm::is_one_of<mlir::Operation*, mlir::Operation*, mlir::Region*, mlir::Block*>::value, void>::type mlir::detail::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, (anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1, mlir::Operation*, void>(mlir::Operation*, (anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1&&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e62688)
#20 0x00000001061fa120 std::__1::enable_if<llvm::function_traits<__decay((anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1)>::num_args == 1, void>::type mlir::Operation::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, (anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1, void>((anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1&&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e62120)
#21 0x00000001061f9f64 (anonymous namespace)::RemoveDeadValues::runOnOperation() (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e61f64)
#22 0x0000000106150884 mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_7::operator()() const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105db8884)
#23 0x0000000106150808 void llvm::function_ref<void ()>::callback_fn<mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_7>(long) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105db8808)
#24 0x000000010062fe9c llvm::function_ref<void ()>::operator()() const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100297e9c)
#25 0x0000000106142fb0 void mlir::MLIRContext::executeAction<mlir::PassExecutionAction, mlir::Pass&>(llvm::function_ref<void ()>, llvm::ArrayRef<mlir::IRUnit>, mlir::Pass&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105daafb0)
#26 0x0000000106142cbc mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105daacbc)
#27 0x0000000106143438 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105dab438)
#28 0x000000010614588c mlir::PassManager::runPasses(mlir::Operation*, mlir::AnalysisManager) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105dad88c)
#29 0x0000000106145640 mlir::PassManager::run(mlir::Operation*) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105dad640)
#30 0x000000010613435c performActions(llvm::raw_ostream&, std::__1::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, mlir::MlirOptMainConfig const&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d9c35c)
#31 0x0000000106133ec8 processBuffer(llvm::raw_ostream&, std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, mlir::MlirOptMainConfig const&, mlir::DialectRegistry&, llvm::ThreadPool*) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d9bec8)
#32 0x0000000106133cac mlir::MlirOptMain(llvm::raw_ostream&, std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_2::operator()(std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d9bcac)
#33 0x0000000106133c34 mlir::LogicalResult llvm::function_ref<mlir::LogicalResult (std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>::callback_fn<mlir::MlirOptMain(llvm::raw_ostream&, std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_2>(long, std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d9bc34)
#34 0x00000001062fc150 llvm::function_ref<mlir::LogicalResult (std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>::operator()(std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105f64150)
#35 0x00000001062fbc40 mlir::splitAndProcessBuffer(std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>, llvm::raw_ostream&, bool, bool) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105f63c40)
#36 0x0000000106125d18 mlir::MlirOptMain(llvm::raw_ostream&, std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d8dd18)
#37 0x0000000106125fdc mlir::MlirOptMain(int, char**, llvm::StringRef, llvm::StringRef, mlir::DialectRegistry&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d8dfdc)
#38 0x0000000106126260 mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d8e260)
#39 0x000000010039a2a8 main (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1000022a8)
#40 0x0000000183a3e0e0 
[1]    39069 abort      ~/dev/lib/llvm/build/bin/mlir-opt --mlir-disable-threading  

I noticed that if I remove the function calls and declarations, it does not crash. Can anyone provide insight on what is going on here? Thank you.

Extra info: LLVM version: 18.1.4 LLVM build: DEBUG build with assertions. System: Apple M1 Pro OS: MacOS 14.5

llvmbot commented 2 months ago

@llvm/issue-subscribers-mlir

Author: Abd-El-Aziz Zayed (AzizZayed)

I'm trying to remove dead values in the following code (as an example) with the `--remove-dead-values` pass. ```mlir func.func private @printF64(f64) func.func private @printNewline() func.func @main() -> f32 { %cst = arith.constant 1.500000e+00 : f64 %cst_0 = arith.constant 1.500000e+00 : f64 %cst_1 = arith.constant 2.000000e+00 : f64 %cst_2 = arith.constant 2.000000e+00 : f64 %cst_3 = arith.constant 3.500000e+00 : f64 %0 = arith.addf %cst_1, %cst : f64 call @printF64(%cst_3) : (f64) -> () call @printNewline() : () -> () %cst_4 = arith.constant 2.000000e+00 : f64 %cst_5 = arith.constant 1.500000e+00 : f64 %1 = arith.subf %cst_4, %cst_5 : f64 %2 = arith.subf %cst_1, %cst : f64 call @printF64(%1) : (f64) -> () call @printNewline() : () -> () %cst_6 = arith.constant 0.000000e+00 : f32 %cst_7 = arith.constant 0.000000e+00 : f32 return %cst_6 : f32 } ``` With this command: ```bash ~/dev/lib/llvm/build/bin/mlir-opt --mlir-disable-threading --remove-dead-values arith_add_sub.mlir ``` And I get the following stack dump after it crashes: ```bash 0. Program arguments: /Users/aziz/dev/lib/llvm/build/bin/mlir-opt --mlir-disable-threading --remove-dead-values res/primitive/arith_add_sub_extracted.mlir #0 0x000000010068de6c llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1002f5e6c) #1 0x000000010068e490 PrintStackTraceSignalHandler(void*) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1002f6490) #2 0x000000010068bf64 llvm::sys::RunSignalHandlers() (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1002f3f64) #3 0x000000010068fde8 SignalHandler(int) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1002f7de8) #4 0x0000000183df7584 (/usr/lib/system/libsystem_platform.dylib+0x180477584) #5 0x0000000183dc6c20 (/usr/lib/system/libsystem_pthread.dylib+0x180446c20) #6 0x0000000183cd3a30 (/usr/lib/system/libsystem_c.dylib+0x180353a30) #7 0x0000000183cd2d20 (/usr/lib/system/libsystem_c.dylib+0x180352d20) #8 0x00000001006e63d8 llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Block, true, false, void, false>, false, false>::operator*() const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x10034e3d8) #9 0x00000001006e6344 llvm::simple_ilist<mlir::Block>::front() (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x10034e344) #10 0x000000010069f634 mlir::Region::front() (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100307634) #11 0x000000010a7defc8 mlir::function_interface_impl::eraseFunctionArguments(mlir::FunctionOpInterface, llvm::BitVector const&, mlir::Type) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x10a446fc8) #12 0x0000000105e47b4c mlir::FunctionOpInterface::eraseArguments(llvm::BitVector const&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105aafb4c) #13 0x00000001061faa10 (anonymous namespace)::cleanFuncOp(mlir::FunctionOpInterface, mlir::Operation*, mlir::dataflow::RunLivenessAnalysis&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e62a10) #14 0x00000001061fa79c (anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1::operator()(mlir::Operation*) const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e6279c) #15 0x00000001061fa72c void llvm::function_ref<void (mlir::Operation*)>::callback_fn<(anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1>(long, mlir::Operation*) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e6272c) #16 0x0000000100809d28 llvm::function_ref<void (mlir::Operation*)>::operator()(mlir::Operation*) const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100471d28) #17 0x0000000100809cac void mlir::detail::walk<mlir::ForwardIterator>(mlir::Operation*, llvm::function_ref<void (mlir::Operation*)>, mlir::WalkOrder) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100471cac) #18 0x0000000100809c58 void mlir::detail::walk<mlir::ForwardIterator>(mlir::Operation*, llvm::function_ref<void (mlir::Operation*)>, mlir::WalkOrder) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100471c58) #19 0x00000001061fa688 std::__1::enable_if<llvm::is_one_of<mlir::Operation*, mlir::Operation*, mlir::Region*, mlir::Block*>::value, void>::type mlir::detail::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, (anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1, mlir::Operation*, void>(mlir::Operation*, (anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1&&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e62688) #20 0x00000001061fa120 std::__1::enable_if<llvm::function_traits<__decay((anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1)>::num_args == 1, void>::type mlir::Operation::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, (anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1, void>((anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1&&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e62120) #21 0x00000001061f9f64 (anonymous namespace)::RemoveDeadValues::runOnOperation() (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e61f64) #22 0x0000000106150884 mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_7::operator()() const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105db8884) #23 0x0000000106150808 void llvm::function_ref<void ()>::callback_fn<mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_7>(long) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105db8808) #24 0x000000010062fe9c llvm::function_ref<void ()>::operator()() const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100297e9c) #25 0x0000000106142fb0 void mlir::MLIRContext::executeAction<mlir::PassExecutionAction, mlir::Pass&>(llvm::function_ref<void ()>, llvm::ArrayRef<mlir::IRUnit>, mlir::Pass&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105daafb0) #26 0x0000000106142cbc mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105daacbc) #27 0x0000000106143438 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105dab438) #28 0x000000010614588c mlir::PassManager::runPasses(mlir::Operation*, mlir::AnalysisManager) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105dad88c) #29 0x0000000106145640 mlir::PassManager::run(mlir::Operation*) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105dad640) #30 0x000000010613435c performActions(llvm::raw_ostream&, std::__1::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, mlir::MlirOptMainConfig const&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d9c35c) #31 0x0000000106133ec8 processBuffer(llvm::raw_ostream&, std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, mlir::MlirOptMainConfig const&, mlir::DialectRegistry&, llvm::ThreadPool*) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d9bec8) #32 0x0000000106133cac mlir::MlirOptMain(llvm::raw_ostream&, std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_2::operator()(std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d9bcac) #33 0x0000000106133c34 mlir::LogicalResult llvm::function_ref<mlir::LogicalResult (std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>::callback_fn<mlir::MlirOptMain(llvm::raw_ostream&, std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_2>(long, std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d9bc34) #34 0x00000001062fc150 llvm::function_ref<mlir::LogicalResult (std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>::operator()(std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105f64150) #35 0x00000001062fbc40 mlir::splitAndProcessBuffer(std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>, llvm::raw_ostream&, bool, bool) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105f63c40) #36 0x0000000106125d18 mlir::MlirOptMain(llvm::raw_ostream&, std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d8dd18) #37 0x0000000106125fdc mlir::MlirOptMain(int, char**, llvm::StringRef, llvm::StringRef, mlir::DialectRegistry&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d8dfdc) #38 0x0000000106126260 mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d8e260) #39 0x000000010039a2a8 main (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1000022a8) #40 0x0000000183a3e0e0 [1] 39069 abort ~/dev/lib/llvm/build/bin/mlir-opt --mlir-disable-threading ``` I noticed that if I remove the function calls, it does not crash. Can anyone provide insight on what is going on here? Thank you. Extra info: LLVM version: 18.1.4 LLVM build: DEBUG build with assertions. System: Apple M1 Pro OS: MacOS 14.5
AzizZayed commented 2 months ago

Clarification:

When I remove the function declarations at the top (and their uses)

func.func private @printF64(f64)
func.func private @printNewline()

It does not crash, so perhaps the pass has an issue with private functions.

AzizZayed commented 2 months ago

Update:

The following command also fails: ~/dev/lib/llvm/build/bin/mlir-opt --remove-dead-values ./res/linalg/linalg_transpose.mlir

On this MLIR code:

func.func @transpose() -> tensor<2x3xf64> {
    %cst_2 = arith.constant dense<[[1., 2., 3.], [4., 5., 6.]]> : tensor<2x3xf64>
    %cst_3 = arith.constant dense<0.> : tensor<3x2xf64>
    %transposed = linalg.transpose ins(%cst_2 : tensor<2x3xf64>) outs(%cst_3 : tensor<3x2xf64>) permutation = [1, 0]

    %cst_4 = arith.constant dense<[[1., 2., 3.], [4., 5., 6.]]> : tensor<2x3xf64>
    %cst_5 = arith.constant dense<0.> : tensor<3x2xf64>
    %transposed_6 = linalg.transpose ins(%cst_4 : tensor<2x3xf64>) outs(%cst_5 : tensor<3x2xf64>) permutation = [1, 0]

    %cst_7 = arith.constant dense<[[1., 2., 3.], [4., 5., 6.]]> : tensor<2x3xf64>
    %transposed_8 = linalg.transpose ins(%transposed_6 : tensor<3x2xf64>) outs(%cst_7 : tensor<2x3xf64>) permutation = [1, 0]

    return %transposed_8 : tensor<2x3xf64>
}

Stack dump:

0.      Program arguments: /Users/aziz/dev/lib/llvm/build/bin/mlir-opt --remove-dead-values ../res/linalg/linalg_transpose_extracted.mlir
 #0 0x0000000101201e6c llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1002f5e6c)
 #1 0x0000000101202490 PrintStackTraceSignalHandler(void*) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1002f6490)
 #2 0x00000001011fff64 llvm::sys::RunSignalHandlers() (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1002f3f64)
 #3 0x0000000101203de8 SignalHandler(int) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1002f7de8)
 #4 0x0000000183df7584 (/usr/lib/system/libsystem_platform.dylib+0x180477584)
 #5 0x0000000100f0e6d4 llvm::detail::PunnedPointer<mlir::Type>::operator long() const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1000026d4)
 #6 0x0000000100f0e674 llvm::PointerIntPair<mlir::Type, 3u, mlir::detail::ValueImpl::Kind, llvm::PointerLikeTypeTraits<mlir::Type>, llvm::PointerIntPairInfo<mlir::Type, 3u, llvm::PointerLikeTypeTraits<mlir::Type>>>::getPointer() const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100002674)
 #7 0x0000000100f0dd90 mlir::detail::ValueImpl::getType() const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100001d90)
 #8 0x0000000101209f08 mlir::Value::getType() const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1002fdf08)
 #9 0x00000001025374dc getGenericEffectsImpl(llvm::SmallVectorImpl<mlir::SideEffects::EffectInstance<mlir::MemoryEffects::Effect>>&, mlir::ValueRange, mlir::ValueRange, mlir::ValueRange) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x10162b4dc)
#10 0x000000010253d3c4 mlir::linalg::TransposeOp::getEffects(llvm::SmallVectorImpl<mlir::SideEffects::EffectInstance<mlir::MemoryEffects::Effect>>&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1016313c4)
#11 0x0000000102934cb8 mlir::detail::MemoryEffectOpInterfaceInterfaceTraits::Model<mlir::linalg::TransposeOp>::getEffects(mlir::detail::MemoryEffectOpInterfaceInterfaceTraits::Concept const*, mlir::Operation*, llvm::SmallVectorImpl<mlir::SideEffects::EffectInstance<mlir::MemoryEffects::Effect>>&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x101a28cb8)
#12 0x000000010b293180 mlir::MemoryEffectOpInterface::getEffects(llvm::SmallVectorImpl<mlir::SideEffects::EffectInstance<mlir::MemoryEffects::Effect>>&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x10a387180)
#13 0x00000001012bcf00 mlir::MemoryEffectOpInterface::hasNoEffect() (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1003b0f00)
#14 0x000000010b2944d4 mlir::isMemoryEffectFree(mlir::Operation*) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x10a3884d4)
#15 0x0000000106d6f490 (anonymous namespace)::cleanSimpleOp(mlir::Operation*, mlir::dataflow::RunLivenessAnalysis&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e63490)
#16 0x0000000106d6e830 (anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1::operator()(mlir::Operation*) const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e62830)
#17 0x0000000106d6e72c void llvm::function_ref<void (mlir::Operation*)>::callback_fn<(anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1>(long, mlir::Operation*) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e6272c)
#18 0x000000010137dd28 llvm::function_ref<void (mlir::Operation*)>::operator()(mlir::Operation*) const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100471d28)
#19 0x000000010137dcac void mlir::detail::walk<mlir::ForwardIterator>(mlir::Operation*, llvm::function_ref<void (mlir::Operation*)>, mlir::WalkOrder) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100471cac)
#20 0x000000010137dc58 void mlir::detail::walk<mlir::ForwardIterator>(mlir::Operation*, llvm::function_ref<void (mlir::Operation*)>, mlir::WalkOrder) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100471c58)
#21 0x000000010137dc58 void mlir::detail::walk<mlir::ForwardIterator>(mlir::Operation*, llvm::function_ref<void (mlir::Operation*)>, mlir::WalkOrder) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100471c58)
#22 0x0000000106d6e688 std::__1::enable_if<llvm::is_one_of<mlir::Operation*, mlir::Operation*, mlir::Region*, mlir::Block*>::value, void>::type mlir::detail::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, (anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1, mlir::Operation*, void>(mlir::Operation*, (anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1&&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e62688)
#23 0x0000000106d6e120 std::__1::enable_if<llvm::function_traits<__decay((anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1)>::num_args == 1, void>::type mlir::Operation::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, (anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1, void>((anonymous namespace)::RemoveDeadValues::runOnOperation()::$_1&&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e62120)
#24 0x0000000106d6df64 (anonymous namespace)::RemoveDeadValues::runOnOperation() (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105e61f64)
#25 0x0000000106cc4884 mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_7::operator()() const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105db8884)
#26 0x0000000106cc4808 void llvm::function_ref<void ()>::callback_fn<mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_7>(long) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105db8808)
#27 0x00000001011a3e9c llvm::function_ref<void ()>::operator()() const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x100297e9c)
#28 0x0000000106cb6fb0 void mlir::MLIRContext::executeAction<mlir::PassExecutionAction, mlir::Pass&>(llvm::function_ref<void ()>, llvm::ArrayRef<mlir::IRUnit>, mlir::Pass&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105daafb0)
#29 0x0000000106cb6cbc mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105daacbc)
#30 0x0000000106cb7438 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105dab438)
#31 0x0000000106cb988c mlir::PassManager::runPasses(mlir::Operation*, mlir::AnalysisManager) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105dad88c)
#32 0x0000000106cb9640 mlir::PassManager::run(mlir::Operation*) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105dad640)
#33 0x0000000106ca835c performActions(llvm::raw_ostream&, std::__1::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, mlir::MlirOptMainConfig const&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d9c35c)
#34 0x0000000106ca7ec8 processBuffer(llvm::raw_ostream&, std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, mlir::MlirOptMainConfig const&, mlir::DialectRegistry&, llvm::ThreadPool*) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d9bec8)
#35 0x0000000106ca7cac mlir::MlirOptMain(llvm::raw_ostream&, std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_2::operator()(std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d9bcac)
#36 0x0000000106ca7c34 mlir::LogicalResult llvm::function_ref<mlir::LogicalResult (std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>::callback_fn<mlir::MlirOptMain(llvm::raw_ostream&, std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_2>(long, std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d9bc34)
#37 0x0000000106e70150 llvm::function_ref<mlir::LogicalResult (std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>::operator()(std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) const (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105f64150)
#38 0x0000000106e6fc40 mlir::splitAndProcessBuffer(std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>, llvm::raw_ostream&, bool, bool) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105f63c40)
#39 0x0000000106c99d18 mlir::MlirOptMain(llvm::raw_ostream&, std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d8dd18)
#40 0x0000000106c99fdc mlir::MlirOptMain(int, char**, llvm::StringRef, llvm::StringRef, mlir::DialectRegistry&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d8dfdc)
#41 0x0000000106c9a260 mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&) (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x105d8e260)
#42 0x0000000100f0e2a8 main (/Users/aziz/dev/lib/llvm/build/bin/mlir-opt+0x1000022a8)
#43 0x0000000183a3e0e0 
[1]    85234 segmentation fault  ~/dev/lib/llvm/build/bin/mlir-opt --remove-dead-values