[X86] Return false from hasAndNotCompare if the comparision value is a constant.

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.

llvm-svn: 350018
This commit is contained in:
Craig Topper 2018-12-23 05:52:55 +00:00
parent 69952979da
commit 006bac6880
2 changed files with 5 additions and 8 deletions

View 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.

View 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