Skip to content

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

Closed
@jeanPerier

Description

@jeanPerier

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)

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions