Skip to content

Commit e586556

Browse files
committed
[X86][CodeGen] Add NDD entries for transform TEST+AND -> TEST
1 parent f42117c commit e586556

File tree

2 files changed

+33
-38
lines changed

2 files changed

+33
-38
lines changed

llvm/lib/Target/X86/X86ISelDAGToDAG.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1560,7 +1560,9 @@ void X86DAGToDAGISel::PostprocessISelDAG() {
15601560
SDValue And = N->getOperand(0);
15611561
unsigned N0Opc = And.getMachineOpcode();
15621562
if ((N0Opc == X86::AND8rr || N0Opc == X86::AND16rr ||
1563-
N0Opc == X86::AND32rr || N0Opc == X86::AND64rr) &&
1563+
N0Opc == X86::AND32rr || N0Opc == X86::AND64rr ||
1564+
N0Opc == X86::AND8rr_ND || N0Opc == X86::AND16rr_ND ||
1565+
N0Opc == X86::AND32rr_ND || N0Opc == X86::AND64rr_ND) &&
15641566
!And->hasAnyUseOfValue(1)) {
15651567
MachineSDNode *Test = CurDAG->getMachineNode(Opc, SDLoc(N),
15661568
MVT::i32,
@@ -1571,15 +1573,25 @@ void X86DAGToDAGISel::PostprocessISelDAG() {
15711573
continue;
15721574
}
15731575
if ((N0Opc == X86::AND8rm || N0Opc == X86::AND16rm ||
1574-
N0Opc == X86::AND32rm || N0Opc == X86::AND64rm) &&
1576+
N0Opc == X86::AND32rm || N0Opc == X86::AND64rm ||
1577+
N0Opc == X86::AND8rm_ND || N0Opc == X86::AND16rm_ND ||
1578+
N0Opc == X86::AND32rm_ND || N0Opc == X86::AND64rm_ND) &&
15751579
!And->hasAnyUseOfValue(1)) {
15761580
unsigned NewOpc;
1581+
#define CASE_ND(OP) \
1582+
case X86::OP: \
1583+
case X86::OP##_ND:
1584+
#define FROM_TO(A, B) \
1585+
CASE_ND(A) NewOpc = X86::B; \
1586+
break;
15771587
switch (N0Opc) {
1578-
case X86::AND8rm: NewOpc = X86::TEST8mr; break;
1579-
case X86::AND16rm: NewOpc = X86::TEST16mr; break;
1580-
case X86::AND32rm: NewOpc = X86::TEST32mr; break;
1581-
case X86::AND64rm: NewOpc = X86::TEST64mr; break;
1588+
FROM_TO(AND8rm, TEST8mr);
1589+
FROM_TO(AND16rm, TEST16mr);
1590+
FROM_TO(AND32rm, TEST32mr);
1591+
FROM_TO(AND64rm, TEST64mr);
15821592
}
1593+
#undef FROM_TO
1594+
#undef CASE_ND
15831595

15841596
// Need to swap the memory and register operand.
15851597
SDValue Ops[] = { And.getOperand(1),

llvm/test/CodeGen/X86/cmp.ll

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -787,25 +787,15 @@ define i1 @shifted_mask64_testl(i64 %a) {
787787
}
788788

789789
define i1 @shifted_mask64_extra_use_const(i64 %a) {
790-
; NO-NDD-LABEL: shifted_mask64_extra_use_const:
791-
; NO-NDD: # %bb.0:
792-
; NO-NDD-NEXT: movabsq $287104476244869120, %rcx # encoding: [0x48,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x03]
793-
; NO-NDD-NEXT: # imm = 0x3FC000000000000
794-
; NO-NDD-NEXT: testq %rcx, %rdi # encoding: [0x48,0x85,0xcf]
795-
; NO-NDD-NEXT: setne %al # encoding: [0x0f,0x95,0xc0]
796-
; NO-NDD-NEXT: movq %rcx, d64(%rip) # encoding: [0x48,0x89,0x0d,A,A,A,A]
797-
; NO-NDD-NEXT: # fixup A - offset: 3, value: d64-4, kind: reloc_riprel_4byte
798-
; NO-NDD-NEXT: retq # encoding: [0xc3]
799-
;
800-
; NDD-LABEL: shifted_mask64_extra_use_const:
801-
; NDD: # %bb.0:
802-
; NDD-NEXT: movabsq $287104476244869120, %rcx # encoding: [0x48,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x03]
803-
; NDD-NEXT: # imm = 0x3FC000000000000
804-
; NDD-NEXT: andq %rcx, %rdi, %rax # encoding: [0x62,0xf4,0xfc,0x18,0x21,0xcf]
805-
; NDD-NEXT: setne %al # encoding: [0x0f,0x95,0xc0]
806-
; NDD-NEXT: movq %rcx, d64(%rip) # encoding: [0x48,0x89,0x0d,A,A,A,A]
807-
; NDD-NEXT: # fixup A - offset: 3, value: d64-4, kind: reloc_riprel_4byte
808-
; NDD-NEXT: retq # encoding: [0xc3]
790+
; CHECK-LABEL: shifted_mask64_extra_use_const:
791+
; CHECK: # %bb.0:
792+
; CHECK-NEXT: movabsq $287104476244869120, %rcx # encoding: [0x48,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x03]
793+
; CHECK-NEXT: # imm = 0x3FC000000000000
794+
; CHECK-NEXT: testq %rcx, %rdi # encoding: [0x48,0x85,0xcf]
795+
; CHECK-NEXT: setne %al # encoding: [0x0f,0x95,0xc0]
796+
; CHECK-NEXT: movq %rcx, d64(%rip) # encoding: [0x48,0x89,0x0d,A,A,A,A]
797+
; CHECK-NEXT: # fixup A - offset: 3, value: d64-4, kind: reloc_riprel_4byte
798+
; CHECK-NEXT: retq # encoding: [0xc3]
809799
%v0 = and i64 %a, 287104476244869120 ; 0xff << 50
810800
%v1 = icmp ne i64 %v0, 0
811801
store i64 287104476244869120, ptr @d64
@@ -954,19 +944,12 @@ declare i32 @f()
954944
; The store makes sure the chain result of the load is used which used to
955945
; prevent the post isel peephole from catching this.
956946
define i1 @fold_test_and_with_chain(ptr %x, ptr %y, i32 %z) {
957-
; NO-NDD-LABEL: fold_test_and_with_chain:
958-
; NO-NDD: # %bb.0:
959-
; NO-NDD-NEXT: testl %edx, (%rdi) # encoding: [0x85,0x17]
960-
; NO-NDD-NEXT: sete %al # encoding: [0x0f,0x94,0xc0]
961-
; NO-NDD-NEXT: movl %edx, (%rsi) # encoding: [0x89,0x16]
962-
; NO-NDD-NEXT: retq # encoding: [0xc3]
963-
;
964-
; NDD-LABEL: fold_test_and_with_chain:
965-
; NDD: # %bb.0:
966-
; NDD-NEXT: andl (%rdi), %edx, %eax # encoding: [0x62,0xf4,0x7c,0x18,0x23,0x17]
967-
; NDD-NEXT: sete %al # encoding: [0x0f,0x94,0xc0]
968-
; NDD-NEXT: movl %edx, (%rsi) # encoding: [0x89,0x16]
969-
; NDD-NEXT: retq # encoding: [0xc3]
947+
; CHECK-LABEL: fold_test_and_with_chain:
948+
; CHECK: # %bb.0:
949+
; CHECK-NEXT: testl %edx, (%rdi) # encoding: [0x85,0x17]
950+
; CHECK-NEXT: sete %al # encoding: [0x0f,0x94,0xc0]
951+
; CHECK-NEXT: movl %edx, (%rsi) # encoding: [0x89,0x16]
952+
; CHECK-NEXT: retq # encoding: [0xc3]
970953
%a = load i32, ptr %x
971954
%b = and i32 %z, %a
972955
%c = icmp eq i32 %b, 0

0 commit comments

Comments
 (0)