[llvm] [AArch64][LV] Cost low-VF interleaved access (PR #205844)

Jacob Crawley via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 30 02:35:31 PDT 2026


================
@@ -0,0 +1,234 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -O3 < %s | FileCheck %s
+
+target triple = "aarch64"
+
+; Check the backend lowering for factor-4 deinterleave when the result
+; sub-vectors are smaller than the interleave factor.
+
+define void @deinterleave4_nxv8i16_uitofp_f64(
+; CHECK-LABEL: deinterleave4_nxv8i16_uitofp_f64:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    uunpkhi z2.s, z0.h
+; CHECK-NEXT:    uunpklo z0.s, z0.h
+; CHECK-NEXT:    ptrue p0.d
+; CHECK-NEXT:    movi d7, #0000000000000000
+; CHECK-NEXT:    uunpkhi z3.d, z2.s
+; CHECK-NEXT:    uunpklo z2.d, z2.s
+; CHECK-NEXT:    uunpkhi z4.d, z0.s
+; CHECK-NEXT:    uunpklo z0.d, z0.s
+; CHECK-NEXT:    uzp1 z5.d, z2.d, z3.d
+; CHECK-NEXT:    uzp2 z2.d, z2.d, z3.d
+; CHECK-NEXT:    uzp1 z6.d, z0.d, z4.d
+; CHECK-NEXT:    uzp2 z0.d, z0.d, z4.d
+; CHECK-NEXT:    uzp1 z3.d, z6.d, z5.d
+; CHECK-NEXT:    uzp1 z4.d, z0.d, z2.d
+; CHECK-NEXT:    uzp2 z5.d, z6.d, z5.d
+; CHECK-NEXT:    uzp2 z0.d, z0.d, z2.d
+; CHECK-NEXT:    movi d2, #0000000000000000
+; CHECK-NEXT:    movi d6, #0000000000000000
+; CHECK-NEXT:    and z3.d, z3.d, #0xffff
+; CHECK-NEXT:    and z4.d, z4.d, #0xffff
+; CHECK-NEXT:    and z5.d, z5.d, #0xffff
+; CHECK-NEXT:    and z0.d, z0.d, #0xffff
+; CHECK-NEXT:    ucvtf z3.d, p0/m, z3.d
+; CHECK-NEXT:    ucvtf z4.d, p0/m, z4.d
+; CHECK-NEXT:    ucvtf z5.d, p0/m, z5.d
+; CHECK-NEXT:    ucvtf z0.d, p0/m, z0.d
+; CHECK-NEXT:    fmul z3.d, z1.d, z3.d
+; CHECK-NEXT:    fmul z4.d, z1.d, z4.d
+; CHECK-NEXT:    fmul z5.d, z1.d, z5.d
+; CHECK-NEXT:    fmul z0.d, z1.d, z0.d
+; CHECK-NEXT:    movi d1, #0000000000000000
+; CHECK-NEXT:    fadda d2, p0, d2, z3.d
+; CHECK-NEXT:    fadda d6, p0, d6, z4.d
+; CHECK-NEXT:    fadda d7, p0, d7, z5.d
+; CHECK-NEXT:    fadda d1, p0, d1, z0.d
+; CHECK-NEXT:    mov v2.d[1], v6.d[0]
+; CHECK-NEXT:    mov v7.d[1], v1.d[0]
+; CHECK-NEXT:    stp q2, q7, [x0]
+; CHECK-NEXT:    ret
+    <vscale x 8 x i16> %wide.vec, <vscale x 2 x double> %mul, ptr %out) #0 {
----------------
jacob-crawley wrote:

I can't remember what the motivation for that was now, but I'm not a fan of it either so I've changed it back 

https://github.com/llvm/llvm-project/pull/205844


More information about the llvm-commits mailing list