Skip to content

Commit 1e4c44b

Browse files
committed
[X86][SSE] Add OR(EXTRACTELT(X,0),OR(EXTRACTELT(X,1))) -> MOVMSK+CMP reduction combine
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@375463 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent d8c44a5 commit 1e4c44b

File tree

2 files changed

+30
-18
lines changed

2 files changed

+30
-18
lines changed

lib/Target/X86/X86ISelLowering.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39527,6 +39527,24 @@ static SDValue combineOr(SDNode *N, SelectionDAG &DAG,
3952739527
DAG.getBitcast(MVT::v4f32, N1)));
3952839528
}
3952939529

39530+
// Match any-of bool scalar reductions into a bitcast/movmsk + cmp.
39531+
// TODO: Support multiple SrcOps.
39532+
if (VT == MVT::i1) {
39533+
SmallVector<SDValue, 2> SrcOps;
39534+
if (matchScalarReduction(SDValue(N, 0), ISD::OR, SrcOps) &&
39535+
SrcOps.size() == 1) {
39536+
SDLoc dl(N);
39537+
unsigned NumElts = SrcOps[0].getValueType().getVectorNumElements();
39538+
EVT MaskVT = EVT::getIntegerVT(*DAG.getContext(), NumElts);
39539+
SDValue Mask = combineBitcastvxi1(DAG, MaskVT, SrcOps[0], dl, Subtarget);
39540+
if (Mask) {
39541+
APInt AllBits = APInt::getNullValue(NumElts);
39542+
return DAG.getSetCC(dl, MVT::i1, Mask,
39543+
DAG.getConstant(AllBits, dl, MaskVT), ISD::SETNE);
39544+
}
39545+
}
39546+
}
39547+
3953039548
if (DCI.isBeforeLegalizeOps())
3953139549
return SDValue();
3953239550

test/CodeGen/X86/movmsk-cmp.ll

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4513,21 +4513,17 @@ define i1 @movmsk_or_v2i64(<2 x i64> %x, <2 x i64> %y) {
45134513
; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
45144514
; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
45154515
; SSE2-NEXT: pand %xmm0, %xmm1
4516-
; SSE2-NEXT: movmskpd %xmm1, %ecx
4517-
; SSE2-NEXT: xorl $3, %ecx
4518-
; SSE2-NEXT: movl %ecx, %eax
4519-
; SSE2-NEXT: shrb %al
4520-
; SSE2-NEXT: orb %cl, %al
4516+
; SSE2-NEXT: movmskpd %xmm1, %eax
4517+
; SSE2-NEXT: xorb $3, %al
4518+
; SSE2-NEXT: setne %al
45214519
; SSE2-NEXT: retq
45224520
;
45234521
; AVX-LABEL: movmsk_or_v2i64:
45244522
; AVX: # %bb.0:
45254523
; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
4526-
; AVX-NEXT: vmovmskpd %xmm0, %ecx
4527-
; AVX-NEXT: xorl $3, %ecx
4528-
; AVX-NEXT: movl %ecx, %eax
4529-
; AVX-NEXT: shrb %al
4530-
; AVX-NEXT: orb %cl, %al
4524+
; AVX-NEXT: vmovmskpd %xmm0, %eax
4525+
; AVX-NEXT: xorb $3, %al
4526+
; AVX-NEXT: setne %al
45314527
; AVX-NEXT: retq
45324528
;
45334529
; KNL-LABEL: movmsk_or_v2i64:
@@ -4668,19 +4664,17 @@ define i1 @movmsk_or_v2f64(<2 x double> %x, <2 x double> %y) {
46684664
; SSE2-LABEL: movmsk_or_v2f64:
46694665
; SSE2: # %bb.0:
46704666
; SSE2-NEXT: cmplepd %xmm0, %xmm1
4671-
; SSE2-NEXT: movmskpd %xmm1, %ecx
4672-
; SSE2-NEXT: movl %ecx, %eax
4673-
; SSE2-NEXT: shrb %al
4674-
; SSE2-NEXT: orb %cl, %al
4667+
; SSE2-NEXT: movmskpd %xmm1, %eax
4668+
; SSE2-NEXT: testb %al, %al
4669+
; SSE2-NEXT: setne %al
46754670
; SSE2-NEXT: retq
46764671
;
46774672
; AVX-LABEL: movmsk_or_v2f64:
46784673
; AVX: # %bb.0:
46794674
; AVX-NEXT: vcmplepd %xmm0, %xmm1, %xmm0
4680-
; AVX-NEXT: vmovmskpd %xmm0, %ecx
4681-
; AVX-NEXT: movl %ecx, %eax
4682-
; AVX-NEXT: shrb %al
4683-
; AVX-NEXT: orb %cl, %al
4675+
; AVX-NEXT: vmovmskpd %xmm0, %eax
4676+
; AVX-NEXT: testb %al, %al
4677+
; AVX-NEXT: setne %al
46844678
; AVX-NEXT: retq
46854679
;
46864680
; KNL-LABEL: movmsk_or_v2f64:

0 commit comments

Comments
 (0)