[llvm] [SLP]Vectorize unique scalars of splat gather nodes as separate subtrees (PR #220250)

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 2 05:59:58 PDT 2026


alexey-bataev wrote:

> We're hitting assertion failures after this change (repro source attached: [litert_builder.ii.gz](https://github.com/user-attachments/files/31738822/litert_builder.ii.gz))
> 
> ```
> $ clang -cc1 -triple thumbv7-unknown-linux-android29 -Os -emit-obj -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -fmerge-all-constants -fno-delete-null-pointer-checks -fno-lifetime-dse -mframe-pointer=none -relaxed-aliasing -ffp-contract=off -fno-rounding-math -mconstructor-aliases -funwind-tables=1 -target-cpu generic -target-feature +soft-float-abi -target-feature +read-tp-tpidruro -target-feature +vfp2 -target-feature +vfp2sp -target-feature +vfp3 -target-feature +vfp3d16 -target-feature +vfp3d16sp -target-feature +vfp3sp -target-feature -fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature -vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature +fp64 -target-feature +d32 -target-feature +neon -target-feature -sha2 -target-feature -aes -target-feature -fp16fml -target-abi aapcs-linux -mfloat-abi soft -fdebug-info-for-profiling -gkey-instructions -debug-info-kind=line-tables-only -dwarf-version=5 -debugger-tuning=gdb -ggnu-pubnames -gsimple-template-names=simple -debug-forward-template-params -fdebug-compilation-dir=. -ffunction-sections -fdata-sections -fno-unique-section-names -fcoverage-compilation-dir=.  -std=c++23 -fdeprecated-macro -fvisibility=hidden -fvisibility-inlines-hidden -stack-protector 1 -ftrivial-auto-var-init=pattern -fno-rtti -fno-signed-char -fwrapv -fwrapv-pointer -fgnuc-version=4.2.1 -fno-implicit-modules -fskip-odr-check-in-gmf -fno-sized-deallocation -Qn -vectorize-slp -mllvm -instcombine-lower-dbg-declare=0 -mllvm -split-threshold-for-reg-with-hint=0 -fsanitize=array-bounds,return -fsanitize-ignore-for-ubsan-feature=array-bounds,return -fsanitize-trap=array-bounds,return -fsanitize-merge=array-bounds,return -fno-sanitize-memory-param-retval -fno-sanitize-address-use-odr-indicator -fcomplete-member-pointers -fdwarf2-cfi-asm -w -x c++ /tmp/litert_builder.ii
> clang: /work/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp:12796: void llvm::slpvectorizer::BoUpSLP::buildTreeRec(ArrayRef<Value *>, unsigned int, const EdgeInfo &, unsigned int): Assertion `(allConstant(VLRef) || allSameType(VLRef)) && "Invalid types!"' failed.
> PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace and dumped files.
> Stack dump:
> 0.	Program arguments: build/bin/clang -cc1 -triple thumbv7-unknown-linux-android29 -Os -emit-obj -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -fmerge-all-constants -fno-delete-null-pointer-checks -fno-lifetime-dse -mframe-pointer=none -relaxed-aliasing -ffp-contract=off -fno-rounding-math -mconstructor-aliases -funwind-tables=1 -target-cpu generic -target-feature +soft-float-abi -target-feature +read-tp-tpidruro -target-feature +vfp2 -target-feature +vfp2sp -target-feature +vfp3 -target-feature +vfp3d16 -target-feature +vfp3d16sp -target-feature +vfp3sp -target-feature -fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature -vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature +fp64 -target-feature +d32 -target-feature +neon -target-feature -sha2 -target-feature -aes -target-feature -fp16fml -target-abi aapcs-linux -mfloat-abi soft -fdebug-info-for-profiling -gkey-instructions -debug-info-kind=line-tables-only -dwarf-version=5 -debugger-tuning=gdb -ggnu-pubnames -gsimple-template-names=simple -debug-forward-template-params -fdebug-compilation-dir=. -ffunction-sections -fdata-sections -fno-unique-section-names -fcoverage-compilation-dir=. -std=c++23 -fdeprecated-macro -fvisibility=hidden -fvisibility-inlines-hidden -stack-protector 1 -ftrivial-auto-var-init=pattern -fno-rtti -fno-signed-char -fwrapv -fwrapv-pointer -fgnuc-version=4.2.1 -fno-implicit-modules -fskip-odr-check-in-gmf -fno-sized-deallocation -Qn -vectorize-slp -mllvm -instcombine-lower-dbg-declare=0 -mllvm -split-threshold-for-reg-with-hint=0 -fsanitize=array-bounds,return -fsanitize-ignore-for-ubsan-feature=array-bounds,return -fsanitize-trap=array-bounds,return -fsanitize-merge=array-bounds,return -fno-sanitize-memory-param-retval -fno-sanitize-address-use-odr-indicator -fcomplete-member-pointers -fdwarf2-cfi-asm -w -x c++ /tmp/litert_builder.ii
> 1.	<eof> parser at end of file
> 2.	Optimizer
> 3.	Running pass "function<eager-inv>(drop-unnecessary-assumes,float2int,lower-constant-intrinsics,loop(loop-rotate<header-duplication;no-prepare-for-lto;check-exit-count>,loop-deletion,loop-interchange),loop-distribute,inject-tli-mappings,loop-vectorize<no-interleave-forced-only;vectorize-forced-only;>,drop-unnecessary-assumes<drop-deref>,infer-alignment,loop-load-elim,instcombine<max-iterations=1;no-verify-fixpoint>,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,vector-combine,instcombine<max-iterations=1;no-verify-fixpoint>,loop-unroll<O2>,transform-warning,sroa<preserve-cfg;aggregate-to-vector>,infer-alignment,instcombine<max-iterations=1;no-verify-fixpoint>,loop-mssa(licm<allowspeculation>),alignment-from-assumptions,loop-sink,instsimplify,div-rem-pairs,mergeicmps,expand-memcmp,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 "/tmp/litert_builder.ii"
> 4.	Running pass "slp-vectorizer" on function "LiteRtBuilderBuildTensor"
>  #0 0x000056426fe4ac4b llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (build/bin/clang+0x37afc4b)
>  #1 0x000056426fe47ae1 llvm::sys::RunSignalHandlers() (build/bin/clang+0x37acae1)
>  #2 0x000056426fe4ba5b SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
>  #3 0x000056426fe4b8e8 SignalHandlerTerminate(int, siginfo_t*, void*) Signals.cpp:0:0
>  #4 0x00007f2137e48db0 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x40db0)
>  #5 0x00007f2137e9fdbc __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
>  #6 0x00007f2137e48c82 raise ./signal/../sysdeps/posix/raise.c:27:6
>  #7 0x00007f2137e304b2 abort ./stdlib/abort.c:85:3
>  #8 0x00007f2137e30424 __assert_perror_fail ./assert/assert-perr.c:31:1
>  #9 0x00005642716dd7d5 llvm::slpvectorizer::BoUpSLP::buildTreeRec(llvm::ArrayRef<llvm::Value*>, unsigned int, llvm::slpvectorizer::BoUpSLP::EdgeInfo const&, unsigned int) (build/bin/clang+0x50427d5)
> #10 0x00005642716ddf84 llvm::slpvectorizer::BoUpSLP::tryToVectorizeSplatGatheredScalars() (build/bin/clang+0x5042f84)
> #11 0x0000564271784da7 llvm::SLPVectorizerPass::tryToVectorizeList(llvm::ArrayRef<llvm::Value*>, llvm::slpvectorizer::BoUpSLP&, bool, bool) (build/bin/clang+0x50e9da7)
> #12 0x0000564271789bea bool tryToVectorizeSequence<llvm::Value>(llvm::SmallVectorImpl<llvm::Value*>&, llvm::function_ref<bool (llvm::Value*, llvm::Value*)>, llvm::function_ref<bool (llvm::ArrayRef<llvm::Value*>, llvm::Value*)>, llvm::function_ref<bool (llvm::ArrayRef<llvm::Value*>, bool)>, bool, llvm::slpvectorizer::BoUpSLP&) SLPVectorizer.cpp:0:0
> #13 0x0000564271778e4e llvm::SLPVectorizerPass::vectorizeChainsInBlock(llvm::BasicBlock*, llvm::slpvectorizer::BoUpSLP&) (build/bin/clang+0x50dde4e)
> #14 0x0000564271776238 llvm::SLPVectorizerPass::runImpl(llvm::Function&, llvm::ScalarEvolution*, llvm::TargetTransformInfo*, llvm::TargetLibraryInfo*, llvm::AAResults*, llvm::LoopInfo*, llvm::DominatorTree*, llvm::AssumptionCache*, llvm::DemandedBits*, llvm::OptimizationRemarkEmitter*) (build/bin/clang+0x50db238)
> #15 0x0000564271775ad9 llvm::SLPVectorizerPass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (build/bin/clang+0x50daad9)
> #16 0x0000564270e1615d llvm::detail::PassModel<llvm::Function, llvm::SLPVectorizerPass, llvm::AnalysisManager<llvm::Function>>::runImpl(llvm::detail::PassConcept<llvm::Function, llvm::AnalysisManager<llvm::Function>>&, llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (build/bin/clang+0x477b15d)
> #17 0x000056426f80c033 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (build/bin/clang+0x3171033)
> #18 0x000056426d3e8bed 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>&) (build/bin/clang+0xd4dbed)
> #19 0x000056426f80ff48 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (build/bin/clang+0x3174f48)
> #20 0x000056426d3e953d 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>&) (build/bin/clang+0xd4e53d)
> #21 0x000056426f80b42d llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (build/bin/clang+0x317042d)
> #22 0x000056427021585c (anonymous namespace)::EmitAssemblyHelper::RunOptimizationPipeline(clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>&, std::unique_ptr<llvm::ToolOutputFile, std::default_delete<llvm::ToolOutputFile>>&, clang::BackendConsumer*) BackendUtil.cpp:0:0
> #23 0x000056427020a462 (anonymous namespace)::EmitAssemblyHelper::emitAssembly(clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>, clang::BackendConsumer*) BackendUtil.cpp:0:0
> #24 0x0000564270208439 clang::emitBackendOutput(clang::CompilerInstance&, clang::CodeGenOptions&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>, clang::BackendConsumer*) (build/bin/clang+0x3b6d439)
> #25 0x00005642707df87a clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (build/bin/clang+0x414487a)
> #26 0x0000564271ed5e19 clang::ParseAST(clang::Sema&, bool, bool) (build/bin/clang+0x583ae19)
> #27 0x0000564270a94e56 clang::FrontendAction::Execute() (build/bin/clang+0x43f9e56)
> #28 0x0000564270a0a3f7 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (build/bin/clang+0x436f3f7)
> #29 0x0000564270b4f21a clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (build/bin/clang+0x44b421a)
> #30 0x000056426cf6ebb9 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (build/bin/clang+0x8d3bb9)
> #31 0x000056426cf6a9b3 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>) driver.cpp:0:0
> #32 0x000056426cf699a2 clang_main(int, char**, llvm::ToolContext const&) (build/bin/clang+0x8ce9a2)
> #33 0x000056426cf7a32d main (build/bin/clang+0x8df32d)
> #34 0x00007f2137e31f77 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
> #35 0x00007f2137e32027 call_init ./csu/../csu/libc-start.c:128:20
> #36 0x00007f2137e32027 __libc_start_main ./csu/../csu/libc-start.c:347:5
> #37 0x000056426cf683c1 _start (build/bin/clang+0x8cd3c1)
> ```

Ok, will fix ASAP

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


More information about the llvm-commits mailing list