diff options
author | Ramkumar Ramachandra <Ramkumar.Ramachandra@imgtec.com> | 2023-10-19 13:05:04 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-19 13:05:04 +0100 |
commit | 98c90a13c6b27768315eaecc92f036f75195eff4 (patch) | |
tree | 36b6af1389d8d42c99995df23d53f594599ee74c /llvm/lib/CodeGen/TargetLoweringBase.cpp | |
parent | 3d7802d2107f4f6518f366effc0e237bffe67bf1 (diff) | |
download | llvm-98c90a13c6b27768315eaecc92f036f75195eff4.zip llvm-98c90a13c6b27768315eaecc92f036f75195eff4.tar.gz llvm-98c90a13c6b27768315eaecc92f036f75195eff4.tar.bz2 |
ISel: introduce vector ISD::LRINT, ISD::LLRINT; custom RISCV lowering (#66924)
The issue #55208 noticed that std::rint is vectorized by the
SLPVectorizer, but a very similar function, std::lrint, is not.
std::lrint corresponds to ISD::LRINT in the SelectionDAG, and
std::llrint is a familiar cousin corresponding to ISD::LLRINT. Now,
neither ISD::LRINT nor ISD::LLRINT have a corresponding vector variant,
and the LangRef makes this clear in the documentation of llvm.lrint.*
and llvm.llrint.*.
This patch extends the LangRef to include vector variants of
llvm.lrint.* and llvm.llrint.*, and lays the necessary ground-work of
scalarizing it for all targets. However, this patch would be devoid of
motivation unless we show the utility of these new vector variants.
Hence, the RISCV target has been chosen to implement a custom lowering
to the vfcvt.x.f.v instruction. The patch also includes a CostModel for
RISCV, and a trivial follow-up can potentially enable the SLPVectorizer
to vectorize std::lrint and std::llrint, fixing #55208.
The patch includes tests, obviously for the RISCV target, but also for
the X86, AArch64, and PowerPC targets to justify the addition of the
vector variants to the LangRef.
Diffstat (limited to 'llvm/lib/CodeGen/TargetLoweringBase.cpp')
-rw-r--r-- | llvm/lib/CodeGen/TargetLoweringBase.cpp | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp index 3e4bff5..99eadf4 100644 --- a/llvm/lib/CodeGen/TargetLoweringBase.cpp +++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp @@ -873,13 +873,13 @@ void TargetLoweringBase::initActions() { // These operations default to expand for vector types. if (VT.isVector()) - setOperationAction({ISD::FCOPYSIGN, ISD::SIGN_EXTEND_INREG, - ISD::ANY_EXTEND_VECTOR_INREG, - ISD::SIGN_EXTEND_VECTOR_INREG, - ISD::ZERO_EXTEND_VECTOR_INREG, ISD::SPLAT_VECTOR}, - VT, Expand); + setOperationAction( + {ISD::FCOPYSIGN, ISD::SIGN_EXTEND_INREG, ISD::ANY_EXTEND_VECTOR_INREG, + ISD::SIGN_EXTEND_VECTOR_INREG, ISD::ZERO_EXTEND_VECTOR_INREG, + ISD::SPLAT_VECTOR, ISD::LRINT, ISD::LLRINT}, + VT, Expand); - // Constrained floating-point operations default to expand. + // Constrained floating-point operations default to expand. #define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \ setOperationAction(ISD::STRICT_##DAGN, VT, Expand); #include "llvm/IR/ConstrainedOps.def" |