mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-25 21:45:21 +00:00
[x86] don't use a shuffle when a vselect will do; NFCI
Looking at the IR definition of a masked load made me realize there was no reason to use a shuffle here, so we don't need to convert the format of the mask at all. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@263167 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
578acc5b53
commit
444e7f9783
@ -27336,8 +27336,8 @@ reduceMaskedLoadToScalarLoad(MaskedLoadSDNode *ML, SelectionDAG &DAG,
|
||||
return DCI.CombineTo(ML, Insert, Load.getValue(1), true);
|
||||
}
|
||||
|
||||
/// Convert a masked load with a constant mask into a masked load and a shuffle.
|
||||
/// This allows the blend operation to use a faster kind of shuffle instruction
|
||||
/// Convert a masked load with a constant mask into a masked load and a select.
|
||||
/// This allows the select operation to use a faster kind of shuffle instruction
|
||||
/// (for example, vblendvps -> vblendps).
|
||||
static SDValue
|
||||
combineMaskedLoadConstantMask(MaskedLoadSDNode *ML, SelectionDAG &DAG,
|
||||
@ -27348,26 +27348,15 @@ combineMaskedLoadConstantMask(MaskedLoadSDNode *ML, SelectionDAG &DAG,
|
||||
ML->getSrc0().getOpcode() == ISD::UNDEF)
|
||||
return SDValue();
|
||||
|
||||
// Convert the masked load's mask into a blend mask for a vector shuffle node.
|
||||
EVT VT = ML->getValueType(0);
|
||||
unsigned NumElts = VT.getVectorNumElements();
|
||||
BuildVectorSDNode *MaskBV = cast<BuildVectorSDNode>(ML->getMask());
|
||||
SmallVector<int, 16> ShufMask(NumElts, SM_SentinelUndef);
|
||||
for (unsigned i = 0; i < NumElts; ++i) {
|
||||
// If this mask bit of the masked load is false, the pass-through vector
|
||||
// (Src0) element will be selected for that vector lane.
|
||||
if (MaskBV->getOperand(i).getOpcode() != ISD::UNDEF)
|
||||
ShufMask[i] = isNullConstant(MaskBV->getOperand(i)) ? i + NumElts : i;
|
||||
}
|
||||
|
||||
// The new masked load has an undef pass-through operand. The shuffle uses the
|
||||
// The new masked load has an undef pass-through operand. The select uses the
|
||||
// original pass-through operand.
|
||||
SDLoc DL(ML);
|
||||
EVT VT = ML->getValueType(0);
|
||||
SDValue NewML = DAG.getMaskedLoad(VT, DL, ML->getChain(), ML->getBasePtr(),
|
||||
ML->getMask(), DAG.getUNDEF(VT),
|
||||
ML->getMemoryVT(), ML->getMemOperand(),
|
||||
ML->getExtensionType());
|
||||
SDValue Blend = DAG.getVectorShuffle(VT, DL, NewML, ML->getSrc0(), ShufMask);
|
||||
SDValue Blend = DAG.getSelect(DL, VT, ML->getMask(), NewML, ML->getSrc0());
|
||||
|
||||
return DCI.CombineTo(ML, Blend, NewML.getValue(1), true);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user