mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-05 12:31:33 +00:00
Splats for v8i32/v8f32 can be handled by VPERMILPSY. This was causing
infinite recursive calls in legalize. Fix PR10562 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137296 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a5134a0ea3
commit
5f1d8abf75
@ -4066,11 +4066,11 @@ static SDValue getUnpackh(SelectionDAG &DAG, DebugLoc dl, EVT VT, SDValue V1,
|
|||||||
return DAG.getVectorShuffle(VT, dl, V1, V2, &Mask[0]);
|
return DAG.getVectorShuffle(VT, dl, V1, V2, &Mask[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// PromoteSplatv8v16 - All i16 and i8 vector types can't be used directly by
|
// PromoteSplati8i16 - All i16 and i8 vector types can't be used directly by
|
||||||
// a generic shuffle instruction because the target has no such instructions.
|
// a generic shuffle instruction because the target has no such instructions.
|
||||||
// Generate shuffles which repeat i16 and i8 several times until they can be
|
// Generate shuffles which repeat i16 and i8 several times until they can be
|
||||||
// represented by v4f32 and then be manipulated by target suported shuffles.
|
// represented by v4f32 and then be manipulated by target suported shuffles.
|
||||||
static SDValue PromoteSplatv8v16(SDValue V, SelectionDAG &DAG, int &EltNo) {
|
static SDValue PromoteSplati8i16(SDValue V, SelectionDAG &DAG, int &EltNo) {
|
||||||
EVT VT = V.getValueType();
|
EVT VT = V.getValueType();
|
||||||
int NumElems = VT.getVectorNumElements();
|
int NumElems = VT.getVectorNumElements();
|
||||||
DebugLoc dl = V.getDebugLoc();
|
DebugLoc dl = V.getDebugLoc();
|
||||||
@ -4162,8 +4162,9 @@ static SDValue PromoteSplat(ShuffleVectorSDNode *SV, SelectionDAG &DAG) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Make this 128-bit vector duplicate i8 and i16 elements
|
// Make this 128-bit vector duplicate i8 and i16 elements
|
||||||
if (NumElems > 4)
|
EVT EltVT = SrcVT.getVectorElementType();
|
||||||
V1 = PromoteSplatv8v16(V1, DAG, EltNo);
|
if (NumElems > 4 && (EltVT == MVT::i8 || EltVT == MVT::i16))
|
||||||
|
V1 = PromoteSplati8i16(V1, DAG, EltNo);
|
||||||
|
|
||||||
// Recreate the 256-bit vector and place the same 128-bit vector
|
// Recreate the 256-bit vector and place the same 128-bit vector
|
||||||
// into the low and high part. This is necessary because we want
|
// into the low and high part. This is necessary because we want
|
||||||
@ -6027,8 +6028,7 @@ SDValue NormalizeVectorShuffle(SDValue Op, SelectionDAG &DAG,
|
|||||||
return PromoteVectorToScalarSplat(SVOp, DAG);
|
return PromoteVectorToScalarSplat(SVOp, DAG);
|
||||||
|
|
||||||
// Handle splats by matching through known shuffle masks
|
// Handle splats by matching through known shuffle masks
|
||||||
if ((VT.is128BitVector() && NumElem <= 4) ||
|
if (VT.is128BitVector() && NumElem <= 4)
|
||||||
(VT.is256BitVector() && NumElem <= 8))
|
|
||||||
return SDValue();
|
return SDValue();
|
||||||
|
|
||||||
// All i16 and i8 vector types can't be used directly by a generic shuffle
|
// All i16 and i8 vector types can't be used directly by a generic shuffle
|
||||||
|
@ -51,8 +51,9 @@ entry:
|
|||||||
; To:
|
; To:
|
||||||
; shuffle (vload ptr)), undef, <1, 1, 1, 1>
|
; shuffle (vload ptr)), undef, <1, 1, 1, 1>
|
||||||
; CHECK: vmovaps
|
; CHECK: vmovaps
|
||||||
; CHECK-NEXT: vpextrd
|
; CHECK-NEXT: vinsertf128 $1
|
||||||
define void @funcE() nounwind {
|
; CHECK-NEXT: vpermilps $-1
|
||||||
|
define <8 x float> @funcE() nounwind {
|
||||||
allocas:
|
allocas:
|
||||||
%udx495 = alloca [18 x [18 x float]], align 32
|
%udx495 = alloca [18 x [18 x float]], align 32
|
||||||
br label %for_test505.preheader
|
br label %for_test505.preheader
|
||||||
@ -74,7 +75,7 @@ load.i1247: ; preds = %for_exit499
|
|||||||
|
|
||||||
__load_and_broadcast_32.exit1249: ; preds = %load.i1247, %for_exit499
|
__load_and_broadcast_32.exit1249: ; preds = %load.i1247, %for_exit499
|
||||||
%load_broadcast12281250 = phi <8 x float> [ %phitmp, %load.i1247 ], [ undef, %for_exit499 ]
|
%load_broadcast12281250 = phi <8 x float> [ %phitmp, %load.i1247 ], [ undef, %for_exit499 ]
|
||||||
ret void
|
ret <8 x float> %load_broadcast12281250
|
||||||
}
|
}
|
||||||
|
|
||||||
; CHECK: vpshufd $0
|
; CHECK: vpshufd $0
|
||||||
@ -87,3 +88,20 @@ define <8 x float> @funcF(i32* %ptr) nounwind {
|
|||||||
ret <8 x float> %tmp
|
ret <8 x float> %tmp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; CHECK: vinsertf128 $1
|
||||||
|
; CHECK-NEXT: vpermilps $0
|
||||||
|
define <8 x float> @funcG(<8 x float> %a) nounwind uwtable readnone ssp {
|
||||||
|
entry:
|
||||||
|
%shuffle = shufflevector <8 x float> %a, <8 x float> undef, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
|
||||||
|
ret <8 x float> %shuffle
|
||||||
|
}
|
||||||
|
|
||||||
|
; CHECK: vextractf128 $1
|
||||||
|
; CHECK-NEXT: vinsertf128 $1
|
||||||
|
; CHECK-NEXT: vpermilps $85
|
||||||
|
define <8 x float> @funcH(<8 x float> %a) nounwind uwtable readnone ssp {
|
||||||
|
entry:
|
||||||
|
%shuffle = shufflevector <8 x float> %a, <8 x float> undef, <8 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
|
||||||
|
ret <8 x float> %shuffle
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user