llvm / llvm/llvm-project

[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.

Open
#216,455 1 comment 0 reactions 0 assignees View on GitHub
crash mlir
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.