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

Commit 5809b91

Browse files
committed
[SelectionDAG] Add support for vector demandedelts in UDIV opcodes
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286576 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent a597cc6 commit 5809b91

File tree

2 files changed

+6
-52
lines changed

2 files changed

+6
-52
lines changed

lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2192,10 +2192,12 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
21922192
// For the purposes of computing leading zeros we can conservatively
21932193
// treat a udiv as a logical right shift by the power of 2 known to
21942194
// be less than the denominator.
2195-
computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth+1);
2195+
computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, DemandedElts,
2196+
Depth + 1);
21962197
unsigned LeadZ = KnownZero2.countLeadingOnes();
21972198

2198-
computeKnownBits(Op.getOperand(1), KnownZero2, KnownOne2, Depth+1);
2199+
computeKnownBits(Op.getOperand(1), KnownZero2, KnownOne2, DemandedElts,
2200+
Depth + 1);
21992201
unsigned RHSUnknownLeadingOnes = KnownOne2.countLeadingZeros();
22002202
if (RHSUnknownLeadingOnes != BitWidth)
22012203
LeadZ = std::min(BitWidth,

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

Lines changed: 2 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -242,60 +242,12 @@ define <4 x i32> @knownbits_mask_sub_shuffle_lshr(<4 x i32> %a0) nounwind {
242242
define <4 x i32> @knownbits_mask_udiv_shuffle_lshr(<4 x i32> %a0, <4 x i32> %a1) nounwind {
243243
; X32-LABEL: knownbits_mask_udiv_shuffle_lshr:
244244
; X32: # BB#0:
245-
; X32-NEXT: pushl %esi
246-
; X32-NEXT: vpand {{\.LCPI.*}}, %xmm0, %xmm0
247-
; X32-NEXT: vpextrd $1, %xmm1, %ecx
248-
; X32-NEXT: vpextrd $1, %xmm0, %eax
249-
; X32-NEXT: xorl %edx, %edx
250-
; X32-NEXT: divl %ecx
251-
; X32-NEXT: movl %eax, %ecx
252-
; X32-NEXT: vmovd %xmm1, %esi
253-
; X32-NEXT: vmovd %xmm0, %eax
254-
; X32-NEXT: xorl %edx, %edx
255-
; X32-NEXT: divl %esi
256-
; X32-NEXT: vmovd %eax, %xmm2
257-
; X32-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2
258-
; X32-NEXT: vpextrd $2, %xmm1, %ecx
259-
; X32-NEXT: vpextrd $2, %xmm0, %eax
260-
; X32-NEXT: xorl %edx, %edx
261-
; X32-NEXT: divl %ecx
262-
; X32-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2
263-
; X32-NEXT: vpextrd $3, %xmm1, %ecx
264-
; X32-NEXT: vpextrd $3, %xmm0, %eax
265-
; X32-NEXT: xorl %edx, %edx
266-
; X32-NEXT: divl %ecx
267-
; X32-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0
268-
; X32-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,3,3]
269-
; X32-NEXT: vpsrld $22, %xmm0, %xmm0
270-
; X32-NEXT: popl %esi
245+
; X32-NEXT: vxorps %xmm0, %xmm0, %xmm0
271246
; X32-NEXT: retl
272247
;
273248
; X64-LABEL: knownbits_mask_udiv_shuffle_lshr:
274249
; X64: # BB#0:
275-
; X64-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
276-
; X64-NEXT: vpextrd $1, %xmm1, %ecx
277-
; X64-NEXT: vpextrd $1, %xmm0, %eax
278-
; X64-NEXT: xorl %edx, %edx
279-
; X64-NEXT: divl %ecx
280-
; X64-NEXT: movl %eax, %ecx
281-
; X64-NEXT: vmovd %xmm1, %esi
282-
; X64-NEXT: vmovd %xmm0, %eax
283-
; X64-NEXT: xorl %edx, %edx
284-
; X64-NEXT: divl %esi
285-
; X64-NEXT: vmovd %eax, %xmm2
286-
; X64-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2
287-
; X64-NEXT: vpextrd $2, %xmm1, %ecx
288-
; X64-NEXT: vpextrd $2, %xmm0, %eax
289-
; X64-NEXT: xorl %edx, %edx
290-
; X64-NEXT: divl %ecx
291-
; X64-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2
292-
; X64-NEXT: vpextrd $3, %xmm1, %ecx
293-
; X64-NEXT: vpextrd $3, %xmm0, %eax
294-
; X64-NEXT: xorl %edx, %edx
295-
; X64-NEXT: divl %ecx
296-
; X64-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0
297-
; X64-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,3,3]
298-
; X64-NEXT: vpsrld $22, %xmm0, %xmm0
250+
; X64-NEXT: vxorps %xmm0, %xmm0, %xmm0
299251
; X64-NEXT: retq
300252
%1 = and <4 x i32> %a0, <i32 32767, i32 -1, i32 -1, i32 32767>
301253
%2 = udiv <4 x i32> %1, %a1

0 commit comments

Comments
 (0)