Skip to content

Commit ed96e46

Browse files
authored
AArch64: Allow ZEXT+COPY -> FMOV peephole for ZPR registers as well (#135436)
1 parent 1df4af6 commit ed96e46

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

llvm/lib/Target/AArch64/AArch64MIPeepholeOpt.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,15 +261,18 @@ bool AArch64MIPeepholeOpt::visitORR(MachineInstr &MI) {
261261
// A COPY from an FPR will become a FMOVSWr, so do so now so that we know
262262
// that the upper bits are zero.
263263
if (RC != &AArch64::FPR32RegClass &&
264-
((RC != &AArch64::FPR64RegClass && RC != &AArch64::FPR128RegClass) ||
264+
((RC != &AArch64::FPR64RegClass && RC != &AArch64::FPR128RegClass &&
265+
RC != &AArch64::ZPRRegClass) ||
265266
SrcMI->getOperand(1).getSubReg() != AArch64::ssub))
266267
return false;
267-
Register CpySrc = SrcMI->getOperand(1).getReg();
268+
Register CpySrc;
268269
if (SrcMI->getOperand(1).getSubReg() == AArch64::ssub) {
269270
CpySrc = MRI->createVirtualRegister(&AArch64::FPR32RegClass);
270271
BuildMI(*SrcMI->getParent(), SrcMI, SrcMI->getDebugLoc(),
271272
TII->get(TargetOpcode::COPY), CpySrc)
272273
.add(SrcMI->getOperand(1));
274+
} else {
275+
CpySrc = SrcMI->getOperand(1).getReg();
273276
}
274277
BuildMI(*SrcMI->getParent(), SrcMI, SrcMI->getDebugLoc(),
275278
TII->get(AArch64::FMOVSWr), SrcMI->getOperand(0).getReg())

llvm/test/CodeGen/AArch64/peephole-orr.mir

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,49 @@
11
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
22
# RUN: llc -run-pass=aarch64-mi-peephole-opt -o - -mtriple=aarch64-unknown-linux -verify-machineinstrs %s | FileCheck %s
3-
3+
---
4+
name: copy_fpr128_gpr32
5+
body: |
6+
bb.0:
7+
liveins: $q0
8+
; CHECK-LABEL: name: copy_fpr128_gpr32
9+
; CHECK: liveins: $q0
10+
; CHECK-NEXT: {{ $}}
11+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr128 = COPY $q0
12+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr32 = COPY [[COPY]].ssub
13+
; CHECK-NEXT: [[FMOVSWr:%[0-9]+]]:gpr32 = FMOVSWr [[COPY1]]
14+
%0:fpr128 = COPY $q0
15+
%1:gpr32 = COPY %0.ssub:fpr128
16+
%2:gpr32 = ORRWrs $wzr, killed %1:gpr32, 0
17+
...
18+
---
19+
name: copy_fpr32_gpr32
20+
body: |
21+
bb.0:
22+
liveins: $s0
23+
; CHECK-LABEL: name: copy_fpr32_gpr32
24+
; CHECK: liveins: $s0
25+
; CHECK-NEXT: {{ $}}
26+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr32 = COPY $s0
27+
; CHECK-NEXT: [[FMOVSWr:%[0-9]+]]:gpr32 = FMOVSWr [[COPY]]
28+
%0:fpr32 = COPY $s0
29+
%1:gpr32 = COPY %0:fpr32
30+
%2:gpr32 = ORRWrs $wzr, killed %1:gpr32, 0
31+
...
32+
---
33+
name: copy_zpr_gpr32
34+
body: |
35+
bb.0:
36+
liveins: $z0
37+
; CHECK-LABEL: name: copy_zpr_gpr32
38+
; CHECK: liveins: $z0
39+
; CHECK-NEXT: {{ $}}
40+
; CHECK-NEXT: [[COPY:%[0-9]+]]:zpr = COPY $z0
41+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr32 = COPY [[COPY]].ssub
42+
; CHECK-NEXT: [[FMOVSWr:%[0-9]+]]:gpr32 = FMOVSWr [[COPY1]]
43+
%0:zpr = COPY $z0
44+
%1:gpr32 = COPY %0.ssub:zpr
45+
%2:gpr32 = ORRWrs $wzr, killed %1:gpr32, 0
46+
...
447
---
548
name: copy_multiple_uses
649
tracksRegLiveness: true

0 commit comments

Comments
 (0)