diff options
| author | Sander de Smalen <sander.desmalen@arm.com> | 2019-11-13 09:57:51 +0000 |
|---|---|---|
| committer | Sander de Smalen <sander.desmalen@arm.com> | 2019-11-13 10:09:32 +0000 |
| commit | 3367686b4d126e8e035c618829c78315f7751dfd (patch) | |
| tree | fbf29bf35b24d5e3faae8ccc39e750bd8fb61ee9 /llvm/lib | |
| parent | bbb29738b58aaf6f6518269abdcf8f64131665a9 (diff) | |
| download | bcm5719-llvm-3367686b4d126e8e035c618829c78315f7751dfd.tar.gz bcm5719-llvm-3367686b4d126e8e035c618829c78315f7751dfd.zip | |
[AArch64] Extend storeRegToStackSlot to spill SVE registers.
This patch allows the register allocator to spill SVE registers to the stack.
Reviewers: ostannard, efriedma, rengolin, cameron.mcinally
Reviewed By: efriedma
Differential Revision: https://reviews.llvm.org/D70082
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | 23 | ||||
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h | 3 |
2 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp index 9c795a03343..c8651d4aef8 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -2897,7 +2897,18 @@ void AArch64InstrInfo::storeRegToStackSlot( } break; } + unsigned StackID = TargetStackID::Default; + if (AArch64::PPRRegClass.hasSubClassEq(RC)) { + assert(Subtarget.hasSVE() && "Unexpected register store without SVE"); + Opc = AArch64::STR_PXI; + StackID = TargetStackID::SVEVector; + } else if (AArch64::ZPRRegClass.hasSubClassEq(RC)) { + assert(Subtarget.hasSVE() && "Unexpected register store without SVE"); + Opc = AArch64::STR_ZXI; + StackID = TargetStackID::SVEVector; + } assert(Opc && "Unknown register class"); + MFI.setStackID(FI, StackID); const MachineInstrBuilder MI = BuildMI(MBB, MBBI, DebugLoc(), get(Opc)) .addReg(SrcReg, getKillRegState(isKill)) @@ -3028,7 +3039,19 @@ void AArch64InstrInfo::loadRegFromStackSlot( } break; } + + unsigned StackID = TargetStackID::Default; + if (AArch64::PPRRegClass.hasSubClassEq(RC)) { + assert(Subtarget.hasSVE() && "Unexpected register load without SVE"); + Opc = AArch64::LDR_PXI; + StackID = TargetStackID::SVEVector; + } else if (AArch64::ZPRRegClass.hasSubClassEq(RC)) { + assert(Subtarget.hasSVE() && "Unexpected register load without SVE"); + Opc = AArch64::LDR_ZXI; + StackID = TargetStackID::SVEVector; + } assert(Opc && "Unknown register class"); + MFI.setStackID(FI, StackID); const MachineInstrBuilder MI = BuildMI(MBB, MBBI, DebugLoc(), get(Opc)) .addReg(DestReg, getDefRegState(true)) diff --git a/llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h b/llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h index 2cc8a0947ba..fb49cd90b1e 100644 --- a/llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h +++ b/llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h @@ -19,6 +19,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/CodeGen/CallingConvLower.h" #include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/TargetFrameLowering.h" #include "llvm/IR/Function.h" #include "llvm/MC/MCLinkerOptimizationHint.h" #include <cassert> @@ -201,6 +202,8 @@ public: int64_t MaxOffset = std::numeric_limits<int64_t>::min(); for (const auto &Info : MFI.getCalleeSavedInfo()) { int FrameIdx = Info.getFrameIdx(); + if (MFI.getStackID(FrameIdx) != TargetStackID::Default) + continue; int64_t Offset = MFI.getObjectOffset(FrameIdx); int64_t ObjSize = MFI.getObjectSize(FrameIdx); MinOffset = std::min<int64_t>(Offset, MinOffset); |

