Skip to content

Commit 7bc8e87

Browse files
committed
[X86] ICMP EQ/NE MIN_SIGNED_INT - avoid immediate argument by using NEG + SETO/SETNO
Fixes #67709
1 parent 23b8f59 commit 7bc8e87

File tree

7 files changed

+33
-19
lines changed

7 files changed

+33
-19
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -23816,6 +23816,18 @@ SDValue X86TargetLowering::emitFlagsForSetcc(SDValue Op0, SDValue Op1,
2381623816
}
2381723817
}
2381823818

23819+
// Look for X == INT_MIN or X != INT_MIN. We can use NEG and test for
23820+
// overflow.
23821+
if (isMinSignedConstant(Op1)) {
23822+
EVT VT = Op0.getValueType();
23823+
SDVTList CmpVTs = DAG.getVTList(VT, MVT::i32);
23824+
X86::CondCode CondCode = CC == ISD::SETEQ ? X86::COND_O : X86::COND_NO;
23825+
X86CC = DAG.getTargetConstant(CondCode, dl, MVT::i8);
23826+
SDValue Neg =
23827+
DAG.getNode(X86ISD::SUB, dl, CmpVTs, DAG.getConstant(0, dl, VT), Op0);
23828+
return SDValue(Neg.getNode(), 1);
23829+
}
23830+
2381923831
// Try to use the carry flag from the add in place of an separate CMP for:
2382023832
// (seteq (add X, -1), -1). Similar for setne.
2382123833
if (isAllOnesConstant(Op1) && Op0.getOpcode() == ISD::ADD &&

llvm/test/CodeGen/X86/2008-06-16-SubregsBug.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ define i16 @test(ptr %tmp179) nounwind {
88
; CHECK-NEXT: movzwl (%eax), %eax
99
; CHECK-NEXT: movl %eax, %ecx
1010
; CHECK-NEXT: andl $64512, %ecx ## imm = 0xFC00
11-
; CHECK-NEXT: cmpl $32768, %ecx ## imm = 0x8000
12-
; CHECK-NEXT: jne LBB0_2
11+
; CHECK-NEXT: negw %cx
12+
; CHECK-NEXT: jno LBB0_2
1313
; CHECK-NEXT: ## %bb.1: ## %bb189
1414
; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax
1515
; CHECK-NEXT: retl

llvm/test/CodeGen/X86/combine-sdiv.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ define i32 @combine_sdiv_by_minsigned(i32 %x) {
5858
; CHECK-LABEL: combine_sdiv_by_minsigned:
5959
; CHECK: # %bb.0:
6060
; CHECK-NEXT: xorl %eax, %eax
61-
; CHECK-NEXT: cmpl $-2147483648, %edi # imm = 0x80000000
62-
; CHECK-NEXT: sete %al
61+
; CHECK-NEXT: negl %edi
62+
; CHECK-NEXT: seto %al
6363
; CHECK-NEXT: retq
6464
%1 = sdiv i32 %x, -2147483648
6565
ret i32 %1

llvm/test/CodeGen/X86/is_fpclass.ll

+10-8
Original file line numberDiff line numberDiff line change
@@ -936,15 +936,16 @@ entry:
936936
define i1 @is_minus_zero_f(float %x) {
937937
; CHECK-32-LABEL: is_minus_zero_f:
938938
; CHECK-32: # %bb.0: # %entry
939-
; CHECK-32-NEXT: cmpl $-2147483648, {{[0-9]+}}(%esp) # imm = 0x80000000
940-
; CHECK-32-NEXT: sete %al
939+
; CHECK-32-NEXT: xorl %eax, %eax
940+
; CHECK-32-NEXT: cmpl {{[0-9]+}}(%esp), %eax
941+
; CHECK-32-NEXT: seto %al
941942
; CHECK-32-NEXT: retl
942943
;
943944
; CHECK-64-LABEL: is_minus_zero_f:
944945
; CHECK-64: # %bb.0: # %entry
945946
; CHECK-64-NEXT: movd %xmm0, %eax
946-
; CHECK-64-NEXT: cmpl $-2147483648, %eax # imm = 0x80000000
947-
; CHECK-64-NEXT: sete %al
947+
; CHECK-64-NEXT: negl %eax
948+
; CHECK-64-NEXT: seto %al
948949
; CHECK-64-NEXT: retq
949950
entry:
950951
%0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 32) ; 0x20 = "-zero"
@@ -954,15 +955,16 @@ entry:
954955
define i1 @not_is_minus_zero_f(float %x) {
955956
; CHECK-32-LABEL: not_is_minus_zero_f:
956957
; CHECK-32: # %bb.0: # %entry
957-
; CHECK-32-NEXT: cmpl $-2147483648, {{[0-9]+}}(%esp) # imm = 0x80000000
958-
; CHECK-32-NEXT: setne %al
958+
; CHECK-32-NEXT: xorl %eax, %eax
959+
; CHECK-32-NEXT: cmpl {{[0-9]+}}(%esp), %eax
960+
; CHECK-32-NEXT: setno %al
959961
; CHECK-32-NEXT: retl
960962
;
961963
; CHECK-64-LABEL: not_is_minus_zero_f:
962964
; CHECK-64: # %bb.0: # %entry
963965
; CHECK-64-NEXT: movd %xmm0, %eax
964-
; CHECK-64-NEXT: cmpl $-2147483648, %eax # imm = 0x80000000
965-
; CHECK-64-NEXT: setne %al
966+
; CHECK-64-NEXT: negl %eax
967+
; CHECK-64-NEXT: setno %al
966968
; CHECK-64-NEXT: retq
967969
entry:
968970
%0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 991) ; ~0x20 = ~"-zero"

llvm/test/CodeGen/X86/lsr-overflow.ll

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
; The comparison uses the pre-inc value, which could lead LSR to
55
; try to compute -INT64_MIN.
66

7-
; CHECK: movabsq $-9223372036854775808, %rax
8-
; CHECK: cmpq %rax,
9-
; CHECK: sete %al
7+
; CHECK-NOT: movabsq $-9223372036854775808, %rax
8+
; CHECK: negq %r
9+
; CHECK-NEXT: seto %al
1010

1111
declare i64 @bar()
1212

llvm/test/CodeGen/X86/shrink-compare-pgso.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -265,8 +265,8 @@ if.end:
265265
define dso_local void @test_sext_i8_icmp_neg128(i8 %x) nounwind !prof !14 {
266266
; CHECK-LABEL: test_sext_i8_icmp_neg128:
267267
; CHECK: # %bb.0: # %entry
268-
; CHECK-NEXT: cmpb $-128, %dil
269-
; CHECK-NEXT: je bar # TAILCALL
268+
; CHECK-NEXT: negb %dil
269+
; CHECK-NEXT: jo bar # TAILCALL
270270
; CHECK-NEXT: # %bb.1: # %if.end
271271
; CHECK-NEXT: retq
272272
entry:

llvm/test/CodeGen/X86/shrink-compare.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -265,8 +265,8 @@ if.end:
265265
define dso_local void @test_sext_i8_icmp_neg128(i8 %x) nounwind minsize {
266266
; CHECK-LABEL: test_sext_i8_icmp_neg128:
267267
; CHECK: # %bb.0: # %entry
268-
; CHECK-NEXT: cmpb $-128, %dil
269-
; CHECK-NEXT: je bar # TAILCALL
268+
; CHECK-NEXT: negb %dil
269+
; CHECK-NEXT: jo bar # TAILCALL
270270
; CHECK-NEXT: # %bb.1: # %if.end
271271
; CHECK-NEXT: retq
272272
entry:

0 commit comments

Comments
 (0)