Skip to content

Commit fedeaba

Browse files
committed
[X86] Limit i8/i16 eq/ne MIN_SIGNED_INT to one use only
1 parent c8af776 commit fedeaba

File tree

2 files changed

+22
-15
lines changed

2 files changed

+22
-15
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23820,12 +23820,14 @@ SDValue X86TargetLowering::emitFlagsForSetcc(SDValue Op0, SDValue Op1,
2382023820
// overflow.
2382123821
if (isMinSignedConstant(Op1)) {
2382223822
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);
23823+
if (VT == MVT::i32 || VT == MVT::i64 || Op0->hasOneUse()) {
23824+
SDVTList CmpVTs = DAG.getVTList(VT, MVT::i32);
23825+
X86::CondCode CondCode = CC == ISD::SETEQ ? X86::COND_O : X86::COND_NO;
23826+
X86CC = DAG.getTargetConstant(CondCode, dl, MVT::i8);
23827+
SDValue Neg = DAG.getNode(X86ISD::SUB, dl, CmpVTs,
23828+
DAG.getConstant(0, dl, VT), Op0);
23829+
return SDValue(Neg.getNode(), 1);
23830+
}
2382923831
}
2383023832

2383123833
// Try to use the carry flag from the add in place of an separate CMP for:

llvm/test/CodeGen/X86/abs.ll

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -718,18 +718,17 @@ define i8 @test_minsigned_i8(i8 %a0, i8 %a1) nounwind {
718718
; X64-NEXT: movl %edi, %ecx
719719
; X64-NEXT: xorb %al, %cl
720720
; X64-NEXT: subb %al, %cl
721-
; X64-NEXT: negb %dil
721+
; X64-NEXT: cmpb $-128, %dil
722722
; X64-NEXT: movzbl %cl, %eax
723-
; X64-NEXT: cmovol %esi, %eax
723+
; X64-NEXT: cmovel %esi, %eax
724724
; X64-NEXT: # kill: def $al killed $al killed $eax
725725
; X64-NEXT: retq
726726
;
727727
; X86-LABEL: test_minsigned_i8:
728728
; X86: # %bb.0:
729729
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
730-
; X86-NEXT: movl %eax, %ecx
731-
; X86-NEXT: negb %cl
732-
; X86-NEXT: jno .LBB17_1
730+
; X86-NEXT: cmpb $-128, %al
731+
; X86-NEXT: jne .LBB17_1
733732
; X86-NEXT: # %bb.2:
734733
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
735734
; X86-NEXT: # kill: def $al killed $al killed $eax
@@ -751,10 +750,12 @@ define i8 @test_minsigned_i8(i8 %a0, i8 %a1) nounwind {
751750
define i16 @test_minsigned_i16(i16 %a0, i16 %a1) nounwind {
752751
; X64-LABEL: test_minsigned_i16:
753752
; X64: # %bb.0:
754-
; X64-NEXT: movl %edi, %eax
753+
; X64-NEXT: movzwl %di, %ecx
754+
; X64-NEXT: movl %ecx, %eax
755755
; X64-NEXT: negw %ax
756-
; X64-NEXT: cmovsw %di, %ax
757-
; X64-NEXT: cmovol %esi, %eax
756+
; X64-NEXT: cmovsw %cx, %ax
757+
; X64-NEXT: cmpl $32768, %ecx # imm = 0x8000
758+
; X64-NEXT: cmovel %esi, %eax
758759
; X64-NEXT: # kill: def $ax killed $ax killed $eax
759760
; X64-NEXT: retq
760761
;
@@ -764,7 +765,11 @@ define i16 @test_minsigned_i16(i16 %a0, i16 %a1) nounwind {
764765
; X86-NEXT: movl %ecx, %eax
765766
; X86-NEXT: negw %ax
766767
; X86-NEXT: cmovsw %cx, %ax
767-
; X86-NEXT: cmovow {{[0-9]+}}(%esp), %ax
768+
; X86-NEXT: cmpl $32768, %ecx # imm = 0x8000
769+
; X86-NEXT: jne .LBB18_2
770+
; X86-NEXT: # %bb.1:
771+
; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
772+
; X86-NEXT: .LBB18_2:
768773
; X86-NEXT: retl
769774
%lim = icmp eq i16 %a0, -32768
770775
%abs = tail call i16 @llvm.abs.i16(i16 %a0, i1 false)

0 commit comments

Comments
 (0)