[llvm] Make extract vector for bf16 types legal (PR #222913)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 11 03:37:11 PDT 2026
https://github.com/tfzee created https://github.com/llvm/llvm-project/pull/222913
Fixes #222585
Makes EXTRACT_SUBVECTOR legal for bf16 types leading to this new codegen
```asm
# $ ./build/bin/clang test.c -O3 -march=novalake -mprefer-vector-width=512 -ffast-math -S -o -
foo:
vmovups (%rsi), %zmm0
vmulph (%rdi), %zmm0, %zmm0
vextractf64x4 $1, %zmm0, %ymm1
vaddph %zmm1, %zmm0, %zmm0
vextractf128 $1, %ymm0, %xmm1
vaddph %xmm1, %xmm0, %xmm0
vshufpd $1, %xmm0, %xmm0, %xmm1 # xmm1 = xmm0[1,0]
vaddph %xmm1, %xmm0, %xmm0
vmovshdup %xmm0, %xmm1 # xmm1 = xmm0[1,1,3,3]
vaddph %xmm1, %xmm0, %xmm0
vpsrld $16, %xmm0, %xmm1
vaddsh %xmm1, %xmm0, %xmm0
vzeroupper
retq
bar:
vmovups (%rsi), %zmm0
vmulbf16 (%rdi), %zmm0, %zmm0
vextractf64x4 $1, %zmm0, %ymm1
vaddbf16 %zmm1, %zmm0, %zmm0
vextractf32x4 $1, %zmm0, %xmm1
vaddbf16 %xmm1, %xmm0, %xmm0
vshufpd $1, %xmm0, %xmm0, %xmm1 # xmm1 = xmm0[1,0]
vaddbf16 %xmm1, %xmm0, %xmm0
vmovshdup %xmm0, %xmm1 # xmm1 = xmm0[1,1,3,3]
vaddbf16 %xmm1, %xmm0, %xmm0
vpsrld $16, %xmm0, %xmm1
vaddbf16 %xmm1, %xmm0, %xmm0
vzeroupper
retq
```
>From 75afeef38c475492bdba26baa5c8ba45a10c40b9 Mon Sep 17 00:00:00 2001
From: "Ziegler, Tim" <tim.ziegler at intel.com>
Date: Fri, 11 Sep 2026 12:33:58 +0200
Subject: [PATCH] Make extract vector for bf16 types legal
---
llvm/lib/Target/X86/X86ISelLowering.cpp | 1 +
.../avx512-shuffles/shuffle-chained-bf16.ll | 24 ++-----------------
2 files changed, 3 insertions(+), 22 deletions(-)
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index a41cb2914660c..fd22ada6109c1 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -2590,6 +2590,7 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
setOperationAction(ISD::VSELECT, VT, Custom);
setOperationAction(ISD::BUILD_VECTOR, VT, Custom);
setOperationAction(ISD::VECTOR_SHUFFLE, VT, Custom);
+ setOperationAction(ISD::EXTRACT_SUBVECTOR, VT, Legal);
setOperationAction(ISD::INSERT_SUBVECTOR, VT, Legal);
setOperationAction(ISD::CONCAT_VECTORS, VT, Custom);
}
diff --git a/llvm/test/CodeGen/X86/avx512-shuffles/shuffle-chained-bf16.ll b/llvm/test/CodeGen/X86/avx512-shuffles/shuffle-chained-bf16.ll
index a7c79016334fa..85e5a7b6c39be 100644
--- a/llvm/test/CodeGen/X86/avx512-shuffles/shuffle-chained-bf16.ll
+++ b/llvm/test/CodeGen/X86/avx512-shuffles/shuffle-chained-bf16.ll
@@ -6,19 +6,9 @@ target triple = "x86_64-unknown-linux-gnu"
define <2 x bfloat> @shuffle_chained_v32bf16_v2bf16(<32 x bfloat> %a) {
; CHECK-LABEL: shuffle_chained_v32bf16_v2bf16:
; CHECK: # %bb.0:
-; CHECK-NEXT: pushq %rbp
-; CHECK-NEXT: .cfi_def_cfa_offset 16
-; CHECK-NEXT: .cfi_offset %rbp, -16
-; CHECK-NEXT: movq %rsp, %rbp
-; CHECK-NEXT: .cfi_def_cfa_register %rbp
-; CHECK-NEXT: andq $-64, %rsp
-; CHECK-NEXT: addq $-128, %rsp
; CHECK-NEXT: vmovd {{.*#+}} xmm1 = [0,16,0,0,0,0,0,0]
; CHECK-NEXT: vpermw %zmm0, %zmm1, %zmm0
; CHECK-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0
-; CHECK-NEXT: movq %rbp, %rsp
-; CHECK-NEXT: popq %rbp
-; CHECK-NEXT: .cfi_def_cfa %rsp, 8
; CHECK-NEXT: vzeroupper
; CHECK-NEXT: retq
%s = shufflevector <32 x bfloat> %a, <32 x bfloat> zeroinitializer, <32 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23, i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>
@@ -29,18 +19,8 @@ define <2 x bfloat> @shuffle_chained_v32bf16_v2bf16(<32 x bfloat> %a) {
define <2 x bfloat> @shuffle_chained_v16bf16(<16 x bfloat> %a) {
; CHECK-LABEL: shuffle_chained_v16bf16:
; CHECK: # %bb.0:
-; CHECK-NEXT: pushq %rbp
-; CHECK-NEXT: .cfi_def_cfa_offset 16
-; CHECK-NEXT: .cfi_offset %rbp, -16
-; CHECK-NEXT: movq %rsp, %rbp
-; CHECK-NEXT: .cfi_def_cfa_register %rbp
-; CHECK-NEXT: andq $-32, %rsp
-; CHECK-NEXT: subq $96, %rsp
-; CHECK-NEXT: vmovdqa %ymm0, (%rsp)
-; CHECK-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
-; CHECK-NEXT: movq %rbp, %rsp
-; CHECK-NEXT: popq %rbp
-; CHECK-NEXT: .cfi_def_cfa %rsp, 8
+; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm1
+; CHECK-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
; CHECK-NEXT: vzeroupper
; CHECK-NEXT: retq
%s = shufflevector <16 x bfloat> %a, <16 x bfloat> zeroinitializer, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
More information about the llvm-commits
mailing list