[PATCH] D117674: Restrict performPostLD1Combine to 64 and 128 bit vectors

mgabka via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 19 06:24:06 PST 2022


mgabka created this revision.
mgabka added reviewers: paulwalker-arm, huntergr, sdesmalen.
Herald added subscribers: ctetreau, hiraditya, kristof.beyls.
mgabka requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

When wider vectors are used, for example fixed width SVE,
there is no patterns to select AArch64ISD::LD1LANEpost
nodes, so we should do an early exit.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D117674

Files:
  llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
  llvm/test/CodeGen/AArch64/sve-ld-post-inc.ll


Index: llvm/test/CodeGen/AArch64/sve-ld-post-inc.ll
===================================================================
--- llvm/test/CodeGen/AArch64/sve-ld-post-inc.ll
+++ llvm/test/CodeGen/AArch64/sve-ld-post-inc.ll
@@ -3,7 +3,7 @@
 
 ; These tests are here to ensure we don't get a selection error caused
 ; by performPostLD1Combine, which should bail out if the return
-; type is a scalable vector
+; type is not 128 or 64 bit vector.
 
 define <vscale x 4 x i32> @test_post_ld1_insert(i32* %a, i32** %ptr, i64 %inc) {
 ; CHECK-LABEL: test_post_ld1_insert:
@@ -35,4 +35,60 @@
   ret <vscale x 2 x double> %dup
 }
 
+define <4 x i64> @test_post_ld1_int_fixed(i64* %data, i64 %idx, <4 x i64>* %addr)  #1 {
+; CHECK-LABEL: test_post_ld1_int_fixed:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    ptrue p0.d
+; CHECK-NEXT:    mov w9, #2
+; CHECK-NEXT:    ld1d { z0.d }, p0/z, [x2]
+; CHECK-NEXT:    ldr x10, [x0, x1, lsl #3]
+; CHECK-NEXT:    ldr x11, [x0]
+; CHECK-NEXT:    index z3.d, #0, #1
+; CHECK-NEXT:    mov z2.d, x9
+; CHECK-NEXT:    ptrue p1.d, vl1
+; CHECK-NEXT:    cmpeq p2.d, p0/z, z3.d, z2.d
+; CHECK-NEXT:    mov z1.d, z0.d
+; CHECK-NEXT:    mov z0.d, p2/m, x10
+; CHECK-NEXT:    mov z1.d, p1/m, x11
+; CHECK-NEXT:    add z0.d, p0/m, z0.d, z1.d
+; CHECK-NEXT:    st1d { z0.d }, p0, [x8]
+; CHECK-NEXT:    ret
+  %A = load <4 x i64>, <4 x i64>* %addr
+  %ld1 = load i64, i64* %data
+  %vec1 = insertelement <4 x i64> %A, i64 %ld1, i32 0
+  %gep = getelementptr i64, i64* %data, i64 %idx
+  %ld2 = load i64, i64* %gep
+  %vec2 = insertelement <4 x i64> %A, i64 %ld2, i32 2
+  %res = add <4 x i64> %vec1, %vec2
+  ret <4 x i64> %res
+}
+
+define <4 x double> @test_post_ld1_double_fixed(double* %data, i64 %idx, <4 x double>* %addr)  #1 {
+; CHECK-LABEL: test_post_ld1_double_fixed:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    ptrue p0.d
+; CHECK-NEXT:    mov w9, #2
+; CHECK-NEXT:    ld1d { z0.d }, p0/z, [x2]
+; CHECK-NEXT:    ldr d1, [x0, x1, lsl #3]
+; CHECK-NEXT:    ldr d2, [x0]
+; CHECK-NEXT:    index z4.d, #0, #1
+; CHECK-NEXT:    mov z3.d, x9
+; CHECK-NEXT:    ptrue p1.d, vl1
+; CHECK-NEXT:    cmpeq p2.d, p0/z, z4.d, z3.d
+; CHECK-NEXT:    sel z2.d, p1, z2.d, z0.d
+; CHECK-NEXT:    mov z0.d, p2/m, d1
+; CHECK-NEXT:    fadd z0.d, z2.d, z0.d
+; CHECK-NEXT:    st1d { z0.d }, p0, [x8]
+; CHECK-NEXT:    ret
+  %A = load <4 x double>, <4 x double>* %addr
+  %ld1 = load double, double* %data
+  %vec1 = insertelement <4 x double> %A, double %ld1, i32 0
+  %gep = getelementptr double, double* %data, i64 %idx
+  %ld2 = load double, double* %gep
+  %vec2 = insertelement <4 x double> %A, double %ld2, i32 2
+  %res = fadd <4 x double> %vec1, %vec2
+  ret <4 x double> %res
+}
+attributes #1 = { vscale_range(2,2) "target-features"="+neon,+sve" }
+
 declare <vscale x 2 x double> @llvm.aarch64.sve.dup.x.nxv2f64(double)
Index: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
===================================================================
--- llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -15899,7 +15899,7 @@
   SelectionDAG &DAG = DCI.DAG;
   EVT VT = N->getValueType(0);
 
-  if (VT.isScalableVector())
+  if (!VT.is128BitVector() && !VT.is64BitVector())
     return SDValue();
 
   unsigned LoadIdx = IsLaneOp ? 1 : 0;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D117674.401208.patch
Type: text/x-patch
Size: 3300 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220119/4f47974a/attachment.bin>


More information about the llvm-commits mailing list