Skip to content

Commit 95865e5

Browse files
committed
[DAG] SimplifyDemandedBits - if we're only demanding the signbit, a SMIN/SMAX node can be simplified to a OR/AND node respectively.
Alive2: https://alive2.llvm.org/ce/z/MehvFB REAPPLIED from 54d663d with fix for using the correct DemandedBits mask.
1 parent ca10a6c commit 95865e5

File tree

3 files changed

+26
-8
lines changed

3 files changed

+26
-8
lines changed

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2135,6 +2135,24 @@ bool TargetLowering::SimplifyDemandedBits(
21352135
}
21362136
break;
21372137
}
2138+
case ISD::SMIN: {
2139+
SDValue Op0 = Op.getOperand(0);
2140+
SDValue Op1 = Op.getOperand(1);
2141+
// If we're only wanting the signbit, then we can simplify to OR node.
2142+
// TODO: Extend this based on ComputeNumSignBits.
2143+
if (DemandedBits.isSignMask())
2144+
return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::OR, dl, VT, Op0, Op1));
2145+
break;
2146+
}
2147+
case ISD::SMAX: {
2148+
SDValue Op0 = Op.getOperand(0);
2149+
SDValue Op1 = Op.getOperand(1);
2150+
// If we're only wanting the signbit, then we can simplify to AND node.
2151+
// TODO: Extend this based on ComputeNumSignBits.
2152+
if (DemandedBits.isSignMask())
2153+
return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::AND, dl, VT, Op0, Op1));
2154+
break;
2155+
}
21382156
case ISD::UMIN: {
21392157
SDValue Op0 = Op.getOperand(0);
21402158
SDValue Op1 = Op.getOperand(1);

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,27 +105,27 @@ define <16 x i8> @test_v16i8_demandedbits(<16 x i8> %x, <16 x i8> %y, <16 x i8>
105105
;
106106
; SSE41-LABEL: test_v16i8_demandedbits:
107107
; SSE41: # %bb.0:
108-
; SSE41-NEXT: pmaxsb %xmm1, %xmm0
108+
; SSE41-NEXT: andps %xmm1, %xmm0
109109
; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2
110110
; SSE41-NEXT: movdqa %xmm2, %xmm0
111111
; SSE41-NEXT: retq
112112
;
113113
; SSE42-LABEL: test_v16i8_demandedbits:
114114
; SSE42: # %bb.0:
115-
; SSE42-NEXT: pmaxsb %xmm1, %xmm0
115+
; SSE42-NEXT: andps %xmm1, %xmm0
116116
; SSE42-NEXT: pblendvb %xmm0, %xmm3, %xmm2
117117
; SSE42-NEXT: movdqa %xmm2, %xmm0
118118
; SSE42-NEXT: retq
119119
;
120120
; AVX1OR2-LABEL: test_v16i8_demandedbits:
121121
; AVX1OR2: # %bb.0:
122-
; AVX1OR2-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
122+
; AVX1OR2-NEXT: vpand %xmm1, %xmm0, %xmm0
123123
; AVX1OR2-NEXT: vpblendvb %xmm0, %xmm3, %xmm2, %xmm0
124124
; AVX1OR2-NEXT: retq
125125
;
126126
; AVX512F-LABEL: test_v16i8_demandedbits:
127127
; AVX512F: # %bb.0:
128-
; AVX512F-NEXT: vpmaxsb %xmm1, %xmm0, %xmm0
128+
; AVX512F-NEXT: vpand %xmm1, %xmm0, %xmm0
129129
; AVX512F-NEXT: vpblendvb %xmm0, %xmm3, %xmm2, %xmm0
130130
; AVX512F-NEXT: retq
131131
;

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,27 +107,27 @@ define <16 x i8> @test_v16i8_demandedbits(<16 x i8> %x, <16 x i8> %y, <16 x i8>
107107
;
108108
; SSE41-LABEL: test_v16i8_demandedbits:
109109
; SSE41: # %bb.0:
110-
; SSE41-NEXT: pminsb %xmm1, %xmm0
110+
; SSE41-NEXT: orps %xmm1, %xmm0
111111
; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2
112112
; SSE41-NEXT: movdqa %xmm2, %xmm0
113113
; SSE41-NEXT: retq
114114
;
115115
; SSE42-LABEL: test_v16i8_demandedbits:
116116
; SSE42: # %bb.0:
117-
; SSE42-NEXT: pminsb %xmm1, %xmm0
117+
; SSE42-NEXT: orps %xmm1, %xmm0
118118
; SSE42-NEXT: pblendvb %xmm0, %xmm3, %xmm2
119119
; SSE42-NEXT: movdqa %xmm2, %xmm0
120120
; SSE42-NEXT: retq
121121
;
122122
; AVX1OR2-LABEL: test_v16i8_demandedbits:
123123
; AVX1OR2: # %bb.0:
124-
; AVX1OR2-NEXT: vpminsb %xmm1, %xmm0, %xmm0
124+
; AVX1OR2-NEXT: vpor %xmm1, %xmm0, %xmm0
125125
; AVX1OR2-NEXT: vpblendvb %xmm0, %xmm3, %xmm2, %xmm0
126126
; AVX1OR2-NEXT: retq
127127
;
128128
; AVX512F-LABEL: test_v16i8_demandedbits:
129129
; AVX512F: # %bb.0:
130-
; AVX512F-NEXT: vpminsb %xmm1, %xmm0, %xmm0
130+
; AVX512F-NEXT: vpor %xmm1, %xmm0, %xmm0
131131
; AVX512F-NEXT: vpblendvb %xmm0, %xmm3, %xmm2, %xmm0
132132
; AVX512F-NEXT: retq
133133
;

0 commit comments

Comments
 (0)