diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-04-26 18:02:14 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-04-26 18:02:14 +0000 |
| commit | 27e01e675c1acd9f648847d96f296b611f22628f (patch) | |
| tree | 0aa6d08415f7ae9507388273150cf5c4b4f42536 /llvm/lib | |
| parent | 67ab9eb193ce74b0a28bd2413189a34d929cc46c (diff) | |
| download | bcm5719-llvm-27e01e675c1acd9f648847d96f296b611f22628f.tar.gz bcm5719-llvm-27e01e675c1acd9f648847d96f296b611f22628f.zip | |
[X86][AVX] Fold extract_subvector(broadcast(x)) -> broadcast(x) iff x has one use
llvm-svn: 359332
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 7aaf71adf79..23eec373190 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -42590,6 +42590,13 @@ static SDValue combineExtractSubvector(SDNode *N, SelectionDAG &DAG, VT, SDLoc(N), InVec.getNode()->ops().slice(IdxVal, VT.getVectorNumElements())); + // If we're extracting from a broadcast then we're better off just + // broadcasting to the smaller type directly, assuming this is the only use. + // As its a broadcast we don't care about the extraction index. + if (InVec.getOpcode() == X86ISD::VBROADCAST && InVec.hasOneUse() && + InVec.getOperand(0).getValueSizeInBits() <= VT.getSizeInBits()) + return DAG.getNode(X86ISD::VBROADCAST, SDLoc(N), VT, InVec.getOperand(0)); + // If we're extracting the lowest subvector and we're the only user, // we may be able to perform this with a smaller vector width. if (IdxVal == 0 && InVec.hasOneUse()) { |

