[llvm] [SLP]Support vectorization of previously vectorized scalars in split nodes (PR #134286)
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 15 13:34:18 PDT 2025
alexey-bataev wrote:
> This pr makes the following test case crash. Stack trace below.
>
> ```
> $ cat reduced.ll
>
> define i64 @Foo(ptr align 8 dereferenceable(344) %0, i64 %1) {
> %3 = getelementptr i8, ptr %0, i64 104
> %4 = getelementptr i8, ptr %0, i64 112
> %5 = getelementptr i8, ptr %0, i64 24
> %6 = load i64, ptr %3, align 8
> %7 = load i64, ptr %4, align 8
> %8 = load i64, ptr %5, align 8
> %9 = load i64, ptr %0, align 8
> br label %10
>
> 10: ; preds = %18, %2
> %11 = phi i64 [ %9, %2 ], [ 0, %18 ]
> %12 = phi i64 [ %8, %2 ], [ %12, %18 ]
> %13 = phi i64 [ %7, %2 ], [ 0, %18 ]
> %14 = phi i64 [ %6, %2 ], [ 0, %18 ]
> switch i32 0, label %15 [
> i32 0, label %18
> ]
>
> 15: ; preds = %10
> %16 = tail call i64 @llvm.umin.i64(i64 0, i64 0)
> %17 = tail call i64 @llvm.umax.i64(i64 0, i64 0)
> br label %18
>
> 18: ; preds = %15, %10
> %19 = phi i64 [ %17, %15 ], [ 0, %10 ]
> %20 = phi i64 [ %16, %15 ], [ 0, %10 ]
> %21 = phi i64 [ %11, %15 ], [ 0, %10 ]
> %22 = phi i64 [ %12, %15 ], [ 0, %10 ]
> %23 = phi i64 [ %13, %15 ], [ %1, %10 ]
> %24 = phi i64 [ %14, %15 ], [ 0, %10 ]
> br i1 false, label %.loopexit206, label %10
>
> .loopexit206: ; preds = %18
> switch i32 0, label %26 [
> i32 0, label %.cont174
> i32 1, label %25
> ]
>
> 25: ; preds = %.loopexit206
> br label %.cont174
>
> 26: ; preds = %.loopexit206
> %27 = tail call i64 @llvm.umin.i64(i64 0, i64 0)
> %28 = tail call i64 @llvm.umax.i64(i64 0, i64 0)
> br label %.cont174
>
> .cont174: ; preds = %26, %25, %.loopexit206
> %.sroa.139.1 = phi i64 [ %28, %26 ], [ %19, %25 ], [ %19, %.loopexit206 ]
> %.sroa.133.1 = phi i64 [ %27, %26 ], [ 0, %25 ], [ %20, %.loopexit206 ]
> %.sroa.81.1 = phi i64 [ %23, %26 ], [ 0, %25 ], [ %23, %.loopexit206 ]
> %.sroa.75.1 = phi i64 [ %24, %26 ], [ 0, %25 ], [ %24, %.loopexit206 ]
> %.sroa.21.1 = phi i64 [ %21, %26 ], [ 0, %25 ], [ %21, %.loopexit206 ]
> %.sroa.15.1 = phi i64 [ %22, %26 ], [ 0, %25 ], [ %22, %.loopexit206 ]
> %29 = phi i64 [ %28, %26 ], [ 0, %25 ], [ %19, %.loopexit206 ]
> %30 = phi i64 [ %27, %26 ], [ 0, %25 ], [ %20, %.loopexit206 ]
> ret i64 0
> }
>
> ; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
> declare i64 @llvm.umax.i64(i64, i64) #0
>
> ; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
> declare i64 @llvm.umin.i64(i64, i64) #0
>
> ; uselistorder directives
> uselistorder ptr @llvm.umax.i64, { 1, 0 }
> uselistorder ptr @llvm.umin.i64, { 1, 0 }
>
> attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
> augustine:~/repro $ cat reduced.ll | ~/llvm/build/bin/opt -p slp-vectorizer -o /tmp/junk -mtriple=x86_64-unknown-linux-gnu -mattr=+aes -mattr=+cx16 -mattr=+sse4.2 -mattr=+pclmul -mattr=+prfchw -mattr=+avx
> opt: /usr/local/google/home/saugustine/llvm/llvm-project/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp:3861: ArrayRef<Value *> llvm::slpvectorizer::BoUpSLP::TreeEntry::getOperand(unsigned int) const: Assertion `OpIdx < Operands.size() && "Off bounds"' failed.
> PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
> Stack dump:
> 0. Program arguments: /usr/local/google/home/saugustine/llvm/build/bin/opt -p slp-vectorizer -o /tmp/junk -mtriple=x86_64-unknown-linux-gnu -mattr=+aes -mattr=+cx16 -mattr=+sse4.2 -mattr=+pclmul -mattr=+prfchw -mattr=+avx
> 1. Running pass "function(slp-vectorizer)" on module "<stdin>"
> 2. Running pass "slp-vectorizer" on function "Foo"
> #0 0x000056001761dda8 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/local/google/home/saugustine/llvm/build/bin/opt+0x4a21da8)
> #1 0x000056001761b85e llvm::sys::RunSignalHandlers() (/usr/local/google/home/saugustine/llvm/build/bin/opt+0x4a1f85e)
> #2 0x000056001761e431 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
> #3 0x00007fac29849e20 (/lib/x86_64-linux-gnu/libc.so.6+0x3fe20)
> #4 0x00007fac2989de5c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
> #5 0x00007fac29849d82 raise ./signal/../sysdeps/posix/raise.c:27:6
> #6 0x00007fac298324f0 abort ./stdlib/abort.c:81:7
> #7 0x00007fac29832418 _nl_load_domain ./intl/loadmsgcat.c:1177:9
> #8 0x00007fac29842692 (/lib/x86_64-linux-gnu/libc.so.6+0x38692)
> #9 0x00005600167de601 llvm::slpvectorizer::BoUpSLP::getOperandEntry(llvm::slpvectorizer::BoUpSLP::TreeEntry const*, unsigned int) const (/usr/local/google/home/saugustine/llvm/build/bin/opt+0x3be2601)
> #10 0x00005600168761ea bool __gnu_cxx::__ops::_Iter_negate<llvm::slpvectorizer::BoUpSLP::reorderBottomToTop(bool)::$_8>::operator()<llvm::slpvectorizer::BoUpSLP::TreeEntry**>(llvm::slpvectorizer::BoUpSLP::TreeEntry**) SLPVectorizer.cpp:0:0
> #11 0x00005600167b8572 llvm::slpvectorizer::BoUpSLP::reorderBottomToTop(bool) (/usr/local/google/home/saugustine/llvm/build/bin/opt+0x3bbc572)
> #12 0x0000560016823fb9 llvm::SLPVectorizerPass::tryToVectorizeList(llvm::ArrayRef<llvm::Value*>, llvm::slpvectorizer::BoUpSLP&, bool) (/usr/local/google/home/saugustine/llvm/build/bin/opt+0x3c27fb9)
> #13 0x0000560016829dfb bool tryToVectorizeSequence<llvm::Value>(llvm::SmallVectorImpl<llvm::Value*>&, llvm::function_ref<bool (llvm::Value*, llvm::Value*)>, llvm::function_ref<bool (llvm::Value*, llvm::Value*)>, llvm::function_ref<bool (llvm::ArrayRef<llvm::Value*>, bool)>, bool, llvm::slpvectorizer::BoUpSLP&) SLPVectorizer.cpp:0:0
> #14 0x000056001681cb83 llvm::SLPVectorizerPass::vectorizeChainsInBlock(llvm::BasicBlock*, llvm::slpvectorizer::BoUpSLP&) (/usr/local/google/home/saugustine/llvm/build/bin/opt+0x3c20b83)
> #15 0x000056001681a5fd llvm::SLPVectorizerPass::runImpl(llvm::Function&, llvm::ScalarEvolution*, llvm::TargetTransformInfo*, llvm::TargetLibraryInfo*, llvm::AAResults*, llvm::LoopInfo*, llvm::DominatorTree*, llvm::AssumptionCache*, llvm::DemandedBits*, llvm::OptimizationRemarkEmitter*) (/usr/local/google/home/saugustine/llvm/build/bin/opt+0x3c1e5fd)
> #16 0x0000560016819ba6 llvm::SLPVectorizerPass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/usr/local/google/home/saugustine/llvm/build/bin/opt+0x3c1dba6)
> #17 0x000056001574145d llvm::detail::PassModel<llvm::Function, llvm::SLPVectorizerPass, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/usr/local/google/home/saugustine/llvm/build/bin/opt+0x2b4545d)
> #18 0x000056001745ebca llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/usr/local/google/home/saugustine/llvm/build/bin/opt+0x4862bca)
> #19 0x0000560013c8835d llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/usr/local/google/home/saugustine/llvm/build/bin/opt+0x108c35d)
> #20 0x0000560017462ab7 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/usr/local/google/home/saugustine/llvm/build/bin/opt+0x4866ab7)
> #21 0x0000560013c88b1d llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/usr/local/google/home/saugustine/llvm/build/bin/opt+0x108cb1d)
> #22 0x000056001745dc7a llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/usr/local/google/home/saugustine/llvm/build/bin/opt+0x4861c7a)
> #23 0x00005600137e3737 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) (/usr/local/google/home/saugustine/llvm/build/bin/opt+0xbe7737)
> #24 0x00005600137d7a9e optMain (/usr/local/google/home/saugustine/llvm/build/bin/opt+0xbdba9e)
> #25 0x00007fac29833d68 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
> #26 0x00007fac29833e25 call_init ./csu/../csu/libc-start.c:128:20
> #27 0x00007fac29833e25 __libc_start_main ./csu/../csu/libc-start.c:347:5
> #28 0x00005600137d1221 _start (/usr/local/google/home/saugustine/llvm/build/bin/opt+0xbd5221)
> ```
Fixed in 85eb44e304e0a0a7da78448ceee60fdfec235edb
https://github.com/llvm/llvm-project/pull/134286
More information about the llvm-commits
mailing list