Skip to content

[SLP] Assertion OpTE1.isSame [...] hit in SLP after #128907 #130972

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
jeanPerier opened this issue Mar 12, 2025 · 3 comments
Closed

[SLP] Assertion OpTE1.isSame [...] hit in SLP after #128907 #130972

jeanPerier opened this issue Mar 12, 2025 · 3 comments
Assignees
Labels
crash Prefer [crash-on-valid] or [crash-on-invalid] llvm:SLPVectorizer

Comments

@jeanPerier
Copy link
Contributor

After 7de895f, I am seeing a crash in SLP when compiling Fortran code with flang.

Note that the crash is still observed after #130743 fix. Assertion must be enabled (otherwise, opt succeeds).

I cannot share the Fortran source, but below is reproducer obtained with llvm-reduce that fails for me on X86-64 with opt -O3:

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-unknown-linux-gnu"

define void @zot(ptr %arg, ptr %arg1, ptr %arg2, ptr %arg3, i64 %arg4, double %arg5) {
bb:
  br label %bb6

bb6:                                              ; preds = %bb20, %bb
  %phi = phi double [ 0.000000e+00, %bb ], [ %phi22, %bb20 ]
  %phi7 = phi i64 [ 0, %bb ], [ %add, %bb20 ]
  %phi8 = phi double [ 0.000000e+00, %bb ], [ %phi24, %bb20 ]
  %phi9 = phi double [ 0.000000e+00, %bb ], [ %phi25, %bb20 ]
  %load = load i32, ptr %arg, align 4
  %icmp = icmp eq i32 %load, 0
  %add = add i64 %phi7, 1
  br i1 %icmp, label %bb20, label %bb10

bb10:                                             ; preds = %bb6
  %load11 = load double, ptr %arg, align 8
  %fmul = fmul double %load11, 0.000000e+00
  %fsub = fsub double 0.000000e+00, %fmul
  store double 0.000000e+00, ptr %arg, align 8
  %fadd = fadd double %phi9, 1.000000e+00
  %fadd12 = fadd double %phi8, 0.000000e+00
  %fadd13 = fadd double %fadd, 1.000000e+00
  %fadd14 = fadd double %fadd12, 1.000000e+00
  %fadd15 = fadd double 1.000000e+00, %fadd13
  %fadd16 = fadd double %arg5, %fadd14
  %fadd17 = fadd double 1.000000e+00, %fadd15
  %fadd18 = fadd double %arg5, %fadd16
  %fsub19 = fsub double 0.000000e+00, %load11
  br label %bb20

bb20:                                             ; preds = %bb10, %bb6
  %phi21 = phi double [ %fadd17, %bb10 ], [ 0.000000e+00, %bb6 ]
  %phi22 = phi double [ %fadd18, %bb10 ], [ 0.000000e+00, %bb6 ]
  %phi23 = phi double [ %fsub, %bb10 ], [ 0.000000e+00, %bb6 ]
  %phi24 = phi double [ %fadd18, %bb10 ], [ 1.000000e+00, %bb6 ]
  %phi25 = phi double [ %fadd17, %bb10 ], [ 1.000000e+00, %bb6 ]
  %phi26 = phi double [ %fsub19, %bb10 ], [ 0.000000e+00, %bb6 ]
  %icmp27 = icmp eq i64 %phi7, %arg4
  br i1 %icmp27, label %bb28, label %bb6

bb28:                                             ; preds = %bb20
  store double %phi23, ptr %arg, align 8
  store double %phi21, ptr %arg3, align 8
  store double %phi, ptr %arg2, align 8
  store double %phi26, ptr %arg1, align 8
  ret void
}

The crash is:

opt: llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp:16235: llvm::Value* llvm::slpvectorizer::BoUpSLP::vectorizeTree(llvm::slpvectorizer::BoUpSLP::TreeEntry*): Assertion `OpTE1.isSame( ArrayRef(E->Scalars).take_front(OpTE1.getVectorFactor())) && "Expected same first part of scalars."' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.	Program arguments: opt -O3 reduced.ll -o optimized.ll
1.	Running pass "function<eager-inv>(float2int,lower-constant-intrinsics,chr,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;>,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-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<O3>,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;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 "reduced.ll"
2.	Running pass "slp-vectorizer" on function "zot"
 #0 0x00005643bfe583ab llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (opt+0x1a683ab)
 #1 0x00005643bfe55584 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #2 0x00007f472e842520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #3 0x00007f472e8969fc __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #4 0x00007f472e8969fc __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #5 0x00007f472e8969fc pthread_kill ./nptl/pthread_kill.c:89:10
 #6 0x00007f472e842476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #7 0x00007f472e8287f3 abort ./stdlib/abort.c:81:7
 #8 0x00007f472e82871b _nl_load_domain ./intl/loadmsgcat.c:1177:9
 #9 0x00007f472e839e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
#10 0x00005643c2078a46 llvm::slpvectorizer::BoUpSLP::vectorizeTree(llvm::slpvectorizer::BoUpSLP::TreeEntry*) (opt+0x3c88a46)
#11 0x00005643c207238e llvm::slpvectorizer::BoUpSLP::vectorizeOperand(llvm::slpvectorizer::BoUpSLP::TreeEntry*, unsigned int) (opt+0x3c8238e)
#12 0x00005643c2075322 llvm::slpvectorizer::BoUpSLP::vectorizeTree(llvm::slpvectorizer::BoUpSLP::TreeEntry*) (opt+0x3c85322)
#13 0x00005643c20933d4 llvm::slpvectorizer::BoUpSLP::vectorizeTree(llvm::SmallDenseSet<llvm::Value*, 4u, llvm::DenseMapInfo<llvm::Value*, void>> const&, llvm::Instruction*, llvm::ArrayRef<std::tuple<llvm::Value*, unsigned int, bool>>) (opt+0x3ca33d4)
#14 0x00005643c2097152 llvm::slpvectorizer::BoUpSLP::vectorizeTree() (opt+0x3ca7152)
#15 0x00005643c20ac54d llvm::SLPVectorizerPass::tryToVectorizeList(llvm::ArrayRef<llvm::Value*>, llvm::slpvectorizer::BoUpSLP&, bool) (opt+0x3cbc54d)
#16 0x00005643c20b1576 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&) (.constprop.0) SLPVectorizer.cpp:0:0
#17 0x00005643c20b3021 llvm::SLPVectorizerPass::vectorizeChainsInBlock(llvm::BasicBlock*, llvm::slpvectorizer::BoUpSLP&) (opt+0x3cc3021)
#18 0x00005643c20bb066 llvm::SLPVectorizerPass::runImpl(llvm::Function&, llvm::ScalarEvolution*, llvm::TargetTransformInfo*, llvm::TargetLibraryInfo*, llvm::AAResults*, llvm::LoopInfo*, llvm::DominatorTree*, llvm::AssumptionCache*, llvm::DemandedBits*, llvm::OptimizationRemarkEmitter*) (.part.0) SLPVectorizer.cpp:0:0
#19 0x00005643c20bbc2b llvm::SLPVectorizerPass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (opt+0x3ccbc2b)
#20 0x00005643c19f4bf2 llvm::detail::PassModel<llvm::Function, llvm::SLPVectorizerPass, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) PassBuilder.cpp:0:0
#21 0x00005643c00c80d9 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (opt+0x1cd80d9)
#22 0x00005643c11c0252 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) NVPTXTargetMachine.cpp:0:0
#23 0x00005643c00c6942 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (opt+0x1cd6942)
#24 0x00005643c11c01b2 llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) NVPTXTargetMachine.cpp:0:0
#25 0x00005643c00c6361 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (opt+0x1cd6361)
#26 0x00005643c181b6a9 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) (opt+0x342b6a9)
#27 0x00005643bfe31ef4 optMain (opt+0x1a41ef4)
#28 0x00007f472e829d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#29 0x00007f472e829e40 call_init ./csu/../csu/libc-start.c:128:20
#30 0x00007f472e829e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#31 0x00005643bfe2512e _start (opt+0x1a3512e)
@EugeneZelenko EugeneZelenko added the crash Prefer [crash-on-valid] or [crash-on-invalid] label Mar 12, 2025
@alexey-bataev alexey-bataev self-assigned this Mar 12, 2025
@alexey-bataev
Copy link
Member

The patch was reverted, will be fixed in the new version

@alexey-bataev
Copy link
Member

Fixed in 1008539

@jeanPerier
Copy link
Contributor Author

Verified, thanks for the quick fix!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
crash Prefer [crash-on-valid] or [crash-on-invalid] llvm:SLPVectorizer
Projects
None yet
Development

No branches or pull requests

3 participants