| Issue |
75811
|
| Summary |
【MLIR】`mlir-opt --convert-parallel-loops-to-gpu` crashes with nested `scf.parallel` and `arith.constant`
|
| Labels |
mlir
|
| Assignees |
|
| Reporter |
lemolatoon
|
## environment
```
$ uname -a
Linux DESKTOP-U0MPLSL 5.15.123.1-microsoft-standard-WSL2 #1 SMP Mon Aug 7 19:01:48 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
$ mlir-opt --version
LLVM (http://llvm.org/):
LLVM version 16.0.6
Optimized build with assertions.
```
## How to reproduce crash
### tmp3.mlir
```
module {
func.func @main() {
%alloc = memref.alloc() : memref<1x1xf64>
%alloc_1 = memref.alloc() : memref<1x1xf64>
%alloc_2 = memref.alloc() : memref<1x1xf64>
%c0_6 = arith.constant 0 : index
%c1 = arith.constant 1 : index
%c1_7 = arith.constant 1 : index
scf.parallel (%arg0) = (%c0_6) to (%c1) step (%c1_7) {
%c0_8 = arith.constant 0 : index
%c1_9 = arith.constant 1 : index
%c1_10 = arith.constant 1 : index
scf.parallel (%arg1) = (%c0_8) to (%c1_9) step (%c1_10) {
%0 = memref.load %alloc_2[%arg0, %arg1] : memref<1x1xf64>
%1 = memref.load %alloc_1[%arg0, %arg1] : memref<1x1xf64>
%2 = arith.addf %0, %1 : f64
memref.store %2, %alloc[%arg0, %arg1] : memref<1x1xf64>
scf.yield
} {mapping = [#gpu.loop_dim_map<processor = thread_x, map = (d0) -> (d0), bound = (d0) -> (d0)>]}
scf.yield
} {mapping = [#gpu.loop_dim_map<processor = block_x, map = (d0) -> (d0), bound = (d0) -> (d0)>]}
memref.dealloc %alloc_2 : memref<1x1xf64>
memref.dealloc %alloc_1 : memref<1x1xf64>
memref.dealloc %alloc : memref<1x1xf64>
return
}
}
```
### reproduce command
```
$ mlir-opt -convert-parallel-loops-to-gpu tmp3.mlir
```
### output
```
tmp3.mlir:12:16: error: 'arith.constant' op operation destroyed but still has uses
%c1_10 = arith.constant 1 : index
^
tmp3.mlir:12:16: note: see current operation: %0 = "arith.constant"() {value = 1 : index} : () -> index
tmp3.mlir:13:7: note: - use: %16 = "affine.apply"(%arg3, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>) {map = affine_map<(d0)[s0, s1] -> (d0 * s0 + s1)>} : (index, index, index) -> index
scf.parallel (%arg1) = (%c0_8) to (%c1_9) step (%c1_10) {
^
LLVM ERROR: operation destroyed but still has uses
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: ../llvm-project/build/bin/mlir-opt -convert-parallel-loops-to-gpu tmp3.mlir
#0 0x0000563a466ed417 backtrace (../llvm-project/build/bin/mlir-opt+0x7f85417)
#1 0x0000563a46931945 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/lemolatoon/workspace/compiler/llvm-project/llvm/lib/Support/Unix/Signals.inc:567:13
#2 0x0000563a4692b421 llvm::sys::RunSignalHandlers() /home/lemolatoon/workspace/compiler/llvm-project/llvm/lib/Support/Signals.cpp:0:5
#3 0x0000563a46933d6d SignalHandler(int) /home/lemolatoon/workspace/compiler/llvm-project/llvm/lib/Support/Unix/Signals.inc:0:3
#4 0x00007f4e0c9cb420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
#5 0x00007f4e0c3ac00b raise /build/glibc-BHL3KM/glibc-2.31/signal/../sysdeps/unix/sysv/linux/raise.c:51:1
#6 0x00007f4e0c38b859 abort /build/glibc-BHL3KM/glibc-2.31/stdlib/abort.c:81:7
#7 0x0000563a467a16cf llvm::report_fatal_error(llvm::Twine const&, bool) /home/lemolatoon/workspace/compiler/llvm-project/llvm/lib/Support/ErrorHandling.cpp:123:5
#8 0x0000563a467a10ab (../llvm-project/build/bin/mlir-opt+0x80390ab)
#9 0x0000563a4bc88bbf mlir::Operation::~Operation() /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/IR/Operation.cpp:147:5
#10 0x0000563a4bc8b25a destroy /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/IR/Operation.cpp:170:3
#11 0x0000563a4bc8b25a llvm::ilist_traits<mlir::Operation>::deleteNode(mlir::Operation*) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/IR/Operation.cpp:370:7
#12 0x0000563a4bab7ddc erase /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/ilist.h:270:5
#13 0x0000563a4bab7ddc pop_back /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/ilist.h:321:25
#14 0x0000563a4bab7ddc clear /home/lemolatoon/workspace/compiler/llvm-project/mlir/include/mlir/IR/Block.h:42:18
#15 0x0000563a4bab7ddc mlir::Block::~Block() /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/IR/Block.cpp:21:3
#16 0x0000563a4bcc3a71 deleteNode /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/ilist.h:42:39
#17 0x0000563a4bcc3a71 erase /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/ilist.h:269:5
#18 0x0000563a4bcc3a71 erase /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/ilist.h:306:15
#19 0x0000563a4bcc3a71 clear /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/ilist.h:310:18
#20 0x0000563a4bcc3a71 ~iplist_impl /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/ilist.h:211:20
#21 0x0000563a4bcc3a71 mlir::Region::~Region() /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/IR/Region.cpp:20:1
#22 0x0000563a4bc888ed mlir::Operation::~Operation() /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/IR/Operation.cpp:159:21
#23 0x0000563a4bca0043 destroy /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/IR/Operation.cpp:170:3
#24 0x0000563a4bca0043 deleteNode /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/IR/Operation.cpp:370:7
#25 0x0000563a4bca0043 llvm::iplist_impl<llvm::simple_ilist<mlir::Operation>, llvm::ilist_traits<mlir::Operation>>::erase(llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>) /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/ilist.h:269:5
#26 0x0000563a4b931a0c mlir::detail::ConversionPatternRewriterImpl::applyRewrites() /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:1110:19
#27 0x0000563a4b951461 (anonymous namespace)::OperationConverter::convertOperations(llvm::ArrayRef<mlir::Operation*>, llvm::function_ref<void (mlir::Diagnostic&)>) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:2474:9
#28 0x0000563a4b951be5 applyPartialConversion /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:3360:22
#29 0x0000563a4b951be5 mlir::applyPartialConversion(mlir::Operation*, mlir::ConversionTarget&, mlir::FrozenRewritePatternSet const&, llvm::DenseSet<mlir::Operation*, llvm::DenseMapInfo<mlir::Operation*, void>>*) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:3366:10
#30 0x0000563a4aad2891 (anonymous namespace)::ParallelLoopToGpuPass::runOnOperation() /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Conversion/SCFToGPU/SCFToGPUPass.cpp:62:16
#31 0x0000563a4b85b5ed getInt /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/PointerIntPair.h:62:57
#32 0x0000563a4b85b5ed mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Pass/Pass.cpp:471:54
#33 0x0000563a4b85ce54 failed /home/lemolatoon/workspace/compiler/llvm-project/mlir/include/mlir/Support/LogicalResult.h:44:33
#34 0x0000563a4b85ce54 failed /home/lemolatoon/workspace/compiler/llvm-project/mlir/include/mlir/Support/LogicalResult.h:72:58
#35 0x0000563a4b85ce54 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Pass/Pass.cpp:534:9
#36 0x0000563a4b864298 runPasses /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Pass/Pass.cpp:839:10
#37 0x0000563a4b864298 mlir::PassManager::run(mlir::Operation*) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Pass/Pass.cpp:819:60
#38 0x0000563a4b84f822 failed /home/lemolatoon/workspace/compiler/llvm-project/mlir/include/mlir/Support/LogicalResult.h:44:33
#39 0x0000563a4b84f822 failed /home/lemolatoon/workspace/compiler/llvm-project/mlir/include/mlir/Support/LogicalResult.h:72:58
#40 0x0000563a4b84f822 performActions(llvm::raw_ostream&, bool, bool, std::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, bool, bool) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:91:7
#41 0x0000563a4b84ed06 processBuffer /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:139:12
#42 0x0000563a4b84ed06 operator() /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:181:12
#43 0x0000563a4b84ed06 mlir::LogicalResult llvm::function_ref<mlir::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>>, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, bool, bool, bool, bool, bool, bool, bool)::$_0>(long, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:45:12
#44 0x0000563a4ba180a6 ~unique_ptr /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/unique_ptr.h:360:6
#45 0x0000563a4ba180a6 operator() /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:5
#46 0x0000563a4ba180a6 mlir::splitAndProcessBuffer(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>, llvm::raw_ostream&, bool, bool) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Support/ToolUtilities.cpp:28:12
#47 0x0000563a4b84985d mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, bool, bool, bool, bool, bool, bool, bool) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:0:10
#48 0x0000563a4b84a661 MlirOptMain /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:209:10
#49 0x0000563a4b84a661 mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&, bool) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:306:14
#50 0x0000563a467741a6 succeeded /home/lemolatoon/workspace/compiler/llvm-project/mlir/include/mlir/Support/LogicalResult.h:41:35
#51 0x0000563a467741a6 asMainReturnCode /home/lemolatoon/workspace/compiler/llvm-project/mlir/include/mlir/Tools/mlir-opt/MlirOptMain.h:97:12
#52 0x0000563a467741a6 main /home/lemolatoon/workspace/compiler/llvm-project/mlir/tools/mlir-opt/mlir-opt.cpp:249:10
#53 0x00007f4e0c38d083 __libc_start_main /build/glibc-BHL3KM/glibc-2.31/csu/../csu/libc-start.c:342:3
#54 0x0000563a466aa06e _start (../llvm-project/build/bin/mlir-opt+0x7f4206e)
fish: Job 1, 'LLVM_SYMBOLIZER_PATH=$(which ll…' terminated by signal SIGABRT (Abort)
```
# expected behavior
Successfully finish running `mlir-opt` and the mlir source will be converted.
I would like to know how to avoid this crash.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs