mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[X86] Custom split v32i16/v64i8 bitcasts when AVX512F is available, but BWI is not.
The test changes you can see are related to the changes in ReplaceNodeResults. Though shuffle-vs-trunc-512.ll does have a test that exercises the code in LowerBITCAST. Looks like the test output didn't change because DAG combining is able to clean up the resulting type legalization. Adding the custom hook just makes type legalization work less hard. Differential Revision: https://reviews.llvm.org/D43447 llvm-svn: 325933
This commit is contained in:
parent
097bf66bf4
commit
38e20ced44
@ -1365,6 +1365,12 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
|
||||
setOperationPromotedToType(ISD::LOAD, VT, MVT::v8i64);
|
||||
setOperationPromotedToType(ISD::SELECT, VT, MVT::v8i64);
|
||||
}
|
||||
|
||||
// Need to custom split v32i16/v64i8 bitcasts.
|
||||
if (!Subtarget.hasBWI()) {
|
||||
setOperationAction(ISD::BITCAST, MVT::v32i16, Custom);
|
||||
setOperationAction(ISD::BITCAST, MVT::v64i8, Custom);
|
||||
}
|
||||
}// has AVX-512
|
||||
|
||||
// This block controls legalization for operations that don't have
|
||||
@ -21779,8 +21785,9 @@ static SDValue LowerVectorIntUnary(SDValue Op, SelectionDAG &DAG) {
|
||||
// Extract the Lo/Hi vectors
|
||||
SDLoc dl(Op);
|
||||
SDValue Src = Op.getOperand(0);
|
||||
unsigned SrcNumElems = Src.getSimpleValueType().getVectorNumElements();
|
||||
SDValue Lo = extractSubVector(Src, 0, DAG, dl, SizeInBits / 2);
|
||||
SDValue Hi = extractSubVector(Src, NumElems / 2, DAG, dl, SizeInBits / 2);
|
||||
SDValue Hi = extractSubVector(Src, SrcNumElems / 2, DAG, dl, SizeInBits / 2);
|
||||
|
||||
MVT EltVT = VT.getVectorElementType();
|
||||
MVT NewVT = MVT::getVectorVT(EltVT, NumElems / 2);
|
||||
@ -23745,6 +23752,10 @@ static SDValue LowerBITCAST(SDValue Op, const X86Subtarget &Subtarget,
|
||||
return DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v64i1, Lo, Hi);
|
||||
}
|
||||
|
||||
// Custom splitting for BWI types when AVX512F is available but BWI isn't.
|
||||
if ((SrcVT == MVT::v32i16 || SrcVT == MVT::v64i8) && DstVT.isVector())
|
||||
return Lower512IntUnary(Op, DAG);
|
||||
|
||||
if (SrcVT == MVT::v2i32 || SrcVT == MVT::v4i16 || SrcVT == MVT::v8i8 ||
|
||||
SrcVT == MVT::i64) {
|
||||
assert(Subtarget.hasSSE2() && "Requires at least SSE2!");
|
||||
@ -25133,6 +25144,14 @@ void X86TargetLowering::ReplaceNodeResults(SDNode *N,
|
||||
return;
|
||||
}
|
||||
|
||||
// Custom splitting for BWI types when AVX512F is available but BWI isn't.
|
||||
if ((DstVT == MVT::v32i16 || DstVT == MVT::v64i8) &&
|
||||
SrcVT.isVector() && isTypeLegal(SrcVT)) {
|
||||
SDValue Res = Lower512IntUnary(SDValue(N, 0), DAG);
|
||||
Results.push_back(Res);
|
||||
return;
|
||||
}
|
||||
|
||||
if (SrcVT != MVT::f64 ||
|
||||
(DstVT != MVT::v2i32 && DstVT != MVT::v4i16 && DstVT != MVT::v8i8))
|
||||
return;
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user