firrtl.circuit "Foo" {
firrtl.module private @Bar(in %a: !firrtl.uint<1> sym @sym_302, in %b: !firrtl.uint<1> sym @sym_305, in %c: !firrtl.uint<1> sym @sym_306, in %d: !firrtl.uint<16> sym @sym_307, in %e: !firrtl.uint<128> sym @sym_308, in %f: !firrtl.uint<1> sym @sym_309, in %g: !firrtl.uint<1> sym @sym_310, in %h: !firrtl.uint<1> sym @sym_311, in %i: !firrtl.uint<1> sym @sym_312, in %j: !firrtl.uint<3> sym @sym_313, in %k: !firrtl.uint<6> sym @sym_314, in %l: !firrtl.uint<5> sym @sym_344, in %m: !firrtl.uint<33> sym @sym_61, in %n: !firrtl.uint<33> sym @sym_62, in %o: !firrtl.uint<33> sym @sym_63, in %p: !firrtl.uint<33> sym @sym_64, in %q: !firrtl.uint<33> sym @sym_65, in %r: !firrtl.uint<33> sym @sym_66, in %s: !firrtl.uint<33> sym @sym_67, in %t: !firrtl.uint<33> sym @sym_68, in %u: !firrtl.uint<33> sym @sym_70, in %v: !firrtl.uint<33> sym @sym_71, in %w: !firrtl.uint<33> sym @sym_72, in %x: !firrtl.uint<33> sym @sym_73, in %y: !firrtl.uint<33> sym @sym_74, in %z: !firrtl.uint<33> sym @sym_75, in %a_0: !firrtl.uint<33> sym @sym_76, in %b_0: !firrtl.uint<33> sym @sym_77, in %c_0: !firrtl.uint<33> sym @sym_78, in %d_0: !firrtl.uint<33> sym @sym_79, in %e_0: !firrtl.uint<33> sym @sym_80, in %f_0: !firrtl.uint<33> sym @sym_81, in %g_0: !firrtl.uint<33> sym @sym_82, in %h_0: !firrtl.uint<33> sym @sym_83, in %i_0: !firrtl.uint<33> sym @sym_84, in %j_0: !firrtl.uint<33> sym @sym_86, in %k_0: !firrtl.uint<33> sym @sym_87, in %l_0: !firrtl.uint<33> sym @sym_88, in %m_0: !firrtl.uint<33> sym @sym_91) {
%intf = sv.interface.instance sym @intf : !sv.interface<@Intf_0>
sv.verbatim "// {{1}} {{0}}"(%l) : !firrtl.uint<5> {symbols = [#hw.innerNameRef<@Bar::@intf>]}
}
firrtl.module private @Baz() {
%c0_ui33 = firrtl.constant 0 : !firrtl.uint<33>
%Bar_a, %Bar_b, %Bar_c, %Bar_d, %Bar_e, %Bar_f, %Bar_g, %Bar_h, %Bar_i, %Bar_j, %Bar_k, %Bar_l, %Bar_m, %Bar_n, %Bar_o, %Bar_p, %Bar_q, %Bar_r, %Bar_s, %Bar_t, %Bar_u, %Bar_v, %Bar_w, %Bar_x, %Bar_y, %Bar_z, %Bar_a_0, %Bar_b_0, %Bar_c_0, %Bar_d_0, %Bar_e_0, %Bar_f_0, %Bar_g_0, %Bar_h_0, %Bar_i_0, %Bar_j_0, %Bar_k_0, %Bar_l_0, %Bar_m_0 = firrtl.instance Bar @Bar(in a: !firrtl.uint<1>, in b: !firrtl.uint<1>, in c: !firrtl.uint<1>, in d: !firrtl.uint<16>, in e: !firrtl.uint<128>, in f: !firrtl.uint<1>, in g: !firrtl.uint<1>, in h: !firrtl.uint<1>, in i: !firrtl.uint<1>, in j: !firrtl.uint<3>, in k: !firrtl.uint<6>, in l: !firrtl.uint<5>, in m: !firrtl.uint<33>, in n: !firrtl.uint<33>, in o: !firrtl.uint<33>, in p: !firrtl.uint<33>, in q: !firrtl.uint<33>, in r: !firrtl.uint<33>, in s: !firrtl.uint<33>, in t: !firrtl.uint<33>, in u: !firrtl.uint<33>, in v: !firrtl.uint<33>, in w: !firrtl.uint<33>, in x: !firrtl.uint<33>, in y: !firrtl.uint<33>, in z: !firrtl.uint<33>, in a_0: !firrtl.uint<33>, in b_0: !firrtl.uint<33>, in c_0: !firrtl.uint<33>, in d_0: !firrtl.uint<33>, in e_0: !firrtl.uint<33>, in f_0: !firrtl.uint<33>, in g_0: !firrtl.uint<33>, in h_0: !firrtl.uint<33>, in i_0: !firrtl.uint<33>, in j_0: !firrtl.uint<33>, in k_0: !firrtl.uint<33>, in l_0: !firrtl.uint<33>, in m_0: !firrtl.uint<33>)
firrtl.matchingconnect %Bar_m_0, %c0_ui33 : !firrtl.uint<33>
}
firrtl.module private @Qux(in %a: !firrtl.uint<1>, in %b: !firrtl.uint<32>) {
%intf = sv.interface.instance sym @intf : !sv.interface<@Intf_1>
sv.verbatim "// {{1}} {{0}};"(%b) : !firrtl.uint<32> {symbols = [#hw.innerNameRef<@Qux::@intf>]}
}
firrtl.extmodule @Foo()
sv.interface @Intf_0 {}
sv.interface @Intf_1 {}
}
# circt-opt -firrtl-imdeadcodeelim reduced.3.mlir
circt-opt: /home/schuylere/scratch/repos/github.com/llvm/circt/lib/Dialect/FIRRTL/Transforms/IMDeadCodeElim.cpp:757: void {anonymous}::IMDeadCodeElimPass::rewriteModuleSignature(circt::firrtl::FModuleOp): Assertion `isAssumedDead(wire) && "dummy wire must be dead"' failed.
PLEASE submit a bug report to https://github.com/llvm/circt and include the crash backtrace.
Stack dump:
0. Program arguments: circt-opt -firrtl-imdeadcodeelim reduced.3.mlir
#0 0x000000000152e05b llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/scratch/schuylere/repos/github.com/llvm/circt/build-gcc-g++-Release-on/bin/circt-opt+0x152e05b)
#1 0x000000000152aedb llvm::sys::RunSignalHandlers() (/scratch/schuylere/repos/github.com/llvm/circt/build-gcc-g++-Release-on/bin/circt-opt+0x152aedb)
#2 0x000000000152b009 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
#3 0x00007f7d87c24990 __restore_rt (/lib64/libpthread.so.0+0x12990)
#4 0x00007f7d86a2752f raise (/lib64/libc.so.6+0x4e52f)
#5 0x00007f7d869fae65 abort (/lib64/libc.so.6+0x21e65)
#6 0x00007f7d869fad39 _nl_load_domain.cold.0 (/lib64/libc.so.6+0x21d39)
#7 0x00007f7d86a1fe86 (/lib64/libc.so.6+0x46e86)
#8 0x0000000001e53c50 (anonymous namespace)::IMDeadCodeElimPass::runOnOperation() IMDeadCodeElim.cpp:0:0
#9 0x0000000001e555ec (anonymous namespace)::IMDeadCodeElimPass::runOnOperation() IMDeadCodeElim.cpp:0:0
#10 0x0000000004012879 mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) (/scratch/schuylere/repos/github.com/llvm/circt/build-gcc-g++-Release-on/bin/circt-opt+0x4012879)
#11 0x0000000004012b96 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) (/scratch/schuylere/repos/github.com/llvm/circt/build-gcc-g++-Release-on/bin/circt-opt+0x4012b96)
#12 0x00000000040132bd mlir::PassManager::runPasses(mlir::Operation*, mlir::AnalysisManager) (/scratch/schuylere/repos/github.com/llvm/circt/build-gcc-g++-Release-on/bin/circt-opt+0x40132bd)
#13 0x000000000401447b mlir::PassManager::run(mlir::Operation*) (/scratch/schuylere/repos/github.com/llvm/circt/build-gcc-g++-Release-on/bin/circt-opt+0x401447b)
#14 0x00000000037ed07f performActions(llvm::raw_ostream&, std::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, mlir::MlirOptMainConfig const&) MlirOptMain.cpp:0:0
#15 0x00000000037edee4 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&)::'lambda'(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::MemoryBufferRef, llvm::raw_ostream&)>(long, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::MemoryBufferRef const&, llvm::raw_ostream&) MlirOptMain.cpp:0:0
#16 0x0000000003824556 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) (/scratch/schuylere/repos/github.com/llvm/circt/build-gcc-g++-Release-on/bin/circt-opt+0x3824556)
#17 0x00000000037e9d5d mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&) (.part.0) MlirOptMain.cpp:0:0
#18 0x00000000037ee5ad mlir::MlirOptMain(int, char**, llvm::StringRef, llvm::StringRef, mlir::DialectRegistry&) (/scratch/schuylere/repos/github.com/llvm/circt/build-gcc-g++-Release-on/bin/circt-opt+0x37ee5ad)
#19 0x00000000037ee802 mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&) (/scratch/schuylere/repos/github.com/llvm/circt/build-gcc-g++-Release-on/bin/circt-opt+0x37ee802)
#20 0x000000000148b6a3 main (/scratch/schuylere/repos/github.com/llvm/circt/build-gcc-g++-Release-on/bin/circt-opt+0x148b6a3)
#21 0x00007f7d86a137e5 __libc_start_main (/lib64/libc.so.6+0x3a7e5)
#22 0x00000000014908fe _start (/scratch/schuylere/repos/github.com/llvm/circt/build-gcc-g++-Release-on/bin/circt-opt+0x14908fe)
Aborted
I can sometimes get the following circuit to crash IMDCE: