diff options
author | Sanjay Patel <spatel@rotateright.com> | 2017-02-11 18:01:55 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2017-02-11 18:01:55 +0000 |
commit | 63499b61c9167c9a89c6858c88fe70783db9a26a (patch) | |
tree | 42a632766c604d8d22b1214956df093a7f1ca504 /llvm/lib/CodeGen | |
parent | 5c092a34385d67892538524f10268078e1eb12ed (diff) | |
download | bcm5719-llvm-63499b61c9167c9a89c6858c88fe70783db9a26a.tar.gz bcm5719-llvm-63499b61c9167c9a89c6858c88fe70783db9a26a.zip |
[TargetLowering] check for sign-bit comparisons in SimplifyDemandedBits
I don't know if anything other than x86 vectors is affected by this change, but this may allow
us to remove target-specific intrinsics for blendv* (vector selects). The simplification arises
from the fact that blendv* instructions only use the sign-bit when deciding which vector element
to choose for the destination vector. The mechanism to fold VSELECT into SHRUNKBLEND nodes already
exists in x86 lowering; this demanded bits change just enables the transform to fire more often.
The original motivation starts with a bug for DSE of masked stores that seems completely unrelated,
but I've explained the likely steps in this series here:
https://llvm.org/bugs/show_bug.cgi?id=11210
Differential Revision: https://reviews.llvm.org/D29687
llvm-svn: 294863
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 144165ab63a..3db7c8202d6 100644 --- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -751,6 +751,25 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op, KnownOne &= KnownOne2; KnownZero &= KnownZero2; break; + case ISD::SETCC: + // If (1) we only need the sign-bit, (2) the setcc operands are the same + // width as the setcc result, and (3) the result of a setcc conforms to 0 or + // -1, we may be able to bypass the setcc. + if (NewMask.isSignBit() && + Op.getOperand(0).getScalarValueSizeInBits() == BitWidth && + getBooleanContents(Op.getValueType()) == + BooleanContent::ZeroOrNegativeOneBooleanContent) { + ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get(); + // If we're testing if X < 0, then this compare isn't needed - just use X! + if (CC == ISD::SETLT && + (isNullConstant(Op.getOperand(1)) || + ISD::isBuildVectorAllZeros(Op.getOperand(1).getNode()))) + return TLO.CombineTo(Op, Op.getOperand(0)); + + // TODO: Should we check for other forms of sign-bit comparisons? + // Examples: X <= -1, X >= 0 + } + break; case ISD::SHL: if (ConstantSDNode *SA = dyn_cast<ConstantSDNode>(Op.getOperand(1))) { unsigned ShAmt = SA->getZExtValue(); |