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 Chain = N->getChain();
|
||||||
SDValue BasePtr = N->getBasePtr();
|
SDValue BasePtr = N->getBasePtr();
|
||||||
|
|
||||||
if (VT == MVT::v2f32) {
|
if (VT == MVT::v2f32 || VT == MVT::v2i32) {
|
||||||
assert(Mask.getValueType() == MVT::v2i1 && "Unexpected mask type");
|
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 the index is v2i64 and we have VLX we can use xmm for data and index.
|
||||||
if (Index.getValueType() == MVT::v2i64 && Subtarget.hasVLX()) {
|
if (Index.getValueType() == MVT::v2i64 && Subtarget.hasVLX()) {
|
||||||
Src = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v4f32, Src,
|
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||||
DAG.getUNDEF(MVT::v2f32));
|
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);
|
SDVTList VTs = DAG.getVTList(MVT::v2i1, MVT::Other);
|
||||||
SDValue Ops[] = {Chain, Src, Mask, BasePtr, Index, Scale};
|
SDValue Ops[] = {Chain, Src, Mask, BasePtr, Index, Scale};
|
||||||
SDValue NewScatter = DAG.getTargetMemSDNode<X86MaskedScatterSDNode>(
|
SDValue NewScatter = DAG.getTargetMemSDNode<X86MaskedScatterSDNode>(
|
||||||
|
@ -27039,30 +27040,6 @@ static SDValue LowerMSCATTER(SDValue Op, const X86Subtarget &Subtarget,
|
||||||
return SDValue();
|
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 IndexVT = Index.getSimpleValueType();
|
||||||
MVT MaskVT = Mask.getSimpleValueType();
|
MVT MaskVT = Mask.getSimpleValueType();
|
||||||
|
|
||||||
|
@ -28108,16 +28085,20 @@ void X86TargetLowering::ReplaceNodeResults(SDNode *N,
|
||||||
}
|
}
|
||||||
case ISD::MGATHER: {
|
case ISD::MGATHER: {
|
||||||
EVT VT = N->getValueType(0);
|
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);
|
auto *Gather = cast<MaskedGatherSDNode>(N);
|
||||||
SDValue Index = Gather->getIndex();
|
SDValue Index = Gather->getIndex();
|
||||||
if (Index.getValueType() != MVT::v2i64)
|
if (Index.getValueType() != MVT::v2i64)
|
||||||
return;
|
return;
|
||||||
|
assert(getTypeAction(*DAG.getContext(), VT) == TypeWidenVector &&
|
||||||
|
"Unexpected type action!");
|
||||||
|
EVT WideVT = getTypeToTransformTo(*DAG.getContext(), VT);
|
||||||
SDValue Mask = Gather->getMask();
|
SDValue Mask = Gather->getMask();
|
||||||
assert(Mask.getValueType() == MVT::v2i1 && "Unexpected mask type");
|
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(),
|
Gather->getPassThru(),
|
||||||
DAG.getUNDEF(MVT::v2f32));
|
DAG.getUNDEF(VT));
|
||||||
if (!Subtarget.hasVLX()) {
|
if (!Subtarget.hasVLX()) {
|
||||||
// We need to widen the mask, but the instruction will only use 2
|
// We need to widen the mask, but the instruction will only use 2
|
||||||
// of its elements. So we can use undef.
|
// of its elements. So we can use undef.
|
||||||
|
@ -28128,67 +28109,12 @@ void X86TargetLowering::ReplaceNodeResults(SDNode *N,
|
||||||
SDValue Ops[] = { Gather->getChain(), PassThru, Mask,
|
SDValue Ops[] = { Gather->getChain(), PassThru, Mask,
|
||||||
Gather->getBasePtr(), Index, Gather->getScale() };
|
Gather->getBasePtr(), Index, Gather->getScale() };
|
||||||
SDValue Res = DAG.getTargetMemSDNode<X86MaskedGatherSDNode>(
|
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());
|
Gather->getMemoryVT(), Gather->getMemOperand());
|
||||||
Results.push_back(Res);
|
Results.push_back(Res);
|
||||||
Results.push_back(Res.getValue(2));
|
Results.push_back(Res.getValue(2));
|
||||||
return;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
case ISD::LOAD: {
|
case ISD::LOAD: {
|
||||||
|
|
Loading…
Reference in New Issue