[PATCH] D125367: [DAGCombine] Support splat_vector nodes in (and (extload)) dagcombine
Bradley Smith via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed May 11 03:25:14 PDT 2022
bsmith created this revision.
bsmith added reviewers: paulwalker-arm, peterwaller-arm, sdesmalen.
Herald added subscribers: ecnelises, hiraditya.
Herald added a project: All.
bsmith requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D125367
Files:
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/test/CodeGen/AArch64/sve-fold-loadext-and-splat-vector.ll
Index: llvm/test/CodeGen/AArch64/sve-fold-loadext-and-splat-vector.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/AArch64/sve-fold-loadext-and-splat-vector.ll
@@ -0,0 +1,38 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s | FileCheck %s
+
+target triple = "aarch64-unknown-linux-gnu"
+
+; Ensure that a no-op 'and' after an extending load gets removed when the and is
+; constructed via a splat_vector node.
+define <vscale x 2 x i64> @fold_loadext_and(ptr %ptr, i32 %needle, <vscale x 2 x i64> %b) #0 {
+; CHECK-LABEL: fold_loadext_and:
+; CHECK: // %bb.0:
+; CHECK-NEXT: ptrue p0.d
+; CHECK-NEXT: ld1w { z0.d }, p0/z, [x0]
+; CHECK-NEXT: ret
+ %load = load <vscale x 2 x i32>, ptr %ptr, align 4
+ %ext = zext <vscale x 2 x i32> %load to <vscale x 2 x i64>
+ %splatinsert = insertelement <vscale x 2 x i64> poison, i64 4294967295, i64 0
+ %splat = shufflevector <vscale x 2 x i64> %splatinsert, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
+ %and = and <vscale x 2 x i64> %ext, %splat
+ ret <vscale x 2 x i64> %and
+}
+
+; Same as above but testing the case we care about. Here the vscale x 2 x i32
+; types get legalized into vscale x 2 x i64 types which introduces the extending
+; load and 'and' nodes similar to the above case.
+define <vscale x 2 x i1> @fold_loadext_and_legalize(ptr %ptr, <vscale x 2 x i32> %a) #0 {
+; CHECK-LABEL: fold_loadext_and_legalize:
+; CHECK: // %bb.0:
+; CHECK-NEXT: ptrue p0.d
+; CHECK-NEXT: and z0.d, z0.d, #0xffffffff
+; CHECK-NEXT: ld1w { z1.d }, p0/z, [x0]
+; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z0.d
+; CHECK-NEXT: ret
+ %load = load <vscale x 2 x i32>, ptr %ptr
+ %cmp = icmp eq <vscale x 2 x i32> %load, %a
+ ret <vscale x 2 x i1> %cmp
+}
+
+attributes #0 = { "target-features"="+sve" }
Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -6190,7 +6190,7 @@
// This can be a pure constant or a vector splat, in which case we treat the
// vector as a scalar and use the splat value.
APInt Constant = APInt::getZero(1);
- if (const ConstantSDNode *C = dyn_cast<ConstantSDNode>(N1)) {
+ if (const ConstantSDNode *C = isConstOrConstSplat(N1)) {
Constant = C->getAPIntValue();
} else if (BuildVectorSDNode *Vector = dyn_cast<BuildVectorSDNode>(N1)) {
APInt SplatValue, SplatUndef;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D125367.428610.patch
Type: text/x-patch
Size: 2603 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220511/97cc71c6/attachment.bin>
More information about the llvm-commits
mailing list