Skip to content

Commit 821f39e

Browse files
committed
[X86] Allow all legal integers to have optimize smin and smax with 0
It makes no sense why it has to be limited to 32 and 64 bits.
1 parent 2ec7959 commit 821f39e

File tree

2 files changed

+29
-46
lines changed

2 files changed

+29
-46
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25093,7 +25093,7 @@ SDValue X86TargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
2509325093
} else if (SDValue R = LowerSELECTWithCmpZero(CmpOp0, Op1, Op2, CondCode,
2509425094
DL, DAG, Subtarget)) {
2509525095
return R;
25096-
} else if ((VT == MVT::i32 || VT == MVT::i64) && isNullConstant(Op2) &&
25096+
} else if (VT.isScalarInteger() && isNullConstant(Op2) &&
2509725097
Cmp.getNode()->hasOneUse() && (CmpOp0 == Op1) &&
2509825098
((CondCode == X86::COND_S) || // smin(x, 0)
2509925099
(CondCode == X86::COND_G && hasAndNot(Op1)))) { // smax(x, 0)

llvm/test/CodeGen/X86/select-smin-smax.ll

Lines changed: 28 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -50,31 +50,18 @@ define i8 @test_i8_smax(i8 %a) nounwind {
5050
define i8 @test_i8_smin(i8 %a) nounwind {
5151
; X64-LABEL: test_i8_smin:
5252
; X64: # %bb.0:
53-
; X64-NEXT: xorl %eax, %eax
54-
; X64-NEXT: testb %dil, %dil
55-
; X64-NEXT: cmovsl %edi, %eax
56-
; X64-NEXT: # kill: def $al killed $al killed $eax
53+
; X64-NEXT: movl %edi, %eax
54+
; X64-NEXT: sarb $7, %al
55+
; X64-NEXT: andb %dil, %al
5756
; X64-NEXT: retq
5857
;
59-
; X86-BMI-LABEL: test_i8_smin:
60-
; X86-BMI: # %bb.0:
61-
; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %ecx
62-
; X86-BMI-NEXT: xorl %eax, %eax
63-
; X86-BMI-NEXT: testb %cl, %cl
64-
; X86-BMI-NEXT: cmovsl %ecx, %eax
65-
; X86-BMI-NEXT: # kill: def $al killed $al killed $eax
66-
; X86-BMI-NEXT: retl
67-
;
68-
; X86-NOBMI-LABEL: test_i8_smin:
69-
; X86-NOBMI: # %bb.0:
70-
; X86-NOBMI-NEXT: movzbl {{[0-9]+}}(%esp), %eax
71-
; X86-NOBMI-NEXT: testb %al, %al
72-
; X86-NOBMI-NEXT: js .LBB1_2
73-
; X86-NOBMI-NEXT: # %bb.1:
74-
; X86-NOBMI-NEXT: xorl %eax, %eax
75-
; X86-NOBMI-NEXT: .LBB1_2:
76-
; X86-NOBMI-NEXT: # kill: def $al killed $al killed $eax
77-
; X86-NOBMI-NEXT: retl
58+
; X86-LABEL: test_i8_smin:
59+
; X86: # %bb.0:
60+
; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
61+
; X86-NEXT: movl %ecx, %eax
62+
; X86-NEXT: sarb $7, %al
63+
; X86-NEXT: andb %cl, %al
64+
; X86-NEXT: retl
7865
%r = call i8 @llvm.smin.i8(i8 %a, i8 0)
7966
ret i8 %r
8067
}
@@ -112,33 +99,29 @@ define i16 @test_i16_smax(i16 %a) nounwind {
11299
}
113100

114101
define i16 @test_i16_smin(i16 %a) nounwind {
102+
; CHECK-LABEL: test_i16_smin:
103+
; CHECK: # %bb.0:
104+
; CHECK-NEXT: movswl %di, %eax
105+
; CHECK-NEXT: sarl $15, %eax
106+
; CHECK-NEXT: andl %edi, %eax
107+
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax
108+
; CHECK-NEXT: retq
115109
; X64-LABEL: test_i16_smin:
116110
; X64: # %bb.0:
117-
; X64-NEXT: xorl %eax, %eax
118-
; X64-NEXT: testw %di, %di
119-
; X64-NEXT: cmovsl %edi, %eax
111+
; X64-NEXT: movswl %di, %eax
112+
; X64-NEXT: sarl $15, %eax
113+
; X64-NEXT: andl %edi, %eax
120114
; X64-NEXT: # kill: def $ax killed $ax killed $eax
121115
; X64-NEXT: retq
122116
;
123-
; X86-BMI-LABEL: test_i16_smin:
124-
; X86-BMI: # %bb.0:
125-
; X86-BMI-NEXT: movl {{[0-9]+}}(%esp), %ecx
126-
; X86-BMI-NEXT: xorl %eax, %eax
127-
; X86-BMI-NEXT: testw %cx, %cx
128-
; X86-BMI-NEXT: cmovsl %ecx, %eax
129-
; X86-BMI-NEXT: # kill: def $ax killed $ax killed $eax
130-
; X86-BMI-NEXT: retl
131-
;
132-
; X86-NOBMI-LABEL: test_i16_smin:
133-
; X86-NOBMI: # %bb.0:
134-
; X86-NOBMI-NEXT: movl {{[0-9]+}}(%esp), %eax
135-
; X86-NOBMI-NEXT: testw %ax, %ax
136-
; X86-NOBMI-NEXT: js .LBB3_2
137-
; X86-NOBMI-NEXT: # %bb.1:
138-
; X86-NOBMI-NEXT: xorl %eax, %eax
139-
; X86-NOBMI-NEXT: .LBB3_2:
140-
; X86-NOBMI-NEXT: # kill: def $ax killed $ax killed $eax
141-
; X86-NOBMI-NEXT: retl
117+
; X86-LABEL: test_i16_smin:
118+
; X86: # %bb.0:
119+
; X86-NEXT: movswl {{[0-9]+}}(%esp), %ecx
120+
; X86-NEXT: movl %ecx, %eax
121+
; X86-NEXT: shrl $15, %eax
122+
; X86-NEXT: andl %ecx, %eax
123+
; X86-NEXT: # kill: def $ax killed $ax killed $eax
124+
; X86-NEXT: retl
142125
%r = call i16 @llvm.smin.i16(i16 %a, i16 0)
143126
ret i16 %r
144127
}

0 commit comments

Comments
 (0)