Skip to content

Commit 702114e

Browse files
author
git apple-llvm automerger
committed
Merge commit '7dc20abed0d1' from llvm.org/main into next
2 parents 5a5e6c5 + 7dc20ab commit 702114e

File tree

2 files changed

+22
-9
lines changed

2 files changed

+22
-9
lines changed

llvm/lib/Target/AArch64/AArch64InstrInfo.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4775,9 +4775,13 @@ void AArch64InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
47754775
} else if (AArch64::PNRRegClass.hasSubClassEq(RC)) {
47764776
assert((Subtarget.hasSVE2p1() || Subtarget.hasSME2()) &&
47774777
"Unexpected register store without SVE2p1 or SME2");
4778-
if (SrcReg.isVirtual())
4779-
MF.getRegInfo().constrainRegClass(SrcReg, &AArch64::PPRRegClass);
4780-
else
4778+
if (SrcReg.isVirtual()) {
4779+
auto NewSrcReg =
4780+
MF.getRegInfo().createVirtualRegister(&AArch64::PPRRegClass);
4781+
BuildMI(MBB, MBBI, DebugLoc(), get(TargetOpcode::COPY), NewSrcReg)
4782+
.addReg(SrcReg);
4783+
SrcReg = NewSrcReg;
4784+
} else
47814785
SrcReg = (SrcReg - AArch64::PN0) + AArch64::P0;
47824786
Opc = AArch64::STR_PXI;
47834787
StackID = TargetStackID::ScalableVector;
@@ -4933,7 +4937,7 @@ void AArch64InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
49334937
unsigned Opc = 0;
49344938
bool Offset = true;
49354939
unsigned StackID = TargetStackID::Default;
4936-
MCRegister PNRReg = MCRegister::NoRegister;
4940+
Register PNRReg = MCRegister::NoRegister;
49374941
switch (TRI->getSpillSize(*RC)) {
49384942
case 1:
49394943
if (AArch64::FPR8RegClass.hasSubClassEq(RC))
@@ -4952,7 +4956,7 @@ void AArch64InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
49524956
"Unexpected register load without SVE2p1 or SME2");
49534957
PNRReg = DestReg;
49544958
if (DestReg.isVirtual())
4955-
MF.getRegInfo().constrainRegClass(DestReg, &AArch64::PPRRegClass);
4959+
DestReg = MF.getRegInfo().createVirtualRegister(&AArch64::PPRRegClass);
49564960
else
49574961
DestReg = (DestReg - AArch64::PN0) + AArch64::P0;
49584962
Opc = AArch64::LDR_PXI;
@@ -5063,9 +5067,13 @@ void AArch64InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
50635067
.addFrameIndex(FI);
50645068
if (Offset)
50655069
MI.addImm(0);
5066-
if (PNRReg.isValid())
5070+
if (PNRReg.isValid() && !PNRReg.isVirtual())
50675071
MI.addDef(PNRReg, RegState::Implicit);
50685072
MI.addMemOperand(MMO);
5073+
5074+
if (PNRReg.isValid() && PNRReg.isVirtual())
5075+
BuildMI(MBB, MBBI, DebugLoc(), get(TargetOpcode::COPY), PNRReg)
5076+
.addReg(DestReg);
50695077
}
50705078

50715079
bool llvm::isNZCVTouchedInInstructionRange(const MachineInstr &DefMI,

llvm/test/CodeGen/AArch64/spillfill-sve.mir

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,13 @@ body: |
121121
122122
; EXPAND-LABEL: name: spills_fills_stack_id_virtreg_pnr
123123
; EXPAND: renamable $pn8 = WHILEGE_CXX_B
124-
; EXPAND: STR_PXI killed renamable $pn8, $sp, 7
125-
; EXPAND: $p0 = LDR_PXI $sp, 7, implicit-def $pn0
124+
; EXPAND: $p0 = ORR_PPzPP $p8, $p8, killed $p8
125+
; EXPAND: STR_PXI killed renamable $p0, $sp, 7
126+
;
127+
; EXPAND: renamable $p0 = LDR_PXI $sp, 7
128+
; EXPAND: $p8 = ORR_PPzPP $p0, $p0, killed $p0, implicit-def $pn8
129+
; EXPAND: $p0 = PEXT_PCI_B killed renamable $pn8, 0
130+
126131
127132
%0:pnr_p8to15 = WHILEGE_CXX_B undef $x0, undef $x0, 0, implicit-def dead $nzcv
128133
@@ -143,7 +148,7 @@ body: |
143148
$pn14 = IMPLICIT_DEF
144149
$pn15 = IMPLICIT_DEF
145150
146-
$pn0 = COPY %0
151+
$p0 = PEXT_PCI_B %0, 0
147152
RET_ReallyLR
148153
...
149154
---

0 commit comments

Comments
 (0)