[llvm] [SLP]Support vectorization of previously vectorized scalars in split nodes (PR #134286)

via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 15 12:41:14 PDT 2025


Sterling-Augustine 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)
```


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


More information about the llvm-commits mailing list