summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2019-02-05 10:58:43 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2019-02-05 10:58:43 +0000
commit9e595e366348ea340746cf0849b5f4cae42e1ff5 (patch)
tree716c74dc3ae38cc6c3f9a2c029b5c6629b54acdf /llvm/lib
parentfbb3086fc8c48b9bc9540db48fc2ae2f740793af (diff)
downloadbcm5719-llvm-9e595e366348ea340746cf0849b5f4cae42e1ff5.tar.gz
bcm5719-llvm-9e595e366348ea340746cf0849b5f4cae42e1ff5.zip
[X86][AVX] Attempt to share broadcasts of different widths (PR39454)
If we have broadcasts of different vector widths, keep the longest vector width and extract subvectors for the shorter vectors (which should be free). Differential Revision: https://reviews.llvm.org/D57663 llvm-svn: 353154
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 314fed564c2..7d81bfba4b1 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -32071,6 +32071,14 @@ static SDValue combineTargetShuffle(SDValue N, SelectionDAG &DAG,
if (Src.getOpcode() == ISD::SCALAR_TO_VECTOR)
return DAG.getNode(X86ISD::VBROADCAST, DL, VT, Src.getOperand(0));
+ // Share broadcast with the longest vector and extract low subvector (free).
+ for (SDNode *User : Src->uses())
+ if (User != N.getNode() && User->getOpcode() == X86ISD::VBROADCAST &&
+ User->getValueSizeInBits(0) > VT.getSizeInBits()) {
+ return extractSubVector(SDValue(User, 0), 0, DAG, DL,
+ VT.getSizeInBits());
+ }
+
return SDValue();
}
case X86ISD::PSHUFD:
OpenPOWER on IntegriCloud