Issue 175058
Summary "EVL used by unexpected VPInstruction" error from VPlanVerifier for RV32
Labels new issue
Assignees
Reporter asb
    This is a separate issue to #175028

Given this test case:
```llvm
define void @buf2img(ptr %imgX, i32 %size_x) {
entry:
  br label %for.cond70

for.cond70: ; preds = %for.cond74, %entry
  %buf.addr.0 = phi ptr [ null, %entry ], [ %buf.addr.1, %for.cond74 ]
  br label %for.cond74

for.cond74: ; preds = %for.body77, %for.cond70
 %buf.addr.1 = phi ptr [ %buf.addr.0, %for.cond70 ], [ %incdec.ptr, %for.body77 ]
  %i.1 = phi i32 [ 0, %for.cond70 ], [ %inc82, %for.body77 ]
 %cmp75 = icmp slt i32 %i.1, %size_x
  br i1 %cmp75, label %for.body77, label %for.cond70

for.body77:                                       ; preds = %for.cond74
  %incdec.ptr = getelementptr i8, ptr %buf.addr.1, i32 1
  %0 = load i8, ptr %buf.addr.1, align 1
  %conv78 = zext i8 %0 to i16
 store i16 %conv78, ptr %imgX, align 2
  %inc82 = add i32 %i.1, 1
  br label %for.cond74
}
```

We get (on HEAD):
```
$ ./build/rvdev/bin/clang --target=riscv32-linux-gnu -c -march=rv32gcv -O3 tc2.ll 
warning: overriding the module target triple with riscv32-unknown-linux-gnu
 [-Woverride-module]
EVL used by unexpected VPInstruction
EVL VPValue is not used correctly
clang: ../../llvm/lib/Transforms/Vectorize/LoopVectorize.cpp:7476: DenseMap<const SCEV *, Value *> llvm::LoopVectorizationPlanner::executePlan(ElementCount, unsigned int, VPlan &, InnerLoopVectorizer &, DominatorTree *, bool): Assertion `verifyVPlanIsValid(BestVPlan, true ) && "final VPlan is invalid"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.	Program arguments: ./build/rvdev/bin/clang --target=riscv32-linux-gnu -c -march=rv32gcv -O3 tc2.ll
1.	Optimizer
2.	Running pass "function<eager-inv>(drop-unnecessary-assumes,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;>,drop-unnecessary-assumes,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-arithmetic;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;switch-to-arithmetic;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 "tc2.ll"
3.	Running pass "loop-vectorize<no-interleave-forced-only;no-vectorize-forced-only;>" on function "buf2img"
 #0 0x00007e01b0aa7579 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) build/rvdev/../../llvm/lib/Support/Unix/Signals.inc:842:11
 #1 0x00007e01b0aa7b9b PrintStackTraceSignalHandler(void*) build/rvdev/../../llvm/lib/Support/Unix/Signals.inc:924:1
 #2 0x00007e01b0aa5631 llvm::sys::RunSignalHandlers() build/rvdev/../../llvm/lib/Support/Signals.cpp:108:5
 #3 0x00007e01b0aa6d0b llvm::sys::CleanupOnSignal(unsigned long) build/rvdev/../../llvm/lib/Support/Unix/Signals.inc:377:1
 #4 0x00007e01b08ec062 (anonymous namespace)::CrashRecoveryContextImpl::HandleCrash(int, unsigned long) build/rvdev/../../llvm/lib/Support/CrashRecoveryContext.cpp:0:7
 #5 0x00007e01b08ec4c1 CrashRecoverySignalHandler(int) build/rvdev/../../llvm/lib/Support/CrashRecoveryContext.cpp:391:1
 #6 0x00007e01afe3e4d0 (/usr/lib/libc.so.6+0x3e4d0)
 #7 0x00007e01afe9890c (/usr/lib/libc.so.6+0x9890c)
 #8 0x00007e01afe3e3a0 raise (/usr/lib/libc.so.6+0x3e3a0)
 #9 0x00007e01afe2557a abort (/usr/lib/libc.so.6+0x2557a)
#10 0x00007e01afe254e3 __assert_perror_fail (/usr/lib/libc.so.6+0x254e3)
#11 0x00007e01b6987dc8 llvm::LoopVectorizationPlanner::executePlan(llvm::ElementCount, unsigned int, llvm::VPlan&, llvm::InnerLoopVectorizer&, llvm::DominatorTree*, bool) build/rvdev/../../llvm/lib/Transforms/Vectorize/LoopVectorize.cpp:0:3
#12 0x00007e01b69939e0 llvm::LoopVectorizePass::processLoop(llvm::Loop*) build/rvdev/../../llvm/lib/Transforms/Vectorize/LoopVectorize.cpp:10090:5
#13 0x00007e01b69988fc llvm::LoopVectorizePass::runImpl(llvm::Function&) build/rvdev/../../llvm/lib/Transforms/Vectorize/LoopVectorize.cpp:10143:30
#14 0x00007e01b6998d7e llvm::LoopVectorizePass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) build/rvdev/../../llvm/lib/Transforms/Vectorize/LoopVectorize.cpp:10181:32
#15 0x00007e01ae25a8d4 llvm::detail::PassModel<llvm::Function, llvm::LoopVectorizePass, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) build/rvdev/../../llvm/include/llvm/IR/PassManagerInternal.h:91:17
...
```
I can add `VPInstruction::PtrAdd` to the list of explicitly allowed instructions at around line 182 in VPlanVerifier.cpp, compilation works and and llvm-test-suite builds and runs for rv32v with evl tail folding (if the verifier workaround suggested in #175028 is also applied). I am not familiar enough with VPlan to know if this is a reasonable fix though, hence the issue rather than a patch.

CC @lukel97 
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to