[riscv] Use X0 for destination of VSETVLI instruction if result unused
authorPhilip Reames <preames@rivosinc.com>
Thu, 5 May 2022 14:35:09 +0000 (07:35 -0700)
committerPhilip Reames <preames@rivosinc.com>
Thu, 5 May 2022 14:39:45 +0000 (07:39 -0700)
commit042a7a5f0da8beb89cbbfe2f1c3a155e654d9375
tree904d9a7c8bc7c66665710bf33170fd9fd622e0b7
parentc7a6b11b7e2ca40d9a0406d5db9cc122e5091023
[riscv] Use X0 for destination of VSETVLI instruction if result unused

If the GPR destination register of a VSETVLI instruction is unused, we can replace it with X0. This discards the result, and thus reduces register pressure.

Since after the core insertion/lowering algorithm has run, many user written VSETVLIs will have their GPR result unused (as VTYPE/VLEN is now explicitly read instead), this kicks in for most tests which involve a vsetvli intrinsic for fixed length vectorization. (vscale vectorization generally uses the GPR result to know how far to e.g. advance pointers in a loop and these uses are not removed.)  When inserting VSETVLIs to lower psuedos, we prefer the X0 form anyways.

Differential Revision: https://reviews.llvm.org/D124961
llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
llvm/test/CodeGen/RISCV/rvv/rv32-vsetvli-intrinsics.ll
llvm/test/CodeGen/RISCV/rvv/rv64-vsetvli-intrinsics.ll
llvm/test/CodeGen/RISCV/rvv/vsetvli-insert-crossbb.ll
llvm/test/CodeGen/RISCV/rvv/vsetvli-insert-crossbb.mir
llvm/test/CodeGen/RISCV/rvv/vsetvli-insert.ll
llvm/test/CodeGen/RISCV/rvv/vsetvli-insert.mir