Skip to content

Commit d7263d6

Browse files
committed
[AArch64] Use second reg class in genSubAdd2SubSub machine combine.
In case the first operand is a physical register with no register class, use the second operand of the sub as the register class for the new virtual register in genSubAdd2SubSub machine combine.
1 parent 133f8fa commit d7263d6

File tree

2 files changed

+38
-4
lines changed

2 files changed

+38
-4
lines changed

llvm/lib/Target/AArch64/AArch64InstrInfo.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7369,7 +7369,8 @@ genSubAdd2SubSub(MachineFunction &MF, MachineRegisterInfo &MRI,
73697369
bool RegBIsKill = AddMI->getOperand(IdxOpd1).isKill();
73707370
Register RegC = AddMI->getOperand(IdxOtherOpd).getReg();
73717371
bool RegCIsKill = AddMI->getOperand(IdxOtherOpd).isKill();
7372-
Register NewVR = MRI.createVirtualRegister(MRI.getRegClass(RegA));
7372+
Register NewVR =
7373+
MRI.createVirtualRegister(MRI.getRegClass(Root.getOperand(2).getReg()));
73737374

73747375
unsigned Opcode = Root.getOpcode();
73757376
if (Opcode == AArch64::SUBSWrr)

llvm/test/CodeGen/AArch64/machine-combiner-subadd2.mir

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
# 32 bit.
99

1010
# CHECK-LABEL: name: test1
11-
# CHECK: [[TMP:%[0-9]+]]:gpr32common = SUBWrr killed %3, %4
11+
# CHECK: [[TMP:%[0-9]+]]:gpr32 = SUBWrr killed %3, %4
1212
# CHECK-NEXT: %7:gpr32 = SUBWrr killed [[TMP]], %5
1313

1414
name: test1
@@ -41,7 +41,7 @@ body: |
4141
# 64 bit.
4242

4343
# CHECK-LABEL: name: test2
44-
# CHECK: [[TMP:%[0-9]+]]:gpr64common = SUBXrr killed %3, %4
44+
# CHECK: [[TMP:%[0-9]+]]:gpr64 = SUBXrr killed %3, %4
4545
# CHECK-NEXT: %7:gpr64 = SUBXrr killed [[TMP]], %5
4646

4747
name: test2
@@ -107,7 +107,7 @@ body: |
107107
# Dead define of flag registers should not block transformation.
108108

109109
# CHECK-LABEL: name: test4
110-
# CHECK: [[TMP:%[0-9]+]]:gpr64common = SUBXrr killed %3, %4
110+
# CHECK: [[TMP:%[0-9]+]]:gpr64 = SUBXrr killed %3, %4
111111
# CHECK-NEXT: %7:gpr64 = SUBXrr killed [[TMP]], %5
112112

113113
name: test4
@@ -264,3 +264,36 @@ body: |
264264
RET_ReallyLR implicit $x0
265265
266266
...
267+
---
268+
# WZR use
269+
270+
# CHECK-LABEL: name: wzr
271+
# CHECK: [[TMP:%[0-9]+]]:gpr32 = SUBWrr killed $wzr, %4
272+
# CHECK-NEXT: %7:gpr32 = SUBWrr killed [[TMP]], %5
273+
274+
name: wzr
275+
registers:
276+
- { id: 0, class: gpr32common }
277+
- { id: 1, class: gpr32 }
278+
- { id: 2, class: gpr32 }
279+
- { id: 3, class: gpr32common }
280+
- { id: 4, class: gpr32common }
281+
- { id: 5, class: gpr32 }
282+
- { id: 6, class: gpr32 }
283+
- { id: 7, class: gpr32 }
284+
- { id: 8, class: gpr32 }
285+
body: |
286+
bb.0:
287+
%2:gpr32 = COPY $w2
288+
%1:gpr32 = COPY $w1
289+
%0:gpr32common = COPY $w0
290+
%3:gpr32common = ORRWri %2:gpr32, 1600
291+
%4:gpr32common = ADDWri %0:gpr32common, 100, 0
292+
%5:gpr32 = EORWrs %1:gpr32, %4:gpr32common, 8
293+
%6:gpr32 = ADDWrr %5:gpr32, %4:gpr32common
294+
%7:gpr32 = SUBWrr killed $wzr, killed %6:gpr32
295+
%8:gpr32 = EORWrs killed %7:gpr32, %5:gpr32, 141
296+
$w0 = COPY %8:gpr32
297+
RET_ReallyLR implicit $w0
298+
299+
...

0 commit comments

Comments
 (0)