[all-commits] [llvm/llvm-project] 3b5430: [RISCV] Add a VL output to vleff intrinsics.
Craig Topper via All-commits
all-commits at lists.llvm.org
Thu Jan 21 17:25:12 PST 2021
Branch: refs/heads/master
Home: https://github.com/llvm/llvm-project
Commit: 3b5430eb0dad5b239d0671503f73f6b713aaaf40
https://github.com/llvm/llvm-project/commit/3b5430eb0dad5b239d0671503f73f6b713aaaf40
Author: Craig Topper <craig.topper at sifive.com>
Date: 2021-01-21 (Thu, 21 Jan 2021)
Changed paths:
M llvm/include/llvm/IR/IntrinsicsRISCV.td
M llvm/lib/Target/RISCV/RISCVISelLowering.cpp
M llvm/lib/Target/RISCV/RISCVISelLowering.h
M llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td
M llvm/lib/Target/RISCV/RISCVMCInstLower.cpp
M llvm/test/CodeGen/RISCV/rvv/vleff-rv32.ll
M llvm/test/CodeGen/RISCV/rvv/vleff-rv64.ll
Log Message:
-----------
[RISCV] Add a VL output to vleff intrinsics.
The fault-only-first-load instructions can reduce VL if an element
other than element 0 triggers a memory fault. This can be used to
vectorize loops with data dependent exit conditions like strcmp or
strlen.
This patch adds a VL output to these intrinsics so that the new
VL value can be captured by software. This will be expanded to
'csrr gpr, vl' after the vleff instruction during SelectionDAG.
By doing this with one intrinsic we are able to guarantee that the
csrr reads the VL value produced by the vleff instruction. Having
it as a separate intrinsic would make it impossible to guarantee
ordering without making every other vector intrinsic have side
effects.
The intrinsics are expanded during lowering into two ISD nodes
that are glued together. These ISD nodes will go
through isel separately, but should maintain the glue so that they
get emitted adjacently by InstrEmitter.
I've only ran the chain through the vleff instruction, allowing
the READ_VL to be deleted if it is unused.
Reviewed By: HsiangKai
Differential Revision: https://reviews.llvm.org/D94286
More information about the All-commits
mailing list