Skip to content

Assertion failure in DeadCodeAnalysis during FSM range narrowing #9372

@sairam2661

Description

@sairam2661

Test 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<llvm::ilist_detail::node_options<mlir::Operation, true, false, void, false, void>, true, false>::operator*() const /workdir/sources/circt/llvm/llvm/include/llvm/ADT/ilist_iterator.h:168:5
#11 0x000055657d58281f llvm::simple_ilist<mlir::Operation>::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<void ()>::callback_fn<mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_44>(long) /workdir/sources/circt/llvm/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:12
#33 0x000055657e2c4b3a llvm::function_ref<void ()>::operator()() const /workdir/sources/circt/llvm/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
#34 0x000055657e2c4b3a void mlir::MLIRContext::executeAction<mlir::PassExecutionAction, mlir::Pass&>(llvm::function_ref<void ()>, llvm::ArrayRef<mlir::IRUnit>, 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<llvm::SourceMgr> 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::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, 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<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_3::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, 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::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::MemoryBufferRef const&, llvm::raw_ostream&)>::callback_fn<mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_3>(long, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::MemoryBufferRef const&, llvm::raw_ostream&) /workdir/sources/circt/llvm/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:12
#47 0x000055657db5077b llvm::function_ref<llvm::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::MemoryBufferRef const&, llvm::raw_ostream&)>::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, 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::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, llvm::function_ref<llvm::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, 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<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> >, 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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    FSMthe FSM dialect

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions