Skip to content

Commit 9e97b2a

Browse files
committed
[DAG] SimplifySetCC - relax fold (X^C1) == C2 --> X == C1^C2
https://alive2.llvm.org/ce/z/A_auBq Remove limitation that wouldn't perform the fold if all the inverted bits are known zero The thumb2 changes look to be benign, although it does show that the TEQ/TST isel patterns could probably be improved. Fixes movmsk regression in D122754 Differential Revision: https://reviews.llvm.org/D123023
1 parent ed4e6e0 commit 9e97b2a

File tree

4 files changed

+21
-27
lines changed

4 files changed

+21
-27
lines changed

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4649,11 +4649,8 @@ SDValue TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
46494649
dl, N0.getValueType()),
46504650
Cond);
46514651

4652-
// Turn (X^C1) == C2 into X == C1^C2 iff X&~C1 = 0.
4653-
// If we know that all of the inverted bits are zero, don't bother
4654-
// performing the inversion.
4655-
if (N0.getOpcode() == ISD::XOR &&
4656-
DAG.MaskedValueIsZero(N0.getOperand(0), ~LHSR->getAPIntValue()))
4652+
// Turn (X^C1) == C2 --> X == C1^C2
4653+
if (N0.getOpcode() == ISD::XOR && N0.getNode()->hasOneUse())
46574654
return DAG.getSetCC(
46584655
dl, VT, N0.getOperand(0),
46594656
DAG.getConstant(LHSR->getAPIntValue() ^ RHSC->getAPIntValue(),

llvm/test/CodeGen/Mips/countleading.ll

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,7 @@ declare i64 @llvm.ctlz.i64(i64, i1) nounwind readnone
198198
define i64 @ctlo_i64(i64 %X) nounwind readnone {
199199
; MIPS32-R1-R2-LABEL: ctlo_i64:
200200
; MIPS32-R1-R2: # %bb.0: # %entry
201-
; MIPS32-R1-R2-NEXT: addiu $1, $zero, -1
202-
; MIPS32-R1-R2-NEXT: xor $1, $5, $1
201+
; MIPS32-R1-R2-NEXT: not $1, $5
203202
; MIPS32-R1-R2-NEXT: clo $3, $5
204203
; MIPS32-R1-R2-NEXT: clo $2, $4
205204
; MIPS32-R1-R2-NEXT: addiu $2, $2, 32
@@ -209,15 +208,13 @@ define i64 @ctlo_i64(i64 %X) nounwind readnone {
209208
;
210209
; MIPS32-R6-LABEL: ctlo_i64:
211210
; MIPS32-R6: # %bb.0: # %entry
212-
; MIPS32-R6-NEXT: addiu $1, $zero, -1
213-
; MIPS32-R6-NEXT: xor $1, $5, $1
214-
; MIPS32-R6-NEXT: sltu $1, $zero, $1
215-
; MIPS32-R6-NEXT: clo $2, $4
216-
; MIPS32-R6-NEXT: addiu $2, $2, 32
217-
; MIPS32-R6-NEXT: seleqz $2, $2, $1
218-
; MIPS32-R6-NEXT: clo $3, $5
219-
; MIPS32-R6-NEXT: selnez $1, $3, $1
220-
; MIPS32-R6-NEXT: or $2, $1, $2
211+
; MIPS32-R6-NEXT: not $1, $5
212+
; MIPS32-R6-NEXT: clo $2, $5
213+
; MIPS32-R6-NEXT: selnez $2, $2, $1
214+
; MIPS32-R6-NEXT: clo $3, $4
215+
; MIPS32-R6-NEXT: addiu $3, $3, 32
216+
; MIPS32-R6-NEXT: seleqz $1, $3, $1
217+
; MIPS32-R6-NEXT: or $2, $2, $1
221218
; MIPS32-R6-NEXT: jr $ra
222219
; MIPS32-R6-NEXT: addiu $3, $zero, 0
223220
;

llvm/test/CodeGen/Thumb2/thumb2-teq.ll

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ define i32 @f2(i32 %a) {
99
; CHECK-LABEL: f2:
1010
; CHECK: @ %bb.0:
1111
; CHECK-NEXT: movs r1, #24
12-
; CHECK-NEXT: teq.w r0, #187
12+
; CHECK-NEXT: cmp r0, #187
1313
; CHECK-NEXT: it eq
1414
; CHECK-NEXT: moveq r1, #42
1515
; CHECK-NEXT: mov r0, r1
@@ -25,7 +25,7 @@ define i32 @f3(i32 %a) {
2525
; CHECK-LABEL: f3:
2626
; CHECK: @ %bb.0:
2727
; CHECK-NEXT: movs r1, #24
28-
; CHECK-NEXT: teq.w r0, #11141290
28+
; CHECK-NEXT: cmp.w r0, #11141290
2929
; CHECK-NEXT: it eq
3030
; CHECK-NEXT: moveq r1, #42
3131
; CHECK-NEXT: mov r0, r1
@@ -41,7 +41,7 @@ define i32 @f6(i32 %a) {
4141
; CHECK-LABEL: f6:
4242
; CHECK: @ %bb.0:
4343
; CHECK-NEXT: movs r1, #24
44-
; CHECK-NEXT: teq.w r0, #-872363008
44+
; CHECK-NEXT: cmp.w r0, #-872363008
4545
; CHECK-NEXT: it eq
4646
; CHECK-NEXT: moveq r1, #42
4747
; CHECK-NEXT: mov r0, r1
@@ -57,7 +57,7 @@ define i32 @f7(i32 %a) {
5757
; CHECK-LABEL: f7:
5858
; CHECK: @ %bb.0:
5959
; CHECK-NEXT: movs r1, #24
60-
; CHECK-NEXT: teq.w r0, #-572662307
60+
; CHECK-NEXT: cmp.w r0, #-572662307
6161
; CHECK-NEXT: it eq
6262
; CHECK-NEXT: moveq r1, #42
6363
; CHECK-NEXT: mov r0, r1
@@ -73,7 +73,7 @@ define i32 @f10(i32 %a) {
7373
; CHECK-LABEL: f10:
7474
; CHECK: @ %bb.0:
7575
; CHECK-NEXT: movs r1, #24
76-
; CHECK-NEXT: teq.w r0, #1114112
76+
; CHECK-NEXT: cmp.w r0, #1114112
7777
; CHECK-NEXT: it eq
7878
; CHECK-NEXT: moveq r1, #42
7979
; CHECK-NEXT: mov r0, r1
@@ -88,7 +88,7 @@ define i32 @f10(i32 %a) {
8888
define i1 @f12(i32 %a) {
8989
; CHECK-LABEL: f12:
9090
; CHECK: @ %bb.0:
91-
; CHECK-NEXT: eor r0, r0, #187
91+
; CHECK-NEXT: subs r0, #187
9292
; CHECK-NEXT: clz r0, r0
9393
; CHECK-NEXT: lsrs r0, r0, #5
9494
; CHECK-NEXT: bx lr
@@ -101,7 +101,7 @@ define i1 @f12(i32 %a) {
101101
define i1 @f13(i32 %a) {
102102
; CHECK-LABEL: f13:
103103
; CHECK: @ %bb.0:
104-
; CHECK-NEXT: eor r0, r0, #11141290
104+
; CHECK-NEXT: sub.w r0, r0, #11141290
105105
; CHECK-NEXT: clz r0, r0
106106
; CHECK-NEXT: lsrs r0, r0, #5
107107
; CHECK-NEXT: bx lr
@@ -114,7 +114,7 @@ define i1 @f13(i32 %a) {
114114
define i1 @f16(i32 %a) {
115115
; CHECK-LABEL: f16:
116116
; CHECK: @ %bb.0:
117-
; CHECK-NEXT: eor r0, r0, #-872363008
117+
; CHECK-NEXT: sub.w r0, r0, #-872363008
118118
; CHECK-NEXT: clz r0, r0
119119
; CHECK-NEXT: lsrs r0, r0, #5
120120
; CHECK-NEXT: bx lr
@@ -127,7 +127,7 @@ define i1 @f16(i32 %a) {
127127
define i1 @f17(i32 %a) {
128128
; CHECK-LABEL: f17:
129129
; CHECK: @ %bb.0:
130-
; CHECK-NEXT: eor r0, r0, #-572662307
130+
; CHECK-NEXT: sub.w r0, r0, #-572662307
131131
; CHECK-NEXT: clz r0, r0
132132
; CHECK-NEXT: lsrs r0, r0, #5
133133
; CHECK-NEXT: bx lr
@@ -140,7 +140,7 @@ define i1 @f17(i32 %a) {
140140
define i1 @f18(i32 %a) {
141141
; CHECK-LABEL: f18:
142142
; CHECK: @ %bb.0:
143-
; CHECK-NEXT: eor r0, r0, #1114112
143+
; CHECK-NEXT: sub.w r0, r0, #1114112
144144
; CHECK-NEXT: clz r0, r0
145145
; CHECK-NEXT: lsrs r0, r0, #5
146146
; CHECK-NEXT: bx lr

llvm/test/CodeGen/X86/peep-test-3.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ define void @xor(float* %A, i32 %IA, i32 %N) nounwind {
4141
; CHECK-NEXT: movl %eax, %ecx
4242
; CHECK-NEXT: andl $3, %ecx
4343
; CHECK-NEXT: xorl {{[0-9]+}}(%esp), %ecx
44-
; CHECK-NEXT: xorl $1, %ecx
44+
; CHECK-NEXT: cmpl $1, %ecx
4545
; CHECK-NEXT: je .LBB1_2
4646
; CHECK-NEXT: # %bb.1: # %bb
4747
; CHECK-NEXT: movl $0, (%eax)

0 commit comments

Comments
 (0)