[llvm] [InstCombinePHI] Enhance PHI CSE to remove redundant phis (PR #163453)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 17 11:52:13 PDT 2025
CongzheUalberta wrote:
> Crash reproducer:
>
> ```
> ; bin/opt -passes=instcombine test.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-pc-linux-gnu"
>
> define fastcc i32 @vduse_queue_check_inflights() {
> ._crit_edge:
> br label %.lr.ph54
>
> .lr.ph54:
> %0 = phi ptr [ null, %._crit_edge ], [ %3, %.lr.ph54 ]
> %1 = phi ptr [ %3, %.lr.ph54 ], [ null, %._crit_edge ]
> %2 = load i8, ptr %1, align 8
> %.not51 = icmp eq i8 %2, 0
> %3 = select i1 %.not51, ptr %0, ptr null
> br label %.lr.ph54
> }
> ```
>
> ```
> opt: /home/dtcxzyw/WorkSpace/Projects/compilers/llvm-project/llvm/include/llvm/IR/Instructions.h:2817: llvm::Value* llvm::PHINode::getIncomingValueForBlock(const llvm::BasicBlock*) const: Assertion `Idx >= 0 && "Invalid basic block argument!"' 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 "vduse_queue_check_inflights"
> #0 0x000071702d854192 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMSupport.so.22.0git+0x254192)
> #1 0x000071702d85075f llvm::sys::RunSignalHandlers() (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMSupport.so.22.0git+0x25075f)
> #2 0x000071702d8508ac SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
> #3 0x000071702d245330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
> #4 0x000071702d29eb2c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
> #5 0x000071702d29eb2c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
> #6 0x000071702d29eb2c pthread_kill ./nptl/pthread_kill.c:89:10
> #7 0x000071702d24527e raise ./signal/../sysdeps/posix/raise.c:27:6
> #8 0x000071702d2288ff abort ./stdlib/abort.c:81:7
> #9 0x000071702d22881b _nl_load_domain ./intl/loadmsgcat.c:1177:9
> #10 0x000071702d23b517 (/lib/x86_64-linux-gnu/libc.so.6+0x3b517)
> #11 0x0000717027c38c4a llvm::PHINode::getIncomingValueForBlock(llvm::BasicBlock const*) const (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMInstCombine.so.22.0git+0x38c4a)
> #12 0x0000717027d5bfa9 llvm::InstCombinerImpl::visitPHINode(llvm::PHINode&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMInstCombine.so.22.0git+0x15bfa9)
> #13 0x0000717027c68ff8 llvm::InstCombinerImpl::run() (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMInstCombine.so.22.0git+0x68ff8)
> #14 0x0000717027c6a1c2 combineInstructionsOverFunction(llvm::Function&, llvm::InstructionWorklist&, llvm::AAResults*, llvm::AssumptionCache&, llvm::TargetLibraryInfo&, llvm::TargetTransformInfo&, llvm::DominatorTree&, llvm::OptimizationRemarkEmitter&, llvm::BlockFrequencyInfo*, llvm::BranchProbabilityInfo*, llvm::ProfileSummaryInfo*, llvm::InstCombineOptions const&) InstructionCombining.cpp:0:0
> #15 0x0000717027c6b204 llvm::InstCombinePass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMInstCombine.so.22.0git+0x6b204)
> #16 0x000071702a3a8ee5 llvm::detail::PassModel<llvm::Function, llvm::InstCombinePass, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libPolly.so.22.0git+0x1a8ee5)
> #17 0x0000717026b2c299 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMCore.so.22.0git+0x32c299)
> #18 0x000071702cadd335 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMX86CodeGen.so.22.0git+0xdd335)
> #19 0x0000717026b2a722 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMCore.so.22.0git+0x32a722)
> #20 0x000071702dad5285 llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMOptDriver.so.22.0git+0x20285)
> #21 0x0000717026b2af4d llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMCore.so.22.0git+0x32af4d)
> #22 0x000071702dae2261 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) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMOptDriver.so.22.0git+0x2d261)
> #23 0x000071702daed436 optMain (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMOptDriver.so.22.0git+0x38436)
> #24 0x000071702d22a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
> #25 0x000071702d22a28b call_init ./csu/../csu/libc-start.c:128:20
> #26 0x000071702d22a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
> #27 0x0000622cb7c80095 _start (bin/opt+0x1095)
> Aborted (core dumped)
> ```
Thanks for the case.
I've also checked other failures in the last CI, they occurred because with ` %0 = phi ptr [ null, %._crit_edge ], [ %3, %.lr.ph54 ]` and ` %1 = phi ptr [ %3, %.lr.ph54 ], [ null, %._crit_edge ]`, `DiffVals` actually is 0 and this case slipped into my code since I did not explicitly have `if (DiffVals == 0) continue`.
I've fixed it by using ` if (DiffVals != 1) continue` because the target pattern of this patch is explicitly that one of the two incoming values of phis differ. CI has passed, and I've also checked that your example IR works fine.
https://github.com/llvm/llvm-project/pull/163453
More information about the llvm-commits
mailing list