[llvm] [X86] Combine `uitofp <v x i32> to <v x half>` (PR #121809)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 6 09:51:53 PST 2025
https://github.com/abhishek-kaushik22 created https://github.com/llvm/llvm-project/pull/121809
Closes #121793
>From 75e77f226d465f71ea4ec7523562efe92774e005 Mon Sep 17 00:00:00 2001
From: abhishek-kaushik22 <abhishek.kaushik at intel.com>
Date: Mon, 6 Jan 2025 23:21:12 +0530
Subject: [PATCH] [X86] Combine `uitofp <v x i32> to <v x half>`
Closes #121793
---
llvm/lib/Target/X86/X86ISelLowering.cpp | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 68bdeb1cebeb9c..156ad47efcbf4f 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -56098,8 +56098,19 @@ static SDValue combineUIntToFP(SDNode *N, SelectionDAG &DAG,
if (InVT.isVector() && VT.getVectorElementType() == MVT::f16) {
unsigned ScalarSize = InVT.getScalarSizeInBits();
if ((ScalarSize == 16 && Subtarget.hasFP16()) || ScalarSize == 32 ||
- ScalarSize >= 64)
- return SDValue();
+ ScalarSize >= 64) {
+ if (ScalarSize != 32 || VT.getScalarSizeInBits() != 16 ||
+ Subtarget.hasFP16())
+ return SDValue();
+ // UINT_TO_FP(vXi32 to vXf16) -> FP_ROUND(UINT_TO_FP(vXi32 to vXf32), 0)
+ return DAG.getNode(
+ ISD::FP_ROUND, SDLoc(N), VT,
+ DAG.getNode(ISD::UINT_TO_FP, SDLoc(N),
+ InVT.changeVectorElementType(MVT::f32), Op0),
+ DAG.getTargetConstant(
+ 0, SDLoc(N),
+ DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout())));
+ }
SDLoc dl(N);
EVT DstVT =
EVT::getVectorVT(*DAG.getContext(),
More information about the llvm-commits
mailing list