[llvm-branch-commits] [llvm] release/23.x: [LoongArch] Add omitted LASX patterns for vector extend (#219351) (PR #220138)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Aug 31 18:51:16 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-loongarch
Author: llvmbot
<details>
<summary>Changes</summary>
Backport 715901096defbb408d9fb1a6f7e1959938d950c8
Requested by: @<!-- -->wangleiat
---
Full diff: https://github.com/llvm/llvm-project/pull/220138.diff
3 Files Affected:
- (modified) llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td (+20-8)
- (added) llvm/test/CodeGen/LoongArch/lasx/vec-sext-invec-mask.ll (+251)
- (added) llvm/test/CodeGen/LoongArch/lasx/vec-zext-invec.ll (+57)
``````````diff
diff --git a/llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td b/llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td
index a1d1e96fca790..449457425d936 100644
--- a/llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td
+++ b/llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td
@@ -2333,15 +2333,21 @@ def : Pat<(v4i32 (sext_invec v16i8:$vj)),
def : Pat<(v4i32 (sext_invec v8i16:$vj)),
(v4i32 (EXTRACT_SUBREG (VEXT2XV_W_H (SUBREG_TO_REG v8i16:$vj, sub_128)),
sub_128))>;
-def : Pat<(v4i64 (sext_invec v32i8:$xj)), (v4i64 (VEXT2XV_D_B v32i8:$xj))>;
-def : Pat<(v4i64 (sext_invec v16i16:$xj)), (v4i64 (VEXT2XV_D_H v16i16:$xj))>;
-def : Pat<(v4i64 (sext_invec v8i32:$xj)), (v4i64 (VEXT2XV_D_W v8i32:$xj))>;
def : Pat<(v8i16 (sext_invec v16i8:$vj)),
(v8i16 (EXTRACT_SUBREG (VEXT2XV_H_B (SUBREG_TO_REG v16i8:$vj, sub_128)),
sub_128))>;
-def : Pat<(v16i16 (sext_invec v32i8:$xj)), (v16i16 (VEXT2XV_H_B v32i8:$xj))>;
+
+def : Pat<(v4i64 (sext_invec v32i8:$xj)), (v4i64 (VEXT2XV_D_B v32i8:$xj))>;
+def : Pat<(v4i64 (sext_invec v16i16:$xj)), (v4i64 (VEXT2XV_D_H v16i16:$xj))>;
+def : Pat<(v4i64 (sext_invec v8i32:$xj)), (v4i64 (VEXT2XV_D_W v8i32:$xj))>;
def : Pat<(v8i32 (sext_invec v32i8:$xj)), (v8i32 (VEXT2XV_W_B v32i8:$xj))>;
def : Pat<(v8i32 (sext_invec v16i16:$xj)), (v8i32 (VEXT2XV_W_H v16i16:$xj))>;
+def : Pat<(v16i16 (sext_invec v32i8:$xj)), (v16i16 (VEXT2XV_H_B v32i8:$xj))>;
+
+def : Pat<(v4i64 (sext_invec v16i8:$vj)),
+ (v4i64 (VEXT2XV_D_B (SUBREG_TO_REG v16i8:$vj, sub_128)))>;
+def : Pat<(v4i64 (sext_invec v8i16:$vj)),
+ (v4i64 (VEXT2XV_D_H (SUBREG_TO_REG v8i16:$vj, sub_128)))>;
def : Pat<(v8i32 (sext_invec v16i8:$vj)),
(v8i32 (VEXT2XV_W_B (SUBREG_TO_REG v16i8:$vj, sub_128)))>;
@@ -2368,15 +2374,21 @@ def : Pat<(v4i32 (zext_invec v16i8:$vj)),
def : Pat<(v4i32 (zext_invec v8i16:$vj)),
(v4i32 (EXTRACT_SUBREG (VEXT2XV_WU_HU (SUBREG_TO_REG v8i16:$vj, sub_128)),
sub_128))>;
-def : Pat<(v4i64 (zext_invec v32i8:$xj)), (v4i64 (VEXT2XV_DU_BU v32i8:$xj))>;
-def : Pat<(v4i64 (zext_invec v16i16:$xj)), (v4i64 (VEXT2XV_DU_HU v16i16:$xj))>;
-def : Pat<(v4i64 (zext_invec v8i32:$xj)), (v4i64 (VEXT2XV_DU_WU v8i32:$xj))>;
def : Pat<(v8i16 (zext_invec v16i8:$vj)),
(v8i16 (EXTRACT_SUBREG (VEXT2XV_HU_BU (SUBREG_TO_REG v16i8:$vj, sub_128)),
sub_128))>;
-def : Pat<(v16i16 (zext_invec v32i8:$xj)), (v16i16 (VEXT2XV_HU_BU v32i8:$xj))>;
+
+def : Pat<(v4i64 (zext_invec v32i8:$xj)), (v4i64 (VEXT2XV_DU_BU v32i8:$xj))>;
+def : Pat<(v4i64 (zext_invec v16i16:$xj)), (v4i64 (VEXT2XV_DU_HU v16i16:$xj))>;
+def : Pat<(v4i64 (zext_invec v8i32:$xj)), (v4i64 (VEXT2XV_DU_WU v8i32:$xj))>;
def : Pat<(v8i32 (zext_invec v32i8:$xj)), (v8i32 (VEXT2XV_WU_BU v32i8:$xj))>;
def : Pat<(v8i32 (zext_invec v16i16:$xj)), (v8i32 (VEXT2XV_WU_HU v16i16:$xj))>;
+def : Pat<(v16i16 (zext_invec v32i8:$xj)), (v16i16 (VEXT2XV_HU_BU v32i8:$xj))>;
+
+def : Pat<(v4i64 (zext_invec v16i8:$vj)),
+ (v4i64 (VEXT2XV_DU_BU (SUBREG_TO_REG v16i8:$vj, sub_128)))>;
+def : Pat<(v4i64 (zext_invec v8i16:$vj)),
+ (v4i64 (VEXT2XV_DU_HU (SUBREG_TO_REG v8i16:$vj, sub_128)))>;
def : Pat<(v8i32 (zext_invec v16i8:$vj)),
(v8i32 (VEXT2XV_WU_BU (SUBREG_TO_REG v16i8:$vj, sub_128)))>;
diff --git a/llvm/test/CodeGen/LoongArch/lasx/vec-sext-invec-mask.ll b/llvm/test/CodeGen/LoongArch/lasx/vec-sext-invec-mask.ll
new file mode 100644
index 0000000000000..4536027edc3aa
--- /dev/null
+++ b/llvm/test/CodeGen/LoongArch/lasx/vec-sext-invec-mask.ll
@@ -0,0 +1,251 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx,+lasx < %s | FileCheck %s --check-prefixes=CHECK,LA32
+; RUN: llc --mtriple=loongarch64 --mattr=+lsx,+lasx < %s | FileCheck %s --check-prefixes=CHECK,LA64
+
+;; This test covers 128-bit sign_extend_vector_inreg to 256-bit, which could
+;; generated by the combination of setcc + logic operand (or/and/xor) pattern.
+;;
+;; Fix https://github.com/llvm/llvm-project/issues/219224
+
+define void @zext_or_masks_v4i8_to_v4i64(ptr %ptr, ptr %dst) {
+; CHECK-LABEL: zext_or_masks_v4i8_to_v4i64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: ld.w $a0, $a0, 0
+; CHECK-NEXT: vinsgr2vr.w $vr0, $a0, 0
+; CHECK-NEXT: vrepli.b $vr1, 1
+; CHECK-NEXT: vslt.b $vr1, $vr1, $vr0
+; CHECK-NEXT: vseqi.b $vr0, $vr0, 0
+; CHECK-NEXT: vor.v $vr0, $vr1, $vr0
+; CHECK-NEXT: vext2xv.d.b $xr0, $xr0
+; CHECK-NEXT: xvrepli.d $xr1, 1
+; CHECK-NEXT: xvand.v $xr0, $xr0, $xr1
+; CHECK-NEXT: xvst $xr0, $a1, 0
+; CHECK-NEXT: ret
+ %wide.load = load <4 x i8>, ptr %ptr
+ %A = icmp sgt <4 x i8> %wide.load, splat (i8 1)
+ %B = icmp eq <4 x i8> %wide.load, zeroinitializer
+ %C = or <4 x i1> %A, %B
+ %D = zext <4 x i1> %C to <4 x i64>
+ store <4 x i64> %D, ptr %dst
+ ret void
+}
+
+define void @zext_or_masks_v4i16_to_v4i64(ptr %ptr, ptr %dst) {
+; LA32-LABEL: zext_or_masks_v4i16_to_v4i64:
+; LA32: # %bb.0:
+; LA32-NEXT: ld.w $a2, $a0, 0
+; LA32-NEXT: ld.w $a0, $a0, 4
+; LA32-NEXT: vinsgr2vr.w $vr0, $a2, 0
+; LA32-NEXT: vinsgr2vr.w $vr0, $a0, 1
+; LA32-NEXT: vrepli.h $vr1, 1
+; LA32-NEXT: vslt.h $vr1, $vr1, $vr0
+; LA32-NEXT: vseqi.h $vr0, $vr0, 0
+; LA32-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-NEXT: vext2xv.d.h $xr0, $xr0
+; LA32-NEXT: xvrepli.d $xr1, 1
+; LA32-NEXT: xvand.v $xr0, $xr0, $xr1
+; LA32-NEXT: xvst $xr0, $a1, 0
+; LA32-NEXT: ret
+;
+; LA64-LABEL: zext_or_masks_v4i16_to_v4i64:
+; LA64: # %bb.0:
+; LA64-NEXT: ld.d $a0, $a0, 0
+; LA64-NEXT: vinsgr2vr.d $vr0, $a0, 0
+; LA64-NEXT: vrepli.h $vr1, 1
+; LA64-NEXT: vslt.h $vr1, $vr1, $vr0
+; LA64-NEXT: vseqi.h $vr0, $vr0, 0
+; LA64-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-NEXT: vext2xv.d.h $xr0, $xr0
+; LA64-NEXT: xvrepli.d $xr1, 1
+; LA64-NEXT: xvand.v $xr0, $xr0, $xr1
+; LA64-NEXT: xvst $xr0, $a1, 0
+; LA64-NEXT: ret
+ %wide.load = load <4 x i16>, ptr %ptr
+ %A = icmp sgt <4 x i16> %wide.load, splat (i16 1)
+ %B = icmp eq <4 x i16> %wide.load, zeroinitializer
+ %C = or <4 x i1> %A, %B
+ %D = zext <4 x i1> %C to <4 x i64>
+ store <4 x i64> %D, ptr %dst
+ ret void
+}
+
+define void @zext_or_masks_v8i8_to_v8i32(ptr %ptr, ptr %dst) {
+; LA32-LABEL: zext_or_masks_v8i8_to_v8i32:
+; LA32: # %bb.0:
+; LA32-NEXT: ld.w $a2, $a0, 0
+; LA32-NEXT: ld.w $a0, $a0, 4
+; LA32-NEXT: vinsgr2vr.w $vr0, $a2, 0
+; LA32-NEXT: vinsgr2vr.w $vr0, $a0, 1
+; LA32-NEXT: vrepli.b $vr1, 1
+; LA32-NEXT: vslt.b $vr1, $vr1, $vr0
+; LA32-NEXT: vseqi.b $vr0, $vr0, 0
+; LA32-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-NEXT: vext2xv.w.b $xr0, $xr0
+; LA32-NEXT: xvrepli.w $xr1, 1
+; LA32-NEXT: xvand.v $xr0, $xr0, $xr1
+; LA32-NEXT: xvst $xr0, $a1, 0
+; LA32-NEXT: ret
+;
+; LA64-LABEL: zext_or_masks_v8i8_to_v8i32:
+; LA64: # %bb.0:
+; LA64-NEXT: ld.d $a0, $a0, 0
+; LA64-NEXT: vinsgr2vr.d $vr0, $a0, 0
+; LA64-NEXT: vrepli.b $vr1, 1
+; LA64-NEXT: vslt.b $vr1, $vr1, $vr0
+; LA64-NEXT: vseqi.b $vr0, $vr0, 0
+; LA64-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-NEXT: vext2xv.w.b $xr0, $xr0
+; LA64-NEXT: xvrepli.w $xr1, 1
+; LA64-NEXT: xvand.v $xr0, $xr0, $xr1
+; LA64-NEXT: xvst $xr0, $a1, 0
+; LA64-NEXT: ret
+ %wide.load = load <8 x i8>, ptr %ptr
+ %A = icmp sgt <8 x i8> %wide.load, splat (i8 1)
+ %B = icmp eq <8 x i8> %wide.load, zeroinitializer
+ %C = or <8 x i1> %A, %B
+ %D = zext <8 x i1> %C to <8 x i32>
+ store <8 x i32> %D, ptr %dst
+ ret void
+}
+
+define void @sext_or_masks_v4i8_to_v4i64(ptr %ptr, ptr %dst) {
+; CHECK-LABEL: sext_or_masks_v4i8_to_v4i64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: ld.w $a0, $a0, 0
+; CHECK-NEXT: vinsgr2vr.w $vr0, $a0, 0
+; CHECK-NEXT: vrepli.b $vr1, 1
+; CHECK-NEXT: vslt.b $vr1, $vr1, $vr0
+; CHECK-NEXT: vseqi.b $vr0, $vr0, 0
+; CHECK-NEXT: vor.v $vr0, $vr1, $vr0
+; CHECK-NEXT: vext2xv.d.b $xr0, $xr0
+; CHECK-NEXT: xvst $xr0, $a1, 0
+; CHECK-NEXT: ret
+ %wide.load = load <4 x i8>, ptr %ptr
+ %A = icmp sgt <4 x i8> %wide.load, splat (i8 1)
+ %B = icmp eq <4 x i8> %wide.load, zeroinitializer
+ %C = or <4 x i1> %A, %B
+ %D = sext <4 x i1> %C to <4 x i64>
+ store <4 x i64> %D, ptr %dst
+ ret void
+}
+
+define void @sext_or_masks_v4i16_to_v4i64(ptr %ptr, ptr %dst) {
+; LA32-LABEL: sext_or_masks_v4i16_to_v4i64:
+; LA32: # %bb.0:
+; LA32-NEXT: ld.w $a2, $a0, 0
+; LA32-NEXT: ld.w $a0, $a0, 4
+; LA32-NEXT: vinsgr2vr.w $vr0, $a2, 0
+; LA32-NEXT: vinsgr2vr.w $vr0, $a0, 1
+; LA32-NEXT: vrepli.h $vr1, 1
+; LA32-NEXT: vslt.h $vr1, $vr1, $vr0
+; LA32-NEXT: vseqi.h $vr0, $vr0, 0
+; LA32-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-NEXT: vext2xv.d.h $xr0, $xr0
+; LA32-NEXT: xvst $xr0, $a1, 0
+; LA32-NEXT: ret
+;
+; LA64-LABEL: sext_or_masks_v4i16_to_v4i64:
+; LA64: # %bb.0:
+; LA64-NEXT: ld.d $a0, $a0, 0
+; LA64-NEXT: vinsgr2vr.d $vr0, $a0, 0
+; LA64-NEXT: vrepli.h $vr1, 1
+; LA64-NEXT: vslt.h $vr1, $vr1, $vr0
+; LA64-NEXT: vseqi.h $vr0, $vr0, 0
+; LA64-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-NEXT: vext2xv.d.h $xr0, $xr0
+; LA64-NEXT: xvst $xr0, $a1, 0
+; LA64-NEXT: ret
+ %wide.load = load <4 x i16>, ptr %ptr
+ %A = icmp sgt <4 x i16> %wide.load, splat (i16 1)
+ %B = icmp eq <4 x i16> %wide.load, zeroinitializer
+ %C = or <4 x i1> %A, %B
+ %D = sext <4 x i1> %C to <4 x i64>
+ store <4 x i64> %D, ptr %dst
+ ret void
+}
+
+define void @sext_or_masks_v8i8_to_v8i32(ptr %ptr, ptr %dst) {
+; LA32-LABEL: sext_or_masks_v8i8_to_v8i32:
+; LA32: # %bb.0:
+; LA32-NEXT: ld.w $a2, $a0, 0
+; LA32-NEXT: ld.w $a0, $a0, 4
+; LA32-NEXT: vinsgr2vr.w $vr0, $a2, 0
+; LA32-NEXT: vinsgr2vr.w $vr0, $a0, 1
+; LA32-NEXT: vrepli.b $vr1, 1
+; LA32-NEXT: vslt.b $vr1, $vr1, $vr0
+; LA32-NEXT: vseqi.b $vr0, $vr0, 0
+; LA32-NEXT: vor.v $vr0, $vr1, $vr0
+; LA32-NEXT: vext2xv.w.b $xr0, $xr0
+; LA32-NEXT: xvst $xr0, $a1, 0
+; LA32-NEXT: ret
+;
+; LA64-LABEL: sext_or_masks_v8i8_to_v8i32:
+; LA64: # %bb.0:
+; LA64-NEXT: ld.d $a0, $a0, 0
+; LA64-NEXT: vinsgr2vr.d $vr0, $a0, 0
+; LA64-NEXT: vrepli.b $vr1, 1
+; LA64-NEXT: vslt.b $vr1, $vr1, $vr0
+; LA64-NEXT: vseqi.b $vr0, $vr0, 0
+; LA64-NEXT: vor.v $vr0, $vr1, $vr0
+; LA64-NEXT: vext2xv.w.b $xr0, $xr0
+; LA64-NEXT: xvst $xr0, $a1, 0
+; LA64-NEXT: ret
+ %wide.load = load <8 x i8>, ptr %ptr
+ %A = icmp sgt <8 x i8> %wide.load, splat (i8 1)
+ %B = icmp eq <8 x i8> %wide.load, zeroinitializer
+ %C = or <8 x i1> %A, %B
+ %D = sext <8 x i1> %C to <8 x i32>
+ store <8 x i32> %D, ptr %dst
+ ret void
+}
+
+;; PromoteMaskArithmetic LHSTrunc/isExtVecInRegOpcode deal with LHS/RHS differently.
+
+define void @mixed_masks_wide_lhs(ptr %ptr, ptr %dst) {
+; CHECK-LABEL: mixed_masks_wide_lhs:
+; CHECK: # %bb.0:
+; CHECK-NEXT: ld.w $a2, $a0, 0
+; CHECK-NEXT: xvld $xr0, $a0, 0
+; CHECK-NEXT: vinsgr2vr.w $vr1, $a2, 0
+; CHECK-NEXT: xvrepli.d $xr2, 1
+; CHECK-NEXT: xvslt.d $xr0, $xr2, $xr0
+; CHECK-NEXT: vseqi.b $vr1, $vr1, 0
+; CHECK-NEXT: vext2xv.d.b $xr1, $xr1
+; CHECK-NEXT: xvor.v $xr0, $xr0, $xr1
+; CHECK-NEXT: xvst $xr0, $a1, 0
+; CHECK-NEXT: ret
+ %x = load <4 x i64>, ptr %ptr
+ %y = load <4 x i8>, ptr %ptr
+ %A = icmp sgt <4 x i64> %x, splat (i64 1)
+ %B = icmp eq <4 x i8> %y, zeroinitializer
+ %C = or <4 x i1> %A, %B
+ %D = sext <4 x i1> %C to <4 x i64>
+ store <4 x i64> %D, ptr %dst
+ ret void
+}
+
+define void @mixed_masks_wide_rhs(ptr %ptr, ptr %dst) {
+; CHECK-LABEL: mixed_masks_wide_rhs:
+; CHECK: # %bb.0:
+; CHECK-NEXT: ld.w $a2, $a0, 0
+; CHECK-NEXT: xvld $xr0, $a0, 0
+; CHECK-NEXT: vinsgr2vr.w $vr1, $a2, 0
+; CHECK-NEXT: xvrepli.d $xr2, 1
+; CHECK-NEXT: xvslt.d $xr0, $xr2, $xr0
+; CHECK-NEXT: xvpickev.w $xr0, $xr0, $xr0
+; CHECK-NEXT: xvpermi.d $xr0, $xr0, 216
+; CHECK-NEXT: vseqi.b $vr1, $vr1, 0
+; CHECK-NEXT: vext2xv.w.b $xr1, $xr1
+; CHECK-NEXT: vor.v $vr0, $vr1, $vr0
+; CHECK-NEXT: vext2xv.d.w $xr0, $xr0
+; CHECK-NEXT: xvst $xr0, $a1, 0
+; CHECK-NEXT: ret
+ %x = load <4 x i64>, ptr %ptr
+ %y = load <4 x i8>, ptr %ptr
+ %A = icmp sgt <4 x i64> %x, splat (i64 1)
+ %B = icmp eq <4 x i8> %y, zeroinitializer
+ %C = or <4 x i1> %B, %A
+ %D = sext <4 x i1> %C to <4 x i64>
+ store <4 x i64> %D, ptr %dst
+ ret void
+}
diff --git a/llvm/test/CodeGen/LoongArch/lasx/vec-zext-invec.ll b/llvm/test/CodeGen/LoongArch/lasx/vec-zext-invec.ll
new file mode 100644
index 0000000000000..44210781c881b
--- /dev/null
+++ b/llvm/test/CodeGen/LoongArch/lasx/vec-zext-invec.ll
@@ -0,0 +1,57 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx,+lasx < %s | FileCheck %s
+; RUN: llc --mtriple=loongarch64 --mattr=+lsx,+lasx < %s | FileCheck %s
+
+;; This test covers 128-bit zero_extend_vector_inreg to 256-bit.
+;;
+;; Fix https://github.com/llvm/llvm-project/issues/219224
+
+define void @zext_invec_v16i8_to_v4i64(ptr %ptr, ptr %dst) {
+; CHECK-LABEL: zext_invec_v16i8_to_v4i64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: vld $vr0, $a0, 0
+; CHECK-NEXT: vext2xv.du.bu $xr0, $xr0
+; CHECK-NEXT: xvst $xr0, $a1, 0
+; CHECK-NEXT: ret
+ %a = load <16 x i8>, ptr %ptr
+ %s = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer,
+ <16 x i32> <i32 0, i32 16, i32 16, i32 16, i32 1, i32 16, i32 16, i32 16,
+ i32 2, i32 16, i32 16, i32 16, i32 3, i32 16, i32 16, i32 16>
+ %b = bitcast <16 x i8> %s to <4 x i32>
+ %r = zext <4 x i32> %b to <4 x i64>
+ store <4 x i64> %r, ptr %dst
+ ret void
+}
+
+define void @zext_invec_v8i16_to_v4i64(ptr %ptr, ptr %dst) {
+; CHECK-LABEL: zext_invec_v8i16_to_v4i64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: vld $vr0, $a0, 0
+; CHECK-NEXT: vext2xv.du.hu $xr0, $xr0
+; CHECK-NEXT: xvst $xr0, $a1, 0
+; CHECK-NEXT: ret
+ %a = load <8 x i16>, ptr %ptr
+ %s = shufflevector <8 x i16> %a, <8 x i16> zeroinitializer,
+ <8 x i32> <i32 0, i32 8, i32 1, i32 8, i32 2, i32 8, i32 3, i32 8>
+ %b = bitcast <8 x i16> %s to <4 x i32>
+ %r = zext <4 x i32> %b to <4 x i64>
+ store <4 x i64> %r, ptr %dst
+ ret void
+}
+
+define void @zext_invec_v16i8_to_v8i32(ptr %ptr, ptr %dst) {
+; CHECK-LABEL: zext_invec_v16i8_to_v8i32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: vld $vr0, $a0, 0
+; CHECK-NEXT: vext2xv.wu.bu $xr0, $xr0
+; CHECK-NEXT: xvst $xr0, $a1, 0
+; CHECK-NEXT: ret
+ %a = load <16 x i8>, ptr %ptr
+ %s = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer,
+ <16 x i32> <i32 0, i32 16, i32 1, i32 16, i32 2, i32 16, i32 3, i32 16,
+ i32 4, i32 16, i32 5, i32 16, i32 6, i32 16, i32 7, i32 16>
+ %b = bitcast <16 x i8> %s to <8 x i16>
+ %r = zext <8 x i16> %b to <8 x i32>
+ store <8 x i32> %r, ptr %dst
+ ret void
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/220138
More information about the llvm-branch-commits
mailing list