Skip to content

Commit b892ec4

Browse files
committed
[TargetLowering] Add and (rot X, Y), Z ==/!= -1 --> (and X, Z) ==/!= -1 to foldSetCCWithRotate
1 parent c1c2e71 commit b892ec4

File tree

2 files changed

+19
-24
lines changed

2 files changed

+19
-24
lines changed

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4567,7 +4567,6 @@ static SDValue foldSetCCWithRotate(EVT VT, SDValue N0, SDValue N1,
45674567
// or (rot X, Y), Z ==/!= 0 --> (or X, Z) ==/!= 0
45684568
// or Z, (rot X, Y) ==/!= 0 --> (or X, Z) ==/!= 0
45694569
//
4570-
// TODO: Add the 'and' with -1 sibling.
45714570
// TODO: Recurse through a series of 'or' ops to find the rotate.
45724571
EVT OpVT = N0.getValueType();
45734572
if (N0.hasOneUse() && N0.getOpcode() == ISD::OR && C1->isZero()) {
@@ -4581,6 +4580,21 @@ static SDValue foldSetCCWithRotate(EVT VT, SDValue N0, SDValue N1,
45814580
}
45824581
}
45834582

4583+
// and (rot X, Y), Z ==/!= -1 --> (and X, Z) ==/!= -1
4584+
// and Z, (rot X, Y) ==/!= -1 --> (and X, Z) ==/!= -1
4585+
//
4586+
// TODO: Recurse through a series of 'and' ops to find the rotate.
4587+
if (N0.hasOneUse() && N0.getOpcode() == ISD::AND && C1->isAllOnes()) {
4588+
if (SDValue R = getRotateSource(N0.getOperand(0))) {
4589+
SDValue NewAnd = DAG.getNode(ISD::AND, dl, OpVT, R, N0.getOperand(1));
4590+
return DAG.getSetCC(dl, VT, NewAnd, N1, Cond);
4591+
}
4592+
if (SDValue R = getRotateSource(N0.getOperand(1))) {
4593+
SDValue NewAnd = DAG.getNode(ISD::AND, dl, OpVT, R, N0.getOperand(0));
4594+
return DAG.getSetCC(dl, VT, NewAnd, N1, Cond);
4595+
}
4596+
}
4597+
45844598
return SDValue();
45854599
}
45864600

llvm/test/CodeGen/X86/setcc-fsh.ll

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -524,10 +524,7 @@ define i1 @fshl_or_ne_2(i32 %x, i32 %y) {
524524
define i1 @and_rotl_eq_neg_1(i8 %x, i8 %y, i8 %z) nounwind {
525525
; CHECK-LABEL: and_rotl_eq_neg_1:
526526
; CHECK: # %bb.0:
527-
; CHECK-NEXT: movl %edx, %ecx
528-
; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
529-
; CHECK-NEXT: rolb %cl, %dil
530-
; CHECK-NEXT: andb %sil, %dil
527+
; CHECK-NEXT: andl %esi, %edi
531528
; CHECK-NEXT: cmpb $-1, %dil
532529
; CHECK-NEXT: sete %al
533530
; CHECK-NEXT: retq
@@ -596,25 +593,9 @@ define i1 @and_rotl_ne_neg_1_use(i32 %x, i32 %y, i32 %z) nounwind {
596593
define <4 x i1> @and_rotl_ne_eq_neg_1(<4 x i32> %x, <4 x i32> %y) nounwind {
597594
; CHECK-LABEL: and_rotl_ne_eq_neg_1:
598595
; CHECK: # %bb.0:
599-
; CHECK-NEXT: movdqa %xmm1, %xmm2
600-
; CHECK-NEXT: pslld $23, %xmm2
601-
; CHECK-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
602-
; CHECK-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
603-
; CHECK-NEXT: cvttps2dq %xmm2, %xmm2
604-
; CHECK-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
605-
; CHECK-NEXT: pmuludq %xmm2, %xmm0
606-
; CHECK-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3]
607-
; CHECK-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
608-
; CHECK-NEXT: pmuludq %xmm3, %xmm2
609-
; CHECK-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,3,2,3]
610-
; CHECK-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
611-
; CHECK-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,2,2,3]
612-
; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
613-
; CHECK-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1]
614-
; CHECK-NEXT: por %xmm4, %xmm3
615-
; CHECK-NEXT: pand %xmm1, %xmm3
616-
; CHECK-NEXT: pcmpeqd %xmm0, %xmm0
617-
; CHECK-NEXT: pcmpeqd %xmm3, %xmm0
596+
; CHECK-NEXT: pcmpeqd %xmm2, %xmm2
597+
; CHECK-NEXT: pand %xmm1, %xmm0
598+
; CHECK-NEXT: pcmpeqd %xmm2, %xmm0
618599
; CHECK-NEXT: retq
619600
%rot = tail call <4 x i32> @llvm.fshl.v4i32(<4 x i32>%x, <4 x i32> %x, <4 x i32> %y)
620601
%and = and <4 x i32> %y, %rot

0 commit comments

Comments
 (0)