[llvm] [LV] Vectorize early exit loops with multiple exits. (PR #174864)
Mikael Holmen via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 6 01:12:52 PST 2026
mikaelholmen wrote:
I've bisected a crash back to this patch:
```opt -passes="default<O2>" -disable-loop-unrolling -extra-vectorizer-passes=1 bbi-115749.ll -o /dev/null```
fails with
```
opt: /repo/uabelho/main-github/llvm/include/llvm/Support/GenericLoopInfoImpl.h:344: void llvm::LoopBase<llvm::BasicBlock, llvm::Loop>::verifyLoop() const [BlockT = llvm::BasicBlock, LoopT = llvm::Loop]: Assertion `llvm::any_of(children<BlockT *>(BB), [&](BlockT *B) { return contains(B); }) && "Loop block has no in-loop successors!"' 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: build-all/bin/opt -passes=default<O2> -disable-loop-unrolling -extra-vectorizer-passes=1 bbi-115749.ll -o /dev/null
1. Running pass "function<eager-inv>(drop-unnecessary-assumes,float2int,lower-constant-intrinsics,loop(loop-rotate<header-duplication;no-prepare-for-lto>,loop-deletion),loop-distribute,inject-tli-mappings,loop-vectorize<no-interleave-forced-only;no-vectorize-forced-only;>,drop-unnecessary-assumes,infer-alignment,loop-load-elim,instcombine<max-iterations=1;no-verify-fixpoint>,extra-vector-passes,simplifycfg<bonus-inst-threshold=1;forward-switch-cond;switch-range-to-icmp;switch-to-arithmetic;switch-to-lookup;no-keep-loops;hoist-common-insts;no-hoist-loads-stores-with-cond-faulting;sink-common-insts;speculate-blocks;simplify-cond-branch;no-speculate-unpredictables>,slp-vectorizer,early-cse<>,vector-combine,instcombine<max-iterations=1;no-verify-fixpoint>,loop-unroll<O2>,transform-warning,sroa<preserve-cfg>,infer-alignment,instcombine<max-iterations=1;no-verify-fixpoint>,loop-mssa(licm<allowspeculation>),alignment-from-assumptions,loop-sink,instsimplify,div-rem-pairs,tailcallelim,simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;switch-to-arithmetic;no-switch-to-lookup;keep-loops;no-hoist-common-insts;hoist-loads-stores-with-cond-faulting;no-sink-common-insts;speculate-blocks;simplify-cond-branch;speculate-unpredictables>)" on module "bbi-115749.ll"
2. Running pass "extra-vector-passes" on function "func_5"
3. Running pass "loop-mssa(licm<allowspeculation>,simple-loop-unswitch<no-nontrivial;trivial>)" on function "func_5"
#0 0x00005630d2727726 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (build-all/bin/opt+0x5108726)
#1 0x00005630d27243d5 llvm::sys::RunSignalHandlers() (build-all/bin/opt+0x51053d5)
#2 0x00005630d2728939 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
#3 0x00007faa17c0a990 __restore_rt (/lib64/libpthread.so.0+0x12990)
#4 0x00007faa155a952f raise (/lib64/libc.so.6+0x4e52f)
#5 0x00007faa1557ce65 abort (/lib64/libc.so.6+0x21e65)
#6 0x00007faa1557cd39 _nl_load_domain.cold.0 (/lib64/libc.so.6+0x21d39)
#7 0x00007faa155a1e86 (/lib64/libc.so.6+0x46e86)
#8 0x00005630d2e5f6a7 llvm::LoopBase<llvm::BasicBlock, llvm::Loop>::verifyLoop() const (build-all/bin/opt+0x58406a7)
#9 0x00005630d3f932df void llvm::detail::UniqueFunctionBase<void, llvm::StringRef, llvm::Any>::CallImpl<llvm::FunctionToLoopPassAdaptor::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&)::$_0>(void*, llvm::StringRef, llvm::Any&) LoopPassManager.cpp:0:0
#10 0x00005630d3f92acc bool llvm::PassInstrumentation::runBeforePass<llvm::Loop, llvm::detail::PassConcept<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>>(llvm::detail::PassConcept<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&> const&, llvm::Loop const&) const LoopPassManager.cpp:0:0
#11 0x00005630d3f9107d std::optional<llvm::PreservedAnalyses> llvm::PassManager<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::runSinglePass<llvm::Loop, std::unique_ptr<llvm::detail::PassConcept<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>, std::default_delete<llvm::detail::PassConcept<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>>>>(llvm::Loop&, std::unique_ptr<llvm::detail::PassConcept<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>, std::default_delete<llvm::detail::PassConcept<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>>>&, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&, llvm::PassInstrumentation&) (build-all/bin/opt+0x697207d)
#12 0x00005630d3f90ce3 llvm::PassManager<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::runWithoutLoopNestPasses(llvm::Loop&, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (build-all/bin/opt+0x6971ce3)
#13 0x00005630d3f901e4 llvm::PassManager<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::run(llvm::Loop&, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (build-all/bin/opt+0x69711e4)
#14 0x00005630d3c8affd llvm::detail::PassModel<llvm::Loop, llvm::PassManager<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::run(llvm::Loop&, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) PassBuilderPipelines.cpp:0:0
#15 0x00005630d3f91fb0 llvm::FunctionToLoopPassAdaptor::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (build-all/bin/opt+0x6972fb0)
#16 0x00005630d3c8db7d llvm::detail::PassModel<llvm::Function, llvm::FunctionToLoopPassAdaptor, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) PassBuilderPipelines.cpp:0:0
#17 0x00005630d29536e5 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (build-all/bin/opt+0x53346e5)
#18 0x00005630d3c929b6 llvm::ExtraFunctionPassManager<llvm::ShouldRunExtraVectorPasses>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) PassBuilderPipelines.cpp:0:0
#19 0x00005630d3c9283d llvm::detail::PassModel<llvm::Function, llvm::ExtraFunctionPassManager<llvm::ShouldRunExtraVectorPasses>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) PassBuilderPipelines.cpp:0:0
#20 0x00005630d29536e5 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (build-all/bin/opt+0x53346e5)
#21 0x00005630d3c8f85d llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) PassBuilderPipelines.cpp:0:0
#22 0x00005630d2957ffe llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (build-all/bin/opt+0x5338ffe)
#23 0x00005630d3c1d0fd llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) NewPMDriver.cpp:0:0
#24 0x00005630d29523d5 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (build-all/bin/opt+0x53333d5)
#25 0x00005630d3c15601 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) (build-all/bin/opt+0x65f6601)
#26 0x00005630d26c6d27 optMain (build-all/bin/opt+0x50a7d27)
#27 0x00007faa155957e5 __libc_start_main (/lib64/libc.so.6+0x3a7e5)
#28 0x00005630d26c3f6e _start (build-all/bin/opt+0x50a4f6e)
Abort (core dumped)
```
Unfortunately utils/reduce_pipeline.py doesn't get anywhere.
[bbi-115749.ll.gz](https://github.com/user-attachments/files/25790217/bbi-115749.ll.gz)
https://godbolt.org/z/6fdjWfbf1
https://github.com/llvm/llvm-project/pull/174864
More information about the llvm-commits
mailing list