diff options
| author | Craig Topper <craig.topper@intel.com> | 2017-10-07 16:51:19 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2017-10-07 16:51:19 +0000 |
| commit | 2f602953647ff616fd7d9d1fb9475dbf66ef306a (patch) | |
| tree | 46ffab2dacb409aa6f980e396f749796f798dd05 /llvm/lib | |
| parent | 865e6c852b565e83b75b43a21942618439f8705e (diff) | |
| download | bcm5719-llvm-2f602953647ff616fd7d9d1fb9475dbf66ef306a.tar.gz bcm5719-llvm-2f602953647ff616fd7d9d1fb9475dbf66ef306a.zip | |
[X86] Add X86ISD::CMOV to computeKnownBitsForTargetNode and ComputeNumSignBitsForTargetNode.
Summary: Implementations based on ISD::SELECT.
Reviewers: RKSimon, spatel
Reviewed By: RKSimon
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D38663
llvm-svn: 315153
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 9485b02735b..e2f5807aa55 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -27165,6 +27165,19 @@ void X86TargetLowering::computeKnownBitsForTargetNode(const SDValue Op, Known.Zero.setBitsFrom(InBitWidth); break; } + case X86ISD::CMOV: { + DAG.computeKnownBits(Op.getOperand(1), Known, Depth+1); + // If we don't know any bits, early out. + if (Known.isUnknown()) + break; + KnownBits Known2; + DAG.computeKnownBits(Op.getOperand(0), Known2, Depth+1); + + // Only known if known in both the LHS and RHS. + Known.One &= Known2.One; + Known.Zero &= Known2.Zero; + break; + } } } @@ -27227,6 +27240,13 @@ unsigned X86TargetLowering::ComputeNumSignBitsForTargetNode( case X86ISD::VPCOMU: // Vector compares return zero/all-bits result values. return VTBits; + + case X86ISD::CMOV: { + unsigned Tmp0 = DAG.ComputeNumSignBits(Op.getOperand(0), Depth+1); + if (Tmp0 == 1) return 1; // Early out. + unsigned Tmp1 = DAG.ComputeNumSignBits(Op.getOperand(1), Depth+1); + return std::min(Tmp0, Tmp1); + } } // Fallback case. |

