[RISCV] Implement getVScaleForTuning and thus prefer scalable vectorization when...
authorPhilip Reames <preames@rivosinc.com>
Sat, 25 Jun 2022 18:18:40 +0000 (11:18 -0700)
committerPhilip Reames <listmail@philipreames.com>
Sat, 25 Jun 2022 18:25:23 +0000 (11:25 -0700)
commit9803b0d1e7b3cbcce33c1c91d4e1cd1f20eea3d4
tree0703020c84d402d0222698bc0d39c4c4af8064f8
parentd152e50c15416c61220f218039c70f0c814e5651
[RISCV] Implement getVScaleForTuning and thus prefer scalable vectorization when enabled

LoopVectorizer uses getVScaleForTuning for deciding how to discount the cost of a potential vector factor by the amount of work performed. Without the callback implemented, the vectorizer was defaulting to an estimated vscale of 1. This results in fixed vectorization looking falsely profitable (since it used the command line VLEN).

The test change is pretty limited since a) we don't have much coverage of the vectorizer with scalable vectors at all, and b) what little coverage we have mostly uses i64 element types. There's a separate issue with <vscale x 1 x i64> which prevents us from getting to this stage of costing, and thus only the one test explicitly written to avoid that is visible in the diff. However, this is actually a very wide impact change as it changes the practical vectorization result when both fixed and scalable is enabled to scalable.

As an aside, I think the vectorizer is at little too strongly biased towards scalable when both are legal, but we can explore that separately. For now, let's just get the cost model working the way it was intended.

Differential Revision: https://reviews.llvm.org/D128547
llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
llvm/lib/Target/RISCV/RISCVTargetTransformInfo.h
llvm/test/Transforms/LoopVectorize/RISCV/scalable-basics.ll