diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-02-05 10:58:43 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-02-05 10:58:43 +0000 |
| commit | 9e595e366348ea340746cf0849b5f4cae42e1ff5 (patch) | |
| tree | 716c74dc3ae38cc6c3f9a2c029b5c6629b54acdf /llvm/lib | |
| parent | fbb3086fc8c48b9bc9540db48fc2ae2f740793af (diff) | |
| download | bcm5719-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.cpp | 8 |
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: |

