File tree 2 files changed +49
-3
lines changed 2 files changed +49
-3
lines changed Original file line number Diff line number Diff line change @@ -261,15 +261,18 @@ bool AArch64MIPeepholeOpt::visitORR(MachineInstr &MI) {
261
261
// A COPY from an FPR will become a FMOVSWr, so do so now so that we know
262
262
// that the upper bits are zero.
263
263
if (RC != &AArch64::FPR32RegClass &&
264
- ((RC != &AArch64::FPR64RegClass && RC != &AArch64::FPR128RegClass) ||
264
+ ((RC != &AArch64::FPR64RegClass && RC != &AArch64::FPR128RegClass &&
265
+ RC != &AArch64::ZPRRegClass) ||
265
266
SrcMI->getOperand (1 ).getSubReg () != AArch64::ssub))
266
267
return false ;
267
- Register CpySrc = SrcMI-> getOperand ( 1 ). getReg () ;
268
+ Register CpySrc;
268
269
if (SrcMI->getOperand (1 ).getSubReg () == AArch64::ssub) {
269
270
CpySrc = MRI->createVirtualRegister (&AArch64::FPR32RegClass);
270
271
BuildMI (*SrcMI->getParent (), SrcMI, SrcMI->getDebugLoc (),
271
272
TII->get (TargetOpcode::COPY), CpySrc)
272
273
.add (SrcMI->getOperand (1 ));
274
+ } else {
275
+ CpySrc = SrcMI->getOperand (1 ).getReg ();
273
276
}
274
277
BuildMI (*SrcMI->getParent (), SrcMI, SrcMI->getDebugLoc (),
275
278
TII->get (AArch64::FMOVSWr), SrcMI->getOperand (0 ).getReg ())
Original file line number Diff line number Diff line change 1
1
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2
2
# 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
+ ...
4
47
---
5
48
name : copy_multiple_uses
6
49
tracksRegLiveness : true
You can’t perform that action at this time.
0 commit comments