[llvm] bb20724 - [X86] Move Non-VLX handling for VPMADD52 instructions entirely into tablegen (#200800)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 1 23:16:52 PDT 2026
Author: Simon Pilgrim
Date: 2026-06-02T06:16:46Z
New Revision: bb20724ecb743be0d67270934830510f0149ed15
URL: https://github.com/llvm/llvm-project/commit/bb20724ecb743be0d67270934830510f0149ed15
DIFF: https://github.com/llvm/llvm-project/commit/bb20724ecb743be0d67270934830510f0149ed15.diff
LOG: [X86] Move Non-VLX handling for VPMADD52 instructions entirely into tablegen (#200800)
Just widen v2i64/v4i64 cases to v8i64
Removes more VLX/NoVLX testing from DAG
Added:
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/lib/Target/X86/X86InstrAVX512.td
llvm/test/CodeGen/X86/ifma-combine-vpmadd52.ll
llvm/test/CodeGen/X86/slow-pmullq.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 7e6daba3cfb37..6c5e682a41542 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -50735,9 +50735,8 @@ static SDValue combineMulToPMADD52(SDNode *N, const SDLoc &DL,
// 128/256-bit vectors (v2i64/v4i64) require either AVX512-IFMA + VLX, or
// AVX-IFMA.
bool Supported512 = (VT == MVT::v8i64) && Subtarget.hasIFMA();
- bool SupportedSmall =
- (VT == MVT::v2i64 || VT == MVT::v4i64) &&
- ((Subtarget.hasIFMA() && Subtarget.hasVLX()) || Subtarget.hasAVXIFMA());
+ bool SupportedSmall = (VT == MVT::v2i64 || VT == MVT::v4i64) &&
+ (Subtarget.hasIFMA() || Subtarget.hasAVXIFMA());
if (!Supported512 && !SupportedSmall)
return SDValue();
@@ -59759,11 +59758,6 @@ static SDValue matchVPMADD52(SDNode *N, SelectionDAG &DAG, const SDLoc &DL,
(!Subtarget.hasAVXIFMA() && !Subtarget.hasIFMA()))
return SDValue();
- // Need AVX-512VL vector length extensions if operating on XMM/YMM registers
- if (!Subtarget.hasAVXIFMA() && !Subtarget.hasVLX() &&
- VT.getSizeInBits() < 512)
- return SDValue();
-
const auto TotalSize = VT.getSizeInBits();
if (TotalSize < 128 || !isPowerOf2_64(TotalSize))
return SDValue();
diff --git a/llvm/lib/Target/X86/X86InstrAVX512.td b/llvm/lib/Target/X86/X86InstrAVX512.td
index d8367412be587..34ea27a55d77e 100644
--- a/llvm/lib/Target/X86/X86InstrAVX512.td
+++ b/llvm/lib/Target/X86/X86InstrAVX512.td
@@ -7229,6 +7229,35 @@ defm VPMADD52HUQ : avx512_pmadd52_common<0xb5, "vpmadd52huq", x86vpmadd52h,
SchedWriteVecIMul, avx512vl_i64_info>,
REX_W;
+// Use 512bit VPMADD52LUQ/VPMADD52HUQ version to implement 128/256 bit in case NoVLX.
+let Predicates = [HasIFMA, NoVLX] in {
+ def : Pat<(v2i64 (x86vpmadd52l VR128X:$x, VR128X:$y, VR128X:$z)),
+ (EXTRACT_SUBREG
+ (VPMADD52LUQZr
+ (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR128X:$x, sub_xmm),
+ (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR128X:$y, sub_xmm),
+ (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR128X:$z, sub_xmm)), sub_xmm)>;
+ def : Pat<(v2i64 (x86vpmadd52l VR128X:$x, VR128X:$y, VR128X:$z)),
+ (EXTRACT_SUBREG
+ (VPMADD52HUQZr
+ (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR128X:$x, sub_xmm),
+ (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR128X:$y, sub_xmm),
+ (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR128X:$z, sub_xmm)), sub_xmm)>;
+
+ def : Pat<(v4i64 (x86vpmadd52l VR256X:$x, VR256X:$y, VR256X:$z)),
+ (EXTRACT_SUBREG
+ (VPMADD52LUQZr
+ (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR256X:$x, sub_ymm),
+ (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR256X:$y, sub_ymm),
+ (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR256X:$z, sub_ymm)), sub_ymm)>;
+ def : Pat<(v4i64 (x86vpmadd52l VR256X:$x, VR256X:$y, VR256X:$z)),
+ (EXTRACT_SUBREG
+ (VPMADD52HUQZr
+ (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR256X:$x, sub_ymm),
+ (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR256X:$y, sub_ymm),
+ (INSERT_SUBREG (v8i64 (IMPLICIT_DEF)), VR256X:$z, sub_ymm)), sub_ymm)>;
+}
+
//===----------------------------------------------------------------------===//
// AVX-512 Scalar convert from sign integer to float/double
//===----------------------------------------------------------------------===//
diff --git a/llvm/test/CodeGen/X86/ifma-combine-vpmadd52.ll b/llvm/test/CodeGen/X86/ifma-combine-vpmadd52.ll
index 019496c504887..3287cdcf6d672 100644
--- a/llvm/test/CodeGen/X86/ifma-combine-vpmadd52.ll
+++ b/llvm/test/CodeGen/X86/ifma-combine-vpmadd52.ll
@@ -222,11 +222,12 @@ define <4 x i64> @test_256_combine(<4 x i64> %x, <4 x i64> %y, <4 x i64> %z) {
;
; AVX512-NOVL-LABEL: test_256_combine:
; AVX512-NOVL: # %bb.0:
+; AVX512-NOVL-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2
; AVX512-NOVL-NEXT: vpbroadcastq {{.*#+}} ymm3 = [67108863,67108863,67108863,67108863]
; AVX512-NOVL-NEXT: vpand %ymm3, %ymm0, %ymm0
; AVX512-NOVL-NEXT: vpand %ymm3, %ymm1, %ymm1
-; AVX512-NOVL-NEXT: vpmuldq %ymm1, %ymm0, %ymm0
-; AVX512-NOVL-NEXT: vpaddq %ymm0, %ymm2, %ymm0
+; AVX512-NOVL-NEXT: vpmadd52luq %zmm2, %zmm1, %zmm0
+; AVX512-NOVL-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
; AVX512-NOVL-NEXT: retq
;
; AVX512VL-LABEL: test_256_combine:
@@ -274,11 +275,13 @@ define <2 x i64> @test_128_combine(<2 x i64> %x, <2 x i64> %y, <2 x i64> %z) {
;
; AVX512-NOVL-LABEL: test_128_combine:
; AVX512-NOVL: # %bb.0:
+; AVX512-NOVL-NEXT: # kill: def $xmm2 killed $xmm2 def $zmm2
; AVX512-NOVL-NEXT: vpbroadcastq {{.*#+}} xmm3 = [67108863,67108863]
; AVX512-NOVL-NEXT: vpand %xmm3, %xmm0, %xmm0
; AVX512-NOVL-NEXT: vpand %xmm3, %xmm1, %xmm1
-; AVX512-NOVL-NEXT: vpmuldq %xmm1, %xmm0, %xmm0
-; AVX512-NOVL-NEXT: vpaddq %xmm0, %xmm2, %xmm0
+; AVX512-NOVL-NEXT: vpmadd52luq %zmm2, %zmm1, %zmm0
+; AVX512-NOVL-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0
+; AVX512-NOVL-NEXT: vzeroupper
; AVX512-NOVL-NEXT: retq
;
; AVX512VL-LABEL: test_128_combine:
diff --git a/llvm/test/CodeGen/X86/slow-pmullq.ll b/llvm/test/CodeGen/X86/slow-pmullq.ll
index 501bdf1761366..e3bb600cb7042 100644
--- a/llvm/test/CodeGen/X86/slow-pmullq.ll
+++ b/llvm/test/CodeGen/X86/slow-pmullq.ll
@@ -169,7 +169,8 @@ define <4 x i64> @test_mul_52bit_ymm(<4 x i64> %a, <4 x i64> %b) {
; NOVLX-NEXT: vpand %ymm2, %ymm0, %ymm0
; NOVLX-NEXT: vpbroadcastq {{.*#+}} ymm2 = [524287,524287,524287,524287]
; NOVLX-NEXT: vpand %ymm2, %ymm1, %ymm1
-; NOVLX-NEXT: vpmullq %zmm1, %zmm0, %zmm0
+; NOVLX-NEXT: vpxor %xmm2, %xmm2, %xmm2
+; NOVLX-NEXT: vpmadd52luq %zmm2, %zmm1, %zmm0
; NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
; NOVLX-NEXT: retq
;
@@ -187,7 +188,8 @@ define <4 x i64> @test_mul_52bit_ymm(<4 x i64> %a, <4 x i64> %b) {
; GENERIC-NOVLX-NEXT: vpand %ymm2, %ymm0, %ymm0
; GENERIC-NOVLX-NEXT: vpbroadcastq {{.*#+}} ymm2 = [524287,524287,524287,524287]
; GENERIC-NOVLX-NEXT: vpand %ymm2, %ymm1, %ymm1
-; GENERIC-NOVLX-NEXT: vpmullq %zmm1, %zmm0, %zmm0
+; GENERIC-NOVLX-NEXT: vpxor %xmm2, %xmm2, %xmm2
+; GENERIC-NOVLX-NEXT: vpmadd52luq %zmm2, %zmm1, %zmm0
; GENERIC-NOVLX-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
; GENERIC-NOVLX-NEXT: retq
More information about the llvm-commits
mailing list