[MLIR][Affine] mlir-opt crashes with `--affine-loop-coalescing` in UseDefLists.h:198: Assertion `use_empty() && "Cannot destroy a value that still has uses!"' failed.
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
### Reproducer
small.mlir
```mlir
func.func @f(%seed: i64) {
affine.for %i = 0 to 4 {
affine.for %j = 0 to 4 {
%r = affine.for %k = 0 to 4 iter_args(%acc = %seed) -> (i64) {
%t = arith.addi %acc, %acc : i64
affine.yield %t : i64
}
}
}
return
}
```
To reproduce:
```bash
mlir-opt small.mlir --affine-loop-coalescing -o /dev/null
```
Crash:
```
mlir-opt: /data/x27zhou/compiler-nightly/src/llvm-project/mlir/include/mlir/IR/UseDefLists.h:198: mlir::IRObjectWithUseList::~IRObjectWithUseList() [with OperandType = mlir::OpOperand]: Assertion `use_empty() && "Cannot destroy a value that still has uses!"' failed.
```
Stack dump:
```
0. Program arguments: mlir-opt reproduce.mlir --affine-loop-coalescing -o /dev/null
#0 0x0000aaaadacd6988 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /data/x27zhou/compiler-nightly/src/llvm-project/llvm/lib/Support/Unix/Signals.inc:935:3
#1 0x0000aaaadacd38fc llvm::sys::RunSignalHandlers() /data/x27zhou/compiler-nightly/src/llvm-project/llvm/lib/Support/Signals.cpp:109:18
#2 0x0000aaaadacd3fc8 SignalHandler(int, siginfo_t*, void*) /data/x27zhou/compiler-nightly/src/llvm-project/llvm/lib/Support/Unix/Signals.inc:474:14
#3 0x0000ffffa6ea07dc (linux-vdso.so.1+0x7dc)
#4 0x0000ffffa6a02008 (/lib/aarch64-linux-gnu/libc.so.6+0x82008)
#5 0x0000ffffa69ba83c gsignal (/lib/aarch64-linux-gnu/libc.so.6+0x3a83c)
#6 0x0000ffffa69a7134 abort (/lib/aarch64-linux-gnu/libc.so.6+0x27134)
#7 0x0000ffffa69b4114 (/lib/aarch64-linux-gnu/libc.so.6+0x34114)
#8 0x0000ffffa69b418c (/lib/aarch64-linux-gnu/libc.so.6+0x3418c)
#9 0x0000aaaae29aca64 mlir::Block::~Block() /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/IR/Block.cpp:21:3
#10 0x0000aaaae2a7b744 llvm::ilist_alloc_traits::deleteNode(mlir::Block*) /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist.h:42:39
#11 0x0000aaaae2a7b744 llvm::ilist_alloc_traits::deleteNode(mlir::Block*) /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist.h:42:15
#12 0x0000aaaae2a7b744 llvm::iplist_impl, llvm::ilist_traits >::erase(llvm::ilist_iterator, false, false>) /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist.h:205:21
#13 0x0000aaaae2a7b744 llvm::iplist_impl, llvm::ilist_traits >::erase(llvm::ilist_iterator, false, false>, llvm::ilist_iterator, false, false>) /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist.h:242:20
#14 0x0000aaaae2a7b744 llvm::iplist_impl, llvm::ilist_traits >::clear() /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist.h:246:23
#15 0x0000aaaae2a7b744 llvm::iplist_impl, llvm::ilist_traits >::~iplist_impl() /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist.h:147:25
#16 0x0000aaaae2a7b744 llvm::iplist::~iplist() /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist.h:327:7
#17 0x0000aaaae2a7b744 mlir::Region::~Region() /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/IR/Region.cpp:20:1
#18 0x0000aaaae2a6a85c mlir::Operation::~Operation() /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/IR/Operation.cpp:197:34
#19 0x0000aaaae2a6aa94 mlir::Operation::destroy() /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/IR/Operation.cpp:208:69
#20 0x0000aaaae29ac93c llvm::PointerIntPairInfo*, 1u, llvm::PointerLikeTypeTraits*> >::getPointer(long) /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/PointerIntPair.h:191:40
#21 0x0000aaaae29ac93c llvm::PointerIntPair*, 1u, unsigned int, llvm::PointerLikeTypeTraits*>, llvm::PointerIntPairInfo*, 1u, llvm::PointerLikeTypeTraits*> > >::getPointer() const /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/PointerIntPair.h:94:57
#22 0x0000aaaae29ac93c llvm::ilist_detail::node_base_prevnext, true>::getPrev() const /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist_node_base.h:41:64
#23 0x0000aaaae29ac93c llvm::ilist_node_impl >::getPrev() const /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist_node.h:112:66
#24 0x0000aaaae29ac93c llvm::ilist_sentinel >::empty() const /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist_node.h:308:52
#25 0x0000aaaae29ac93c llvm::simple_ilist::empty() const /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/simple_ilist.h:132:59
#26 0x0000aaaae29ac93c mlir::Block::empty() /data/x27zhou/compiler-nightly/src/llvm-project/mlir/include/mlir/IR/Block.h:172:41
#27 0x0000aaaae29ac93c mlir::Block::clear() /data/x27zhou/compiler-nightly/src/llvm-project/mlir/include/mlir/IR/Block.h:44:18
#28 0x0000aaaae29ac93c mlir::Block::~Block() /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/IR/Block.cpp:22:8
#29 0x0000aaaae2a7b744 llvm::ilist_alloc_traits::deleteNode(mlir::Block*) /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist.h:42:39
#30 0x0000aaaae2a7b744 llvm::ilist_alloc_traits::deleteNode(mlir::Block*) /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist.h:42:15
#31 0x0000aaaae2a7b744 llvm::iplist_impl, llvm::ilist_traits >::erase(llvm::ilist_iterator, false, false>) /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist.h:205:21
#32 0x0000aaaae2a7b744 llvm::iplist_impl, llvm::ilist_traits >::erase(llvm::ilist_iterator, false, false>, llvm::ilist_iterator, false, false>) /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist.h:242:20
#33 0x0000aaaae2a7b744 llvm::iplist_impl, llvm::ilist_traits >::clear() /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist.h:246:23
#34 0x0000aaaae2a7b744 llvm::iplist_impl, llvm::ilist_traits >::~iplist_impl() /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist.h:147:25
#35 0x0000aaaae2a7b744 llvm::iplist::~iplist() /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist.h:327:7
#36 0x0000aaaae2a7b744 mlir::Region::~Region() /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/IR/Region.cpp:20:1
#37 0x0000aaaae2a6a85c mlir::Operation::~Operation() /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/IR/Operation.cpp:197:34
#38 0x0000aaaae2a6aa94 mlir::Operation::destroy() /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/IR/Operation.cpp:208:69
#39 0x0000aaaae0dd4980 llvm::SmallVectorImpl::~SmallVectorImpl() /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/SmallVector.h:622:5
#40 0x0000aaaae0dd4980 llvm::SmallVector::~SmallVector() /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/SmallVector.h:1243:3
#41 0x0000aaaae0dd4980 mlir::affine::coalesceLoops(llvm::MutableArrayRef) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Dialect/Affine/Utils/LoopUtils.cpp:1728:1
#42 0x0000aaaae0dd7980 mlir::affine::coalescePerfectlyNestedAffineLoops(mlir::affine::AffineForOp) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Dialect/Affine/Utils/LoopUtils.cpp:2816:7
#43 0x0000aaaadad9caf8 void mlir::detail::walk(mlir::Operation*, llvm::function_ref, mlir::WalkOrder) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/include/mlir/IR/Visitors.h:143:45
#44 0x0000aaaadad9cb58 llvm::ilist_iterator, false, false>::operator++() /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist_iterator.h:187:13
#45 0x0000aaaadad9cb58 llvm::ilist_iterator, false, false>::operator++(int) /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/ilist_iterator.h:197:5
#46 0x0000aaaadad9cb58 llvm::early_inc_iterator_impl, false, false> >::operator*() /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/STLExtras.h:598:22
#47 0x0000aaaadad9cb58 void mlir::detail::walk(mlir::Operation*, llvm::function_ref, mlir::WalkOrder) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/include/mlir/IR/Visitors.h:146:7
#48 0x0000aaaae0d8624c (anonymous namespace)::LoopCoalescingPass::runOnOperation() /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Dialect/Affine/Transforms/LoopCoalescing.cpp:42:3
#49 0x0000aaaae27696a0 operator() /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Pass/Pass.cpp:612:33
#50 0x0000aaaae27696a0 callback_fn > /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:52
#51 0x0000aaaae27696a0 llvm::function_ref::operator()() const /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
#52 0x0000aaaae27696a0 void mlir::MLIRContext::executeAction(llvm::function_ref, llvm::ArrayRef, mlir::Pass&) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/include/mlir/IR/MLIRContext.h:296:15
#53 0x0000aaaae27696a0 mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Pass/Pass.cpp:606:57
#54 0x0000aaaae276995c mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Pass/Pass.cpp:688:5
#55 0x0000aaaae276a1e4 mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::'lambda12'(mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo&)::operator()(mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::OpPMInfo&) const /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Pass/Pass.cpp:1004:5
#56 0x0000aaaae27686e0 operator++ /usr/include/c++/11/bits/stl_iterator.h:1054:2
#57 0x0000aaaae27686e0 failableParallelForEach<__gnu_cxx::__normal_iterator >, mlir::parallelForEach<__gnu_cxx::__normal_iterator >, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool):: >(mlir::MLIRContext*, __gnu_cxx::__normal_iterator >, __gnu_cxx::__normal_iterator >, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool)::&&):: > /data/x27zhou/compiler-nightly/src/llvm-project/mlir/include/mlir/IR/Threading.h:45:26
#58 0x0000aaaae27686e0 parallelForEach<__gnu_cxx::__normal_iterator >, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool):: > /data/x27zhou/compiler-nightly/src/llvm-project/mlir/include/mlir/IR/Threading.h:119:32
#59 0x0000aaaae27686e0 parallelForEach&, mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool):: > /data/x27zhou/compiler-nightly/src/llvm-project/mlir/include/mlir/IR/Threading.h:131:18
#60 0x0000aaaae27686e0 mlir::detail::OpToOpPassAdaptor::runOnOperationAsyncImpl(bool) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Pass/Pass.cpp:991:18
#61 0x0000aaaae2769574 operator() /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Pass/Pass.cpp:613:24
#62 0x0000aaaae2769574 callback_fn > /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:52
#63 0x0000aaaae2769574 llvm::function_ref::operator()() const /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
#64 0x0000aaaae2769574 void mlir::MLIRContext::executeAction(llvm::function_ref, llvm::ArrayRef, mlir::Pass&) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/include/mlir/IR/MLIRContext.h:296:15
#65 0x0000aaaae2769574 mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Pass/Pass.cpp:606:57
#66 0x0000aaaae276995c mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Pass/Pass.cpp:688:5
#67 0x0000aaaae276c734 mlir::PassManager::run(mlir::Operation*) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Pass/Pass.cpp:1102:69
#68 0x0000aaaadad7ebdc performActions(llvm::raw_ostream&, std::shared_ptr const&, mlir::MLIRContext*, mlir::MlirOptMainConfig const&) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:596:3
#69 0x0000aaaadad7f500 processBuffer /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:686:26
#70 0x0000aaaadad7f500 operator() /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:784:25
#71 0x0000aaaadad7f500 llvm::LogicalResult llvm::function_ref >, llvm::MemoryBufferRef const&, llvm::raw_ostream&)>::callback_fn >, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::'lambda'(std::unique_ptr >, llvm::MemoryBufferRef, llvm::raw_ostream&)>(long, std::unique_ptr >, llvm::MemoryBufferRef const&, llvm::raw_ostream&) /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:52
#72 0x0000aaaae2ab1678 llvm::function_ref >, llvm::MemoryBufferRef const&, llvm::raw_ostream&)>::operator()(std::unique_ptr >, llvm::MemoryBufferRef const&, llvm::raw_ostream&) const /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
#73 0x0000aaaae2ab1678 mlir::splitAndProcessBuffer(std::unique_ptr >, llvm::function_ref >, llvm::MemoryBufferRef const&, llvm::raw_ostream&)>, llvm::raw_ostream&, llvm::StringRef, llvm::StringRef) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Support/ToolUtilities.cpp:30:30
#74 0x0000aaaadad78a28 mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr >, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&) (.part.0) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:789:47
#75 0x0000aaaadad7fb10 mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr >, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&) /data/x27zhou/compiler-nightly/src/llvm-project/llvm/include/llvm/Support/LogicalResult.h:62:42
#76 0x0000aaaadad7fb10 mlir::MlirOptMain(int, char**, llvm::StringRef, llvm::StringRef, mlir::DialectRegistry&) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:835:13
#77 0x0000aaaadad7fcc0 mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:851:21
#78 0x0000aaaadac535ac mlir::asMainReturnCode(llvm::LogicalResult) /data/x27zhou/compiler-nightly/src/llvm-project/mlir/include/mlir/Tools/mlir-opt/MlirOptMain.h:436:24
#79 0x0000aaaadac535ac main /data/x27zhou/compiler-nightly/src/llvm-project/mlir/tools/mlir-opt/mlir-opt.cpp:345:32
#80 0x0000ffffa69a7400 (/lib/aarch64-linux-gnu/libc.so.6+0x27400)
#81 0x0000ffffa69a74d8 __libc_start_main (/lib/aarch64-linux-gnu/libc.so.6+0x274d8)
#82 0x0000aaaadacbaff0 _start (/data/x27zhou/compiler-nightly/build/mlir/bin/mlir-opt+0x210aff0)
zsh: abort (core dumped) mlir-opt reproduce.mlir --affine-loop-coalescing -o /dev/null
```
Contributor guide
Research direction
Start by running the supplied small.mlir reproducer with --affine-loop-coalescing. Inspect coalesceLoops in mlir/lib/Dialect/Affine/Utils/LoopUtils.cpp:1728 and the pass entry in mlir/lib/Dialect/Affine/Transforms/LoopCoalescing.cpp:42 to trace the invalid use during loop coalescing. Done means the reproducer no longer triggers the UseDefLists.h assertion.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100