summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2017-10-28 14:27:53 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2017-10-28 14:27:53 +0000
commitd09c1ac20f908675dde9fec43808e5d661e165ac (patch)
tree5f1a065cdb31bd3caa54365ce614c627bf234351 /llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
parent1496d188a07124f09589cdba0bd8cb8c58ade8be (diff)
downloadbcm5719-llvm-d09c1ac20f908675dde9fec43808e5d661e165ac.tar.gz
bcm5719-llvm-d09c1ac20f908675dde9fec43808e5d661e165ac.zip
[SelectionDAG] Support 'bit preserving' floating points bitcasts on computeKnownBits/ComputeNumSignBits
For cases where we know the floating point representations match the bitcasted integer equivalent, allow bitcasting to these types. This is especially useful for the X86 floating point compare results which return all/zero bits but as a floating point type. Differential Revision: https://reviews.llvm.org/D39289 llvm-svn: 316831
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp22
1 files changed, 15 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index b92ca2b5aec..7f47853b3fc 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -2096,6 +2096,12 @@ void SelectionDAG::computeKnownBits(SDValue Op, KnownBits &Known,
Known.Zero = ~Known.One;
return;
}
+ if (auto *C = dyn_cast<ConstantFPSDNode>(Op)) {
+ // We know all of the bits for a constant fp!
+ Known.One = C->getValueAPF().bitcastToAPInt();
+ Known.Zero = ~Known.One;
+ return;
+ }
if (Depth == 6)
return; // Limit search depth.
@@ -2219,10 +2225,11 @@ void SelectionDAG::computeKnownBits(SDValue Op, KnownBits &Known,
}
case ISD::BITCAST: {
SDValue N0 = Op.getOperand(0);
- unsigned SubBitWidth = N0.getScalarValueSizeInBits();
+ EVT SubVT = N0.getValueType();
+ unsigned SubBitWidth = SubVT.getScalarSizeInBits();
- // Ignore bitcasts from floating point.
- if (!N0.getValueType().isInteger())
+ // Ignore bitcasts from unsupported types.
+ if (!(SubVT.isInteger() || SubVT.isFloatingPoint()))
break;
// Fast handling of 'identity' bitcasts.
@@ -2960,7 +2967,7 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, unsigned Depth) const {
unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
unsigned Depth) const {
EVT VT = Op.getValueType();
- assert(VT.isInteger() && "Invalid VT!");
+ assert((VT.isInteger() || VT.isFloatingPoint()) && "Invalid VT!");
unsigned VTBits = VT.getScalarSizeInBits();
unsigned NumElts = DemandedElts.getBitWidth();
unsigned Tmp, Tmp2;
@@ -3041,10 +3048,11 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
case ISD::BITCAST: {
SDValue N0 = Op.getOperand(0);
- unsigned SrcBits = N0.getScalarValueSizeInBits();
+ EVT SrcVT = N0.getValueType();
+ unsigned SrcBits = SrcVT.getScalarSizeInBits();
- // Ignore bitcasts from floating point.
- if (!N0.getValueType().isInteger())
+ // Ignore bitcasts from unsupported types..
+ if (!(SrcVT.isInteger() || SrcVT.isFloatingPoint()))
break;
// Fast handling of 'identity' bitcasts.
OpenPOWER on IntegriCloud