diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2020-01-05 18:50:44 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2020-01-05 18:50:44 +0000 |
commit | e3bd0118903ccb545ca5cb2641646eb66ae8180e (patch) | |
tree | e6d09173f3c1e8bc195438333db74efacbd90682 /llvm/lib/Target/X86 | |
parent | 6a6e6f04ec2cd2f4f07ec4943036c5c2d47ce0c7 (diff) | |
download | bcm5719-llvm-e3bd0118903ccb545ca5cb2641646eb66ae8180e.tar.gz bcm5719-llvm-e3bd0118903ccb545ca5cb2641646eb66ae8180e.zip |
[X86][SSE] Combine combineLogicBlendIntoConditionalNegate for VSELECT nodes (PR43660)
Attempt to use combineLogicBlendIntoConditionalNegate for (select M, (sub 0, X), X) -> (sub (xor X, M), M)
We limit this to cases that can't easily replace the VSELECT with a shuffle (non-constant masks) or where a BLENDV is likely to occur (which tends to result in slower codegen).
Diffstat (limited to 'llvm/lib/Target/X86')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index ba29d9e513d..e41717c332a 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -37697,10 +37697,21 @@ static SDValue combineSelect(SDNode *N, SelectionDAG &DAG, EVT VT = LHS.getValueType(); EVT CondVT = Cond.getValueType(); const TargetLowering &TLI = DAG.getTargetLoweringInfo(); + bool CondConstantVector = ISD::isBuildVectorOfConstantSDNodes(Cond.getNode()); + + // Attempt to combine (select M, (sub 0, X), X) -> (sub (xor X, M), M). + // Limit this to cases of non-constant masks that createShuffleMaskFromVSELECT + // can't catch, plus vXi8 cases where we'd likely end up with BLENDV. + if (CondVT.isVector() && CondVT.isInteger() && + CondVT.getScalarSizeInBits() == VT.getScalarSizeInBits() && + (!CondConstantVector || CondVT.getScalarType() == MVT::i8) && + DAG.ComputeNumSignBits(Cond) == CondVT.getScalarSizeInBits()) + if (SDValue V = combineLogicBlendIntoConditionalNegate(VT, Cond, RHS, LHS, + DL, DAG, Subtarget)) + return V; // Convert vselects with constant condition into shuffles. - if (ISD::isBuildVectorOfConstantSDNodes(Cond.getNode()) && - DCI.isBeforeLegalizeOps()) { + if (CondConstantVector && DCI.isBeforeLegalizeOps()) { SmallVector<int, 64> Mask; if (createShuffleMaskFromVSELECT(Mask, Cond)) return DAG.getVectorShuffle(VT, DL, LHS, RHS, Mask); |