[PATCH] D100812: [DAGCombiner] Allow operand of step_vector to be negative.
JunMa via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 20 01:25:40 PDT 2021
junparser updated this revision to Diff 338754.
junparser added a comment.
rebase.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D100812/new/
https://reviews.llvm.org/D100812
Files:
llvm/include/llvm/CodeGen/ISDOpcodes.h
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
llvm/test/CodeGen/AArch64/sve-stepvector.ll
Index: llvm/test/CodeGen/AArch64/sve-stepvector.ll
===================================================================
--- llvm/test/CodeGen/AArch64/sve-stepvector.ll
+++ llvm/test/CodeGen/AArch64/sve-stepvector.ll
@@ -259,6 +259,18 @@
ret <vscale x 8 x i8> %3
}
+define <vscale x 8 x i16> @sub_stepvector_nxv8i16() {
+; CHECK-LABEL: sub_stepvector_nxv8i16:
+; CHECK: // %bb.0: // %entry
+; CHECK-NEXT: index z0.h, #2, #-1
+; CHECK-NEXT: ret
+entry:
+ %0 = insertelement <vscale x 8 x i16> poison, i16 2, i32 0
+ %1 = shufflevector <vscale x 8 x i16> %0, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
+ %2 = call <vscale x 8 x i16> @llvm.experimental.stepvector.nxv8i16()
+ %3 = sub <vscale x 8 x i16> %1, %2
+ ret <vscale x 8 x i16> %3
+}
declare <vscale x 2 x i64> @llvm.experimental.stepvector.nxv2i64()
declare <vscale x 4 x i32> @llvm.experimental.stepvector.nxv4i32()
Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -4707,10 +4707,9 @@
"STEP_VECTOR can only be used with vectors of integers that are at "
"least 8 bits wide");
assert(isa<ConstantSDNode>(Operand) &&
- cast<ConstantSDNode>(Operand)->getAPIntValue().isNonNegative() &&
cast<ConstantSDNode>(Operand)->getAPIntValue().isSignedIntN(
VT.getScalarSizeInBits()) &&
- "Expected STEP_VECTOR integer constant to be positive and fit in "
+ "Expected STEP_VECTOR integer constant to be fit in "
"the vector element type");
break;
case ISD::FREEZE:
Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -3544,6 +3544,14 @@
return DAG.getNode(ISD::ADD, DL, VT, N0, DAG.getVScale(DL, VT, -IntVal));
}
+ // canonicalize (sub X, step_vector(C)) to (add X, step_vector(-C))
+ if (N1.getOpcode() == ISD::STEP_VECTOR) {
+ SDValue NewStep = DAG.getConstant(-N1.getConstantOperandAPInt(0), DL,
+ N1.getOperand(0).getValueType());
+ return DAG.getNode(ISD::ADD, DL, VT, N0,
+ DAG.getStepVector(SDLoc(N), VT, NewStep));
+ }
+
// Prefer an add for more folding potential and possibly better codegen:
// sub N0, (lshr N10, width-1) --> add N0, (ashr N10, width-1)
if (!LegalOperations && N1.getOpcode() == ISD::SRL && N1.hasOneUse()) {
Index: llvm/include/llvm/CodeGen/ISDOpcodes.h
===================================================================
--- llvm/include/llvm/CodeGen/ISDOpcodes.h
+++ llvm/include/llvm/CodeGen/ISDOpcodes.h
@@ -594,8 +594,8 @@
/// STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised
/// of a linear sequence of unsigned values starting from 0 with a step of
- /// IMM, where IMM must be a vector index constant positive integer value
- /// which must fit in the vector element type.
+ /// IMM, where IMM must be a vector index constant integer value which must
+ /// fit in the vector element type.
/// Note that IMM may be a smaller type than the vector element type, in
/// which case the step is implicitly zero-extended to the vector element
/// type. IMM may also be a larger type than the vector element type, in
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D100812.338754.patch
Type: text/x-patch
Size: 3521 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210420/6d3fcb2f/attachment.bin>
More information about the llvm-commits
mailing list