[PATCH] D105520: [AArch64][SVE][InstCombine] last{a,b} of a splat vector
Usman Nadeem via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 6 18:26:57 PDT 2021
mnadeem created this revision.
Herald added subscribers: psnobl, hiraditya, kristof.beyls, tschuett.
Herald added a reviewer: efriedma.
mnadeem requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Replace last{a,b}(splat(X)) with X, irrespective of the predicate.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D105520
Files:
llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-opts-lasta-lastb.ll
Index: llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-opts-lasta-lastb.ll
===================================================================
--- llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-opts-lasta-lastb.ll
+++ llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-opts-lasta-lastb.ll
@@ -144,6 +144,25 @@
ret i8 %e
}
+; Return the splatted value irrespective of the predicate.
+define i8 @lasta_splat(<vscale x 16 x i1> %pg, i8 %a) #0 {
+; OPT-LABEL: @lasta_splat(
+; OPT-NEXT: ret i8 %a
+ %splat_insert = insertelement <vscale x 16 x i8> poison, i8 %a, i32 0
+ %splat = shufflevector <vscale x 16 x i8> %splat_insert, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
+ %last = tail call i8 @llvm.aarch64.sve.lasta.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %splat)
+ ret i8 %last
+}
+
+define i8 @lastb_splat(<vscale x 16 x i1> %pg, i8 %a) #0 {
+; OPT-LABEL: @lastb_splat(
+; OPT-NEXT: ret i8 %a
+ %splat_insert = insertelement <vscale x 16 x i8> poison, i8 %a, i32 0
+ %splat = shufflevector <vscale x 16 x i8> %splat_insert, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
+ %last = tail call i8 @llvm.aarch64.sve.lastb.nxv16i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %splat)
+ ret i8 %last
+}
+
declare <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32)
declare i8 @llvm.aarch64.sve.lasta.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>)
declare i8 @llvm.aarch64.sve.lastb.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>)
Index: llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
===================================================================
--- llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
+++ llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp
@@ -501,6 +501,10 @@
Value *Vec = II.getArgOperand(1);
bool IsAfter = II.getIntrinsicID() == Intrinsic::aarch64_sve_lasta;
+ // lastX(splat(X)) --> X
+ if (auto *SplatVal = getSplatValue(Vec))
+ return IC.replaceInstUsesWith(II, SplatVal);
+
auto *C = dyn_cast<Constant>(Pg);
if (IsAfter && C && C->isNullValue()) {
// The intrinsic is extracting lane 0 so use an extract instead.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D105520.356847.patch
Type: text/x-patch
Size: 2169 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210707/197414c8/attachment.bin>
More information about the llvm-commits
mailing list