[llvm] [SimplifyCFG] Simplify identical predecessors (PR #173022)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 1 06:05:38 PST 2026


dtcxzyw wrote:

Crash reproducer:
```
; bin/opt -passes="simplifycfg<no-keep-loops;sink-common-insts>" reduced.ll
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

define i32 @main() {
entry:
  br label %lbl_215.preheader.lr.ph.i.i.i

lbl_215.i.i.i:                                    ; preds = %lbl_215.preheader.lr.ph.i.i.i, %lbl_215.i.i.i
  br label %lbl_215.i.i.i

lbl_215.preheader.lr.ph.i.i.i:                    ; preds = %entry
  br label %lbl_215.i.i.i
}
```
```
opt: /data/zyw/dev/llvm-project/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp:247: bool iterativelySimplifyCFG(llvm::Function&, const llvm::TargetTransformInfo&, llvm::DomTreeUpdater*, const llvm::SimplifyCFGOptions&): Assertion `IterCnt++ < 1000 && "Iterative simplification didn't converge!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace and instructions to reproduce the bug.
Stack dump:
0.      Program arguments: bin/opt -passes=simplifycfg<no-keep-loops;sink-common-insts> reduced.ll
1.      Running pass "function(simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;no-switch-range-to-icmp;no-switch-to-arithmetic;no-switch-to-lookup;no-keep-loops;no-hoist-common-insts;no-hoist-loads-stores-with-cond-faulting;sink-common-insts;speculate-blocks;simplify-cond-branch;no-speculate-unpredictables>)" on module "reduced.ll"
2.      Running pass "simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;no-switch-range-to-icmp;no-switch-to-arithmetic;no-switch-to-lookup;no-keep-loops;no-hoist-common-insts;no-hoist-loads-stores-with-cond-faulting;sink-common-insts;speculate-blocks;simplify-cond-branch;no-speculate-unpredictables>" on function "main"
 #0 0x00007ffff7df7a32 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /data/zyw/dev/llvm-project/llvm/lib/Support/Unix/Signals.inc:846:3
 #1 0x00007ffff7df494c llvm::sys::RunSignalHandlers() /data/zyw/dev/llvm-project/llvm/lib/Support/Signals.cpp:108:20
 #2 0x00007ffff7df5171 SignalHandler(int, siginfo_t*, void*) /data/zyw/dev/llvm-project/llvm/lib/Support/Unix/Signals.inc:429:14
 #3 0x00007ffff7845330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
 #4 0x00007ffff789eb2c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x00007ffff789eb2c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #6 0x00007ffff789eb2c pthread_kill ./nptl/pthread_kill.c:89:10
 #7 0x00007ffff784527e raise ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x00007ffff78288ff abort ./stdlib/abort.c:81:7
 #9 0x00007ffff782881b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x00007ffff783b517 (/lib/x86_64-linux-gnu/libc.so.6+0x3b517)
#11 0x00007ffff29806ad llvm::SmallVectorBase<unsigned int>::set_allocation_range(void*, unsigned long) /data/zyw/dev/llvm-project/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp:247:5
#12 0x00007ffff29806ad llvm::SmallVectorTemplateBase<llvm::WeakVH, false>::takeAllocationForGrow(llvm::WeakVH*, unsigned long) /data/zyw/dev/llvm-project/llvm/include/llvm/ADT/SmallVector.h:471:29
#13 0x00007ffff29806ad llvm::SmallVectorTemplateBase<llvm::WeakVH, false>::grow(unsigned long) /data/zyw/dev/llvm-project/llvm/include/llvm/ADT/SmallVector.h:441:24
#14 0x00007ffff29806ad llvm::SmallVectorImpl<llvm::WeakVH>::reserve(unsigned long) /data/zyw/dev/llvm-project/llvm/include/llvm/ADT/SmallVector.h:666:17
#15 0x00007ffff29806ad void llvm::SmallVectorImpl<llvm::WeakVH>::append<llvm::SmallPtrSetIterator<llvm::BasicBlock*>, void>(llvm::SmallPtrSetIterator<llvm::BasicBlock*>, llvm::SmallPtrSetIterator<llvm::BasicBlock*>) /data/zyw/dev/llvm-project/llvm/include/llvm/ADT/SmallVector.h:687:18
#16 0x00007ffff29806ad llvm::SmallVector<llvm::WeakVH, 16u>::SmallVector<llvm::SmallPtrSetIterator<llvm::BasicBlock*>, void>(llvm::SmallPtrSetIterator<llvm::BasicBlock*>, llvm::SmallPtrSetIterator<llvm::BasicBlock*>) /data/zyw/dev/llvm-project/llvm/include/llvm/ADT/SmallVector.h:1224:17
#17 0x00007ffff29806ad iterativelySimplifyCFG(llvm::Function&, llvm::TargetTransformInfo const&, llvm::DomTreeUpdater*, llvm::SimplifyCFGOptions const&) /data/zyw/dev/llvm-project/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp:242:62
#18 0x00007ffff2981e8c simplifyFunctionCFGImpl(llvm::Function&, llvm::TargetTransformInfo const&, llvm::DominatorTree*, llvm::SimplifyCFGOptions const&) /data/zyw/dev/llvm-project/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp:283:3
#19 0x00007ffff29827f5 simplifyFunctionCFG(llvm::Function&, llvm::TargetTransformInfo const&, llvm::DominatorTree*, llvm::SimplifyCFGOptions const&) /data/zyw/dev/llvm-project/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp:310:3
#20 0x00007ffff2982955 llvm::SimplifyCFGPass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /data/zyw/dev/llvm-project/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp:381:3
#21 0x00007ffff44eebb5 llvm::detail::PassModel<llvm::Function, llvm::SimplifyCFGPass, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /data/zyw/dev/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:92:3
#22 0x00007ffff14cfc1d llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /data/zyw/dev/llvm-project/llvm/include/llvm/IR/PassManagerImpl.h:80:18
#23 0x00007ffff6ebe965 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /data/zyw/dev/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:92:3
#24 0x00007ffff14d0057 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /data/zyw/dev/llvm-project/llvm/lib/IR/PassManager.cpp:132:41
#25 0x00007ffff7f8be55 llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /data/zyw/dev/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:92:3
#26 0x00007ffff14d12d6 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /data/zyw/dev/llvm-project/llvm/include/llvm/IR/PassManagerImpl.h:80:18
#27 0x00007ffff7f97bdc llvm::SmallPtrSetImplBase::~SmallPtrSetImplBase() /data/zyw/dev/llvm-project/llvm/include/llvm/ADT/SmallPtrSet.h:89:5
#28 0x00007ffff7f97bdc llvm::SmallPtrSetImpl<llvm::AnalysisKey*>::~SmallPtrSetImpl() /data/zyw/dev/llvm-project/llvm/include/llvm/ADT/SmallPtrSet.h:368:35
#29 0x00007ffff7f97bdc llvm::SmallPtrSet<llvm::AnalysisKey*, 2u>::~SmallPtrSet() /data/zyw/dev/llvm-project/llvm/include/llvm/ADT/SmallPtrSet.h:527:7
#30 0x00007ffff7f97bdc llvm::PreservedAnalyses::~PreservedAnalyses() /data/zyw/dev/llvm-project/llvm/include/llvm/IR/Analysis.h:112:7
#31 0x00007ffff7f97bdc llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef<llvm::PassPlugin>, llvm::ArrayRef<std::function<void (llvm::PassBuilder&)>>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool, bool, bool, bool) /data/zyw/dev/llvm-project/llvm/tools/opt/NewPMDriver.cpp:574:10
#32 0x00007ffff7fa35bb optMain /data/zyw/dev/llvm-project/llvm/tools/opt/optdriver.cpp:758:5
#33 0x00007ffff782a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#34 0x00007ffff782a28b call_init ./csu/../csu/libc-start.c:128:20
#35 0x00007ffff782a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
#36 0x0000555555555095 _start (bin/opt+0x1095)
Aborted (core dumped)
```

https://github.com/llvm/llvm-project/pull/173022


More information about the llvm-commits mailing list