Assertion failure in DeadCodeAnalysis during FSM range narrowing
- Dominant language
- C++
- Stars
- 2.2k
- Forks
- 524
- Avg merge
- 3d 2h
- Merged PRs (30d)
- 46
Description
**Test commit**
[417a5112947d9889cad54cb5b2110b37978b86b8](https://github.com/llvm/circt/commit/417a5112947d9889cad54cb5b2110b37978b86b8)
**Description**
The `--comb-int-range-narrowing` pass crashes during dead code analysis when processing FSM transitions containing `verif.refines` operations.
**Steps to reproduce**
- Minimal MLIR program (test.mlir)
```
"builtin.module"() ({
"fsm.machine"() <{function_type = () -> (), initialState = "State1", sym_name = "OpsInTransition"}> ({
"fsm.state"() <{sym_name = "State1"}> ({
"fsm.output"() : () -> ()
}, {
%0 = "hw.constant"() <{value = false}> : () -> i1
"verif.refines"() ({
"verif.yield"() : () -> ()
}, {
"verif.yield"() : () -> ()
}) : () -> ()
"fsm.transition"() <{nextState = @State1}> ({
"fsm.return"(%0) : (i1) -> ()
}, {}) : () -> ()
}) : () -> ()
}) : () -> ()
}) : () -> ()
```
**Command**
```
circt-opt --comb-int-range-narrowing test.mlir
```
**Output**
```
circt-opt: /workdir/sources/circt/llvm/mlir/lib/IR/Block.cpp:245: mlir::Operation *mlir::Block::getTerminator(): Assertion `mightHaveTerminator()' failed.
PLEASE submit a bug report to https://github.com/llvm/circt and include the crash backtrace.
Stack dump:
0. Program arguments: /workdir/builds/circt/bin/circt-opt --comb-int-range-narrowing test.mlir
#0 0x000055657754894b backtrace (/workdir/builds/circt/bin/circt-opt+0x6f4e94b)
#1 0x00005565776d8747 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /workdir/sources/circt/llvm/llvm/lib/Support/Unix/Signals.inc:834:13
#2 0x00005565776d6373 llvm::sys::RunSignalHandlers() /workdir/sources/circt/llvm/llvm/lib/Support/Signals.cpp:105:18
#3 0x00005565776d94b5 SignalHandler(int, siginfo_t*, void*) /workdir/sources/circt/llvm/llvm/lib/Support/Unix/Signals.inc:426:38
#4 0x00007f25962a4520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#5 0x00007f25962f89fc pthread_kill (/lib/x86_64-linux-gnu/libc.so.6+0x969fc)
#6 0x00007f25962a4476 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x42476)
#7 0x00007f259628a7f3 abort (/lib/x86_64-linux-gnu/libc.so.6+0x287f3)
#8 0x00007f259628a71b (/lib/x86_64-linux-gnu/libc.so.6+0x2871b)
#9 0x00007f259629be96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
#10 0x000055657d58281f llvm::ilist_iterator, true, false>::operator*() const /workdir/sources/circt/llvm/llvm/include/llvm/ADT/ilist_iterator.h:168:5
#11 0x000055657d58281f llvm::simple_ilist::back() /workdir/sources/circt/llvm/llvm/include/llvm/ADT/simple_ilist.h:139:29
#12 0x000055657d58281f mlir::Block::back() /workdir/sources/circt/llvm/mlir/include/mlir/IR/Block.h:152:41
#13 0x000055657d58281f mlir::Block::getTerminator() /workdir/sources/circt/llvm/mlir/lib/IR/Block.cpp:246:11
#14 0x000055657e38345f isRegionOrCallableReturn(mlir::Operation*) /workdir/sources/circt/llvm/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp:244:42
#15 0x000055657e38345f mlir::dataflow::DeadCodeAnalysis::visit(mlir::ProgramPoint*) /workdir/sources/circt/llvm/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp:367:7
#16 0x000055657e381416 llvm::LogicalResult::failed() const /workdir/sources/circt/llvm/llvm/include/llvm/Support/LogicalResult.h:43:43
#17 0x000055657e381416 llvm::failed(llvm::LogicalResult) /workdir/sources/circt/llvm/llvm/include/llvm/Support/LogicalResult.h:71:58
#18 0x000055657e381416 mlir::dataflow::DeadCodeAnalysis::initializeRecursively(mlir::Operation*) /workdir/sources/circt/llvm/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp:261:9
#19 0x000055657e3819cb llvm::LogicalResult::failed() const /workdir/sources/circt/llvm/llvm/include/llvm/Support/LogicalResult.h:43:43
#20 0x000055657e3819cb llvm::failed(llvm::LogicalResult) /workdir/sources/circt/llvm/llvm/include/llvm/Support/LogicalResult.h:71:58
#21 0x000055657e3819cb mlir::dataflow::DeadCodeAnalysis::initializeRecursively(mlir::Operation*) /workdir/sources/circt/llvm/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp:281:13
#22 0x000055657e3819cb llvm::LogicalResult::failed() const /workdir/sources/circt/llvm/llvm/include/llvm/Support/LogicalResult.h:43:43
#23 0x000055657e3819cb llvm::failed(llvm::LogicalResult) /workdir/sources/circt/llvm/llvm/include/llvm/Support/LogicalResult.h:71:58
#24 0x000055657e3819cb mlir::dataflow::DeadCodeAnalysis::initializeRecursively(mlir::Operation*) /workdir/sources/circt/llvm/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp:281:13
#25 0x000055657e3804b4 mlir::dataflow::DeadCodeAnalysis::initialize(mlir::Operation*) /workdir/sources/circt/llvm/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp:156:3
#26 0x000055657e35052d llvm::LogicalResult::failed() const /workdir/sources/circt/llvm/llvm/include/llvm/Support/LogicalResult.h:43:43
#27 0x000055657e35052d llvm::failed(llvm::LogicalResult) /workdir/sources/circt/llvm/llvm/include/llvm/Support/LogicalResult.h:71:58
#28 0x000055657e35052d mlir::DataFlowSolver::initializeAndRun(mlir::Operation*) /workdir/sources/circt/llvm/mlir/lib/Analysis/DataFlowFramework.cpp:127:9
#29 0x00005565781c9ee5 llvm::failed(llvm::LogicalResult) /workdir/sources/circt/llvm/llvm/include/llvm/Support/LogicalResult.h:71:42
#30 0x00005565781c9ee5 (anonymous namespace)::CombIntRangeNarrowingPass::runOnOperation() /workdir/sources/circt/lib/Dialect/Comb/Transforms/IntRangeOptimizations.cpp:125:7
#31 0x000055657e2c4b3a mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_44::operator()() const /workdir/sources/circt/llvm/mlir/lib/Pass/Pass.cpp:0:17
#32 0x000055657e2c4b3a void llvm::function_ref::callback_fn(long) /workdir/sources/circt/llvm/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:12
#33 0x000055657e2c4b3a llvm::function_ref::operator()() const /workdir/sources/circt/llvm/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
#34 0x000055657e2c4b3a void mlir::MLIRContext::executeAction(llvm::function_ref, llvm::ArrayRef, mlir::Pass&) /workdir/sources/circt/llvm/mlir/include/mlir/IR/MLIRContext.h:290:7
#35 0x000055657e2c4b3a mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) /workdir/sources/circt/llvm/mlir/lib/Pass/Pass.cpp:603:21
#36 0x000055657e2c58f9 llvm::LogicalResult::failed() const /workdir/sources/circt/llvm/llvm/include/llvm/Support/LogicalResult.h:43:43
#37 0x000055657e2c58f9 llvm::failed(llvm::LogicalResult) /workdir/sources/circt/llvm/llvm/include/llvm/Support/LogicalResult.h:71:58
#38 0x000055657e2c58f9 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) /workdir/sources/circt/llvm/mlir/lib/Pass/Pass.cpp:682:9
#39 0x000055657e2cc298 mlir::PassManager::runPasses(mlir::Operation*, mlir::AnalysisManager) /workdir/sources/circt/llvm/mlir/lib/Pass/Pass.cpp:1117:3
#40 0x000055657e2cb9d1 mlir::PassManager::run(mlir::Operation*) /workdir/sources/circt/llvm/mlir/lib/Pass/Pass.cpp:0:0
#41 0x000055657db28280 llvm::LogicalResult::failed() const /workdir/sources/circt/llvm/llvm/include/llvm/Support/LogicalResult.h:43:43
#42 0x000055657db28280 llvm::failed(llvm::LogicalResult) /workdir/sources/circt/llvm/llvm/include/llvm/Support/LogicalResult.h:71:58
#43 0x000055657db28280 performActions(llvm::raw_ostream&, std::shared_ptr const&, mlir::MLIRContext*, mlir::MlirOptMainConfig const&) /workdir/sources/circt/llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:591:7
#44 0x000055657db274ae processBuffer(llvm::raw_ostream&, std::unique_ptr >, llvm::MemoryBufferRef, mlir::MlirOptMainConfig const&, mlir::DialectRegistry&, mlir::SourceMgrDiagnosticVerifierHandler*, llvm::ThreadPoolInterface*) /workdir/sources/circt/llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:673:12
#45 0x000055657db274ae mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr >, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_3::operator()(std::unique_ptr >, llvm::MemoryBufferRef, llvm::raw_ostream&) const /workdir/sources/circt/llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:771:12
#46 0x000055657db274ae llvm::LogicalResult llvm::function_ref >, llvm::MemoryBufferRef const&, llvm::raw_ostream&)>::callback_fn >, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_3>(long, std::unique_ptr >, llvm::MemoryBufferRef const&, llvm::raw_ostream&) /workdir/sources/circt/llvm/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:12
#47 0x000055657db5077b llvm::function_ref >, llvm::MemoryBufferRef const&, llvm::raw_ostream&)>::operator()(std::unique_ptr >, llvm::MemoryBufferRef const&, llvm::raw_ostream&) const /workdir/sources/circt/llvm/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
#48 0x000055657db5077b mlir::splitAndProcessBuffer(std::unique_ptr >, llvm::function_ref >, llvm::MemoryBufferRef const&, llvm::raw_ostream&)>, llvm::raw_ostream&, llvm::StringRef, llvm::StringRef) /workdir/sources/circt/llvm/mlir/lib/Support/ToolUtilities.cpp:30:12
#49 0x000055657db1ed52 mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr >, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&) /workdir/sources/circt/llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:776:26
#50 0x000055657db1f089 mlir::MlirOptMain(int, char**, llvm::StringRef, llvm::StringRef, mlir::DialectRegistry&) /workdir/sources/circt/llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:822:14
#51 0x000055657db1f2cd mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&) /workdir/sources/circt/llvm/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:838:10
#52 0x00005565775ce5f3 llvm::failed(llvm::LogicalResult) /workdir/sources/circt/llvm/llvm/include/llvm/Support/LogicalResult.h:71:42
#53 0x00005565775ce5f3 main /workdir/sources/circt/tools/circt-opt/circt-opt.cpp:86:10
#54 0x00007f259628bd90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#55 0x00007f259628be40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#56 0x000055657750ce15 _start (/workdir/builds/circt/bin/circt-opt+0x6f12e15)
Aborted (core dumped)
```
Contributor guide
No contributing guide indexed for this repository
Research direction
Start with the reproducer in test.mlir and run circt-opt --comb-int-range-narrowing to confirm the crash. Read llvm/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp around isRegionOrCallableReturn and initialization, then inspect lib/Dialect/Comb/Transforms/IntRangeOptimizations.cpp. Done means the pass no longer asserts for the FSM with verif.refines and regression coverage preserves that behavior.
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
- 45/100