[llvm] [X86][FP16] Bitcast v8f16/v16f16 to vXi8 to use vXi8 vselect (PR #143484)

Phoebe Wang via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 10 00:36:54 PDT 2025


https://github.com/phoebewang created https://github.com/llvm/llvm-project/pull/143484

Fixes: https://godbolt.org/z/fbPYzjxTs

>From 197e23fe4356468dc59a99fa81a3636fc4e18e33 Mon Sep 17 00:00:00 2001
From: "Wang, Phoebe" <phoebe.wang at intel.com>
Date: Mon, 9 Jun 2025 16:33:11 +0800
Subject: [PATCH] [X86][FP16] Bitcast v8f16/v16f16 to vXi8 to use vXi8 vselect

Fixes: https://godbolt.org/z/fbPYzjxTs
---
 llvm/lib/Target/X86/X86ISelLowering.cpp  |  4 +++-
 llvm/test/CodeGen/X86/avx512fp16-novl.ll | 15 +++++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index b34215b316128..b3ea1b09d1dd1 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -18555,7 +18555,9 @@ SDValue X86TargetLowering::LowerVSELECT(SDValue Op, SelectionDAG &DAG) const {
     return SDValue();
 
   case MVT::v8i16:
-  case MVT::v16i16: {
+  case MVT::v16i16:
+  case MVT::v8f16:
+  case MVT::v16f16: {
     // Bitcast everything to the vXi8 type and use a vXi8 vselect.
     MVT CastVT = MVT::getVectorVT(MVT::i8, NumElts * 2);
     Cond = DAG.getBitcast(CastVT, Cond);
diff --git a/llvm/test/CodeGen/X86/avx512fp16-novl.ll b/llvm/test/CodeGen/X86/avx512fp16-novl.ll
index c64a59432abd2..1c4b7316c283c 100644
--- a/llvm/test/CodeGen/X86/avx512fp16-novl.ll
+++ b/llvm/test/CodeGen/X86/avx512fp16-novl.ll
@@ -207,3 +207,18 @@ entry:
   %s = select <8 x i1> %c, <8 x half> splat (half 0xH3C00), <8 x half> %x
   ret <8 x half> %s
 }
+
+define <4 x half> @select2(<4 x i32> %0, <4 x half> %1) {
+; CHECK-LABEL: select2:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    vpxor %xmm2, %xmm2, %xmm2
+; CHECK-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm0
+; CHECK-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
+; CHECK-NEXT:    vmovq {{.*#+}} xmm2 = [9.6E+1,9.7E+1,9.8E+1,9.9E+1,0.0E+0,0.0E+0,0.0E+0,0.0E+0]
+; CHECK-NEXT:    vpblendvb %xmm0, %xmm1, %xmm2, %xmm0
+; CHECK-NEXT:    retq
+entry:
+  %2 = icmp eq <4 x i32> %0, zeroinitializer
+  %3 = select <4 x i1> %2, <4 x half> %1, <4 x half> <half 0xH5600, half 0xH5610, half 0xH5620, half 0xH5630>
+  ret <4 x half> %3
+}



More information about the llvm-commits mailing list