Skip to content

Commit 36b4b9d

Browse files
authored
[X86] Support immediate folding for CCMP/CTEST (#86616)
E.g. %0:gr32 = MOV32ri 81 CTEST32rr %0, %1, 2, 10, implicit-def $eflags, implicit $eflags => CTEST32ri %1, 81, 2, 10, implicit-def $eflags, implicit $eflags
1 parent 79ba323 commit 36b4b9d

File tree

2 files changed

+77
-2
lines changed

2 files changed

+77
-2
lines changed

llvm/lib/Target/X86/X86InstrInfo.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5595,9 +5595,13 @@ static unsigned convertALUrr2ALUri(unsigned Opc) {
55955595
case X86::FROM: \
55965596
return X86::TO;
55975597
FROM_TO(TEST64rr, TEST64ri32)
5598+
FROM_TO(CTEST64rr, CTEST64ri32)
55985599
FROM_TO(CMP64rr, CMP64ri32)
5600+
FROM_TO(CCMP64rr, CCMP64ri32)
55995601
FROM_TO(TEST32rr, TEST32ri)
5602+
FROM_TO(CTEST32rr, CTEST32ri)
56005603
FROM_TO(CMP32rr, CMP32ri)
5604+
FROM_TO(CCMP32rr, CCMP32ri)
56015605
#undef FROM_TO
56025606
}
56035607
}
@@ -5697,7 +5701,8 @@ bool X86InstrInfo::foldImmediateImpl(MachineInstr &UseMI, MachineInstr *DefMI,
56975701
UseMI.findRegisterUseOperandIdx(Reg) != 2)
56985702
return false;
56995703
// For CMP instructions the immediate can only be at index 1.
5700-
if ((NewOpc == X86::CMP64ri32 || NewOpc == X86::CMP32ri) &&
5704+
if (((NewOpc == X86::CMP64ri32 || NewOpc == X86::CMP32ri) ||
5705+
(NewOpc == X86::CCMP64ri32 || NewOpc == X86::CCMP32ri)) &&
57015706
UseMI.findRegisterUseOperandIdx(Reg) != 1)
57025707
return false;
57035708

@@ -5742,7 +5747,7 @@ bool X86InstrInfo::foldImmediateImpl(MachineInstr &UseMI, MachineInstr *DefMI,
57425747
unsigned Op1 = 1, Op2 = CommuteAnyOperandIndex;
57435748
unsigned ImmOpNum = 2;
57445749
if (!UseMI.getOperand(0).isDef()) {
5745-
Op1 = 0; // TEST, CMP
5750+
Op1 = 0; // TEST, CMP, CTEST, CCMP
57465751
ImmOpNum = 1;
57475752
}
57485753
if (Opc == TargetOpcode::COPY)
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3
2+
# RUN: llc -mtriple=x86_64-- -run-pass=peephole-opt %s -o - | FileCheck %s
3+
--- |
4+
define void @foldImmediate() { ret void }
5+
...
6+
---
7+
# Check that immediates can be folded into ALU instructions.
8+
name: foldImmediate
9+
registers:
10+
- { id: 0, class: gr32 }
11+
- { id: 1, class: gr32 }
12+
- { id: 2, class: gr32 }
13+
- { id: 3, class: gr32 }
14+
- { id: 4, class: gr32 }
15+
- { id: 5, class: gr32 }
16+
- { id: 6, class: gr32 }
17+
- { id: 7, class: gr64 }
18+
- { id: 8, class: gr64 }
19+
- { id: 9, class: gr64 }
20+
- { id: 10, class: gr64 }
21+
- { id: 11, class: gr64 }
22+
- { id: 12, class: gr64 }
23+
- { id: 13, class: gr64 }
24+
- { id: 14, class: gr64 }
25+
- { id: 15, class: gr64 }
26+
- { id: 16, class: gr32 }
27+
- { id: 17, class: gr64 }
28+
- { id: 18, class: gr32 }
29+
30+
body: |
31+
bb.0:
32+
liveins: $rdi, $rsi
33+
34+
; CHECK-LABEL: name: foldImmediate
35+
; CHECK: liveins: $rdi, $rsi
36+
; CHECK-NEXT: {{ $}}
37+
; CHECK-NEXT: [[MOV32ri:%[0-9]+]]:gr32 = MOV32ri 81
38+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $edi
39+
; CHECK-NEXT: CTEST32ri [[COPY]], 81, 2, 10, implicit-def $eflags, implicit $eflags
40+
; CHECK-NEXT: NOOP implicit $eflags
41+
; CHECK-NEXT: CCMP32ri [[COPY]], 81, 2, 10, implicit-def $eflags, implicit $eflags
42+
; CHECK-NEXT: NOOP implicit $eflags
43+
; CHECK-NEXT: [[SUBREG_TO_REG:%[0-9]+]]:gr64 = SUBREG_TO_REG 0, killed [[MOV32ri]], %subreg.sub_32bit
44+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
45+
; CHECK-NEXT: CTEST64ri32 [[COPY1]], 81, 2, 10, implicit-def $eflags, implicit $eflags
46+
; CHECK-NEXT: NOOP implicit $eflags
47+
; CHECK-NEXT: CCMP64ri32 [[COPY1]], 81, 2, 10, implicit-def $eflags, implicit $eflags
48+
; CHECK-NEXT: NOOP implicit $eflags
49+
; CHECK-NEXT: CCMP64rr [[SUBREG_TO_REG]], [[COPY1]], 2, 10, implicit-def $eflags, implicit $eflags
50+
; CHECK-NEXT: NOOP implicit $eflags
51+
%0 = MOV32ri 81
52+
%1 = COPY $edi
53+
54+
CTEST32rr %0, %1, 2, 10, implicit-def $eflags, implicit $eflags
55+
NOOP implicit $eflags
56+
57+
CCMP32rr %1, %0, 2, 10, implicit-def $eflags, implicit $eflags
58+
NOOP implicit $eflags
59+
60+
%7 = SUBREG_TO_REG 0, killed %0:gr32, %subreg.sub_32bit
61+
%8 = COPY $rsi
62+
63+
CTEST64rr %8, %7, 2, 10, implicit-def $eflags, implicit $eflags
64+
NOOP implicit $eflags
65+
66+
CCMP64rr %8, %7, 2, 10, implicit-def $eflags, implicit $eflags
67+
NOOP implicit $eflags
68+
CCMP64rr %7, %8, 2, 10, implicit-def $eflags, implicit $eflags
69+
NOOP implicit $eflags
70+
...

0 commit comments

Comments
 (0)