[ARM] Split large truncating MVE stores
commite227fcd30d31f54866c2f66875689829ccc3a4b8
authorDavid Green <david.green@arm.com>
Tue, 24 Sep 2019 10:10:41 +0000 (24 10:10 +0000)
committerDavid Green <david.green@arm.com>
Tue, 24 Sep 2019 10:10:41 +0000 (24 10:10 +0000)
tree86e2f075e56c9c80104bf5af94919710c5d3b68e
parentf3c63272f8f213e4f047e68aa2169093ab0c5496
[ARM] Split large truncating MVE stores

MVE does not have a simple sign extend instruction that can move elements
across lanes. We currently often end up moving each lane into and out of a GPR,
in order to get elements into the correct places. When we have a store of a
trunc (or a extend of a load), we can instead just split the store/load in two,
using the narrowing/widening load/store instructions from each half of the
vector.

This does that for stores. It happens very early in a store combine, so as to
easily detect the truncates. (It would be possible to do this later, but that
would involve looking through a buildvector of extract elements. Not impossible
but this way seemed simpler).

By enabling store combines we also get a vmovdrr combine for free, helping some
other tests.

Differential Revision: https://reviews.llvm.org/D67828

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@372717 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/ARM/ARMISelLowering.cpp
test/CodeGen/Thumb2/float-ops.ll
test/CodeGen/Thumb2/mve-masked-store.ll