Skip to content

Commit 78ac07f

Browse files
committed
[DAGCombiner] Simplifying {si|ui}tofp when only signbit is needed
If we only need the signbit `uitofp` simplified to 0, and `sitofp` simplifies to `bitcast`.
1 parent 0e4359f commit 78ac07f

File tree

3 files changed

+36
-18
lines changed

3 files changed

+36
-18
lines changed

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -816,6 +816,18 @@ SDValue TargetLowering::SimplifyMultipleUseDemandedBits(
816816
}
817817
break;
818818
}
819+
case ISD::SINT_TO_FP: {
820+
EVT InnerVT = Op.getOperand(0).getValueType();
821+
if (DemandedBits.isSignMask() &&
822+
VT.getScalarSizeInBits() == InnerVT.getScalarSizeInBits())
823+
return DAG.getBitcast(VT, Op.getOperand(0));
824+
break;
825+
}
826+
case ISD::UINT_TO_FP: {
827+
if (DemandedBits.isSignMask())
828+
return DAG.getConstant(0, SDLoc(Op), VT);
829+
break;
830+
}
819831
case ISD::SIGN_EXTEND_INREG: {
820832
// If none of the extended bits are demanded, eliminate the sextinreg.
821833
SDValue Op0 = Op.getOperand(0);
@@ -2313,6 +2325,22 @@ bool TargetLowering::SimplifyDemandedBits(
23132325
Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
23142326
break;
23152327
}
2328+
case ISD::SINT_TO_FP: {
2329+
EVT InnerVT = Op.getOperand(0).getValueType();
2330+
if (DemandedBits.isSignMask() &&
2331+
VT.getScalarSizeInBits() == InnerVT.getScalarSizeInBits())
2332+
return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Op.getOperand(0)));
2333+
2334+
Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
2335+
break;
2336+
}
2337+
case ISD::UINT_TO_FP: {
2338+
if (DemandedBits.isSignMask())
2339+
return TLO.CombineTo(Op, TLO.DAG.getConstant(0, dl, VT));
2340+
2341+
Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
2342+
break;
2343+
}
23162344
case ISD::SIGN_EXTEND_INREG: {
23172345
SDValue Op0 = Op.getOperand(0);
23182346
EVT ExVT = cast<VTSDNode>(Op.getOperand(1))->getVT();

llvm/test/CodeGen/X86/combine-sse41-intrinsics.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,14 +164,13 @@ define <4 x float> @demandedbits_sitofp_blendvps(<4 x float> %a0, <4 x float> %a
164164
; SSE-LABEL: demandedbits_sitofp_blendvps:
165165
; SSE: # %bb.0:
166166
; SSE-NEXT: movaps %xmm0, %xmm3
167-
; SSE-NEXT: cvtdq2ps %xmm2, %xmm0
167+
; SSE-NEXT: movaps %xmm2, %xmm0
168168
; SSE-NEXT: blendvps %xmm0, %xmm1, %xmm3
169169
; SSE-NEXT: movaps %xmm3, %xmm0
170170
; SSE-NEXT: retq
171171
;
172172
; AVX-LABEL: demandedbits_sitofp_blendvps:
173173
; AVX: # %bb.0:
174-
; AVX-NEXT: vcvtdq2ps %xmm2, %xmm2
175174
; AVX-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm0
176175
; AVX-NEXT: retq
177176
%cvt = sitofp <4 x i32> %a2 to <4 x float>

llvm/test/CodeGen/X86/int-to-fp-demanded.ll

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,13 @@ declare void @use.i32(i32)
77
define i32 @sitofp_signbit_only(i32 %i_in) {
88
; X86-LABEL: sitofp_signbit_only:
99
; X86: # %bb.0:
10-
; X86-NEXT: subl $8, %esp
11-
; X86-NEXT: .cfi_def_cfa_offset 12
12-
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
13-
; X86-NEXT: movl %eax, (%esp)
14-
; X86-NEXT: fildl (%esp)
15-
; X86-NEXT: fstps {{[0-9]+}}(%esp)
1610
; X86-NEXT: movl $-2147483648, %eax # imm = 0x80000000
1711
; X86-NEXT: andl {{[0-9]+}}(%esp), %eax
18-
; X86-NEXT: addl $8, %esp
19-
; X86-NEXT: .cfi_def_cfa_offset 4
2012
; X86-NEXT: retl
2113
;
2214
; X64-LABEL: sitofp_signbit_only:
2315
; X64: # %bb.0:
24-
; X64-NEXT: cvtsi2ss %edi, %xmm0
16+
; X64-NEXT: movd %edi, %xmm0
2517
; X64-NEXT: movmskps %xmm0, %eax
2618
; X64-NEXT: shll $31, %eax
2719
; X64-NEXT: retq
@@ -48,8 +40,8 @@ define i32 @sitofp_signbit_only_okay_width(i16 %i_in) {
4840
;
4941
; X64-LABEL: sitofp_signbit_only_okay_width:
5042
; X64: # %bb.0:
51-
; X64-NEXT: movswl %di, %eax
52-
; X64-NEXT: cvtsi2ss %eax, %xmm0
43+
; X64-NEXT: shll $16, %edi
44+
; X64-NEXT: movd %edi, %xmm0
5345
; X64-NEXT: movmskps %xmm0, %eax
5446
; X64-NEXT: shll $31, %eax
5547
; X64-NEXT: retq
@@ -89,15 +81,14 @@ define <2 x i16> @sitofp_signbit_only_fail_bad_width2(i32 %i_in) {
8981
; X86: # %bb.0:
9082
; X86-NEXT: subl $8, %esp
9183
; X86-NEXT: .cfi_def_cfa_offset 12
92-
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
93-
; X86-NEXT: movl %eax, (%esp)
84+
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
85+
; X86-NEXT: movl %edx, (%esp)
9486
; X86-NEXT: fildl (%esp)
9587
; X86-NEXT: fstps {{[0-9]+}}(%esp)
96-
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
97-
; X86-NEXT: movl %eax, %edx
9888
; X86-NEXT: shrl $16, %edx
99-
; X86-NEXT: andl $32768, %eax # imm = 0x8000
10089
; X86-NEXT: andl $32768, %edx # imm = 0x8000
90+
; X86-NEXT: movl $32768, %eax # imm = 0x8000
91+
; X86-NEXT: andl {{[0-9]+}}(%esp), %eax
10192
; X86-NEXT: # kill: def $ax killed $ax killed $eax
10293
; X86-NEXT: # kill: def $dx killed $dx killed $edx
10394
; X86-NEXT: addl $8, %esp

0 commit comments

Comments
 (0)