Skip to content
This repository was archived by the owner on Apr 23, 2020. It is now read-only.

Commit 63745a6

Browse files
committed
[SelectionDAG] Add SEXT/AND/XOR/Or demanded elts support to ComputeNumSignBits
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@316875 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 986395e commit 63745a6

File tree

2 files changed

+26
-30
lines changed

2 files changed

+26
-30
lines changed

lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3130,17 +3130,21 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
31303130
}
31313131

31323132
case ISD::SIGN_EXTEND:
3133-
case ISD::SIGN_EXTEND_VECTOR_INREG:
31343133
Tmp = VTBits - Op.getOperand(0).getScalarValueSizeInBits();
3135-
return ComputeNumSignBits(Op.getOperand(0), Depth+1) + Tmp;
3136-
3134+
return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1) + Tmp;
31373135
case ISD::SIGN_EXTEND_INREG:
31383136
// Max of the input and what this extends.
31393137
Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
31403138
Tmp = VTBits-Tmp+1;
3141-
3142-
Tmp2 = ComputeNumSignBits(Op.getOperand(0), Depth+1);
3139+
Tmp2 = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
31433140
return std::max(Tmp, Tmp2);
3141+
case ISD::SIGN_EXTEND_VECTOR_INREG: {
3142+
SDValue Src = Op.getOperand(0);
3143+
EVT SrcVT = Src.getValueType();
3144+
APInt DemandedSrcElts = DemandedElts.zext(SrcVT.getVectorNumElements());
3145+
Tmp = VTBits - SrcVT.getScalarSizeInBits();
3146+
return ComputeNumSignBits(Src, DemandedSrcElts, Depth+1) + Tmp;
3147+
}
31443148

31453149
case ISD::SRA:
31463150
Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
@@ -3166,9 +3170,9 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
31663170
case ISD::OR:
31673171
case ISD::XOR: // NOT is handled here.
31683172
// Logical binary ops preserve the number of sign bits at the worst.
3169-
Tmp = ComputeNumSignBits(Op.getOperand(0), Depth+1);
3173+
Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
31703174
if (Tmp != 1) {
3171-
Tmp2 = ComputeNumSignBits(Op.getOperand(1), Depth+1);
3175+
Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
31723176
FirstAnswer = std::min(Tmp, Tmp2);
31733177
// We computed what we know about the sign bits as our first
31743178
// answer. Now proceed to the generic code that uses

test/CodeGen/X86/known-signbits-vector.ll

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -279,10 +279,7 @@ define <2 x double> @signbits_ashr_concat_ashr_extract_sitofp(<2 x i64> %a0, <4
279279
define float @signbits_ashr_sext_sextinreg_and_extract_sitofp(<2 x i64> %a0, <2 x i64> %a1, i32 %a2) nounwind {
280280
; X32-LABEL: signbits_ashr_sext_sextinreg_and_extract_sitofp:
281281
; X32: # BB#0:
282-
; X32-NEXT: pushl %ebp
283-
; X32-NEXT: movl %esp, %ebp
284-
; X32-NEXT: andl $-8, %esp
285-
; X32-NEXT: subl $16, %esp
282+
; X32-NEXT: pushl %eax
286283
; X32-NEXT: vmovdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
287284
; X32-NEXT: vpsrlq $60, %xmm2, %xmm3
288285
; X32-NEXT: vpsrlq $61, %xmm2, %xmm2
@@ -292,7 +289,7 @@ define float @signbits_ashr_sext_sextinreg_and_extract_sitofp(<2 x i64> %a0, <2
292289
; X32-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
293290
; X32-NEXT: vpxor %xmm2, %xmm0, %xmm0
294291
; X32-NEXT: vpsubq %xmm2, %xmm0, %xmm0
295-
; X32-NEXT: movl 8(%ebp), %eax
292+
; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
296293
; X32-NEXT: vpinsrd $0, %eax, %xmm1, %xmm1
297294
; X32-NEXT: sarl $31, %eax
298295
; X32-NEXT: vpinsrd $1, %eax, %xmm1, %xmm1
@@ -301,12 +298,11 @@ define float @signbits_ashr_sext_sextinreg_and_extract_sitofp(<2 x i64> %a0, <2
301298
; X32-NEXT: vpsrlq $20, %xmm1, %xmm1
302299
; X32-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
303300
; X32-NEXT: vpand %xmm1, %xmm0, %xmm0
304-
; X32-NEXT: vmovq %xmm0, {{[0-9]+}}(%esp)
305-
; X32-NEXT: fildll {{[0-9]+}}(%esp)
306-
; X32-NEXT: fstps {{[0-9]+}}(%esp)
307-
; X32-NEXT: flds {{[0-9]+}}(%esp)
308-
; X32-NEXT: movl %ebp, %esp
309-
; X32-NEXT: popl %ebp
301+
; X32-NEXT: vmovd %xmm0, %eax
302+
; X32-NEXT: vcvtsi2ssl %eax, %xmm4, %xmm0
303+
; X32-NEXT: vmovss %xmm0, (%esp)
304+
; X32-NEXT: flds (%esp)
305+
; X32-NEXT: popl %eax
310306
; X32-NEXT: retl
311307
;
312308
; X64-LABEL: signbits_ashr_sext_sextinreg_and_extract_sitofp:
@@ -325,7 +321,7 @@ define float @signbits_ashr_sext_sextinreg_and_extract_sitofp(<2 x i64> %a0, <2
325321
; X64-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
326322
; X64-NEXT: vpand %xmm1, %xmm0, %xmm0
327323
; X64-NEXT: vmovq %xmm0, %rax
328-
; X64-NEXT: vcvtsi2ssq %rax, %xmm3, %xmm0
324+
; X64-NEXT: vcvtsi2ssl %eax, %xmm3, %xmm0
329325
; X64-NEXT: retq
330326
%1 = ashr <2 x i64> %a0, <i64 61, i64 60>
331327
%2 = sext i32 %a2 to i64
@@ -341,10 +337,7 @@ define float @signbits_ashr_sext_sextinreg_and_extract_sitofp(<2 x i64> %a0, <2
341337
define float @signbits_ashr_sextvecinreg_bitops_extract_sitofp(<2 x i64> %a0, <4 x i32> %a1) nounwind {
342338
; X32-LABEL: signbits_ashr_sextvecinreg_bitops_extract_sitofp:
343339
; X32: # BB#0:
344-
; X32-NEXT: pushl %ebp
345-
; X32-NEXT: movl %esp, %ebp
346-
; X32-NEXT: andl $-8, %esp
347-
; X32-NEXT: subl $16, %esp
340+
; X32-NEXT: pushl %eax
348341
; X32-NEXT: vmovdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
349342
; X32-NEXT: vpsrlq $60, %xmm2, %xmm3
350343
; X32-NEXT: vpsrlq $61, %xmm2, %xmm2
@@ -358,12 +351,11 @@ define float @signbits_ashr_sextvecinreg_bitops_extract_sitofp(<2 x i64> %a0, <4
358351
; X32-NEXT: vpand %xmm1, %xmm0, %xmm2
359352
; X32-NEXT: vpor %xmm1, %xmm2, %xmm1
360353
; X32-NEXT: vpxor %xmm0, %xmm1, %xmm0
361-
; X32-NEXT: vmovq %xmm0, {{[0-9]+}}(%esp)
362-
; X32-NEXT: fildll {{[0-9]+}}(%esp)
363-
; X32-NEXT: fstps {{[0-9]+}}(%esp)
364-
; X32-NEXT: flds {{[0-9]+}}(%esp)
365-
; X32-NEXT: movl %ebp, %esp
366-
; X32-NEXT: popl %ebp
354+
; X32-NEXT: vmovd %xmm0, %eax
355+
; X32-NEXT: vcvtsi2ssl %eax, %xmm4, %xmm0
356+
; X32-NEXT: vmovss %xmm0, (%esp)
357+
; X32-NEXT: flds (%esp)
358+
; X32-NEXT: popl %eax
367359
; X32-NEXT: retl
368360
;
369361
; X64-LABEL: signbits_ashr_sextvecinreg_bitops_extract_sitofp:
@@ -379,7 +371,7 @@ define float @signbits_ashr_sextvecinreg_bitops_extract_sitofp(<2 x i64> %a0, <4
379371
; X64-NEXT: vpor %xmm1, %xmm2, %xmm1
380372
; X64-NEXT: vpxor %xmm0, %xmm1, %xmm0
381373
; X64-NEXT: vmovq %xmm0, %rax
382-
; X64-NEXT: vcvtsi2ssq %rax, %xmm3, %xmm0
374+
; X64-NEXT: vcvtsi2ssl %eax, %xmm3, %xmm0
383375
; X64-NEXT: retq
384376
%1 = ashr <2 x i64> %a0, <i64 61, i64 60>
385377
%2 = shufflevector <4 x i32> %a1, <4 x i32> undef, <2 x i32> <i32 0, i32 1>

0 commit comments

Comments
 (0)