Skip to content

Commit

Permalink
[X86] Directly form VBROADCAST_LOAD for BUILD_VECTOR of splat loads i…
Browse files Browse the repository at this point in the history
…n lowerBuildVectorAsBroadcast.
  • Loading branch information
topperc committed Mar 4, 2020
1 parent 7e1a6ca commit 9284abd
Showing 1 changed file with 20 additions and 5 deletions.
25 changes: 20 additions & 5 deletions llvm/lib/Target/X86/X86ISelLowering.cpp
Expand Up @@ -8670,14 +8670,29 @@ static SDValue lowerBuildVectorAsBroadcast(BuildVectorSDNode *BVOp,
return SDValue();

if (ScalarSize == 32 || (IsGE256 && ScalarSize == 64) ||
(Subtarget.hasVLX() && ScalarSize == 64))
return DAG.getNode(X86ISD::VBROADCAST, dl, VT, Ld);
(Subtarget.hasVLX() && ScalarSize == 64)) {
auto *LN = cast<LoadSDNode>(Ld);
SDVTList Tys = DAG.getVTList(VT, MVT::Other);
SDValue Ops[] = {LN->getChain(), LN->getBasePtr()};
SDValue BCast =
DAG.getMemIntrinsicNode(X86ISD::VBROADCAST_LOAD, dl, Tys, Ops,
LN->getMemoryVT(), LN->getMemOperand());
DAG.ReplaceAllUsesOfValueWith(SDValue(LN, 1), BCast.getValue(1));
return BCast;
}

// The integer check is needed for the 64-bit into 128-bit so it doesn't match
// double since there is no vbroadcastsd xmm
if (Subtarget.hasInt256() && Ld.getValueType().isInteger()) {
if (ScalarSize == 8 || ScalarSize == 16 || ScalarSize == 64)
return DAG.getNode(X86ISD::VBROADCAST, dl, VT, Ld);
if (Subtarget.hasInt256() && Ld.getValueType().isInteger() &&
(ScalarSize == 8 || ScalarSize == 16 || ScalarSize == 64)) {
auto *LN = cast<LoadSDNode>(Ld);
SDVTList Tys = DAG.getVTList(VT, MVT::Other);
SDValue Ops[] = {LN->getChain(), LN->getBasePtr()};
SDValue BCast =
DAG.getMemIntrinsicNode(X86ISD::VBROADCAST_LOAD, dl, Tys, Ops,
LN->getMemoryVT(), LN->getMemOperand());
DAG.ReplaceAllUsesOfValueWith(SDValue(LN, 1), BCast.getValue(1));
return BCast;
}

// Unsupported broadcast.
Expand Down

0 comments on commit 9284abd

Please sign in to comment.