[RISCV] Teach lowerVECTOR_SHUFFLE to recognize some shuffles as vnsrl.
authorCraig Topper <craig.topper@sifive.com>
Tue, 13 Sep 2022 17:58:48 +0000 (10:58 -0700)
committerCraig Topper <craig.topper@sifive.com>
Tue, 13 Sep 2022 18:07:11 +0000 (11:07 -0700)
commit8d7e73effe860286dabfca5702d8e8efc9d43cd4
tree23a8ee290ffafca7532336bee84c033c17a66a27
parent8989aa003f3d33498801e3a41871472da1bc211e
[RISCV] Teach lowerVECTOR_SHUFFLE to recognize some shuffles as vnsrl.

Unary shuffles such as <0,2,4,6,8,10,12,14> or <1,3,5,7,9,11,13,15>
where half the elements are returned, can be lowered using vnsrl.

SelectionDAGBuilder lowers such shuffles as a build_vector of
extract_elements since the mask has less elements than the source.
To fix this, I've enable the extractSubvectorIsCheapHook to allow
DAGCombine to rebuild the shuffle using 2 extract_subvectors preceding
the shufffle.

I've gone very conservative on extractSubvectorIsCheapHook to minimize
test impact and match what we have test coverage for. This can be
improved in the future.

Reviewed By: reames

Differential Revision: https://reviews.llvm.org/D133736
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
llvm/lib/Target/RISCV/RISCVISelLowering.h
llvm/lib/Target/RISCV/RISCVInstrInfoVVLPatterns.td
llvm/test/CodeGen/RISCV/rvv/fixed-vectors-fp-buildvec.ll
llvm/test/CodeGen/RISCV/rvv/fixed-vectors-shufflevector-vnsrl.ll [new file with mode: 0644]