@@ -4775,9 +4775,13 @@ void AArch64InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
4775
4775
} else if (AArch64::PNRRegClass.hasSubClassEq (RC)) {
4776
4776
assert ((Subtarget.hasSVE2p1 () || Subtarget.hasSME2 ()) &&
4777
4777
" 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
4781
4785
SrcReg = (SrcReg - AArch64::PN0) + AArch64::P0;
4782
4786
Opc = AArch64::STR_PXI;
4783
4787
StackID = TargetStackID::ScalableVector;
@@ -4933,7 +4937,7 @@ void AArch64InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
4933
4937
unsigned Opc = 0 ;
4934
4938
bool Offset = true ;
4935
4939
unsigned StackID = TargetStackID::Default;
4936
- MCRegister PNRReg = MCRegister::NoRegister;
4940
+ Register PNRReg = MCRegister::NoRegister;
4937
4941
switch (TRI->getSpillSize (*RC)) {
4938
4942
case 1 :
4939
4943
if (AArch64::FPR8RegClass.hasSubClassEq (RC))
@@ -4952,7 +4956,7 @@ void AArch64InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
4952
4956
" Unexpected register load without SVE2p1 or SME2" );
4953
4957
PNRReg = DestReg;
4954
4958
if (DestReg.isVirtual ())
4955
- MF.getRegInfo ().constrainRegClass (DestReg, &AArch64::PPRRegClass);
4959
+ DestReg = MF.getRegInfo ().createVirtualRegister ( &AArch64::PPRRegClass);
4956
4960
else
4957
4961
DestReg = (DestReg - AArch64::PN0) + AArch64::P0;
4958
4962
Opc = AArch64::LDR_PXI;
@@ -5063,9 +5067,13 @@ void AArch64InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
5063
5067
.addFrameIndex (FI);
5064
5068
if (Offset)
5065
5069
MI.addImm (0 );
5066
- if (PNRReg.isValid ())
5070
+ if (PNRReg.isValid () && !PNRReg. isVirtual () )
5067
5071
MI.addDef (PNRReg, RegState::Implicit);
5068
5072
MI.addMemOperand (MMO);
5073
+
5074
+ if (PNRReg.isValid () && PNRReg.isVirtual ())
5075
+ BuildMI (MBB, MBBI, DebugLoc (), get (TargetOpcode::COPY), PNRReg)
5076
+ .addReg (DestReg);
5069
5077
}
5070
5078
5071
5079
bool llvm::isNZCVTouchedInInstructionRange (const MachineInstr &DefMI,
0 commit comments