forked from OSchip/llvm-project
[CodeGen] Add support for widening the result of EXTRACT_SUBVECTOR
When trying to return a type such as <vscale x 1 x i32> from a function we crash in DAGTypeLegalizer::WidenVecRes_EXTRACT_SUBVECTOR when attempting to get the fixed number of elements in the vector. For the simple case we are dealing with, i.e. extracting <vscale x 1 x i32> from index 0 of input vector <vscale x 4 x i32> we can simply rely upon existing code that just returns the input. Differential Revision: https://reviews.llvm.org/D102605
This commit is contained in:
parent
a28fe17d73
commit
a21bff0673
|
@ -3960,7 +3960,6 @@ SDValue DAGTypeLegalizer::WidenVecRes_CONCAT_VECTORS(SDNode *N) {
|
|||
SDValue DAGTypeLegalizer::WidenVecRes_EXTRACT_SUBVECTOR(SDNode *N) {
|
||||
EVT VT = N->getValueType(0);
|
||||
EVT WidenVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
|
||||
unsigned WidenNumElts = WidenVT.getVectorNumElements();
|
||||
SDValue InOp = N->getOperand(0);
|
||||
SDValue Idx = N->getOperand(1);
|
||||
SDLoc dl(N);
|
||||
|
@ -3975,7 +3974,12 @@ SDValue DAGTypeLegalizer::WidenVecRes_EXTRACT_SUBVECTOR(SDNode *N) {
|
|||
if (IdxVal == 0 && InVT == WidenVT)
|
||||
return InOp;
|
||||
|
||||
if (VT.isScalableVector())
|
||||
report_fatal_error("Don't know how to widen the result of "
|
||||
"EXTRACT_SUBVECTOR for scalable vectors");
|
||||
|
||||
// Check if we can extract from the vector.
|
||||
unsigned WidenNumElts = WidenVT.getVectorNumElements();
|
||||
unsigned InNumElts = InVT.getVectorNumElements();
|
||||
if (IdxVal % WidenNumElts == 0 && IdxVal + WidenNumElts < InNumElts)
|
||||
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, WidenVT, InOp, Idx);
|
||||
|
|
|
@ -105,7 +105,30 @@ define <16 x i8> @extract_v16i8_nxv16i8_idx1(<vscale x 16 x i8> %vec) nounwind {
|
|||
ret <16 x i8> %retval
|
||||
}
|
||||
|
||||
|
||||
; Extracting illegal subvectors
|
||||
|
||||
define <vscale x 1 x i32> @extract_nxv1i32_nxv4i32(<vscale x 4 x i32> %vec) nounwind {
|
||||
; CHECK-LABEL: extract_nxv1i32_nxv4i32:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: ret
|
||||
%retval = call <vscale x 1 x i32> @llvm.experimental.vector.extract.nxv1i32.nxv4i32(<vscale x 4 x i32> %vec, i64 0)
|
||||
ret <vscale x 1 x i32> %retval
|
||||
}
|
||||
|
||||
define <vscale x 1 x i16> @extract_nxv1i16_nxv6i16(<vscale x 6 x i16> %vec) nounwind {
|
||||
; CHECK-LABEL: extract_nxv1i16_nxv6i16:
|
||||
; CHECK: // %bb.0:
|
||||
; CHECK-NEXT: ret
|
||||
%retval = call <vscale x 1 x i16> @llvm.experimental.vector.extract.nxv1i16.nxv6i16(<vscale x 6 x i16> %vec, i64 0)
|
||||
ret <vscale x 1 x i16> %retval
|
||||
}
|
||||
|
||||
|
||||
declare <2 x i64> @llvm.experimental.vector.extract.v2i64.nxv2i64(<vscale x 2 x i64>, i64)
|
||||
declare <4 x i32> @llvm.experimental.vector.extract.v4i32.nxv4i32(<vscale x 4 x i32>, i64)
|
||||
declare <8 x i16> @llvm.experimental.vector.extract.v8i16.nxv8i16(<vscale x 8 x i16>, i64)
|
||||
declare <16 x i8> @llvm.experimental.vector.extract.v16i8.nxv16i8(<vscale x 16 x i8>, i64)
|
||||
|
||||
declare <vscale x 1 x i32> @llvm.experimental.vector.extract.nxv1i32.nxv4i32(<vscale x 4 x i32>, i64)
|
||||
declare <vscale x 1 x i16> @llvm.experimental.vector.extract.nxv1i16.nxv6i16(<vscale x 6 x i16>, i64)
|
||||
|
|
|
@ -45,6 +45,16 @@ define <vscale x 16 x i8> @add_i8_zero(<vscale x 16 x i8> %a) {
|
|||
ret <vscale x 16 x i8> %res
|
||||
}
|
||||
|
||||
define <vscale x 1 x i32> @add_nxv1i32(<vscale x 1 x i32> %a, <vscale x 1 x i32> %b) {
|
||||
; CHECK-LABEL: add_nxv1i32:
|
||||
; CHECK: // %bb.0: // %entry
|
||||
; CHECK-NEXT: add z0.s, z0.s, z1.s
|
||||
; CHECK-NEXT: ret
|
||||
entry:
|
||||
%c = add <vscale x 1 x i32> %a, %b
|
||||
ret <vscale x 1 x i32> %c
|
||||
}
|
||||
|
||||
define <vscale x 2 x i64> @sub_i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
|
||||
; CHECK-LABEL: sub_i64:
|
||||
; CHECK: // %bb.0:
|
||||
|
|
Loading…
Reference in New Issue