forked from OSchip/llvm-project
[X86] Merge v2f32 and v2i32 gather/scatter handling in ReplaceNodeResults/LowerMSCATTER now that v2i32 is also widened like v2f32.
llvm-svn: 368389
This commit is contained in:
parent
6f81db0f68
commit
0da681a2be
|
@ -27024,12 +27024,13 @@ static SDValue LowerMSCATTER(SDValue Op, const X86Subtarget &Subtarget,
|
|||
SDValue Chain = N->getChain();
|
||||
SDValue BasePtr = N->getBasePtr();
|
||||
|
||||
if (VT == MVT::v2f32) {
|
||||
if (VT == MVT::v2f32 || VT == MVT::v2i32) {
|
||||
assert(Mask.getValueType() == MVT::v2i1 && "Unexpected mask type");
|
||||
// If the index is v2i64 and we have VLX we can use xmm for data and index.
|
||||
if (Index.getValueType() == MVT::v2i64 && Subtarget.hasVLX()) {
|
||||
Src = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v4f32, Src,
|
||||
DAG.getUNDEF(MVT::v2f32));
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
EVT WideVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
|
||||
Src = DAG.getNode(ISD::CONCAT_VECTORS, dl, WideVT, Src, DAG.getUNDEF(VT));
|
||||
SDVTList VTs = DAG.getVTList(MVT::v2i1, MVT::Other);
|
||||
SDValue Ops[] = {Chain, Src, Mask, BasePtr, Index, Scale};
|
||||
SDValue NewScatter = DAG.getTargetMemSDNode<X86MaskedScatterSDNode>(
|
||||
|
@ -27039,30 +27040,6 @@ static SDValue LowerMSCATTER(SDValue Op, const X86Subtarget &Subtarget,
|
|||
return SDValue();
|
||||
}
|
||||
|
||||
if (VT == MVT::v2i32) {
|
||||
assert(Mask.getValueType() == MVT::v2i1 && "Unexpected mask type");
|
||||
Src = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v4i32, Src,
|
||||
DAG.getUNDEF(MVT::v2i32));
|
||||
// If the index is v2i64 and we have VLX we can use xmm for data and index.
|
||||
if (Index.getValueType() == MVT::v2i64 && Subtarget.hasVLX()) {
|
||||
SDVTList VTs = DAG.getVTList(MVT::v2i1, MVT::Other);
|
||||
SDValue Ops[] = {Chain, Src, Mask, BasePtr, Index, Scale};
|
||||
SDValue NewScatter = DAG.getTargetMemSDNode<X86MaskedScatterSDNode>(
|
||||
VTs, Ops, dl, N->getMemoryVT(), N->getMemOperand());
|
||||
return SDValue(NewScatter.getNode(), 1);
|
||||
}
|
||||
// Custom widen all the operands to avoid promotion.
|
||||
EVT NewIndexVT = EVT::getVectorVT(
|
||||
*DAG.getContext(), Index.getValueType().getVectorElementType(), 4);
|
||||
Index = DAG.getNode(ISD::CONCAT_VECTORS, dl, NewIndexVT, Index,
|
||||
DAG.getUNDEF(Index.getValueType()));
|
||||
Mask = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v4i1, Mask,
|
||||
DAG.getConstant(0, dl, MVT::v2i1));
|
||||
SDValue Ops[] = {Chain, Src, Mask, BasePtr, Index, Scale};
|
||||
return DAG.getMaskedScatter(DAG.getVTList(MVT::Other), N->getMemoryVT(), dl,
|
||||
Ops, N->getMemOperand(), N->getIndexType());
|
||||
}
|
||||
|
||||
MVT IndexVT = Index.getSimpleValueType();
|
||||
MVT MaskVT = Mask.getSimpleValueType();
|
||||
|
||||
|
@ -28108,16 +28085,20 @@ void X86TargetLowering::ReplaceNodeResults(SDNode *N,
|
|||
}
|
||||
case ISD::MGATHER: {
|
||||
EVT VT = N->getValueType(0);
|
||||
if (VT == MVT::v2f32 && (Subtarget.hasVLX() || !Subtarget.hasAVX512())) {
|
||||
if ((VT == MVT::v2f32 || VT == MVT::v2i32) &&
|
||||
(Subtarget.hasVLX() || !Subtarget.hasAVX512())) {
|
||||
auto *Gather = cast<MaskedGatherSDNode>(N);
|
||||
SDValue Index = Gather->getIndex();
|
||||
if (Index.getValueType() != MVT::v2i64)
|
||||
return;
|
||||
assert(getTypeAction(*DAG.getContext(), VT) == TypeWidenVector &&
|
||||
"Unexpected type action!");
|
||||
EVT WideVT = getTypeToTransformTo(*DAG.getContext(), VT);
|
||||
SDValue Mask = Gather->getMask();
|
||||
assert(Mask.getValueType() == MVT::v2i1 && "Unexpected mask type");
|
||||
SDValue PassThru = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v4f32,
|
||||
SDValue PassThru = DAG.getNode(ISD::CONCAT_VECTORS, dl, WideVT,
|
||||
Gather->getPassThru(),
|
||||
DAG.getUNDEF(MVT::v2f32));
|
||||
DAG.getUNDEF(VT));
|
||||
if (!Subtarget.hasVLX()) {
|
||||
// We need to widen the mask, but the instruction will only use 2
|
||||
// of its elements. So we can use undef.
|
||||
|
@ -28128,67 +28109,12 @@ void X86TargetLowering::ReplaceNodeResults(SDNode *N,
|
|||
SDValue Ops[] = { Gather->getChain(), PassThru, Mask,
|
||||
Gather->getBasePtr(), Index, Gather->getScale() };
|
||||
SDValue Res = DAG.getTargetMemSDNode<X86MaskedGatherSDNode>(
|
||||
DAG.getVTList(MVT::v4f32, Mask.getValueType(), MVT::Other), Ops, dl,
|
||||
DAG.getVTList(WideVT, Mask.getValueType(), MVT::Other), Ops, dl,
|
||||
Gather->getMemoryVT(), Gather->getMemOperand());
|
||||
Results.push_back(Res);
|
||||
Results.push_back(Res.getValue(2));
|
||||
return;
|
||||
}
|
||||
if (VT == MVT::v2i32) {
|
||||
auto *Gather = cast<MaskedGatherSDNode>(N);
|
||||
SDValue Index = Gather->getIndex();
|
||||
SDValue Mask = Gather->getMask();
|
||||
assert(Mask.getValueType() == MVT::v2i1 && "Unexpected mask type");
|
||||
SDValue PassThru = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v4i32,
|
||||
Gather->getPassThru(),
|
||||
DAG.getUNDEF(MVT::v2i32));
|
||||
// If the index is v2i64 we can use it directly.
|
||||
if (Index.getValueType() == MVT::v2i64 &&
|
||||
(Subtarget.hasVLX() || !Subtarget.hasAVX512())) {
|
||||
if (!Subtarget.hasVLX()) {
|
||||
// We need to widen the mask, but the instruction will only use 2
|
||||
// of its elements. So we can use undef.
|
||||
Mask = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v4i1, Mask,
|
||||
DAG.getUNDEF(MVT::v2i1));
|
||||
Mask = DAG.getNode(ISD::SIGN_EXTEND, dl, MVT::v4i32, Mask);
|
||||
}
|
||||
SDValue Ops[] = { Gather->getChain(), PassThru, Mask,
|
||||
Gather->getBasePtr(), Index, Gather->getScale() };
|
||||
SDValue Res = DAG.getTargetMemSDNode<X86MaskedGatherSDNode>(
|
||||
DAG.getVTList(MVT::v4i32, Mask.getValueType(), MVT::Other), Ops, dl,
|
||||
Gather->getMemoryVT(), Gather->getMemOperand());
|
||||
SDValue Chain = Res.getValue(2);
|
||||
if (getTypeAction(*DAG.getContext(), VT) != TypeWidenVector)
|
||||
Res = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, MVT::v2i32, Res,
|
||||
DAG.getIntPtrConstant(0, dl));
|
||||
Results.push_back(Res);
|
||||
Results.push_back(Chain);
|
||||
return;
|
||||
}
|
||||
if (getTypeAction(*DAG.getContext(), VT) != TypeWidenVector) {
|
||||
EVT IndexVT = Index.getValueType();
|
||||
EVT NewIndexVT = EVT::getVectorVT(*DAG.getContext(),
|
||||
IndexVT.getScalarType(), 4);
|
||||
// Otherwise we need to custom widen everything to avoid promotion.
|
||||
Index = DAG.getNode(ISD::CONCAT_VECTORS, dl, NewIndexVT, Index,
|
||||
DAG.getUNDEF(IndexVT));
|
||||
Mask = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v4i1, Mask,
|
||||
DAG.getConstant(0, dl, MVT::v2i1));
|
||||
SDValue Ops[] = { Gather->getChain(), PassThru, Mask,
|
||||
Gather->getBasePtr(), Index, Gather->getScale() };
|
||||
SDValue Res = DAG.getMaskedGather(DAG.getVTList(MVT::v4i32, MVT::Other),
|
||||
Gather->getMemoryVT(), dl, Ops,
|
||||
Gather->getMemOperand(),
|
||||
Gather->getIndexType());
|
||||
SDValue Chain = Res.getValue(1);
|
||||
if (getTypeAction(*DAG.getContext(), MVT::v2i32) != TypeWidenVector)
|
||||
Res = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, MVT::v2i32, Res,
|
||||
DAG.getIntPtrConstant(0, dl));
|
||||
Results.push_back(Res);
|
||||
Results.push_back(Chain);
|
||||
return;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
case ISD::LOAD: {
|
||||
|
|
Loading…
Reference in New Issue