llvm / llvm/circt

Assertion failure in DeadCodeAnalysis during FSM range narrowing

Open
#9,372 2 comments 0 reactions 0 assignees View on GitHub
FSM
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.