[llvm] [InstCombine] Handle switch-to-select remapping correctly (PR #213302)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Sun Aug 9 00:06:06 PDT 2026
https://github.com/dtcxzyw requested changes to this pull request.
You cannot add new CFG edges in InstCombine.
The following case demonstrates the issue if you add `assert(DT.verify(DominatorTree::VerificationLevel::Full));` to the end of `InstCombinePass::run`.
```
; bin/opt -passes=instcombine reduced.ll -S
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 fastcc i32 @sched_copy_attr() {
.critedge.i:
%0 = load volatile i32, ptr null, align 4
%.not.i = icmp eq i32 %0, 0
%..i = select i1 %.not.i, i32 -7, i32 %0
switch i32 %..i, label %copy_struct_from_user.exit.thread [
i32 0, label %copy_struct_from_user.exit.thread59
]
copy_struct_from_user.exit.thread59: ; preds = %.critedge.i
ret i32 0
copy_struct_from_user.exit.thread: ; preds = %.critedge.i
ret i32 0
}
```
```
DominatorTree is different than a freshly computed one!
Current:
=============================--------------------------------
Inorder Dominator Tree: DFSNumbers invalid: 0 slow queries.
[1] %.critedge.i {4294967295,4294967295} [0]
[2] %copy_struct_from_user.exit.thread {4294967295,4294967295} [1]
[2] %copy_struct_from_user.exit.thread59 {4294967295,4294967295} [1]
Roots: %.critedge.i
Freshly computed tree:
=============================--------------------------------
Inorder Dominator Tree: DFSNumbers invalid: 0 slow queries.
[1] %.critedge.i {4294967295,4294967295} [0]
[2] %copy_struct_from_user.exit.thread {4294967295,4294967295} [1]
Roots: %.critedge.i
opt: /data/zyw/dev/llvm-project/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:6330: llvm::PreservedAnalyses llvm::InstCombinePass::run(llvm::Function&, llvm::FunctionAnalysisManager&): Assertion `DT.verify(DominatorTree::VerificationLevel::Full)' 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=instcombine reduced.ll -S
1. Running pass "function(instcombine<max-iterations=1;verify-fixpoint>)" on module "reduced.ll"
2. Running pass "instcombine<max-iterations=1;verify-fixpoint>" on function "sched_copy_attr"
#0 0x00007ffff7df7d81 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /data/zyw/dev/llvm-project/llvm/lib/Support/Unix/Signals.inc:935:3
#1 0x00007ffff7df4c2c llvm::sys::RunSignalHandlers() /data/zyw/dev/llvm-project/llvm/lib/Support/Signals.cpp:108:20
#2 0x00007ffff7df54a5 SignalHandler(int, siginfo_t*, void*) /data/zyw/dev/llvm-project/llvm/lib/Support/Unix/Signals.inc:474: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 0x00007fffef65c604 llvm::SmallPtrSetImplBase::insert_imp(void const*) /data/zyw/dev/llvm-project/llvm/include/llvm/ADT/SmallPtrSet.h:170:48
#12 0x00007fffef65c604 llvm::SmallPtrSetImpl<void*>::insert(void*) /data/zyw/dev/llvm-project/llvm/include/llvm/ADT/SmallPtrSet.h:387:24
#13 0x00007fffef65c604 llvm::PreservedAnalyses::preserve(llvm::AnalysisKey*) /data/zyw/dev/llvm-project/llvm/include/llvm/IR/Analysis.h:146:26
#14 0x00007fffef65c604 llvm::PreservedAnalyses& llvm::PreservedAnalyses::preserve<llvm::LastRunTrackingAnalysis>() /data/zyw/dev/llvm-project/llvm/include/llvm/IR/Analysis.h:133:13
#15 0x00007fffef65c604 llvm::InstCombinePass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /data/zyw/dev/llvm-project/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:6328:39
#16 0x00007ffff15c7145 llvm::detail::PassModel<llvm::Function, llvm::InstCombinePass, llvm::AnalysisManager<llvm::Function>>::runImpl(llvm::detail::PassConcept<llvm::Function, llvm::AnalysisManager<llvm::Function>>&, llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /data/zyw/dev/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:129:3
#17 0x00007fffee6dca64 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
#18 0x00007ffff15c48a5 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::runImpl(llvm::detail::PassConcept<llvm::Function, llvm::AnalysisManager<llvm::Function>>&, llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /data/zyw/dev/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:129:3
#19 0x00007fffee6db902 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /data/zyw/dev/llvm-project/llvm/lib/IR/PassManager.cpp:132:41
#20 0x00007ffff15c8285 llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::AnalysisManager<llvm::Module>>::runImpl(llvm::detail::PassConcept<llvm::Module, llvm::AnalysisManager<llvm::Module>>&, llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /data/zyw/dev/llvm-project/llvm/include/llvm/IR/PassManagerInternal.h:129:3
#21 0x00007fffee6db3b4 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
#22 0x00007ffff7f99ca4 llvm::SmallPtrSetImplBase::~SmallPtrSetImplBase() /data/zyw/dev/llvm-project/llvm/include/llvm/ADT/SmallPtrSet.h:89:5
#23 0x00007ffff7f99ca4 llvm::SmallPtrSetImpl<llvm::AnalysisKey*>::~SmallPtrSetImpl() /data/zyw/dev/llvm-project/llvm/include/llvm/ADT/SmallPtrSet.h:365:35
#24 0x00007ffff7f99ca4 llvm::SmallPtrSet<llvm::AnalysisKey*, 2u>::~SmallPtrSet() /data/zyw/dev/llvm-project/llvm/include/llvm/ADT/SmallPtrSet.h:532:7
#25 0x00007ffff7f99ca4 llvm::PreservedAnalyses::~PreservedAnalyses() /data/zyw/dev/llvm-project/llvm/include/llvm/IR/Analysis.h:112:7
#26 0x00007ffff7f99ca4 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:580:10
#27 0x00007ffff7fa60a7 optMain /data/zyw/dev/llvm-project/llvm/tools/opt/optdriver.cpp:805:5
#28 0x00007ffff782a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#29 0x00007ffff782a28b call_init ./csu/../csu/libc-start.c:128:20
#30 0x00007ffff782a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
#31 0x0000555555555095 _start (bin/opt+0x1095)
Aborted (core dumped)
```
Please move the transformation into `SimplifyCFGOpt::simplifySwitchOnSelect`.
https://github.com/llvm/llvm-project/pull/213302
More information about the llvm-commits
mailing list