Skip to content

Commit 4571fce

Browse files
committed
[X86] ICMP EQ/NE MIN_SIGNED_INT - avoid immediate argument by using NEG + SETO/SETNO
Fixes #67709
1 parent 0c97ac0 commit 4571fce

File tree

8 files changed

+61
-49
lines changed

8 files changed

+61
-49
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 12 additions & 0 deletions
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

Lines changed: 2 additions & 2 deletions
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/abs.ll

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -713,8 +713,9 @@ define i128 @test_sextinreg_i128(i128 %a) nounwind {
713713
define i8 @test_minsigned_i8(i8 %a0, i8 %a1) nounwind {
714714
; X64-LABEL: test_minsigned_i8:
715715
; X64: # %bb.0:
716-
; X64-NEXT: cmpb $-128, %dil
717-
; X64-NEXT: jne .LBB17_1
716+
; X64-NEXT: movl %edi, %eax
717+
; X64-NEXT: negb %al
718+
; X64-NEXT: jno .LBB17_1
718719
; X64-NEXT: # %bb.2: # %select.end
719720
; X64-NEXT: movl %esi, %eax
720721
; X64-NEXT: retq
@@ -729,8 +730,9 @@ define i8 @test_minsigned_i8(i8 %a0, i8 %a1) nounwind {
729730
; X86-LABEL: test_minsigned_i8:
730731
; X86: # %bb.0:
731732
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
732-
; X86-NEXT: cmpb $-128, %al
733-
; X86-NEXT: jne .LBB17_1
733+
; X86-NEXT: movl %eax, %ecx
734+
; X86-NEXT: negb %cl
735+
; X86-NEXT: jno .LBB17_1
734736
; X86-NEXT: # %bb.2: # %select.end
735737
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
736738
; X86-NEXT: retl
@@ -749,30 +751,28 @@ define i8 @test_minsigned_i8(i8 %a0, i8 %a1) nounwind {
749751
define i16 @test_minsigned_i16(i16 %a0, i16 %a1) nounwind {
750752
; X64-LABEL: test_minsigned_i16:
751753
; X64: # %bb.0:
752-
; X64-NEXT: movzwl %di, %eax
753-
; X64-NEXT: cmpl $32768, %eax # imm = 0x8000
754-
; X64-NEXT: jne .LBB18_1
754+
; X64-NEXT: movl %edi, %eax
755+
; X64-NEXT: negw %ax
756+
; X64-NEXT: jno .LBB18_1
755757
; X64-NEXT: # %bb.2: # %select.end
756758
; X64-NEXT: movl %esi, %eax
757759
; X64-NEXT: retq
758760
; X64-NEXT: .LBB18_1: # %select.false.sink
761+
; X64-NEXT: cmovnsw %ax, %di
759762
; X64-NEXT: movl %edi, %eax
760-
; X64-NEXT: negw %ax
761-
; X64-NEXT: cmovsw %di, %ax
762763
; X64-NEXT: retq
763764
;
764765
; X86-LABEL: test_minsigned_i16:
765766
; X86: # %bb.0:
766-
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx
767-
; X86-NEXT: cmpl $32768, %ecx # imm = 0x8000
768-
; X86-NEXT: jne .LBB18_1
767+
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
768+
; X86-NEXT: movl %eax, %ecx
769+
; X86-NEXT: negw %cx
770+
; X86-NEXT: jno .LBB18_1
769771
; X86-NEXT: # %bb.2: # %select.end
770772
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
771773
; X86-NEXT: retl
772774
; X86-NEXT: .LBB18_1: # %select.false.sink
773-
; X86-NEXT: movl %ecx, %eax
774-
; X86-NEXT: negw %ax
775-
; X86-NEXT: cmovsw %cx, %ax
775+
; X86-NEXT: cmovnsw %cx, %ax
776776
; X86-NEXT: retl
777777
%lim = icmp eq i16 %a0, -32768
778778
%abs = tail call i16 @llvm.abs.i16(i16 %a0, i1 false)
@@ -783,29 +783,28 @@ define i16 @test_minsigned_i16(i16 %a0, i16 %a1) nounwind {
783783
define i32 @test_minsigned_i32(i32 %a0, i32 %a1) nounwind {
784784
; X64-LABEL: test_minsigned_i32:
785785
; X64: # %bb.0:
786-
; X64-NEXT: cmpl $-2147483648, %edi # imm = 0x80000000
787-
; X64-NEXT: jne .LBB19_1
786+
; X64-NEXT: movl %edi, %eax
787+
; X64-NEXT: negl %eax
788+
; X64-NEXT: jno .LBB19_1
788789
; X64-NEXT: # %bb.2: # %select.end
789790
; X64-NEXT: movl %esi, %eax
790791
; X64-NEXT: retq
791792
; X64-NEXT: .LBB19_1: # %select.false.sink
793+
; X64-NEXT: cmovnsl %eax, %edi
792794
; X64-NEXT: movl %edi, %eax
793-
; X64-NEXT: negl %eax
794-
; X64-NEXT: cmovsl %edi, %eax
795795
; X64-NEXT: retq
796796
;
797797
; X86-LABEL: test_minsigned_i32:
798798
; X86: # %bb.0:
799-
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
800-
; X86-NEXT: cmpl $-2147483648, %ecx # imm = 0x80000000
801-
; X86-NEXT: jne .LBB19_1
799+
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
800+
; X86-NEXT: movl %eax, %ecx
801+
; X86-NEXT: negl %ecx
802+
; X86-NEXT: jno .LBB19_1
802803
; X86-NEXT: # %bb.2: # %select.end
803804
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
804805
; X86-NEXT: retl
805806
; X86-NEXT: .LBB19_1: # %select.false.sink
806-
; X86-NEXT: movl %ecx, %eax
807-
; X86-NEXT: negl %eax
808-
; X86-NEXT: cmovsl %ecx, %eax
807+
; X86-NEXT: cmovnsl %ecx, %eax
809808
; X86-NEXT: retl
810809
%lim = icmp eq i32 %a0, -2147483648
811810
%abs = tail call i32 @llvm.abs.i32(i32 %a0, i1 false)
@@ -816,16 +815,15 @@ define i32 @test_minsigned_i32(i32 %a0, i32 %a1) nounwind {
816815
define i64 @test_minsigned_i64(i64 %a0, i64 %a1) nounwind {
817816
; X64-LABEL: test_minsigned_i64:
818817
; X64: # %bb.0:
819-
; X64-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
820-
; X64-NEXT: cmpq %rax, %rdi
821-
; X64-NEXT: jne .LBB20_1
818+
; X64-NEXT: movq %rdi, %rax
819+
; X64-NEXT: negq %rax
820+
; X64-NEXT: jno .LBB20_1
822821
; X64-NEXT: # %bb.2: # %select.end
823822
; X64-NEXT: movq %rsi, %rax
824823
; X64-NEXT: retq
825824
; X64-NEXT: .LBB20_1: # %select.false.sink
825+
; X64-NEXT: cmovnsq %rax, %rdi
826826
; X64-NEXT: movq %rdi, %rax
827-
; X64-NEXT: negq %rax
828-
; X64-NEXT: cmovsq %rdi, %rax
829827
; X64-NEXT: retq
830828
;
831829
; X86-LABEL: test_minsigned_i64:

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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 10 additions & 8 deletions
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

Lines changed: 3 additions & 3 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 2 additions & 2 deletions
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)