[PATCH] D111633: [SelectionDAG] Fix getVectorSubVecPointer for scalable subvectors.
Sander de Smalen via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 14 08:04:23 PDT 2021
sdesmalen updated this revision to Diff 379723.
sdesmalen added a comment.
- Simplified getVectorSubVecPointer to always clamp dynamically.
- For the combinations in the table below, this revision changed clampDynamicVectorIndex as follows:
- Accepts cases: A, B, C, D, E, F (C and F were added)
- It now also asserts that A and F must have valid indices (i.e. are already validated by their original operation, e.g. EXTRACT/INSERT_SUBVECTOR or EXTRACT/INSERT_VECTOR_ELT.
| index | subvector | vector
|----------------------------------
A | const fixed fixed
B | const fixed scalable
C | const scalable scalable
D | var fixed fixed
E | var fixed scalable
F | var scalable scalable
Note that the following combinations are invalid, because we don't support
extracting a scalable vector from a fixed-width vector:
X | const scalable fixed
X | var scalable fixed
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D111633/new/
https://reviews.llvm.org/D111633
Files:
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
llvm/test/CodeGen/AArch64/sve-insert-vector.ll
Index: llvm/test/CodeGen/AArch64/sve-insert-vector.ll
===================================================================
--- llvm/test/CodeGen/AArch64/sve-insert-vector.ll
+++ llvm/test/CodeGen/AArch64/sve-insert-vector.ll
@@ -313,6 +313,24 @@
ret <vscale x 8 x i16> %r
}
+; Test that the index is scaled by vscale if the subvector is scalable.
+define <vscale x 8 x half> @insert_nxv8f16_nxv2f16(<vscale x 8 x half> %vec, <vscale x 2 x half> %in) nounwind {
+; CHECK-LABEL: insert_nxv8f16_nxv2f16:
+; CHECK: // %bb.0:
+; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NEXT: addvl sp, sp, #-1
+; CHECK-NEXT: ptrue p0.h
+; CHECK-NEXT: ptrue p1.d
+; CHECK-NEXT: mov x8, sp
+; CHECK-NEXT: st1h { z0.h }, p0, [sp]
+; CHECK-NEXT: st1h { z1.d }, p1, [x8, #1, mul vl]
+; CHECK-NEXT: ld1h { z0.h }, p0/z, [sp]
+; CHECK-NEXT: addvl sp, sp, #1
+; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload
+; CHECK-NEXT: ret
+ %r = call <vscale x 8 x half> @llvm.experimental.vector.insert.nxv8f16.nxv2f16(<vscale x 8 x half> %vec, <vscale x 2 x half> %in, i64 2)
+ ret <vscale x 8 x half> %r
+}
; Fixed length clamping
@@ -379,3 +397,5 @@
declare <vscale x 6 x i16> @llvm.experimental.vector.insert.nxv6i16.nxv1i16(<vscale x 6 x i16>, <vscale x 1 x i16>, i64)
declare <vscale x 8 x i16> @llvm.experimental.vector.insert.nxv8i16.nxv2i16(<vscale x 8 x i16>, <vscale x 2 x i16>, i64)
+
+declare <vscale x 8 x half> @llvm.experimental.vector.insert.nxv8f16.nxv2f16(<vscale x 8 x half>, <vscale x 2 x half>, i64)
Index: llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
===================================================================
--- llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -7810,13 +7810,26 @@
static SDValue clampDynamicVectorIndex(SelectionDAG &DAG, SDValue Idx,
EVT VecVT, const SDLoc &dl,
- unsigned NumSubElts) {
- if (!VecVT.isScalableVector() && isa<ConstantSDNode>(Idx))
- return Idx;
+ ElementCount SubEC) {
+ assert(!(SubEC.isScalable() && VecVT.isFixedLengthVector()) &&
+ "Cannot index a scalable vector within a fixed-width vector");
+ unsigned NElts = VecVT.getVectorMinNumElements();
+ unsigned NumSubElts = SubEC.getKnownMinValue();
+ bool IndexingFixedInScalable =
+ VecVT.isScalableVector() && !SubEC.isScalable();
+ if (!IndexingFixedInScalable) {
+ if (auto *IdxC = dyn_cast<ConstantSDNode>(Idx)) {
+ assert(IdxC->getZExtValue() + NumSubElts <= NElts &&
+ "Expected the trivial case to have been handled");
+ return Idx;
+ }
+ }
EVT IdxVT = Idx.getValueType();
- unsigned NElts = VecVT.getVectorMinNumElements();
- if (VecVT.isScalableVector()) {
+
+ // If the scalable properties are equal, no values need to be multiplied by
+ // vscale, because (vscale*x < vscale*y) <=> x < y.
+ if (IndexingFixedInScalable) {
// If this is a constant index and we know the value plus the number of the
// elements in the subvector minus one is less than the minimum number of
// elements then it's safe to return Idx.
@@ -7863,16 +7876,16 @@
unsigned EltSize = EltVT.getFixedSizeInBits() / 8; // FIXME: should be ABI size.
assert(EltSize * 8 == EltVT.getFixedSizeInBits() &&
"Converting bits to bytes lost precision");
-
- // Scalable vectors don't need clamping as these are checked at compile time
- if (SubVecVT.isFixedLengthVector()) {
- assert(SubVecVT.getVectorElementType() == EltVT &&
- "Sub-vector must be a fixed vector with matching element type");
- Index = clampDynamicVectorIndex(DAG, Index, VecVT, dl,
- SubVecVT.getVectorNumElements());
- }
+ assert(SubVecVT.getVectorElementType() == EltVT &&
+ "Sub-vector must be a fixed vector with matching element type");
+ Index = clampDynamicVectorIndex(DAG, Index, VecVT, dl,
+ SubVecVT.getVectorElementCount());
EVT IdxVT = Index.getValueType();
+ if (SubVecVT.isScalableVector())
+ Index =
+ DAG.getNode(ISD::MUL, dl, IdxVT, Index,
+ DAG.getVScale(dl, IdxVT, APInt(IdxVT.getSizeInBits(), 1)));
Index = DAG.getNode(ISD::MUL, dl, IdxVT, Index,
DAG.getConstant(EltSize, dl, IdxVT));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D111633.379723.patch
Type: text/x-patch
Size: 4449 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211014/f5ac9533/attachment.bin>
More information about the llvm-commits
mailing list