[RISCV] Expand unaligned fixed-length vector memory accesses
authorFraser Cormack <fraser@codeplay.com>
Fri, 14 May 2021 12:56:41 +0000 (13:56 +0100)
committerFraser Cormack <fraser@codeplay.com>
Wed, 2 Jun 2021 08:27:44 +0000 (09:27 +0100)
commit3b0a33d0ade8a6bacfb5a843f3263806cd12da0a
treeef9f8214258b5e054e2feee4ff96413e08709279
parent5f25145306e7f05a468b4520e31e05aaae66b2a0
[RISCV] Expand unaligned fixed-length vector memory accesses

RVV vectors must be aligned to their element types, so anything less is
unaligned.

For regular loads and stores, our custom-lowering of fixed-length
vectors meant that we opted out of LegalizeDAG's built-in unaligned
expansion. This patch adds that logic in to our custom lower function.

For masked intrinsics, we declare that anything unaligned is not legal,
leaving the ScalarizeMaskedMemIntrin pass to do the expansion for us.

Note that neither of these methods can handle the expansion of
scalable-vector memory ops, so those cases are left alone by this patch.
Scalable loads and stores already go through expansion by default but
hit an assertion, and scalable masked intrinsics will silently generate
incorrect code. It may be prudent to return an error in both of these
cases.

Reviewed By: craig.topper

Differential Revision: https://reviews.llvm.org/D102493
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
llvm/lib/Target/RISCV/RISCVTargetTransformInfo.h
llvm/test/Analysis/CostModel/RISCV/fixed-vector-gather.ll
llvm/test/Analysis/CostModel/RISCV/fixed-vector-scatter.ll
llvm/test/CodeGen/RISCV/rvv/fixed-vectors-unaligned.ll [new file with mode: 0644]