diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-02-24 19:57:52 +0000 | 
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-02-24 19:57:52 +0000 | 
| commit | cfaf663a356d1c97b42a62f42c34f316bf0edb49 (patch) | |
| tree | 2ed1ca09a093203caa0a9802d81a3d63ede1718a /llvm/lib/Target/X86/X86ISelLowering.cpp | |
| parent | 3fe4bd464cc647da36a5c4f4c0015fb653f0e3b1 (diff) | |
| download | bcm5719-llvm-cfaf663a356d1c97b42a62f42c34f316bf0edb49.tar.gz bcm5719-llvm-cfaf663a356d1c97b42a62f42c34f316bf0edb49.zip | |
[X86] Combine zext(packus(x),packus(y)) -> concat(x,y) (PR39637)
Its proving tricky to combine shuffles across multiple vector sizes, so for now I'm adding this more specific combine - the pattern is common enough to be worth it as a first step.
llvm-svn: 354757
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 14 | 
1 files changed, 14 insertions, 0 deletions
| diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index ae7fd6c93b3..dc50eca4258 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -40328,6 +40328,20 @@ static SDValue combineZext(SDNode *N, SelectionDAG &DAG,    if (SDValue R = combineOrCmpEqZeroToCtlzSrl(N, DAG, DCI, Subtarget))      return R; +  // TODO: Combine with any target/faux shuffle. +  if (N0.getOpcode() == X86ISD::PACKUS && N0.getValueSizeInBits() == 128 && +      VT.getScalarSizeInBits() == N0.getOperand(0).getScalarValueSizeInBits()) { +    SDValue N00 = N0.getOperand(0); +    SDValue N01 = N0.getOperand(1); +    unsigned NumSrcElts = N00.getValueType().getVectorNumElements(); +    unsigned NumSrcEltBits = N00.getScalarValueSizeInBits(); +    APInt ZeroMask = APInt::getHighBitsSet(NumSrcEltBits, NumSrcEltBits / 2); +    if ((N00.isUndef() || DAG.MaskedValueIsZero(N00, ZeroMask)) && +        (N01.isUndef() || DAG.MaskedValueIsZero(N01, ZeroMask))) { +      return concatSubVectors(N00, N01, VT, NumSrcElts * 2, DAG, dl, 128); +    } +  } +    return SDValue();  } | 

