From bd27e7ebf8d01c55242c1fdbdd61d2e1844f4cb0 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Sat, 7 Oct 2017 16:51:19 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315153 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelLowering.cpp | 20 ++++++++++++++++++++ test/CodeGen/X86/cmovcmov.ll | 6 ++---- test/CodeGen/X86/pr32282.ll | 1 - 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 9485b02735b..e2f5807aa55 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/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. diff --git a/test/CodeGen/X86/cmovcmov.ll b/test/CodeGen/X86/cmovcmov.ll index 5b984d27249..50860b8d8fd 100644 --- a/test/CodeGen/X86/cmovcmov.ll +++ b/test/CodeGen/X86/cmovcmov.ll @@ -53,8 +53,7 @@ entry: ; NOCMOV-NEXT: leal 12(%esp), %ecx ; NOCMOV-NEXT: [[TBB]]: ; NOCMOV-NEXT: movl (%ecx), %eax -; NOCMOV-NEXT: orl $4, %ecx -; NOCMOV-NEXT: movl (%ecx), %edx +; NOCMOV-NEXT: movl 4(%ecx), %edx ; NOCMOV-NEXT: retl define i64 @test_select_fcmp_oeq_i64(float %a, float %b, i64 %c, i64 %d) #0 { entry: @@ -82,8 +81,7 @@ entry: ; NOCMOV-NEXT: leal 20(%esp), %ecx ; NOCMOV-NEXT: [[TBB]]: ; NOCMOV-NEXT: movl (%ecx), %eax -; NOCMOV-NEXT: orl $4, %ecx -; NOCMOV-NEXT: movl (%ecx), %edx +; NOCMOV-NEXT: movl 4(%ecx), %edx ; NOCMOV-NEXT: retl define i64 @test_select_fcmp_une_i64(float %a, float %b, i64 %c, i64 %d) #0 { entry: diff --git a/test/CodeGen/X86/pr32282.ll b/test/CodeGen/X86/pr32282.ll index 26c4bdb2375..6b526258f10 100644 --- a/test/CodeGen/X86/pr32282.ll +++ b/test/CodeGen/X86/pr32282.ll @@ -28,7 +28,6 @@ define void @foo() { ; X86-NEXT: cmovnel %ecx, %edx ; X86-NEXT: cmovnel %eax, %ecx ; X86-NEXT: andl $-2, %edx -; X86-NEXT: andl $2147483647, %ecx # imm = 0x7FFFFFFF ; X86-NEXT: addl $7, %edx ; X86-NEXT: adcxl %eax, %ecx ; X86-NEXT: pushl %ecx -- 2.40.0