[PATCH] D120548: [AArch64] Try to convert signed to unsigned pred to re-use zext.
Florian Hahn via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 25 01:51:45 PST 2022
fhahn created this revision.
fhahn added reviewers: t.p.northover, ab, dmgreen, paquette.
Herald added subscribers: hiraditya, kristof.beyls.
fhahn requested review of this revision.
Herald added a project: LLVM.
Building on D120481 <https://reviews.llvm.org/D120481>, try to convert a signed predicate to unsigned to
re-use existing zext.
The following conversion is supported: %a >s -1 -> zext(%a) <u 128.
https://alive2.llvm.org/ce/z/RVnadn
Depends on D120481 <https://reviews.llvm.org/D120481>.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D120548
Files:
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
llvm/test/CodeGen/AArch64/vselect-ext.ll
Index: llvm/test/CodeGen/AArch64/vselect-ext.ll
===================================================================
--- llvm/test/CodeGen/AArch64/vselect-ext.ll
+++ llvm/test/CodeGen/AArch64/vselect-ext.ll
@@ -166,24 +166,21 @@
define <16 x i32> @same_zext_used_in_cmp_signed_pred_and_select_can_convert_to_unsigned_pred(<16 x i8> %a) {
; CHECK-LABEL: same_zext_used_in_cmp_signed_pred_and_select_can_convert_to_unsigned_pred:
; CHECK: ; %bb.0: ; %entry
-; CHECK-NEXT: movi.2d v1, #0xffffffffffffffff
-; CHECK-NEXT: ushll.8h v2, v0, #0
-; CHECK-NEXT: ushll2.8h v3, v0, #0
-; CHECK-NEXT: ushll.4s v4, v2, #0
-; CHECK-NEXT: cmgt.16b v0, v0, v1
-; CHECK-NEXT: ushll.4s v5, v3, #0
-; CHECK-NEXT: ushll2.4s v1, v3, #0
-; CHECK-NEXT: sshll.8h v3, v0, #0
-; CHECK-NEXT: sshll2.8h v0, v0, #0
-; CHECK-NEXT: ushll2.4s v2, v2, #0
-; CHECK-NEXT: sshll.4s v6, v3, #0
-; CHECK-NEXT: sshll.4s v7, v0, #0
-; CHECK-NEXT: sshll2.4s v0, v0, #0
-; CHECK-NEXT: sshll2.4s v16, v3, #0
-; CHECK-NEXT: and.16b v3, v1, v0
-; CHECK-NEXT: and.16b v1, v2, v16
-; CHECK-NEXT: and.16b v2, v5, v7
-; CHECK-NEXT: and.16b v0, v4, v6
+; CHECK-NEXT: movi.2d v1, #0x0000ff000000ff
+; CHECK-NEXT: ushll2.8h v2, v0, #0
+; CHECK-NEXT: ushll.8h v0, v0, #0
+; CHECK-NEXT: ushll2.4s v3, v2, #0
+; CHECK-NEXT: ushll2.4s v4, v0, #0
+; CHECK-NEXT: ushll.4s v0, v0, #0
+; CHECK-NEXT: ushll.4s v2, v2, #0
+; CHECK-NEXT: cmhi.4s v5, v1, v0
+; CHECK-NEXT: cmhi.4s v6, v1, v2
+; CHECK-NEXT: cmhi.4s v7, v1, v3
+; CHECK-NEXT: cmhi.4s v1, v1, v4
+; CHECK-NEXT: and.16b v3, v3, v7
+; CHECK-NEXT: and.16b v1, v4, v1
+; CHECK-NEXT: and.16b v2, v2, v6
+; CHECK-NEXT: and.16b v0, v0, v5
; CHECK-NEXT: ret
entry:
%ext = zext <16 x i8> %a to <16 x i32>
Index: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
===================================================================
--- llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -17065,8 +17065,8 @@
}))
return SDValue();
- APInt V;
- if (!ISD::isConstantSplatVector(Op->getOperand(1).getNode(), V))
+ APInt SplatVal;
+ if (!ISD::isConstantSplatVector(Op->getOperand(1).getNode(), SplatVal))
return SDValue();
SDLoc DL(Op);
@@ -17082,14 +17082,25 @@
if (Op0SExt && isSignedIntSetCC(CC)) {
Op0ExtV = SDValue(Op0SExt, 0);
Op1ExtV = DAG.getNode(ISD::SIGN_EXTEND, DL, MVT::v16i32, Op->getOperand(1));
- } else if (Op0ZExt && isUnsignedIntSetCC(CC)) {
+ } else if (Op0ZExt) {
Op0ExtV = SDValue(Op0ZExt, 0);
- Op1ExtV = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::v16i32, Op->getOperand(1));
- } else
+ // Try to convert signed to unsigned predicate, so zext can be used: %a >s
+ // -1 -> zext(%a) <u 128.
+ if (CC == ISD::SETGT && SplatVal.isAllOnes()) {
+ CC = ISD::SETULT;
+ Op1ExtV = DAG.getSplatBuildVector(MVT::v16i32, DL,
+ DAG.getConstant(128, DL, MVT::i32));
+ }
+ if (isUnsignedIntSetCC(CC))
+ Op1ExtV =
+ DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::v16i32, Op->getOperand(1));
+ }
+
+ if (!Op0ExtV || !Op1ExtV)
return SDValue();
return DAG.getNode(ISD::SETCC, DL, MVT::v16i1, Op0ExtV, Op1ExtV,
- Op->getOperand(2));
+ DAG.getCondCode(CC));
}
static SDValue performSETCCCombine(SDNode *N, SelectionDAG &DAG) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D120548.411352.patch
Type: text/x-patch
Size: 3451 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220225/ccb8c59e/attachment.bin>
More information about the llvm-commits
mailing list