Skip to content

Loop Vectorizer crashes with assertion failure :: Assertion `!State.VF.isScalable() && "Can't scalarize a scalable vector" on hitting a store instruction. #60831

@kartcq

Description

@kartcq

Loop vectorizer aborts with assertion failure on hitting store instruction in a loop

virtual void llvm::VPReplicateRecipe::execute(llvm::VPTransformState &): Assertion `!State.VF.isScalable() && "Can't scalarize a scalable vector"' failed.

I have reduced the IR to simple loop containing a store instruction.

The issue started to appear after the commit D134460 where tail masking condition is added for legalizing scalarization.
@fhahn

Find the IR and the command to reproduce the failure below.

IR
test_loop.ll

target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
target triple = "aarch64-unknown-linux-gnu"

define dso_local fastcc void @_test_loop(i64 %n, i8* %store_dest) unnamed_addr #0 {
  br label %1

.critedge5:                                       ; preds = %1
  ret void

1:                                                ; preds = %1, %0
  %2 = phi i64 [ %5, %1 ], [ 0, %0 ]
  %3 = trunc i64 %2 to i8
  %4 = getelementptr i8, i8* %store_dest, i64 0
  store i8 %3, i8* %4, align 1
  %5 = add nsw i64 %2, 1
  %6 = icmp sle i64 %5, %n
  br i1 %6, label %1, label %.critedge5
}

attributes #0 = { "target-features"="+crc,+crypto,+fp-armv8,+neon,+sve,+v8.1a,+v8.2a,+v8.3a,+v8.4a,+v8a" }

Can be reproduced by command

opt -passes=loop-vectorize test_loop.ll

Dump of crash

virtual void llvm::VPReplicateRecipe::execute(llvm::VPTransformState &): Assertion `!State.VF.isScalable() && "Can't scalarize a scalable vector"' 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 -passes=loop-vectorize test_loop.ll
 #0 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) 
 #1 llvm::sys::RunSignalHandlers() 
 #2 SignalHandler(int) Signals.cpp:0:0
 #3 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390)
 #4 raise /build/glibc-S7Ft5T/glibc-2.23/signal/../sysdeps/unix/sysv/linux/raise.c:54:0
 #5 abort /build/glibc-S7Ft5T/glibc-2.23/stdlib/abort.c:91:0
 #6 __assert_fail_base /build/glibc-S7Ft5T/glibc-2.23/assert/assert.c:92:0
 #7 (/lib/x86_64-linux-gnu/libc.so.6+0x2dc92)
 #8 llvm::VPReplicateRecipe::execute(llvm::VPTransformState&) 
 #9 llvm::VPBasicBlock::execute(llvm::VPTransformState*) 
#10 llvm::VPRegionBlock::execute(llvm::VPTransformState*) 
#11 llvm::VPlan::execute(llvm::VPTransformState*) 
#12 llvm::LoopVectorizationPlanner::executePlan(llvm::ElementCount, unsigned int, llvm::VPlan&, llvm::InnerLoopVectorizer&, llvm::DominatorTree*, bool) 
#13 llvm::LoopVectorizePass::processLoop(llvm::Loop*) 
#14 llvm::LoopVectorizePass::runImpl(llvm::Function&, llvm::ScalarEvolution&, llvm::LoopInfo&, llvm::TargetTransformInfo&, llvm::DominatorTree&, llvm::BlockFrequencyInfo&, llvm::TargetLibraryInfo*, llvm::DemandedBits&, llvm::AssumptionCache&, llvm::LoopAccessInfoManager&, llvm::OptimizationRemarkEmitter&, llvm::ProfileSummaryInfo*) 
#15 llvm::LoopVectorizePass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) 
#16 llvm::detail::PassModel<llvm::Function, llvm::LoopVectorizePass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) 
#17 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) 
#18 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) 
#19 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) 
#20 llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) 
#21 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) 
#22 llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef<llvm::PassPlugin>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool, bool) 
#23 main 
#24 __libc_start_main /build/glibc-S7Ft5T/glibc-2.23/csu/../csu/libc-start.c:325:0
#25 _start 
Aborted

Metadata

Metadata

Assignees

No one assigned

    Labels

    crashPrefer [crash-on-valid] or [crash-on-invalid]vectorizers

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions