]> granicus.if.org Git - llvm/commitdiff
[X86] Return false from hasAndNotCompare if the comparision value is a constant.
authorCraig Topper <craig.topper@intel.com>
Sun, 23 Dec 2018 05:52:55 +0000 (05:52 +0000)
committerCraig Topper <craig.topper@intel.com>
Sun, 23 Dec 2018 05:52:55 +0000 (05:52 +0000)
We won't end up using an ANDN instruction in this case so we should generate the same code we do for pre-BMI targets.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350018 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/bmi.ll

index 3f6598d5ca3d6dfe8786706ad5e5fd30823c37ae..6e2a592c80bba2a5b983de88b9297705f9b12aa7 100644 (file)
@@ -4945,17 +4945,14 @@ bool X86TargetLowering::hasAndNotCompare(SDValue Y) const {
   if (VT != MVT::i32 && VT != MVT::i64)
     return false;
 
-  // A mask and compare against constant is ok for an 'andn' too
-  // even though the BMI instruction doesn't have an immediate form.
-
-  return true;
+  return !isa<ConstantSDNode>(Y);
 }
 
 bool X86TargetLowering::hasAndNot(SDValue Y) const {
   EVT VT = Y.getValueType();
 
-  if (!VT.isVector()) // x86 can't form 'andn' with an immediate.
-    return !isa<ConstantSDNode>(Y) && hasAndNotCompare(Y);
+  if (!VT.isVector())
+    return hasAndNotCompare(Y);
 
   // Vector.
 
index 0a3acb4cfdf7f116c2eda2d5a084868b89a63ba0..8605c4158372b8865190be866366f2859a268910 100644 (file)
@@ -157,15 +157,15 @@ define i1 @and_cmp_const(i32 %x) {
 ; X86-LABEL: and_cmp_const:
 ; X86:       # %bb.0:
 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-NEXT:    notl %eax
 ; X86-NEXT:    andl $43, %eax
+; X86-NEXT:    cmpl $43, %eax
 ; X86-NEXT:    sete %al
 ; X86-NEXT:    retl
 ;
 ; X64-LABEL: and_cmp_const:
 ; X64:       # %bb.0:
-; X64-NEXT:    notl %edi
 ; X64-NEXT:    andl $43, %edi
+; X64-NEXT:    cmpl $43, %edi
 ; X64-NEXT:    sete %al
 ; X64-NEXT:    retq
   %and = and i32 %x, 43