blob: 1d8aaac46d343af267f69f40786ecb8c8ec0b4c6 [file] [log] [blame]
Jia Liub22310f2012-02-18 12:03:15 +00001//===-- PPCFrameLowering.cpp - PPC Frame Information ----------------------===//
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov2f931282011-01-10 12:39:04 +000010// This file contains the PPC implementation of TargetFrameLowering class.
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000011//
12//===----------------------------------------------------------------------===//
13
Anton Korobeynikov2f931282011-01-10 12:39:04 +000014#include "PPCFrameLowering.h"
Roman Divackyc9e23d92012-09-12 14:47:47 +000015#include "PPCInstrBuilder.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000016#include "PPCInstrInfo.h"
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000017#include "PPCMachineFunctionInfo.h"
Eric Christopherd104c312014-06-12 20:54:11 +000018#include "PPCSubtarget.h"
Eric Christopherfcd3d872015-02-13 22:48:53 +000019#include "PPCTargetMachine.h"
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000020#include "llvm/CodeGen/MachineFrameInfo.h"
21#include "llvm/CodeGen/MachineFunction.h"
22#include "llvm/CodeGen/MachineInstrBuilder.h"
23#include "llvm/CodeGen/MachineModuleInfo.h"
24#include "llvm/CodeGen/MachineRegisterInfo.h"
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +000025#include "llvm/CodeGen/RegisterScavenging.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000026#include "llvm/IR/Function.h"
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000027#include "llvm/Target/TargetOptions.h"
28
29using namespace llvm;
30
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000031/// VRRegNo - Map from a numbered VR register to its enum value.
32///
Craig Toppere5e035a32015-12-05 07:13:35 +000033static const MCPhysReg VRRegNo[] = {
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000034 PPC::V0 , PPC::V1 , PPC::V2 , PPC::V3 , PPC::V4 , PPC::V5 , PPC::V6 , PPC::V7 ,
35 PPC::V8 , PPC::V9 , PPC::V10, PPC::V11, PPC::V12, PPC::V13, PPC::V14, PPC::V15,
36 PPC::V16, PPC::V17, PPC::V18, PPC::V19, PPC::V20, PPC::V21, PPC::V22, PPC::V23,
37 PPC::V24, PPC::V25, PPC::V26, PPC::V27, PPC::V28, PPC::V29, PPC::V30, PPC::V31
38};
39
Eric Christopherf71609b2015-02-13 00:39:27 +000040static unsigned computeReturnSaveOffset(const PPCSubtarget &STI) {
41 if (STI.isDarwinABI())
42 return STI.isPPC64() ? 16 : 8;
43 // SVR4 ABI:
44 return STI.isPPC64() ? 16 : 4;
45}
46
Eric Christopher736d39e2015-02-13 00:39:36 +000047static unsigned computeTOCSaveOffset(const PPCSubtarget &STI) {
48 return STI.isELFv2ABI() ? 24 : 40;
49}
50
Eric Christopherdc3a8a42015-02-13 00:39:38 +000051static unsigned computeFramePointerSaveOffset(const PPCSubtarget &STI) {
52 // For the Darwin ABI:
53 // We cannot use the TOC save slot (offset +20) in the PowerPC linkage area
54 // for saving the frame pointer (if needed.) While the published ABI has
55 // not used this slot since at least MacOSX 10.2, there is older code
56 // around that does use it, and that needs to continue to work.
57 if (STI.isDarwinABI())
58 return STI.isPPC64() ? -8U : -4U;
59
60 // SVR4 ABI: First slot in the general register save area.
61 return STI.isPPC64() ? -8U : -4U;
62}
63
Eric Christophera4ae2132015-02-13 22:22:57 +000064static unsigned computeLinkageSize(const PPCSubtarget &STI) {
65 if (STI.isDarwinABI() || STI.isPPC64())
66 return (STI.isELFv2ABI() ? 4 : 6) * (STI.isPPC64() ? 8 : 4);
67
68 // SVR4 ABI:
69 return 8;
70}
71
Eric Christopherfcd3d872015-02-13 22:48:53 +000072static unsigned computeBasePointerSaveOffset(const PPCSubtarget &STI) {
73 if (STI.isDarwinABI())
74 return STI.isPPC64() ? -16U : -8U;
75
76 // SVR4 ABI: First slot in the general register save area.
77 return STI.isPPC64()
78 ? -16U
Rafael Espindola248cfb92016-06-28 12:49:12 +000079 : STI.getTargetMachine().isPositionIndependent() ? -12U : -8U;
Eric Christopherfcd3d872015-02-13 22:48:53 +000080}
81
Eric Christopherd104c312014-06-12 20:54:11 +000082PPCFrameLowering::PPCFrameLowering(const PPCSubtarget &STI)
83 : TargetFrameLowering(TargetFrameLowering::StackGrowsDown,
Hal Finkelc93a9a22015-02-25 01:06:45 +000084 STI.getPlatformStackAlignment(), 0),
Eric Christopher736d39e2015-02-13 00:39:36 +000085 Subtarget(STI), ReturnSaveOffset(computeReturnSaveOffset(Subtarget)),
Eric Christopherdc3a8a42015-02-13 00:39:38 +000086 TOCSaveOffset(computeTOCSaveOffset(Subtarget)),
Eric Christophera4ae2132015-02-13 22:22:57 +000087 FramePointerSaveOffset(computeFramePointerSaveOffset(Subtarget)),
Eric Christopherfcd3d872015-02-13 22:48:53 +000088 LinkageSize(computeLinkageSize(Subtarget)),
89 BasePointerSaveOffset(computeBasePointerSaveOffset(STI)) {}
Eric Christopherd104c312014-06-12 20:54:11 +000090
Eric Christopherd104c312014-06-12 20:54:11 +000091// With the SVR4 ABI, callee-saved registers have fixed offsets on the stack.
92const PPCFrameLowering::SpillSlot *PPCFrameLowering::getCalleeSavedSpillSlots(
93 unsigned &NumEntries) const {
94 if (Subtarget.isDarwinABI()) {
95 NumEntries = 1;
96 if (Subtarget.isPPC64()) {
97 static const SpillSlot darwin64Offsets = {PPC::X31, -8};
98 return &darwin64Offsets;
99 } else {
100 static const SpillSlot darwinOffsets = {PPC::R31, -4};
101 return &darwinOffsets;
102 }
103 }
104
105 // Early exit if not using the SVR4 ABI.
106 if (!Subtarget.isSVR4ABI()) {
107 NumEntries = 0;
108 return nullptr;
109 }
110
111 // Note that the offsets here overlap, but this is fixed up in
112 // processFunctionBeforeFrameFinalized.
113
114 static const SpillSlot Offsets[] = {
115 // Floating-point register save area offsets.
116 {PPC::F31, -8},
117 {PPC::F30, -16},
118 {PPC::F29, -24},
119 {PPC::F28, -32},
120 {PPC::F27, -40},
121 {PPC::F26, -48},
122 {PPC::F25, -56},
123 {PPC::F24, -64},
124 {PPC::F23, -72},
125 {PPC::F22, -80},
126 {PPC::F21, -88},
127 {PPC::F20, -96},
128 {PPC::F19, -104},
129 {PPC::F18, -112},
130 {PPC::F17, -120},
131 {PPC::F16, -128},
132 {PPC::F15, -136},
133 {PPC::F14, -144},
134
135 // General register save area offsets.
136 {PPC::R31, -4},
137 {PPC::R30, -8},
138 {PPC::R29, -12},
139 {PPC::R28, -16},
140 {PPC::R27, -20},
141 {PPC::R26, -24},
142 {PPC::R25, -28},
143 {PPC::R24, -32},
144 {PPC::R23, -36},
145 {PPC::R22, -40},
146 {PPC::R21, -44},
147 {PPC::R20, -48},
148 {PPC::R19, -52},
149 {PPC::R18, -56},
150 {PPC::R17, -60},
151 {PPC::R16, -64},
152 {PPC::R15, -68},
153 {PPC::R14, -72},
154
155 // CR save area offset. We map each of the nonvolatile CR fields
156 // to the slot for CR2, which is the first of the nonvolatile CR
157 // fields to be assigned, so that we only allocate one save slot.
158 // See PPCRegisterInfo::hasReservedSpillSlot() for more information.
159 {PPC::CR2, -4},
160
161 // VRSAVE save area offset.
162 {PPC::VRSAVE, -4},
163
164 // Vector register save area
165 {PPC::V31, -16},
166 {PPC::V30, -32},
167 {PPC::V29, -48},
168 {PPC::V28, -64},
169 {PPC::V27, -80},
170 {PPC::V26, -96},
171 {PPC::V25, -112},
172 {PPC::V24, -128},
173 {PPC::V23, -144},
174 {PPC::V22, -160},
175 {PPC::V21, -176},
176 {PPC::V20, -192}};
177
178 static const SpillSlot Offsets64[] = {
179 // Floating-point register save area offsets.
180 {PPC::F31, -8},
181 {PPC::F30, -16},
182 {PPC::F29, -24},
183 {PPC::F28, -32},
184 {PPC::F27, -40},
185 {PPC::F26, -48},
186 {PPC::F25, -56},
187 {PPC::F24, -64},
188 {PPC::F23, -72},
189 {PPC::F22, -80},
190 {PPC::F21, -88},
191 {PPC::F20, -96},
192 {PPC::F19, -104},
193 {PPC::F18, -112},
194 {PPC::F17, -120},
195 {PPC::F16, -128},
196 {PPC::F15, -136},
197 {PPC::F14, -144},
198
199 // General register save area offsets.
200 {PPC::X31, -8},
201 {PPC::X30, -16},
202 {PPC::X29, -24},
203 {PPC::X28, -32},
204 {PPC::X27, -40},
205 {PPC::X26, -48},
206 {PPC::X25, -56},
207 {PPC::X24, -64},
208 {PPC::X23, -72},
209 {PPC::X22, -80},
210 {PPC::X21, -88},
211 {PPC::X20, -96},
212 {PPC::X19, -104},
213 {PPC::X18, -112},
214 {PPC::X17, -120},
215 {PPC::X16, -128},
216 {PPC::X15, -136},
217 {PPC::X14, -144},
218
219 // VRSAVE save area offset.
220 {PPC::VRSAVE, -4},
221
222 // Vector register save area
223 {PPC::V31, -16},
224 {PPC::V30, -32},
225 {PPC::V29, -48},
226 {PPC::V28, -64},
227 {PPC::V27, -80},
228 {PPC::V26, -96},
229 {PPC::V25, -112},
230 {PPC::V24, -128},
231 {PPC::V23, -144},
232 {PPC::V22, -160},
233 {PPC::V21, -176},
234 {PPC::V20, -192}};
235
236 if (Subtarget.isPPC64()) {
237 NumEntries = array_lengthof(Offsets64);
238
239 return Offsets64;
240 } else {
241 NumEntries = array_lengthof(Offsets);
242
243 return Offsets;
244 }
245}
246
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000247/// RemoveVRSaveCode - We have found that this function does not need any code
248/// to manipulate the VRSAVE register, even though it uses vector registers.
249/// This can happen when the only registers used are known to be live in or out
250/// of the function. Remove all of the VRSAVE related code from the function.
Bill Schmidt38d94582012-10-10 20:54:15 +0000251/// FIXME: The removal of the code results in a compile failure at -O0 when the
252/// function contains a function call, as the GPR containing original VRSAVE
253/// contents is spilled and reloaded around the call. Without the prolog code,
254/// the spill instruction refers to an undefined register. This code needs
255/// to account for all uses of that GPR.
Duncan P. N. Exon Smithe5a22f42016-07-27 13:24:16 +0000256static void RemoveVRSaveCode(MachineInstr &MI) {
257 MachineBasicBlock *Entry = MI.getParent();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000258 MachineFunction *MF = Entry->getParent();
259
260 // We know that the MTVRSAVE instruction immediately follows MI. Remove it.
261 MachineBasicBlock::iterator MBBI = MI;
262 ++MBBI;
263 assert(MBBI != Entry->end() && MBBI->getOpcode() == PPC::MTVRSAVE);
264 MBBI->eraseFromParent();
265
266 bool RemovedAllMTVRSAVEs = true;
267 // See if we can find and remove the MTVRSAVE instruction from all of the
268 // epilog blocks.
269 for (MachineFunction::iterator I = MF->begin(), E = MF->end(); I != E; ++I) {
270 // If last instruction is a return instruction, add an epilogue
Matthias Braunc2d4bef2015-09-25 21:25:19 +0000271 if (I->isReturnBlock()) {
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000272 bool FoundIt = false;
273 for (MBBI = I->end(); MBBI != I->begin(); ) {
274 --MBBI;
275 if (MBBI->getOpcode() == PPC::MTVRSAVE) {
276 MBBI->eraseFromParent(); // remove it.
277 FoundIt = true;
278 break;
279 }
280 }
281 RemovedAllMTVRSAVEs &= FoundIt;
282 }
283 }
284
285 // If we found and removed all MTVRSAVE instructions, remove the read of
286 // VRSAVE as well.
287 if (RemovedAllMTVRSAVEs) {
288 MBBI = MI;
289 assert(MBBI != Entry->begin() && "UPDATE_VRSAVE is first instr in block?");
290 --MBBI;
291 assert(MBBI->getOpcode() == PPC::MFVRSAVE && "VRSAVE instrs wandered?");
292 MBBI->eraseFromParent();
293 }
294
295 // Finally, nuke the UPDATE_VRSAVE.
Duncan P. N. Exon Smithe5a22f42016-07-27 13:24:16 +0000296 MI.eraseFromParent();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000297}
298
299// HandleVRSaveUpdate - MI is the UPDATE_VRSAVE instruction introduced by the
300// instruction selector. Based on the vector registers that have been used,
301// transform this into the appropriate ORI instruction.
Duncan P. N. Exon Smithe5a22f42016-07-27 13:24:16 +0000302static void HandleVRSaveUpdate(MachineInstr &MI, const TargetInstrInfo &TII) {
303 MachineFunction *MF = MI.getParent()->getParent();
Eric Christopherfc6de422014-08-05 02:39:49 +0000304 const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
Duncan P. N. Exon Smithe5a22f42016-07-27 13:24:16 +0000305 DebugLoc dl = MI.getDebugLoc();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000306
Matthias Braun9912bb82015-07-14 17:52:07 +0000307 const MachineRegisterInfo &MRI = MF->getRegInfo();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000308 unsigned UsedRegMask = 0;
309 for (unsigned i = 0; i != 32; ++i)
Matthias Braun9912bb82015-07-14 17:52:07 +0000310 if (MRI.isPhysRegModified(VRRegNo[i]))
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000311 UsedRegMask |= 1 << (31-i);
312
313 // Live in and live out values already must be in the mask, so don't bother
314 // marking them.
315 for (MachineRegisterInfo::livein_iterator
316 I = MF->getRegInfo().livein_begin(),
317 E = MF->getRegInfo().livein_end(); I != E; ++I) {
Hal Finkelfeea6532013-03-26 20:08:20 +0000318 unsigned RegNo = TRI->getEncodingValue(I->first);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000319 if (VRRegNo[RegNo] == I->first) // If this really is a vector reg.
320 UsedRegMask &= ~(1 << (31-RegNo)); // Doesn't need to be marked.
321 }
Jakob Stoklund Olesenbf034db2013-02-05 17:40:36 +0000322
323 // Live out registers appear as use operands on return instructions.
324 for (MachineFunction::const_iterator BI = MF->begin(), BE = MF->end();
325 UsedRegMask != 0 && BI != BE; ++BI) {
326 const MachineBasicBlock &MBB = *BI;
Matthias Braunc2d4bef2015-09-25 21:25:19 +0000327 if (!MBB.isReturnBlock())
Jakob Stoklund Olesenbf034db2013-02-05 17:40:36 +0000328 continue;
329 const MachineInstr &Ret = MBB.back();
330 for (unsigned I = 0, E = Ret.getNumOperands(); I != E; ++I) {
331 const MachineOperand &MO = Ret.getOperand(I);
332 if (!MO.isReg() || !PPC::VRRCRegClass.contains(MO.getReg()))
333 continue;
Hal Finkelfeea6532013-03-26 20:08:20 +0000334 unsigned RegNo = TRI->getEncodingValue(MO.getReg());
Jakob Stoklund Olesenbf034db2013-02-05 17:40:36 +0000335 UsedRegMask &= ~(1 << (31-RegNo));
336 }
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000337 }
338
339 // If no registers are used, turn this into a copy.
340 if (UsedRegMask == 0) {
341 // Remove all VRSAVE code.
342 RemoveVRSaveCode(MI);
343 return;
344 }
345
Duncan P. N. Exon Smithe5a22f42016-07-27 13:24:16 +0000346 unsigned SrcReg = MI.getOperand(1).getReg();
347 unsigned DstReg = MI.getOperand(0).getReg();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000348
349 if ((UsedRegMask & 0xFFFF) == UsedRegMask) {
350 if (DstReg != SrcReg)
Duncan P. N. Exon Smithe5a22f42016-07-27 13:24:16 +0000351 BuildMI(*MI.getParent(), MI, dl, TII.get(PPC::ORI), DstReg)
352 .addReg(SrcReg)
353 .addImm(UsedRegMask);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000354 else
Duncan P. N. Exon Smithe5a22f42016-07-27 13:24:16 +0000355 BuildMI(*MI.getParent(), MI, dl, TII.get(PPC::ORI), DstReg)
356 .addReg(SrcReg, RegState::Kill)
357 .addImm(UsedRegMask);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000358 } else if ((UsedRegMask & 0xFFFF0000) == UsedRegMask) {
359 if (DstReg != SrcReg)
Duncan P. N. Exon Smithe5a22f42016-07-27 13:24:16 +0000360 BuildMI(*MI.getParent(), MI, dl, TII.get(PPC::ORIS), DstReg)
361 .addReg(SrcReg)
362 .addImm(UsedRegMask >> 16);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000363 else
Duncan P. N. Exon Smithe5a22f42016-07-27 13:24:16 +0000364 BuildMI(*MI.getParent(), MI, dl, TII.get(PPC::ORIS), DstReg)
365 .addReg(SrcReg, RegState::Kill)
366 .addImm(UsedRegMask >> 16);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000367 } else {
368 if (DstReg != SrcReg)
Duncan P. N. Exon Smithe5a22f42016-07-27 13:24:16 +0000369 BuildMI(*MI.getParent(), MI, dl, TII.get(PPC::ORIS), DstReg)
370 .addReg(SrcReg)
371 .addImm(UsedRegMask >> 16);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000372 else
Duncan P. N. Exon Smithe5a22f42016-07-27 13:24:16 +0000373 BuildMI(*MI.getParent(), MI, dl, TII.get(PPC::ORIS), DstReg)
374 .addReg(SrcReg, RegState::Kill)
375 .addImm(UsedRegMask >> 16);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000376
Duncan P. N. Exon Smithe5a22f42016-07-27 13:24:16 +0000377 BuildMI(*MI.getParent(), MI, dl, TII.get(PPC::ORI), DstReg)
378 .addReg(DstReg, RegState::Kill)
379 .addImm(UsedRegMask & 0xFFFF);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000380 }
381
382 // Remove the old UPDATE_VRSAVE instruction.
Duncan P. N. Exon Smithe5a22f42016-07-27 13:24:16 +0000383 MI.eraseFromParent();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000384}
385
Roman Divackyc9e23d92012-09-12 14:47:47 +0000386static bool spillsCR(const MachineFunction &MF) {
387 const PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
388 return FuncInfo->isCRSpilled();
389}
390
Hal Finkelcc1eeda2013-03-23 22:06:03 +0000391static bool spillsVRSAVE(const MachineFunction &MF) {
392 const PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
393 return FuncInfo->isVRSAVESpilled();
394}
395
Hal Finkelbb420f12013-03-15 05:06:04 +0000396static bool hasSpills(const MachineFunction &MF) {
397 const PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
398 return FuncInfo->hasSpills();
399}
400
Hal Finkelfcc51d42013-03-17 04:43:44 +0000401static bool hasNonRISpills(const MachineFunction &MF) {
402 const PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
403 return FuncInfo->hasNonRISpills();
404}
405
Bill Schmidt82f1c772015-02-10 19:09:05 +0000406/// MustSaveLR - Return true if this function requires that we save the LR
407/// register onto the stack in the prolog and restore it in the epilog of the
408/// function.
409static bool MustSaveLR(const MachineFunction &MF, unsigned LR) {
410 const PPCFunctionInfo *MFI = MF.getInfo<PPCFunctionInfo>();
411
412 // We need a save/restore of LR if there is any def of LR (which is
413 // defined by calls, including the PIC setup sequence), or if there is
414 // some use of the LR stack slot (e.g. for builtin_return_address).
415 // (LR comes in 32 and 64 bit versions.)
416 MachineRegisterInfo::def_iterator RI = MF.getRegInfo().def_begin(LR);
417 return RI !=MF.getRegInfo().def_end() || MFI->isLRStoreRequired();
418}
419
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000420/// determineFrameLayout - Determine the size of the frame and maximum call
421/// frame size.
Hal Finkelbb420f12013-03-15 05:06:04 +0000422unsigned PPCFrameLowering::determineFrameLayout(MachineFunction &MF,
423 bool UpdateMF,
424 bool UseEstimate) const {
Matthias Braun941a7052016-07-28 18:40:00 +0000425 MachineFrameInfo &MFI = MF.getFrameInfo();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000426
427 // Get the number of bytes to allocate from the FrameInfo
Hal Finkelbb420f12013-03-15 05:06:04 +0000428 unsigned FrameSize =
Matthias Braun941a7052016-07-28 18:40:00 +0000429 UseEstimate ? MFI.estimateStackSize(MF) : MFI.getStackSize();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000430
Bill Schmidt8893a3d2013-08-16 20:05:04 +0000431 // Get stack alignments. The frame must be aligned to the greatest of these:
432 unsigned TargetAlign = getStackAlignment(); // alignment required per the ABI
Matthias Braun941a7052016-07-28 18:40:00 +0000433 unsigned MaxAlign = MFI.getMaxAlignment(); // algmt required by data in frame
Hal Finkela7c54e82013-07-17 00:45:52 +0000434 unsigned AlignMask = std::max(MaxAlign, TargetAlign) - 1;
435
Eric Christopherfc6de422014-08-05 02:39:49 +0000436 const PPCRegisterInfo *RegInfo =
Eric Christopher38522b82015-01-30 02:11:26 +0000437 static_cast<const PPCRegisterInfo *>(Subtarget.getRegisterInfo());
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000438
439 // If we are a leaf function, and use up to 224 bytes of stack space,
440 // don't have a frame pointer, calls, or dynamic alloca then we do not need
Hal Finkel67369882013-04-15 02:07:05 +0000441 // to adjust the stack pointer (we fit in the Red Zone).
Bill Schmidt8ea7af82013-02-26 21:28:57 +0000442 // The 32-bit SVR4 ABI has no Red Zone. However, it can still generate
443 // stackless code if all local vars are reg-allocated.
Duncan P. N. Exon Smith5bedaf932015-02-14 02:54:07 +0000444 bool DisableRedZone = MF.getFunction()->hasFnAttribute(Attribute::NoRedZone);
Bill Schmidt82f1c772015-02-10 19:09:05 +0000445 unsigned LR = RegInfo->getRARegister();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000446 if (!DisableRedZone &&
Bill Schmidt8ea7af82013-02-26 21:28:57 +0000447 (Subtarget.isPPC64() || // 32-bit SVR4, no stack-
448 !Subtarget.isSVR4ABI() || // allocated locals.
Eric Christopherd1737492014-04-29 00:16:40 +0000449 FrameSize == 0) &&
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000450 FrameSize <= 224 && // Fits in red zone.
Matthias Braun941a7052016-07-28 18:40:00 +0000451 !MFI.hasVarSizedObjects() && // No dynamic alloca.
452 !MFI.adjustsStack() && // No calls.
Bill Schmidt82f1c772015-02-10 19:09:05 +0000453 !MustSaveLR(MF, LR) &&
Hal Finkela7c54e82013-07-17 00:45:52 +0000454 !RegInfo->hasBasePointer(MF)) { // No special alignment.
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000455 // No need for frame
Hal Finkelbb420f12013-03-15 05:06:04 +0000456 if (UpdateMF)
Matthias Braun941a7052016-07-28 18:40:00 +0000457 MFI.setStackSize(0);
Hal Finkelbb420f12013-03-15 05:06:04 +0000458 return 0;
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000459 }
460
461 // Get the maximum call frame size of all the calls.
Matthias Braun941a7052016-07-28 18:40:00 +0000462 unsigned maxCallFrameSize = MFI.getMaxCallFrameSize();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000463
Ulrich Weigandf316e1d2014-06-23 13:47:52 +0000464 // Maximum call frame needs to be at least big enough for linkage area.
Eric Christophera4ae2132015-02-13 22:22:57 +0000465 unsigned minCallFrameSize = getLinkageSize();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000466 maxCallFrameSize = std::max(maxCallFrameSize, minCallFrameSize);
467
468 // If we have dynamic alloca then maxCallFrameSize needs to be aligned so
469 // that allocations will be aligned.
Matthias Braun941a7052016-07-28 18:40:00 +0000470 if (MFI.hasVarSizedObjects())
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000471 maxCallFrameSize = (maxCallFrameSize + AlignMask) & ~AlignMask;
472
473 // Update maximum call frame size.
Hal Finkelbb420f12013-03-15 05:06:04 +0000474 if (UpdateMF)
Matthias Braun941a7052016-07-28 18:40:00 +0000475 MFI.setMaxCallFrameSize(maxCallFrameSize);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000476
477 // Include call frame size in total.
478 FrameSize += maxCallFrameSize;
479
480 // Make sure the frame is aligned.
481 FrameSize = (FrameSize + AlignMask) & ~AlignMask;
482
483 // Update frame info.
Hal Finkelbb420f12013-03-15 05:06:04 +0000484 if (UpdateMF)
Matthias Braun941a7052016-07-28 18:40:00 +0000485 MFI.setStackSize(FrameSize);
Hal Finkelbb420f12013-03-15 05:06:04 +0000486
487 return FrameSize;
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000488}
489
Anton Korobeynikov0eecf5d2010-11-18 21:19:35 +0000490// hasFP - Return true if the specified function actually has a dedicated frame
491// pointer register.
Anton Korobeynikov2f931282011-01-10 12:39:04 +0000492bool PPCFrameLowering::hasFP(const MachineFunction &MF) const {
Matthias Braun941a7052016-07-28 18:40:00 +0000493 const MachineFrameInfo &MFI = MF.getFrameInfo();
Anton Korobeynikov3eb4fed2010-12-18 19:53:14 +0000494 // FIXME: This is pretty much broken by design: hasFP() might be called really
495 // early, before the stack layout was calculated and thus hasFP() might return
496 // true or false here depending on the time of call.
Matthias Braun941a7052016-07-28 18:40:00 +0000497 return (MFI.getStackSize()) && needsFP(MF);
Anton Korobeynikov3eb4fed2010-12-18 19:53:14 +0000498}
499
500// needsFP - Return true if the specified function should have a dedicated frame
501// pointer register. This is true if the function has variable sized allocas or
502// if frame pointer elimination is disabled.
Anton Korobeynikov2f931282011-01-10 12:39:04 +0000503bool PPCFrameLowering::needsFP(const MachineFunction &MF) const {
Matthias Braun941a7052016-07-28 18:40:00 +0000504 const MachineFrameInfo &MFI = MF.getFrameInfo();
Anton Korobeynikov0eecf5d2010-11-18 21:19:35 +0000505
506 // Naked functions have no stack frame pushed, so we don't have a frame
507 // pointer.
Duncan P. N. Exon Smith5bedaf932015-02-14 02:54:07 +0000508 if (MF.getFunction()->hasFnAttribute(Attribute::Naked))
Anton Korobeynikov0eecf5d2010-11-18 21:19:35 +0000509 return false;
510
Nick Lewycky50f02cb2011-12-02 22:16:29 +0000511 return MF.getTarget().Options.DisableFramePointerElim(MF) ||
Matthias Braun941a7052016-07-28 18:40:00 +0000512 MFI.hasVarSizedObjects() || MFI.hasStackMap() || MFI.hasPatchPoint() ||
Nick Lewycky50f02cb2011-12-02 22:16:29 +0000513 (MF.getTarget().Options.GuaranteedTailCallOpt &&
514 MF.getInfo<PPCFunctionInfo>()->hasFastCall());
Anton Korobeynikov0eecf5d2010-11-18 21:19:35 +0000515}
516
Hal Finkelaa03c032013-03-21 19:03:19 +0000517void PPCFrameLowering::replaceFPWithRealFP(MachineFunction &MF) const {
518 bool is31 = needsFP(MF);
519 unsigned FPReg = is31 ? PPC::R31 : PPC::R1;
520 unsigned FP8Reg = is31 ? PPC::X31 : PPC::X1;
521
Eric Christopherfc6de422014-08-05 02:39:49 +0000522 const PPCRegisterInfo *RegInfo =
Eric Christopher38522b82015-01-30 02:11:26 +0000523 static_cast<const PPCRegisterInfo *>(Subtarget.getRegisterInfo());
Hal Finkelf05d6c72013-07-17 23:50:51 +0000524 bool HasBP = RegInfo->hasBasePointer(MF);
Hal Finkel3ee2af72014-07-18 23:29:49 +0000525 unsigned BPReg = HasBP ? (unsigned) RegInfo->getBaseRegister(MF) : FPReg;
Hal Finkelf05d6c72013-07-17 23:50:51 +0000526 unsigned BP8Reg = HasBP ? (unsigned) PPC::X30 : FPReg;
527
Hal Finkelaa03c032013-03-21 19:03:19 +0000528 for (MachineFunction::iterator BI = MF.begin(), BE = MF.end();
529 BI != BE; ++BI)
530 for (MachineBasicBlock::iterator MBBI = BI->end(); MBBI != BI->begin(); ) {
531 --MBBI;
532 for (unsigned I = 0, E = MBBI->getNumOperands(); I != E; ++I) {
533 MachineOperand &MO = MBBI->getOperand(I);
534 if (!MO.isReg())
535 continue;
536
537 switch (MO.getReg()) {
538 case PPC::FP:
539 MO.setReg(FPReg);
540 break;
541 case PPC::FP8:
542 MO.setReg(FP8Reg);
543 break;
Hal Finkelf05d6c72013-07-17 23:50:51 +0000544 case PPC::BP:
545 MO.setReg(BPReg);
546 break;
547 case PPC::BP8:
548 MO.setReg(BP8Reg);
549 break;
550
Hal Finkelaa03c032013-03-21 19:03:19 +0000551 }
552 }
553 }
554}
Anton Korobeynikov0eecf5d2010-11-18 21:19:35 +0000555
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000556/* This function will do the following:
557 - If MBB is an entry or exit block, set SR1 and SR2 to R0 and R12
558 respectively (defaults recommended by the ABI) and return true
559 - If MBB is not an entry block, initialize the register scavenger and look
560 for available registers.
561 - If the defaults (R0/R12) are available, return true
562 - If TwoUniqueRegsRequired is set to true, it looks for two unique
563 registers. Otherwise, look for a single available register.
564 - If the required registers are found, set SR1 and SR2 and return true.
565 - If the required registers are not found, set SR2 or both SR1 and SR2 to
566 PPC::NoRegister and return false.
567
568 Note that if both SR1 and SR2 are valid parameters and TwoUniqueRegsRequired
569 is not set, this function will attempt to find two different registers, but
570 still return true if only one register is available (and set SR1 == SR2).
571*/
572bool
573PPCFrameLowering::findScratchRegister(MachineBasicBlock *MBB,
574 bool UseAtEnd,
575 bool TwoUniqueRegsRequired,
576 unsigned *SR1,
577 unsigned *SR2) const {
Kit Barton9c432ae2015-11-16 20:22:15 +0000578 RegScavenger RS;
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000579 unsigned R0 = Subtarget.isPPC64() ? PPC::X0 : PPC::R0;
580 unsigned R12 = Subtarget.isPPC64() ? PPC::X12 : PPC::R12;
Kit Barton9c432ae2015-11-16 20:22:15 +0000581
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000582 // Set the defaults for the two scratch registers.
583 if (SR1)
584 *SR1 = R0;
Kit Barton9c432ae2015-11-16 20:22:15 +0000585
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000586 if (SR2) {
587 assert (SR1 && "Asking for the second scratch register but not the first?");
588 *SR2 = R12;
589 }
590
591 // If MBB is an entry or exit block, use R0 and R12 as the scratch registers.
Kit Barton9c432ae2015-11-16 20:22:15 +0000592 if ((UseAtEnd && MBB->isReturnBlock()) ||
593 (!UseAtEnd && (&MBB->getParent()->front() == MBB)))
594 return true;
Alexey Samsonov39b7d652015-12-02 21:25:28 +0000595
Matthias Braun7dc03f02016-04-06 02:47:09 +0000596 RS.enterBasicBlock(*MBB);
Kit Barton9c432ae2015-11-16 20:22:15 +0000597
Kit Bartonf4ce2f32015-11-30 18:59:41 +0000598 if (UseAtEnd && !MBB->empty()) {
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000599 // The scratch register will be used at the end of the block, so must
600 // consider all registers used within the block
Kit Bartonf4ce2f32015-11-30 18:59:41 +0000601
602 MachineBasicBlock::iterator MBBI = MBB->getFirstTerminator();
603 // If no terminator, back iterator up to previous instruction.
604 if (MBBI == MBB->end())
605 MBBI = std::prev(MBBI);
606
607 if (MBBI != MBB->begin())
608 RS.forward(MBBI);
609 }
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000610
611 // If the two registers are available, we're all good.
612 // Note that we only return here if both R0 and R12 are available because
613 // although the function may not require two unique registers, it may benefit
614 // from having two so we should try to provide them.
615 if (!RS.isRegUsed(R0) && !RS.isRegUsed(R12))
Kit Barton9c432ae2015-11-16 20:22:15 +0000616 return true;
617
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000618 // Get the list of callee-saved registers for the target.
619 const PPCRegisterInfo *RegInfo =
620 static_cast<const PPCRegisterInfo *>(Subtarget.getRegisterInfo());
621 const MCPhysReg *CSRegs = RegInfo->getCalleeSavedRegs(MBB->getParent());
622
623 // Get all the available registers in the block.
624 BitVector BV = RS.getRegsAvailable(Subtarget.isPPC64() ? &PPC::G8RCRegClass :
625 &PPC::GPRCRegClass);
626
627 // We shouldn't use callee-saved registers as scratch registers as they may be
628 // available when looking for a candidate block for shrink wrapping but not
629 // available when the actual prologue/epilogue is being emitted because they
630 // were added as live-in to the prologue block by PrologueEpilogueInserter.
631 for (int i = 0; CSRegs[i]; ++i)
632 BV.reset(CSRegs[i]);
633
634 // Set the first scratch register to the first available one.
635 if (SR1) {
636 int FirstScratchReg = BV.find_first();
637 *SR1 = FirstScratchReg == -1 ? (unsigned)PPC::NoRegister : FirstScratchReg;
638 }
639
640 // If there is another one available, set the second scratch register to that.
641 // Otherwise, set it to either PPC::NoRegister if this function requires two
642 // or to whatever SR1 is set to if this function doesn't require two.
643 if (SR2) {
644 int SecondScratchReg = BV.find_next(*SR1);
645 if (SecondScratchReg != -1)
646 *SR2 = SecondScratchReg;
647 else
648 *SR2 = TwoUniqueRegsRequired ? (unsigned)PPC::NoRegister : *SR1;
649 }
650
651 // Now that we've done our best to provide both registers, double check
652 // whether we were unable to provide enough.
Aaron Ballman8374c1f2016-02-23 15:02:43 +0000653 if (BV.count() < (TwoUniqueRegsRequired ? 2U : 1U))
Kit Barton9c432ae2015-11-16 20:22:15 +0000654 return false;
655
Kit Barton9c432ae2015-11-16 20:22:15 +0000656 return true;
657}
658
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000659// We need a scratch register for spilling LR and for spilling CR. By default,
660// we use two scratch registers to hide latency. However, if only one scratch
661// register is available, we can adjust for that by not overlapping the spill
662// code. However, if we need to realign the stack (i.e. have a base pointer)
663// and the stack frame is large, we need two scratch registers.
664bool
665PPCFrameLowering::twoUniqueScratchRegsRequired(MachineBasicBlock *MBB) const {
666 const PPCRegisterInfo *RegInfo =
667 static_cast<const PPCRegisterInfo *>(Subtarget.getRegisterInfo());
668 MachineFunction &MF = *(MBB->getParent());
669 bool HasBP = RegInfo->hasBasePointer(MF);
670 unsigned FrameSize = determineFrameLayout(MF, false);
671 int NegFrameSize = -FrameSize;
672 bool IsLargeFrame = !isInt<16>(NegFrameSize);
Matthias Braun941a7052016-07-28 18:40:00 +0000673 MachineFrameInfo &MFI = MF.getFrameInfo();
674 unsigned MaxAlign = MFI.getMaxAlignment();
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000675
676 return IsLargeFrame && HasBP && MaxAlign > 1;
677}
678
Kit Barton9c432ae2015-11-16 20:22:15 +0000679bool PPCFrameLowering::canUseAsPrologue(const MachineBasicBlock &MBB) const {
680 MachineBasicBlock *TmpMBB = const_cast<MachineBasicBlock *>(&MBB);
681
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000682 return findScratchRegister(TmpMBB, false,
683 twoUniqueScratchRegsRequired(TmpMBB));
Kit Barton9c432ae2015-11-16 20:22:15 +0000684}
685
686bool PPCFrameLowering::canUseAsEpilogue(const MachineBasicBlock &MBB) const {
687 MachineBasicBlock *TmpMBB = const_cast<MachineBasicBlock *>(&MBB);
688
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000689 return findScratchRegister(TmpMBB, true);
Kit Barton9c432ae2015-11-16 20:22:15 +0000690}
691
Quentin Colombet61b305e2015-05-05 17:38:16 +0000692void PPCFrameLowering::emitPrologue(MachineFunction &MF,
693 MachineBasicBlock &MBB) const {
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000694 MachineBasicBlock::iterator MBBI = MBB.begin();
Matthias Braun941a7052016-07-28 18:40:00 +0000695 MachineFrameInfo &MFI = MF.getFrameInfo();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000696 const PPCInstrInfo &TII =
Eric Christopher38522b82015-01-30 02:11:26 +0000697 *static_cast<const PPCInstrInfo *>(Subtarget.getInstrInfo());
Eric Christopherfc6de422014-08-05 02:39:49 +0000698 const PPCRegisterInfo *RegInfo =
Eric Christopher38522b82015-01-30 02:11:26 +0000699 static_cast<const PPCRegisterInfo *>(Subtarget.getRegisterInfo());
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000700
701 MachineModuleInfo &MMI = MF.getMMI();
Bill Wendlingbc07a892013-06-18 07:20:20 +0000702 const MCRegisterInfo *MRI = MMI.getContext().getRegisterInfo();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000703 DebugLoc dl;
Jay Foad1f0a44e2014-12-01 09:42:32 +0000704 bool needsCFI = MMI.hasDebugInfo() ||
Rafael Espindolafc9bae62011-05-25 03:44:17 +0000705 MF.getFunction()->needsUnwindTableEntry();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000706
Bill Schmidt8893a3d2013-08-16 20:05:04 +0000707 // Get processor type.
708 bool isPPC64 = Subtarget.isPPC64();
709 // Get the ABI.
Bill Schmidt8893a3d2013-08-16 20:05:04 +0000710 bool isSVR4ABI = Subtarget.isSVR4ABI();
Ulrich Weigandbe928cc2014-07-21 00:03:18 +0000711 bool isELFv2ABI = Subtarget.isELFv2ABI();
Chandler Carruth003ed332015-02-14 09:14:44 +0000712 assert((Subtarget.isDarwinABI() || isSVR4ABI) &&
Bill Schmidt8893a3d2013-08-16 20:05:04 +0000713 "Currently only Darwin and SVR4 ABIs are supported for PowerPC.");
714
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000715 // Scan the prolog, looking for an UPDATE_VRSAVE instruction. If we find it,
716 // process it.
Bill Schmidt8893a3d2013-08-16 20:05:04 +0000717 if (!isSVR4ABI)
Bill Schmidt38d94582012-10-10 20:54:15 +0000718 for (unsigned i = 0; MBBI != MBB.end(); ++i, ++MBBI) {
719 if (MBBI->getOpcode() == PPC::UPDATE_VRSAVE) {
Duncan P. N. Exon Smithe5a22f42016-07-27 13:24:16 +0000720 HandleVRSaveUpdate(*MBBI, TII);
Bill Schmidt38d94582012-10-10 20:54:15 +0000721 break;
722 }
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000723 }
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000724
Kit Bartond3b904d2015-09-10 01:55:44 +0000725 // Move MBBI back to the beginning of the prologue block.
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000726 MBBI = MBB.begin();
727
728 // Work out frame sizes.
Hal Finkelbb420f12013-03-15 05:06:04 +0000729 unsigned FrameSize = determineFrameLayout(MF);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000730 int NegFrameSize = -FrameSize;
Hal Finkela7c54e82013-07-17 00:45:52 +0000731 if (!isInt<32>(NegFrameSize))
732 llvm_unreachable("Unhandled stack size!");
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000733
Matthias Braun941a7052016-07-28 18:40:00 +0000734 if (MFI.isFrameAddressTaken())
Hal Finkelaa03c032013-03-21 19:03:19 +0000735 replaceFPWithRealFP(MF);
736
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000737 // Check if the link register (LR) must be saved.
738 PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>();
739 bool MustSaveLR = FI->mustSaveLR();
Craig Topperb94011f2013-07-14 04:42:23 +0000740 const SmallVectorImpl<unsigned> &MustSaveCRs = FI->getMustSaveCRs();
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000741 bool MustSaveCR = !MustSaveCRs.empty();
Bill Schmidtf381afc2013-08-20 03:12:23 +0000742 // Do we have a frame pointer and/or base pointer for this function?
Anton Korobeynikov3eb4fed2010-12-18 19:53:14 +0000743 bool HasFP = hasFP(MF);
Hal Finkela7c54e82013-07-17 00:45:52 +0000744 bool HasBP = RegInfo->hasBasePointer(MF);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000745
Bill Schmidtf381afc2013-08-20 03:12:23 +0000746 unsigned SPReg = isPPC64 ? PPC::X1 : PPC::R1;
Hal Finkel3ee2af72014-07-18 23:29:49 +0000747 unsigned BPReg = RegInfo->getBaseRegister(MF);
Bill Schmidtf381afc2013-08-20 03:12:23 +0000748 unsigned FPReg = isPPC64 ? PPC::X31 : PPC::R31;
749 unsigned LRReg = isPPC64 ? PPC::LR8 : PPC::LR;
Kit Barton9c432ae2015-11-16 20:22:15 +0000750 unsigned ScratchReg = 0;
Bill Schmidtf381afc2013-08-20 03:12:23 +0000751 unsigned TempReg = isPPC64 ? PPC::X12 : PPC::R12; // another scratch reg
752 // ...(R12/X12 is volatile in both Darwin & SVR4, & can't be a function arg.)
753 const MCInstrDesc& MFLRInst = TII.get(isPPC64 ? PPC::MFLR8
754 : PPC::MFLR );
755 const MCInstrDesc& StoreInst = TII.get(isPPC64 ? PPC::STD
756 : PPC::STW );
757 const MCInstrDesc& StoreUpdtInst = TII.get(isPPC64 ? PPC::STDU
758 : PPC::STWU );
759 const MCInstrDesc& StoreUpdtIdxInst = TII.get(isPPC64 ? PPC::STDUX
760 : PPC::STWUX);
761 const MCInstrDesc& LoadImmShiftedInst = TII.get(isPPC64 ? PPC::LIS8
762 : PPC::LIS );
763 const MCInstrDesc& OrImmInst = TII.get(isPPC64 ? PPC::ORI8
764 : PPC::ORI );
765 const MCInstrDesc& OrInst = TII.get(isPPC64 ? PPC::OR8
766 : PPC::OR );
767 const MCInstrDesc& SubtractCarryingInst = TII.get(isPPC64 ? PPC::SUBFC8
768 : PPC::SUBFC);
769 const MCInstrDesc& SubtractImmCarryingInst = TII.get(isPPC64 ? PPC::SUBFIC8
770 : PPC::SUBFIC);
771
Bill Schmidt8893a3d2013-08-16 20:05:04 +0000772 // Regarding this assert: Even though LR is saved in the caller's frame (i.e.,
773 // LROffset is positive), that slot is callee-owned. Because PPC32 SVR4 has no
774 // Red Zone, an asynchronous event (a form of "callee") could claim a frame &
775 // overwrite it, so PPC32 SVR4 must claim at least a minimal frame to save LR.
776 assert((isPPC64 || !isSVR4ABI || !(!FrameSize && (MustSaveLR || HasFP))) &&
777 "FrameSize must be >0 to save/restore the FP or LR for 32-bit SVR4.");
778
Nemanja Ivanovicdaf0ca22016-02-20 20:45:37 +0000779 // Using the same bool variable as below to supress compiler warnings.
780 bool SingleScratchReg =
781 findScratchRegister(&MBB, false, twoUniqueScratchRegsRequired(&MBB),
782 &ScratchReg, &TempReg);
783 assert(SingleScratchReg &&
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000784 "Required number of registers not available in this block");
785
Nemanja Ivanovicdaf0ca22016-02-20 20:45:37 +0000786 SingleScratchReg = ScratchReg == TempReg;
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000787
Eric Christopherf71609b2015-02-13 00:39:27 +0000788 int LROffset = getReturnSaveOffset();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000789
790 int FPOffset = 0;
791 if (HasFP) {
Bill Schmidt8893a3d2013-08-16 20:05:04 +0000792 if (isSVR4ABI) {
Matthias Braun941a7052016-07-28 18:40:00 +0000793 MachineFrameInfo &MFI = MF.getFrameInfo();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000794 int FPIndex = FI->getFramePointerSaveIndex();
795 assert(FPIndex && "No Frame Pointer Save Slot!");
Matthias Braun941a7052016-07-28 18:40:00 +0000796 FPOffset = MFI.getObjectOffset(FPIndex);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000797 } else {
Eric Christopherdc3a8a42015-02-13 00:39:38 +0000798 FPOffset = getFramePointerSaveOffset();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000799 }
800 }
801
Hal Finkela7c54e82013-07-17 00:45:52 +0000802 int BPOffset = 0;
803 if (HasBP) {
Bill Schmidt8893a3d2013-08-16 20:05:04 +0000804 if (isSVR4ABI) {
Matthias Braun941a7052016-07-28 18:40:00 +0000805 MachineFrameInfo &MFI = MF.getFrameInfo();
Hal Finkela7c54e82013-07-17 00:45:52 +0000806 int BPIndex = FI->getBasePointerSaveIndex();
807 assert(BPIndex && "No Base Pointer Save Slot!");
Matthias Braun941a7052016-07-28 18:40:00 +0000808 BPOffset = MFI.getObjectOffset(BPIndex);
Hal Finkela7c54e82013-07-17 00:45:52 +0000809 } else {
Eric Christopherfcd3d872015-02-13 22:48:53 +0000810 BPOffset = getBasePointerSaveOffset();
Hal Finkela7c54e82013-07-17 00:45:52 +0000811 }
812 }
813
Justin Hibbits654346e2015-01-10 01:57:21 +0000814 int PBPOffset = 0;
815 if (FI->usesPICBase()) {
Matthias Braun941a7052016-07-28 18:40:00 +0000816 MachineFrameInfo &MFI = MF.getFrameInfo();
Justin Hibbits654346e2015-01-10 01:57:21 +0000817 int PBPIndex = FI->getPICBasePointerSaveIndex();
818 assert(PBPIndex && "No PIC Base Pointer Save Slot!");
Matthias Braun941a7052016-07-28 18:40:00 +0000819 PBPOffset = MFI.getObjectOffset(PBPIndex);
Justin Hibbits654346e2015-01-10 01:57:21 +0000820 }
821
Bill Schmidt8893a3d2013-08-16 20:05:04 +0000822 // Get stack alignments.
Matthias Braun941a7052016-07-28 18:40:00 +0000823 unsigned MaxAlign = MFI.getMaxAlignment();
Bill Schmidt8893a3d2013-08-16 20:05:04 +0000824 if (HasBP && MaxAlign > 1)
825 assert(isPowerOf2_32(MaxAlign) && isInt<16>(MaxAlign) &&
826 "Invalid alignment!");
827
828 // Frames of 32KB & larger require special handling because they cannot be
829 // indexed into with a simple STDU/STWU/STD/STW immediate offset operand.
830 bool isLargeFrame = !isInt<16>(NegFrameSize);
831
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000832 assert((isPPC64 || !MustSaveCR) &&
833 "Prologue CR saving supported only in 64-bit mode");
834
835 // If we need to spill the CR and the LR but we don't have two separate
836 // registers available, we must spill them one at a time
837 if (MustSaveCR && SingleScratchReg && MustSaveLR) {
Chuang-Yu Cheng6efde2f2016-04-12 03:04:44 +0000838 // In the ELFv2 ABI, we are not required to save all CR fields.
839 // If only one or two CR fields are clobbered, it is more efficient to use
840 // mfocrf to selectively save just those fields, because mfocrf has short
841 // latency compares to mfcr.
842 unsigned MfcrOpcode = PPC::MFCR8;
Chuang-Yu Cheng8676c3d2016-04-27 02:59:28 +0000843 unsigned CrState = RegState::ImplicitKill;
844 if (isELFv2ABI && MustSaveCRs.size() == 1) {
Chuang-Yu Cheng6efde2f2016-04-12 03:04:44 +0000845 MfcrOpcode = PPC::MFOCRF8;
Chuang-Yu Cheng8676c3d2016-04-27 02:59:28 +0000846 CrState = RegState::Kill;
847 }
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000848 MachineInstrBuilder MIB =
Chuang-Yu Cheng6efde2f2016-04-12 03:04:44 +0000849 BuildMI(MBB, MBBI, dl, TII.get(MfcrOpcode), TempReg);
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000850 for (unsigned i = 0, e = MustSaveCRs.size(); i != e; ++i)
Chuang-Yu Cheng8676c3d2016-04-27 02:59:28 +0000851 MIB.addReg(MustSaveCRs[i], CrState);
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000852 BuildMI(MBB, MBBI, dl, TII.get(PPC::STW8))
853 .addReg(TempReg, getKillRegState(true))
854 .addImm(8)
855 .addReg(SPReg);
856 }
857
Bill Schmidtf381afc2013-08-20 03:12:23 +0000858 if (MustSaveLR)
859 BuildMI(MBB, MBBI, dl, MFLRInst, ScratchReg);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000860
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000861 if (MustSaveCR &&
862 !(SingleScratchReg && MustSaveLR)) { // will only occur for PPC64
Chuang-Yu Cheng6efde2f2016-04-12 03:04:44 +0000863 // In the ELFv2 ABI, we are not required to save all CR fields.
864 // If only one or two CR fields are clobbered, it is more efficient to use
865 // mfocrf to selectively save just those fields, because mfocrf has short
866 // latency compares to mfcr.
867 unsigned MfcrOpcode = PPC::MFCR8;
Chuang-Yu Cheng8676c3d2016-04-27 02:59:28 +0000868 unsigned CrState = RegState::ImplicitKill;
869 if (isELFv2ABI && MustSaveCRs.size() == 1) {
Chuang-Yu Cheng6efde2f2016-04-12 03:04:44 +0000870 MfcrOpcode = PPC::MFOCRF8;
Chuang-Yu Cheng8676c3d2016-04-27 02:59:28 +0000871 CrState = RegState::Kill;
872 }
Bill Schmidtf381afc2013-08-20 03:12:23 +0000873 MachineInstrBuilder MIB =
Chuang-Yu Cheng6efde2f2016-04-12 03:04:44 +0000874 BuildMI(MBB, MBBI, dl, TII.get(MfcrOpcode), TempReg);
Bill Schmidtf381afc2013-08-20 03:12:23 +0000875 for (unsigned i = 0, e = MustSaveCRs.size(); i != e; ++i)
Chuang-Yu Cheng8676c3d2016-04-27 02:59:28 +0000876 MIB.addReg(MustSaveCRs[i], CrState);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000877 }
878
Bill Schmidtf381afc2013-08-20 03:12:23 +0000879 if (HasFP)
880 // FIXME: On PPC32 SVR4, we must not spill before claiming the stackframe.
881 BuildMI(MBB, MBBI, dl, StoreInst)
882 .addReg(FPReg)
883 .addImm(FPOffset)
884 .addReg(SPReg);
885
Justin Hibbits654346e2015-01-10 01:57:21 +0000886 if (FI->usesPICBase())
Justin Hibbits98a532d2015-01-08 15:47:19 +0000887 // FIXME: On PPC32 SVR4, we must not spill before claiming the stackframe.
888 BuildMI(MBB, MBBI, dl, StoreInst)
889 .addReg(PPC::R30)
Justin Hibbits654346e2015-01-10 01:57:21 +0000890 .addImm(PBPOffset)
Justin Hibbits98a532d2015-01-08 15:47:19 +0000891 .addReg(SPReg);
892
Bill Schmidtf381afc2013-08-20 03:12:23 +0000893 if (HasBP)
894 // FIXME: On PPC32 SVR4, we must not spill before claiming the stackframe.
895 BuildMI(MBB, MBBI, dl, StoreInst)
896 .addReg(BPReg)
897 .addImm(BPOffset)
898 .addReg(SPReg);
899
900 if (MustSaveLR)
901 // FIXME: On PPC32 SVR4, we must not spill before claiming the stackframe.
902 BuildMI(MBB, MBBI, dl, StoreInst)
Nemanja Ivanovic62fba482016-07-15 19:56:32 +0000903 .addReg(ScratchReg, getKillRegState(true))
Bill Schmidtf381afc2013-08-20 03:12:23 +0000904 .addImm(LROffset)
905 .addReg(SPReg);
906
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000907 if (MustSaveCR &&
908 !(SingleScratchReg && MustSaveLR)) // will only occur for PPC64
Bill Schmidtf381afc2013-08-20 03:12:23 +0000909 BuildMI(MBB, MBBI, dl, TII.get(PPC::STW8))
910 .addReg(TempReg, getKillRegState(true))
911 .addImm(8)
912 .addReg(SPReg);
913
Bill Schmidt8893a3d2013-08-16 20:05:04 +0000914 // Skip the rest if this is a leaf function & all spills fit in the Red Zone.
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000915 if (!FrameSize) return;
916
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000917 // Adjust stack pointer: r1 += NegFrameSize.
918 // If there is a preferred stack alignment, align R1 now
Hal Finkela7c54e82013-07-17 00:45:52 +0000919
Bill Schmidtf381afc2013-08-20 03:12:23 +0000920 if (HasBP) {
921 // Save a copy of r1 as the base pointer.
922 BuildMI(MBB, MBBI, dl, OrInst, BPReg)
923 .addReg(SPReg)
924 .addReg(SPReg);
925 }
926
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000927 // This condition must be kept in sync with canUseAsPrologue.
Bill Schmidtf381afc2013-08-20 03:12:23 +0000928 if (HasBP && MaxAlign > 1) {
929 if (isPPC64)
930 BuildMI(MBB, MBBI, dl, TII.get(PPC::RLDICL), ScratchReg)
931 .addReg(SPReg)
932 .addImm(0)
933 .addImm(64 - Log2_32(MaxAlign));
934 else // PPC32...
935 BuildMI(MBB, MBBI, dl, TII.get(PPC::RLWINM), ScratchReg)
936 .addReg(SPReg)
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000937 .addImm(0)
938 .addImm(32 - Log2_32(MaxAlign))
939 .addImm(31);
Bill Schmidtf381afc2013-08-20 03:12:23 +0000940 if (!isLargeFrame) {
941 BuildMI(MBB, MBBI, dl, SubtractImmCarryingInst, ScratchReg)
942 .addReg(ScratchReg, RegState::Kill)
943 .addImm(NegFrameSize);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000944 } else {
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +0000945 assert(!SingleScratchReg && "Only a single scratch reg available");
Bill Schmidtf381afc2013-08-20 03:12:23 +0000946 BuildMI(MBB, MBBI, dl, LoadImmShiftedInst, TempReg)
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000947 .addImm(NegFrameSize >> 16);
Bill Schmidtf381afc2013-08-20 03:12:23 +0000948 BuildMI(MBB, MBBI, dl, OrImmInst, TempReg)
949 .addReg(TempReg, RegState::Kill)
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000950 .addImm(NegFrameSize & 0xFFFF);
Bill Schmidtf381afc2013-08-20 03:12:23 +0000951 BuildMI(MBB, MBBI, dl, SubtractCarryingInst, ScratchReg)
952 .addReg(ScratchReg, RegState::Kill)
953 .addReg(TempReg, RegState::Kill);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000954 }
Bill Schmidtf381afc2013-08-20 03:12:23 +0000955 BuildMI(MBB, MBBI, dl, StoreUpdtIdxInst, SPReg)
956 .addReg(SPReg, RegState::Kill)
957 .addReg(SPReg)
958 .addReg(ScratchReg);
Hal Finkela7c54e82013-07-17 00:45:52 +0000959
Bill Schmidtf381afc2013-08-20 03:12:23 +0000960 } else if (!isLargeFrame) {
961 BuildMI(MBB, MBBI, dl, StoreUpdtInst, SPReg)
962 .addReg(SPReg)
963 .addImm(NegFrameSize)
964 .addReg(SPReg);
Bill Schmidt8893a3d2013-08-16 20:05:04 +0000965
Bill Schmidtf381afc2013-08-20 03:12:23 +0000966 } else {
967 BuildMI(MBB, MBBI, dl, LoadImmShiftedInst, ScratchReg)
968 .addImm(NegFrameSize >> 16);
969 BuildMI(MBB, MBBI, dl, OrImmInst, ScratchReg)
970 .addReg(ScratchReg, RegState::Kill)
971 .addImm(NegFrameSize & 0xFFFF);
972 BuildMI(MBB, MBBI, dl, StoreUpdtIdxInst, SPReg)
973 .addReg(SPReg, RegState::Kill)
974 .addReg(SPReg)
975 .addReg(ScratchReg);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000976 }
977
Jay Foad1f0a44e2014-12-01 09:42:32 +0000978 // Add Call Frame Information for the instructions we generated above.
979 if (needsCFI) {
980 unsigned CFIIndex;
981
982 if (HasBP) {
983 // Define CFA in terms of BP. Do this in preference to using FP/SP,
984 // because if the stack needed aligning then CFA won't be at a fixed
985 // offset from FP/SP.
986 unsigned Reg = MRI->getDwarfRegNum(BPReg, true);
987 CFIIndex = MMI.addFrameInst(
988 MCCFIInstruction::createDefCfaRegister(nullptr, Reg));
989 } else {
990 // Adjust the definition of CFA to account for the change in SP.
991 assert(NegFrameSize);
992 CFIIndex = MMI.addFrameInst(
993 MCCFIInstruction::createDefCfaOffset(nullptr, NegFrameSize));
994 }
Eric Christopher612bb692014-04-29 00:16:46 +0000995 BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
996 .addCFIIndex(CFIIndex);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000997
998 if (HasFP) {
Jay Foad1f0a44e2014-12-01 09:42:32 +0000999 // Describe where FP was saved, at a fixed offset from CFA.
Bill Schmidtf381afc2013-08-20 03:12:23 +00001000 unsigned Reg = MRI->getDwarfRegNum(FPReg, true);
Rafael Espindolab1f25f12014-03-07 06:08:31 +00001001 CFIIndex = MMI.addFrameInst(
1002 MCCFIInstruction::createOffset(nullptr, Reg, FPOffset));
Eric Christopher612bb692014-04-29 00:16:46 +00001003 BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
Rafael Espindolab1f25f12014-03-07 06:08:31 +00001004 .addCFIIndex(CFIIndex);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001005 }
1006
Justin Hibbits654346e2015-01-10 01:57:21 +00001007 if (FI->usesPICBase()) {
1008 // Describe where FP was saved, at a fixed offset from CFA.
1009 unsigned Reg = MRI->getDwarfRegNum(PPC::R30, true);
1010 CFIIndex = MMI.addFrameInst(
1011 MCCFIInstruction::createOffset(nullptr, Reg, PBPOffset));
1012 BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
1013 .addCFIIndex(CFIIndex);
1014 }
1015
Hal Finkela7c54e82013-07-17 00:45:52 +00001016 if (HasBP) {
Jay Foad1f0a44e2014-12-01 09:42:32 +00001017 // Describe where BP was saved, at a fixed offset from CFA.
Bill Schmidtf381afc2013-08-20 03:12:23 +00001018 unsigned Reg = MRI->getDwarfRegNum(BPReg, true);
Rafael Espindolab1f25f12014-03-07 06:08:31 +00001019 CFIIndex = MMI.addFrameInst(
1020 MCCFIInstruction::createOffset(nullptr, Reg, BPOffset));
Eric Christopher612bb692014-04-29 00:16:46 +00001021 BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
Rafael Espindolab1f25f12014-03-07 06:08:31 +00001022 .addCFIIndex(CFIIndex);
Hal Finkela7c54e82013-07-17 00:45:52 +00001023 }
1024
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001025 if (MustSaveLR) {
Jay Foad1f0a44e2014-12-01 09:42:32 +00001026 // Describe where LR was saved, at a fixed offset from CFA.
Bill Schmidtf381afc2013-08-20 03:12:23 +00001027 unsigned Reg = MRI->getDwarfRegNum(LRReg, true);
Rafael Espindolab1f25f12014-03-07 06:08:31 +00001028 CFIIndex = MMI.addFrameInst(
1029 MCCFIInstruction::createOffset(nullptr, Reg, LROffset));
Eric Christopher612bb692014-04-29 00:16:46 +00001030 BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
Rafael Espindolab1f25f12014-03-07 06:08:31 +00001031 .addCFIIndex(CFIIndex);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001032 }
1033 }
1034
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001035 // If there is a frame pointer, copy R1 into R31
1036 if (HasFP) {
Bill Schmidtf381afc2013-08-20 03:12:23 +00001037 BuildMI(MBB, MBBI, dl, OrInst, FPReg)
1038 .addReg(SPReg)
1039 .addReg(SPReg);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001040
Jay Foad1f0a44e2014-12-01 09:42:32 +00001041 if (!HasBP && needsCFI) {
1042 // Change the definition of CFA from SP+offset to FP+offset, because SP
1043 // will change at every alloca.
Bill Schmidtf381afc2013-08-20 03:12:23 +00001044 unsigned Reg = MRI->getDwarfRegNum(FPReg, true);
Rafael Espindolab1f25f12014-03-07 06:08:31 +00001045 unsigned CFIIndex = MMI.addFrameInst(
1046 MCCFIInstruction::createDefCfaRegister(nullptr, Reg));
1047
Eric Christopher612bb692014-04-29 00:16:46 +00001048 BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
Rafael Espindolab1f25f12014-03-07 06:08:31 +00001049 .addCFIIndex(CFIIndex);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001050 }
1051 }
1052
Jay Foad1f0a44e2014-12-01 09:42:32 +00001053 if (needsCFI) {
1054 // Describe where callee saved registers were saved, at fixed offsets from
1055 // CFA.
Matthias Braun941a7052016-07-28 18:40:00 +00001056 const std::vector<CalleeSavedInfo> &CSI = MFI.getCalleeSavedInfo();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001057 for (unsigned I = 0, E = CSI.size(); I != E; ++I) {
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001058 unsigned Reg = CSI[I].getReg();
1059 if (Reg == PPC::LR || Reg == PPC::LR8 || Reg == PPC::RM) continue;
Rafael Espindola08600bc2011-05-30 20:20:15 +00001060
1061 // This is a bit of a hack: CR2LT, CR2GT, CR2EQ and CR2UN are just
1062 // subregisters of CR2. We just need to emit a move of CR2.
Craig Topperabadc662012-04-20 06:31:50 +00001063 if (PPC::CRBITRCRegClass.contains(Reg))
Rafael Espindola08600bc2011-05-30 20:20:15 +00001064 continue;
Rafael Espindola08600bc2011-05-30 20:20:15 +00001065
Roman Divackyc9e23d92012-09-12 14:47:47 +00001066 // For SVR4, don't emit a move for the CR spill slot if we haven't
1067 // spilled CRs.
Bill Schmidt8893a3d2013-08-16 20:05:04 +00001068 if (isSVR4ABI && (PPC::CR2 <= Reg && Reg <= PPC::CR4)
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +00001069 && !MustSaveCR)
Bill Schmidt8893a3d2013-08-16 20:05:04 +00001070 continue;
Roman Divackyc9e23d92012-09-12 14:47:47 +00001071
1072 // For 64-bit SVR4 when we have spilled CRs, the spill location
1073 // is SP+8, not a frame-relative slot.
Bill Schmidt8893a3d2013-08-16 20:05:04 +00001074 if (isSVR4ABI && isPPC64 && (PPC::CR2 <= Reg && Reg <= PPC::CR4)) {
Ulrich Weigandbe928cc2014-07-21 00:03:18 +00001075 // In the ELFv1 ABI, only CR2 is noted in CFI and stands in for
1076 // the whole CR word. In the ELFv2 ABI, every CR that was
1077 // actually saved gets its own CFI record.
1078 unsigned CRReg = isELFv2ABI? Reg : (unsigned) PPC::CR2;
Rafael Espindolab1f25f12014-03-07 06:08:31 +00001079 unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createOffset(
Ulrich Weigandbe928cc2014-07-21 00:03:18 +00001080 nullptr, MRI->getDwarfRegNum(CRReg, true), 8));
Eric Christopher612bb692014-04-29 00:16:46 +00001081 BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
Rafael Espindolab1f25f12014-03-07 06:08:31 +00001082 .addCFIIndex(CFIIndex);
Bill Schmidt8893a3d2013-08-16 20:05:04 +00001083 continue;
Roman Divackyc9e23d92012-09-12 14:47:47 +00001084 }
1085
Matthias Braun941a7052016-07-28 18:40:00 +00001086 int Offset = MFI.getObjectOffset(CSI[I].getFrameIdx());
Rafael Espindolab1f25f12014-03-07 06:08:31 +00001087 unsigned CFIIndex = MMI.addFrameInst(MCCFIInstruction::createOffset(
1088 nullptr, MRI->getDwarfRegNum(Reg, true), Offset));
Eric Christopher612bb692014-04-29 00:16:46 +00001089 BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
Rafael Espindolab1f25f12014-03-07 06:08:31 +00001090 .addCFIIndex(CFIIndex);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001091 }
1092 }
1093}
1094
Anton Korobeynikov2f931282011-01-10 12:39:04 +00001095void PPCFrameLowering::emitEpilogue(MachineFunction &MF,
Kit Bartond3b904d2015-09-10 01:55:44 +00001096 MachineBasicBlock &MBB) const {
1097 MachineBasicBlock::iterator MBBI = MBB.getFirstTerminator();
1098 DebugLoc dl;
1099
1100 if (MBBI != MBB.end())
1101 dl = MBBI->getDebugLoc();
1102
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001103 const PPCInstrInfo &TII =
Eric Christopher38522b82015-01-30 02:11:26 +00001104 *static_cast<const PPCInstrInfo *>(Subtarget.getInstrInfo());
Eric Christopherfc6de422014-08-05 02:39:49 +00001105 const PPCRegisterInfo *RegInfo =
Eric Christopher38522b82015-01-30 02:11:26 +00001106 static_cast<const PPCRegisterInfo *>(Subtarget.getRegisterInfo());
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001107
Bill Schmidt8893a3d2013-08-16 20:05:04 +00001108 // Get alignment info so we know how to restore the SP.
Matthias Braun941a7052016-07-28 18:40:00 +00001109 const MachineFrameInfo &MFI = MF.getFrameInfo();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001110
1111 // Get the number of bytes allocated from the FrameInfo.
Matthias Braun941a7052016-07-28 18:40:00 +00001112 int FrameSize = MFI.getStackSize();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001113
1114 // Get processor type.
1115 bool isPPC64 = Subtarget.isPPC64();
Bill Schmidt8893a3d2013-08-16 20:05:04 +00001116 // Get the ABI.
Bill Schmidt8893a3d2013-08-16 20:05:04 +00001117 bool isSVR4ABI = Subtarget.isSVR4ABI();
1118
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001119 // Check if the link register (LR) has been saved.
1120 PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>();
1121 bool MustSaveLR = FI->mustSaveLR();
Craig Topperb94011f2013-07-14 04:42:23 +00001122 const SmallVectorImpl<unsigned> &MustSaveCRs = FI->getMustSaveCRs();
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +00001123 bool MustSaveCR = !MustSaveCRs.empty();
Bill Schmidtf381afc2013-08-20 03:12:23 +00001124 // Do we have a frame pointer and/or base pointer for this function?
Anton Korobeynikov3eb4fed2010-12-18 19:53:14 +00001125 bool HasFP = hasFP(MF);
Hal Finkela7c54e82013-07-17 00:45:52 +00001126 bool HasBP = RegInfo->hasBasePointer(MF);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001127
Bill Schmidtf381afc2013-08-20 03:12:23 +00001128 unsigned SPReg = isPPC64 ? PPC::X1 : PPC::R1;
Hal Finkel3ee2af72014-07-18 23:29:49 +00001129 unsigned BPReg = RegInfo->getBaseRegister(MF);
Bill Schmidtf381afc2013-08-20 03:12:23 +00001130 unsigned FPReg = isPPC64 ? PPC::X31 : PPC::R31;
Kit Barton9c432ae2015-11-16 20:22:15 +00001131 unsigned ScratchReg = 0;
Bill Schmidtf381afc2013-08-20 03:12:23 +00001132 unsigned TempReg = isPPC64 ? PPC::X12 : PPC::R12; // another scratch reg
1133 const MCInstrDesc& MTLRInst = TII.get( isPPC64 ? PPC::MTLR8
1134 : PPC::MTLR );
1135 const MCInstrDesc& LoadInst = TII.get( isPPC64 ? PPC::LD
1136 : PPC::LWZ );
1137 const MCInstrDesc& LoadImmShiftedInst = TII.get( isPPC64 ? PPC::LIS8
1138 : PPC::LIS );
1139 const MCInstrDesc& OrImmInst = TII.get( isPPC64 ? PPC::ORI8
1140 : PPC::ORI );
1141 const MCInstrDesc& AddImmInst = TII.get( isPPC64 ? PPC::ADDI8
1142 : PPC::ADDI );
1143 const MCInstrDesc& AddInst = TII.get( isPPC64 ? PPC::ADD8
1144 : PPC::ADD4 );
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +00001145
Eric Christopherf71609b2015-02-13 00:39:27 +00001146 int LROffset = getReturnSaveOffset();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001147
1148 int FPOffset = 0;
Kit Barton9c432ae2015-11-16 20:22:15 +00001149
Nemanja Ivanovicdaf0ca22016-02-20 20:45:37 +00001150 // Using the same bool variable as below to supress compiler warnings.
1151 bool SingleScratchReg = findScratchRegister(&MBB, true, false, &ScratchReg,
1152 &TempReg);
1153 assert(SingleScratchReg &&
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +00001154 "Could not find an available scratch register");
1155
Nemanja Ivanovicdaf0ca22016-02-20 20:45:37 +00001156 SingleScratchReg = ScratchReg == TempReg;
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +00001157
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001158 if (HasFP) {
Bill Schmidt8893a3d2013-08-16 20:05:04 +00001159 if (isSVR4ABI) {
Matthias Braun941a7052016-07-28 18:40:00 +00001160 MachineFrameInfo &MFI = MF.getFrameInfo();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001161 int FPIndex = FI->getFramePointerSaveIndex();
1162 assert(FPIndex && "No Frame Pointer Save Slot!");
Matthias Braun941a7052016-07-28 18:40:00 +00001163 FPOffset = MFI.getObjectOffset(FPIndex);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001164 } else {
Eric Christopherdc3a8a42015-02-13 00:39:38 +00001165 FPOffset = getFramePointerSaveOffset();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001166 }
1167 }
1168
Hal Finkela7c54e82013-07-17 00:45:52 +00001169 int BPOffset = 0;
1170 if (HasBP) {
Bill Schmidt8893a3d2013-08-16 20:05:04 +00001171 if (isSVR4ABI) {
Matthias Braun941a7052016-07-28 18:40:00 +00001172 MachineFrameInfo &MFI = MF.getFrameInfo();
Hal Finkela7c54e82013-07-17 00:45:52 +00001173 int BPIndex = FI->getBasePointerSaveIndex();
1174 assert(BPIndex && "No Base Pointer Save Slot!");
Matthias Braun941a7052016-07-28 18:40:00 +00001175 BPOffset = MFI.getObjectOffset(BPIndex);
Hal Finkela7c54e82013-07-17 00:45:52 +00001176 } else {
Eric Christopherfcd3d872015-02-13 22:48:53 +00001177 BPOffset = getBasePointerSaveOffset();
Hal Finkela7c54e82013-07-17 00:45:52 +00001178 }
1179 }
1180
Justin Hibbits654346e2015-01-10 01:57:21 +00001181 int PBPOffset = 0;
1182 if (FI->usesPICBase()) {
Matthias Braun941a7052016-07-28 18:40:00 +00001183 MachineFrameInfo &MFI = MF.getFrameInfo();
Justin Hibbits654346e2015-01-10 01:57:21 +00001184 int PBPIndex = FI->getPICBasePointerSaveIndex();
1185 assert(PBPIndex && "No PIC Base Pointer Save Slot!");
Matthias Braun941a7052016-07-28 18:40:00 +00001186 PBPOffset = MFI.getObjectOffset(PBPIndex);
Justin Hibbits654346e2015-01-10 01:57:21 +00001187 }
1188
NAKAMURA Takumi8061e862015-09-11 08:20:56 +00001189 bool IsReturnBlock = (MBBI != MBB.end() && MBBI->isReturn());
Kit Bartond3b904d2015-09-10 01:55:44 +00001190
1191 if (IsReturnBlock) {
1192 unsigned RetOpcode = MBBI->getOpcode();
1193 bool UsesTCRet = RetOpcode == PPC::TCRETURNri ||
1194 RetOpcode == PPC::TCRETURNdi ||
1195 RetOpcode == PPC::TCRETURNai ||
1196 RetOpcode == PPC::TCRETURNri8 ||
1197 RetOpcode == PPC::TCRETURNdi8 ||
1198 RetOpcode == PPC::TCRETURNai8;
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001199
Kit Bartond3b904d2015-09-10 01:55:44 +00001200 if (UsesTCRet) {
1201 int MaxTCRetDelta = FI->getTailCallSPDelta();
1202 MachineOperand &StackAdjust = MBBI->getOperand(1);
1203 assert(StackAdjust.isImm() && "Expecting immediate value.");
1204 // Adjust stack pointer.
1205 int StackAdj = StackAdjust.getImm();
1206 int Delta = StackAdj - MaxTCRetDelta;
1207 assert((Delta >= 0) && "Delta must be positive");
1208 if (MaxTCRetDelta>0)
1209 FrameSize += (StackAdj +Delta);
1210 else
1211 FrameSize += StackAdj;
1212 }
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001213 }
1214
Bill Schmidt8893a3d2013-08-16 20:05:04 +00001215 // Frames of 32KB & larger require special handling because they cannot be
1216 // indexed into with a simple LD/LWZ immediate offset operand.
1217 bool isLargeFrame = !isInt<16>(FrameSize);
1218
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001219 if (FrameSize) {
Bill Schmidt8893a3d2013-08-16 20:05:04 +00001220 // In the prologue, the loaded (or persistent) stack pointer value is offset
1221 // by the STDU/STDUX/STWU/STWUX instruction. Add this offset back now.
Bill Schmidtf381afc2013-08-20 03:12:23 +00001222
1223 // If this function contained a fastcc call and GuaranteedTailCallOpt is
1224 // enabled (=> hasFastCall()==true) the fastcc call might contain a tail
1225 // call which invalidates the stack pointer value in SP(0). So we use the
1226 // value of R31 in this case.
1227 if (FI->hasFastCall()) {
1228 assert(HasFP && "Expecting a valid frame pointer.");
1229 if (!isLargeFrame) {
1230 BuildMI(MBB, MBBI, dl, AddImmInst, SPReg)
1231 .addReg(FPReg).addImm(FrameSize);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001232 } else {
Bill Schmidtf381afc2013-08-20 03:12:23 +00001233 BuildMI(MBB, MBBI, dl, LoadImmShiftedInst, ScratchReg)
1234 .addImm(FrameSize >> 16);
1235 BuildMI(MBB, MBBI, dl, OrImmInst, ScratchReg)
1236 .addReg(ScratchReg, RegState::Kill)
1237 .addImm(FrameSize & 0xFFFF);
1238 BuildMI(MBB, MBBI, dl, AddInst)
1239 .addReg(SPReg)
1240 .addReg(FPReg)
1241 .addReg(ScratchReg);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001242 }
Matthias Braun941a7052016-07-28 18:40:00 +00001243 } else if (!isLargeFrame && !HasBP && !MFI.hasVarSizedObjects()) {
Bill Schmidtf381afc2013-08-20 03:12:23 +00001244 BuildMI(MBB, MBBI, dl, AddImmInst, SPReg)
1245 .addReg(SPReg)
1246 .addImm(FrameSize);
1247 } else {
1248 BuildMI(MBB, MBBI, dl, LoadInst, SPReg)
1249 .addImm(0)
1250 .addReg(SPReg);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001251 }
1252 }
1253
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +00001254 assert((isPPC64 || !MustSaveCR) &&
1255 "Epilogue CR restoring supported only in 64-bit mode");
1256
1257 // If we need to save both the LR and the CR and we only have one available
1258 // scratch register, we must do them one at a time.
1259 if (MustSaveCR && SingleScratchReg && MustSaveLR) {
1260 BuildMI(MBB, MBBI, dl, TII.get(PPC::LWZ8), TempReg)
1261 .addImm(8)
1262 .addReg(SPReg);
1263 for (unsigned i = 0, e = MustSaveCRs.size(); i != e; ++i)
1264 BuildMI(MBB, MBBI, dl, TII.get(PPC::MTOCRF8), MustSaveCRs[i])
1265 .addReg(TempReg, getKillRegState(i == e-1));
1266 }
1267
Bill Schmidtf381afc2013-08-20 03:12:23 +00001268 if (MustSaveLR)
1269 BuildMI(MBB, MBBI, dl, LoadInst, ScratchReg)
1270 .addImm(LROffset)
1271 .addReg(SPReg);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001272
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +00001273 if (MustSaveCR &&
1274 !(SingleScratchReg && MustSaveLR)) // will only occur for PPC64
Bill Schmidtf381afc2013-08-20 03:12:23 +00001275 BuildMI(MBB, MBBI, dl, TII.get(PPC::LWZ8), TempReg)
1276 .addImm(8)
1277 .addReg(SPReg);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001278
Bill Schmidtf381afc2013-08-20 03:12:23 +00001279 if (HasFP)
1280 BuildMI(MBB, MBBI, dl, LoadInst, FPReg)
1281 .addImm(FPOffset)
1282 .addReg(SPReg);
Hal Finkela7c54e82013-07-17 00:45:52 +00001283
Justin Hibbits654346e2015-01-10 01:57:21 +00001284 if (FI->usesPICBase())
Justin Hibbits98a532d2015-01-08 15:47:19 +00001285 // FIXME: On PPC32 SVR4, we must not spill before claiming the stackframe.
1286 BuildMI(MBB, MBBI, dl, LoadInst)
1287 .addReg(PPC::R30)
Justin Hibbits654346e2015-01-10 01:57:21 +00001288 .addImm(PBPOffset)
Justin Hibbits98a532d2015-01-08 15:47:19 +00001289 .addReg(SPReg);
1290
Bill Schmidtf381afc2013-08-20 03:12:23 +00001291 if (HasBP)
1292 BuildMI(MBB, MBBI, dl, LoadInst, BPReg)
1293 .addImm(BPOffset)
1294 .addReg(SPReg);
Hal Finkel67369882013-04-15 02:07:05 +00001295
Nemanja Ivanovicae22101c2016-02-20 18:16:25 +00001296 if (MustSaveCR &&
1297 !(SingleScratchReg && MustSaveLR)) // will only occur for PPC64
Bill Schmidtf381afc2013-08-20 03:12:23 +00001298 for (unsigned i = 0, e = MustSaveCRs.size(); i != e; ++i)
1299 BuildMI(MBB, MBBI, dl, TII.get(PPC::MTOCRF8), MustSaveCRs[i])
1300 .addReg(TempReg, getKillRegState(i == e-1));
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001301
Bill Schmidtf381afc2013-08-20 03:12:23 +00001302 if (MustSaveLR)
1303 BuildMI(MBB, MBBI, dl, MTLRInst).addReg(ScratchReg);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001304
1305 // Callee pop calling convention. Pop parameter/linkage area. Used for tail
1306 // call optimization
Kit Bartond3b904d2015-09-10 01:55:44 +00001307 if (IsReturnBlock) {
1308 unsigned RetOpcode = MBBI->getOpcode();
1309 if (MF.getTarget().Options.GuaranteedTailCallOpt &&
1310 (RetOpcode == PPC::BLR || RetOpcode == PPC::BLR8) &&
1311 MF.getFunction()->getCallingConv() == CallingConv::Fast) {
1312 PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>();
1313 unsigned CallerAllocatedAmt = FI->getMinReservedArea();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001314
Kit Bartond3b904d2015-09-10 01:55:44 +00001315 if (CallerAllocatedAmt && isInt<16>(CallerAllocatedAmt)) {
1316 BuildMI(MBB, MBBI, dl, AddImmInst, SPReg)
1317 .addReg(SPReg).addImm(CallerAllocatedAmt);
1318 } else {
1319 BuildMI(MBB, MBBI, dl, LoadImmShiftedInst, ScratchReg)
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001320 .addImm(CallerAllocatedAmt >> 16);
Kit Bartond3b904d2015-09-10 01:55:44 +00001321 BuildMI(MBB, MBBI, dl, OrImmInst, ScratchReg)
Bill Schmidtf381afc2013-08-20 03:12:23 +00001322 .addReg(ScratchReg, RegState::Kill)
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001323 .addImm(CallerAllocatedAmt & 0xFFFF);
Kit Bartond3b904d2015-09-10 01:55:44 +00001324 BuildMI(MBB, MBBI, dl, AddInst)
Bill Schmidtf381afc2013-08-20 03:12:23 +00001325 .addReg(SPReg)
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001326 .addReg(FPReg)
Bill Schmidtf381afc2013-08-20 03:12:23 +00001327 .addReg(ScratchReg);
Kit Bartond3b904d2015-09-10 01:55:44 +00001328 }
Chuang-Yu Chengf8b592f2016-04-01 06:44:32 +00001329 } else {
1330 createTailCallBranchInstr(MBB);
Kit Bartond3b904d2015-09-10 01:55:44 +00001331 }
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00001332 }
1333}
Anton Korobeynikov14ee3442010-11-18 23:25:52 +00001334
Chuang-Yu Chengf8b592f2016-04-01 06:44:32 +00001335void PPCFrameLowering::createTailCallBranchInstr(MachineBasicBlock &MBB) const {
1336 MachineBasicBlock::iterator MBBI = MBB.getFirstTerminator();
1337 DebugLoc dl;
1338
1339 if (MBBI != MBB.end())
1340 dl = MBBI->getDebugLoc();
1341
1342 const PPCInstrInfo &TII =
1343 *static_cast<const PPCInstrInfo *>(Subtarget.getInstrInfo());
1344
1345 // Create branch instruction for pseudo tail call return instruction
1346 unsigned RetOpcode = MBBI->getOpcode();
1347 if (RetOpcode == PPC::TCRETURNdi) {
1348 MBBI = MBB.getLastNonDebugInstr();
1349 MachineOperand &JumpTarget = MBBI->getOperand(0);
1350 BuildMI(MBB, MBBI, dl, TII.get(PPC::TAILB)).
1351 addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset());
1352 } else if (RetOpcode == PPC::TCRETURNri) {
1353 MBBI = MBB.getLastNonDebugInstr();
1354 assert(MBBI->getOperand(0).isReg() && "Expecting register operand.");
1355 BuildMI(MBB, MBBI, dl, TII.get(PPC::TAILBCTR));
1356 } else if (RetOpcode == PPC::TCRETURNai) {
1357 MBBI = MBB.getLastNonDebugInstr();
1358 MachineOperand &JumpTarget = MBBI->getOperand(0);
1359 BuildMI(MBB, MBBI, dl, TII.get(PPC::TAILBA)).addImm(JumpTarget.getImm());
1360 } else if (RetOpcode == PPC::TCRETURNdi8) {
1361 MBBI = MBB.getLastNonDebugInstr();
1362 MachineOperand &JumpTarget = MBBI->getOperand(0);
1363 BuildMI(MBB, MBBI, dl, TII.get(PPC::TAILB8)).
1364 addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset());
1365 } else if (RetOpcode == PPC::TCRETURNri8) {
1366 MBBI = MBB.getLastNonDebugInstr();
1367 assert(MBBI->getOperand(0).isReg() && "Expecting register operand.");
1368 BuildMI(MBB, MBBI, dl, TII.get(PPC::TAILBCTR8));
1369 } else if (RetOpcode == PPC::TCRETURNai8) {
1370 MBBI = MBB.getLastNonDebugInstr();
1371 MachineOperand &JumpTarget = MBBI->getOperand(0);
1372 BuildMI(MBB, MBBI, dl, TII.get(PPC::TAILBA8)).addImm(JumpTarget.getImm());
1373 }
1374}
1375
Matthias Braun02564862015-07-14 17:17:13 +00001376void PPCFrameLowering::determineCalleeSaves(MachineFunction &MF,
1377 BitVector &SavedRegs,
1378 RegScavenger *RS) const {
1379 TargetFrameLowering::determineCalleeSaves(MF, SavedRegs, RS);
1380
Eric Christopherfc6de422014-08-05 02:39:49 +00001381 const PPCRegisterInfo *RegInfo =
Eric Christopher38522b82015-01-30 02:11:26 +00001382 static_cast<const PPCRegisterInfo *>(Subtarget.getRegisterInfo());
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001383
1384 // Save and clear the LR state.
1385 PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>();
1386 unsigned LR = RegInfo->getRARegister();
1387 FI->setMustSaveLR(MustSaveLR(MF, LR));
Matthias Braun02564862015-07-14 17:17:13 +00001388 SavedRegs.reset(LR);
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001389
1390 // Save R31 if necessary
1391 int FPSI = FI->getFramePointerSaveIndex();
1392 bool isPPC64 = Subtarget.isPPC64();
1393 bool isDarwinABI = Subtarget.isDarwinABI();
Matthias Braun941a7052016-07-28 18:40:00 +00001394 MachineFrameInfo &MFI = MF.getFrameInfo();
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001395
1396 // If the frame pointer save index hasn't been defined yet.
Anton Korobeynikov3eb4fed2010-12-18 19:53:14 +00001397 if (!FPSI && needsFP(MF)) {
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001398 // Find out what the fix offset of the frame pointer save area.
Eric Christopherdc3a8a42015-02-13 00:39:38 +00001399 int FPOffset = getFramePointerSaveOffset();
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001400 // Allocate the frame index for frame pointer save area.
Matthias Braun941a7052016-07-28 18:40:00 +00001401 FPSI = MFI.CreateFixedObject(isPPC64? 8 : 4, FPOffset, true);
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001402 // Save the result.
1403 FI->setFramePointerSaveIndex(FPSI);
1404 }
1405
Hal Finkela7c54e82013-07-17 00:45:52 +00001406 int BPSI = FI->getBasePointerSaveIndex();
1407 if (!BPSI && RegInfo->hasBasePointer(MF)) {
Eric Christopherfcd3d872015-02-13 22:48:53 +00001408 int BPOffset = getBasePointerSaveOffset();
Hal Finkela7c54e82013-07-17 00:45:52 +00001409 // Allocate the frame index for the base pointer save area.
Matthias Braun941a7052016-07-28 18:40:00 +00001410 BPSI = MFI.CreateFixedObject(isPPC64? 8 : 4, BPOffset, true);
Hal Finkela7c54e82013-07-17 00:45:52 +00001411 // Save the result.
1412 FI->setBasePointerSaveIndex(BPSI);
1413 }
1414
Justin Hibbits654346e2015-01-10 01:57:21 +00001415 // Reserve stack space for the PIC Base register (R30).
1416 // Only used in SVR4 32-bit.
1417 if (FI->usesPICBase()) {
Matthias Braun941a7052016-07-28 18:40:00 +00001418 int PBPSI = MFI.CreateFixedObject(4, -8, true);
Justin Hibbits654346e2015-01-10 01:57:21 +00001419 FI->setPICBasePointerSaveIndex(PBPSI);
1420 }
1421
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001422 // Reserve stack space to move the linkage area to in case of a tail call.
1423 int TCSPDelta = 0;
Nick Lewycky50f02cb2011-12-02 22:16:29 +00001424 if (MF.getTarget().Options.GuaranteedTailCallOpt &&
1425 (TCSPDelta = FI->getTailCallSPDelta()) < 0) {
Matthias Braun941a7052016-07-28 18:40:00 +00001426 MFI.CreateFixedObject(-1 * TCSPDelta, TCSPDelta, true);
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001427 }
1428
Eric Christopherd1737492014-04-29 00:16:40 +00001429 // For 32-bit SVR4, allocate the nonvolatile CR spill slot iff the
Bill Schmidtc68c6df2013-02-24 17:34:50 +00001430 // function uses CR 2, 3, or 4.
Eric Christopherd1737492014-04-29 00:16:40 +00001431 if (!isPPC64 && !isDarwinABI &&
Matthias Braun02564862015-07-14 17:17:13 +00001432 (SavedRegs.test(PPC::CR2) ||
1433 SavedRegs.test(PPC::CR3) ||
1434 SavedRegs.test(PPC::CR4))) {
Matthias Braun941a7052016-07-28 18:40:00 +00001435 int FrameIdx = MFI.CreateFixedObject((uint64_t)4, (int64_t)-4, true);
Bill Schmidtc68c6df2013-02-24 17:34:50 +00001436 FI->setCRSpillFrameIndex(FrameIdx);
1437 }
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001438}
1439
Hal Finkel5a765fd2013-03-14 20:33:40 +00001440void PPCFrameLowering::processFunctionBeforeFrameFinalized(MachineFunction &MF,
Hal Finkelbb420f12013-03-15 05:06:04 +00001441 RegScavenger *RS) const {
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001442 // Early exit if not using the SVR4 ABI.
Hal Finkelbb420f12013-03-15 05:06:04 +00001443 if (!Subtarget.isSVR4ABI()) {
1444 addScavengingSpillSlot(MF, RS);
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001445 return;
Hal Finkelbb420f12013-03-15 05:06:04 +00001446 }
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001447
1448 // Get callee saved register information.
Matthias Braun941a7052016-07-28 18:40:00 +00001449 MachineFrameInfo &MFI = MF.getFrameInfo();
1450 const std::vector<CalleeSavedInfo> &CSI = MFI.getCalleeSavedInfo();
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001451
Chuang-Yu Chengf8b592f2016-04-01 06:44:32 +00001452 // If the function is shrink-wrapped, and if the function has a tail call, the
1453 // tail call might not be in the new RestoreBlock, so real branch instruction
1454 // won't be generated by emitEpilogue(), because shrink-wrap has chosen new
1455 // RestoreBlock. So we handle this case here.
Matthias Braun941a7052016-07-28 18:40:00 +00001456 if (MFI.getSavePoint() && MFI.hasTailCall()) {
1457 MachineBasicBlock *RestoreBlock = MFI.getRestorePoint();
Chuang-Yu Chengf8b592f2016-04-01 06:44:32 +00001458 for (MachineBasicBlock &MBB : MF) {
1459 if (MBB.isReturnBlock() && (&MBB) != RestoreBlock)
1460 createTailCallBranchInstr(MBB);
1461 }
1462 }
1463
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001464 // Early exit if no callee saved registers are modified!
Anton Korobeynikov3eb4fed2010-12-18 19:53:14 +00001465 if (CSI.empty() && !needsFP(MF)) {
Hal Finkelbb420f12013-03-15 05:06:04 +00001466 addScavengingSpillSlot(MF, RS);
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001467 return;
1468 }
1469
1470 unsigned MinGPR = PPC::R31;
1471 unsigned MinG8R = PPC::X31;
1472 unsigned MinFPR = PPC::F31;
1473 unsigned MinVR = PPC::V31;
1474
1475 bool HasGPSaveArea = false;
1476 bool HasG8SaveArea = false;
1477 bool HasFPSaveArea = false;
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001478 bool HasVRSAVESaveArea = false;
1479 bool HasVRSaveArea = false;
1480
1481 SmallVector<CalleeSavedInfo, 18> GPRegs;
1482 SmallVector<CalleeSavedInfo, 18> G8Regs;
1483 SmallVector<CalleeSavedInfo, 18> FPRegs;
1484 SmallVector<CalleeSavedInfo, 18> VRegs;
1485
1486 for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
1487 unsigned Reg = CSI[i].getReg();
Craig Topperabadc662012-04-20 06:31:50 +00001488 if (PPC::GPRCRegClass.contains(Reg)) {
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001489 HasGPSaveArea = true;
1490
1491 GPRegs.push_back(CSI[i]);
1492
1493 if (Reg < MinGPR) {
1494 MinGPR = Reg;
1495 }
Craig Topperabadc662012-04-20 06:31:50 +00001496 } else if (PPC::G8RCRegClass.contains(Reg)) {
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001497 HasG8SaveArea = true;
1498
1499 G8Regs.push_back(CSI[i]);
1500
1501 if (Reg < MinG8R) {
1502 MinG8R = Reg;
1503 }
Craig Topperabadc662012-04-20 06:31:50 +00001504 } else if (PPC::F8RCRegClass.contains(Reg)) {
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001505 HasFPSaveArea = true;
1506
1507 FPRegs.push_back(CSI[i]);
1508
1509 if (Reg < MinFPR) {
1510 MinFPR = Reg;
1511 }
Craig Topperabadc662012-04-20 06:31:50 +00001512 } else if (PPC::CRBITRCRegClass.contains(Reg) ||
1513 PPC::CRRCRegClass.contains(Reg)) {
Roman Divackyc9e23d92012-09-12 14:47:47 +00001514 ; // do nothing, as we already know whether CRs are spilled
Craig Topperabadc662012-04-20 06:31:50 +00001515 } else if (PPC::VRSAVERCRegClass.contains(Reg)) {
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001516 HasVRSAVESaveArea = true;
Craig Topperabadc662012-04-20 06:31:50 +00001517 } else if (PPC::VRRCRegClass.contains(Reg)) {
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001518 HasVRSaveArea = true;
1519
1520 VRegs.push_back(CSI[i]);
1521
1522 if (Reg < MinVR) {
1523 MinVR = Reg;
1524 }
1525 } else {
1526 llvm_unreachable("Unknown RegisterClass!");
1527 }
1528 }
1529
1530 PPCFunctionInfo *PFI = MF.getInfo<PPCFunctionInfo>();
Eric Christopher38522b82015-01-30 02:11:26 +00001531 const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001532
1533 int64_t LowerBound = 0;
1534
1535 // Take into account stack space reserved for tail calls.
1536 int TCSPDelta = 0;
Nick Lewycky50f02cb2011-12-02 22:16:29 +00001537 if (MF.getTarget().Options.GuaranteedTailCallOpt &&
1538 (TCSPDelta = PFI->getTailCallSPDelta()) < 0) {
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001539 LowerBound = TCSPDelta;
1540 }
1541
1542 // The Floating-point register save area is right below the back chain word
1543 // of the previous stack frame.
1544 if (HasFPSaveArea) {
1545 for (unsigned i = 0, e = FPRegs.size(); i != e; ++i) {
1546 int FI = FPRegs[i].getFrameIdx();
1547
Matthias Braun941a7052016-07-28 18:40:00 +00001548 MFI.setObjectOffset(FI, LowerBound + MFI.getObjectOffset(FI));
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001549 }
1550
Hal Finkelfeea6532013-03-26 20:08:20 +00001551 LowerBound -= (31 - TRI->getEncodingValue(MinFPR) + 1) * 8;
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001552 }
1553
1554 // Check whether the frame pointer register is allocated. If so, make sure it
1555 // is spilled to the correct offset.
Anton Korobeynikov3eb4fed2010-12-18 19:53:14 +00001556 if (needsFP(MF)) {
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001557 HasGPSaveArea = true;
1558
1559 int FI = PFI->getFramePointerSaveIndex();
1560 assert(FI && "No Frame Pointer Save Slot!");
1561
Matthias Braun941a7052016-07-28 18:40:00 +00001562 MFI.setObjectOffset(FI, LowerBound + MFI.getObjectOffset(FI));
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001563 }
1564
Justin Hibbits654346e2015-01-10 01:57:21 +00001565 if (PFI->usesPICBase()) {
1566 HasGPSaveArea = true;
1567
1568 int FI = PFI->getPICBasePointerSaveIndex();
1569 assert(FI && "No PIC Base Pointer Save Slot!");
1570
Matthias Braun941a7052016-07-28 18:40:00 +00001571 MFI.setObjectOffset(FI, LowerBound + MFI.getObjectOffset(FI));
Justin Hibbits654346e2015-01-10 01:57:21 +00001572 }
1573
Eric Christopherfc6de422014-08-05 02:39:49 +00001574 const PPCRegisterInfo *RegInfo =
Eric Christopher38522b82015-01-30 02:11:26 +00001575 static_cast<const PPCRegisterInfo *>(Subtarget.getRegisterInfo());
Hal Finkela7c54e82013-07-17 00:45:52 +00001576 if (RegInfo->hasBasePointer(MF)) {
1577 HasGPSaveArea = true;
1578
1579 int FI = PFI->getBasePointerSaveIndex();
1580 assert(FI && "No Base Pointer Save Slot!");
1581
Matthias Braun941a7052016-07-28 18:40:00 +00001582 MFI.setObjectOffset(FI, LowerBound + MFI.getObjectOffset(FI));
Hal Finkela7c54e82013-07-17 00:45:52 +00001583 }
1584
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001585 // General register save area starts right below the Floating-point
1586 // register save area.
1587 if (HasGPSaveArea || HasG8SaveArea) {
1588 // Move general register save area spill slots down, taking into account
1589 // the size of the Floating-point register save area.
1590 for (unsigned i = 0, e = GPRegs.size(); i != e; ++i) {
1591 int FI = GPRegs[i].getFrameIdx();
1592
Matthias Braun941a7052016-07-28 18:40:00 +00001593 MFI.setObjectOffset(FI, LowerBound + MFI.getObjectOffset(FI));
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001594 }
1595
1596 // Move general register save area spill slots down, taking into account
1597 // the size of the Floating-point register save area.
1598 for (unsigned i = 0, e = G8Regs.size(); i != e; ++i) {
1599 int FI = G8Regs[i].getFrameIdx();
1600
Matthias Braun941a7052016-07-28 18:40:00 +00001601 MFI.setObjectOffset(FI, LowerBound + MFI.getObjectOffset(FI));
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001602 }
1603
1604 unsigned MinReg =
Hal Finkelfeea6532013-03-26 20:08:20 +00001605 std::min<unsigned>(TRI->getEncodingValue(MinGPR),
1606 TRI->getEncodingValue(MinG8R));
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001607
1608 if (Subtarget.isPPC64()) {
1609 LowerBound -= (31 - MinReg + 1) * 8;
1610 } else {
1611 LowerBound -= (31 - MinReg + 1) * 4;
1612 }
1613 }
1614
Roman Divackyc9e23d92012-09-12 14:47:47 +00001615 // For 32-bit only, the CR save area is below the general register
1616 // save area. For 64-bit SVR4, the CR save area is addressed relative
1617 // to the stack pointer and hence does not need an adjustment here.
1618 // Only CR2 (the first nonvolatile spilled) has an associated frame
1619 // index so that we have a single uniform save area.
1620 if (spillsCR(MF) && !(Subtarget.isPPC64() && Subtarget.isSVR4ABI())) {
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001621 // Adjust the frame index of the CR spill slot.
1622 for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
1623 unsigned Reg = CSI[i].getReg();
1624
Roman Divackyc9e23d92012-09-12 14:47:47 +00001625 if ((Subtarget.isSVR4ABI() && Reg == PPC::CR2)
Eric Christopherd1737492014-04-29 00:16:40 +00001626 // Leave Darwin logic as-is.
1627 || (!Subtarget.isSVR4ABI() &&
1628 (PPC::CRBITRCRegClass.contains(Reg) ||
1629 PPC::CRRCRegClass.contains(Reg)))) {
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001630 int FI = CSI[i].getFrameIdx();
1631
Matthias Braun941a7052016-07-28 18:40:00 +00001632 MFI.setObjectOffset(FI, LowerBound + MFI.getObjectOffset(FI));
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001633 }
1634 }
1635
1636 LowerBound -= 4; // The CR save area is always 4 bytes long.
1637 }
1638
1639 if (HasVRSAVESaveArea) {
1640 // FIXME SVR4: Is it actually possible to have multiple elements in CSI
1641 // which have the VRSAVE register class?
1642 // Adjust the frame index of the VRSAVE spill slot.
1643 for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
1644 unsigned Reg = CSI[i].getReg();
1645
Craig Topperabadc662012-04-20 06:31:50 +00001646 if (PPC::VRSAVERCRegClass.contains(Reg)) {
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001647 int FI = CSI[i].getFrameIdx();
1648
Matthias Braun941a7052016-07-28 18:40:00 +00001649 MFI.setObjectOffset(FI, LowerBound + MFI.getObjectOffset(FI));
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001650 }
1651 }
1652
1653 LowerBound -= 4; // The VRSAVE save area is always 4 bytes long.
1654 }
1655
1656 if (HasVRSaveArea) {
1657 // Insert alignment padding, we need 16-byte alignment.
1658 LowerBound = (LowerBound - 15) & ~(15);
1659
1660 for (unsigned i = 0, e = VRegs.size(); i != e; ++i) {
1661 int FI = VRegs[i].getFrameIdx();
1662
Matthias Braun941a7052016-07-28 18:40:00 +00001663 MFI.setObjectOffset(FI, LowerBound + MFI.getObjectOffset(FI));
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001664 }
1665 }
Hal Finkelbb420f12013-03-15 05:06:04 +00001666
1667 addScavengingSpillSlot(MF, RS);
1668}
1669
1670void
1671PPCFrameLowering::addScavengingSpillSlot(MachineFunction &MF,
1672 RegScavenger *RS) const {
1673 // Reserve a slot closest to SP or frame pointer if we have a dynalloc or
1674 // a large stack, which will require scavenging a register to materialize a
1675 // large offset.
1676
1677 // We need to have a scavenger spill slot for spills if the frame size is
1678 // large. In case there is no free register for large-offset addressing,
1679 // this slot is used for the necessary emergency spill. Also, we need the
1680 // slot for dynamic stack allocations.
1681
1682 // The scavenger might be invoked if the frame offset does not fit into
1683 // the 16-bit immediate. We don't know the complete frame size here
1684 // because we've not yet computed callee-saved register spills or the
1685 // needed alignment padding.
1686 unsigned StackSize = determineFrameLayout(MF, false, true);
Matthias Braun941a7052016-07-28 18:40:00 +00001687 MachineFrameInfo &MFI = MF.getFrameInfo();
1688 if (MFI.hasVarSizedObjects() || spillsCR(MF) || spillsVRSAVE(MF) ||
Hal Finkelcc1eeda2013-03-23 22:06:03 +00001689 hasNonRISpills(MF) || (hasSpills(MF) && !isInt<16>(StackSize))) {
Hal Finkelbb420f12013-03-15 05:06:04 +00001690 const TargetRegisterClass *GPRC = &PPC::GPRCRegClass;
1691 const TargetRegisterClass *G8RC = &PPC::G8RCRegClass;
1692 const TargetRegisterClass *RC = Subtarget.isPPC64() ? G8RC : GPRC;
Matthias Braun941a7052016-07-28 18:40:00 +00001693 RS->addScavengingFrameIndex(MFI.CreateStackObject(RC->getSize(),
1694 RC->getAlignment(),
1695 false));
Hal Finkel0dfbb052013-03-26 18:57:22 +00001696
Hal Finkel18607632013-07-18 04:28:21 +00001697 // Might we have over-aligned allocas?
Matthias Braun941a7052016-07-28 18:40:00 +00001698 bool HasAlVars = MFI.hasVarSizedObjects() &&
1699 MFI.getMaxAlignment() > getStackAlignment();
Hal Finkel18607632013-07-18 04:28:21 +00001700
Hal Finkel0dfbb052013-03-26 18:57:22 +00001701 // These kinds of spills might need two registers.
Hal Finkel18607632013-07-18 04:28:21 +00001702 if (spillsCR(MF) || spillsVRSAVE(MF) || HasAlVars)
Matthias Braun941a7052016-07-28 18:40:00 +00001703 RS->addScavengingFrameIndex(MFI.CreateStackObject(RC->getSize(),
1704 RC->getAlignment(),
1705 false));
Hal Finkel0dfbb052013-03-26 18:57:22 +00001706
Hal Finkelbb420f12013-03-15 05:06:04 +00001707 }
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +00001708}
Roman Divackyc9e23d92012-09-12 14:47:47 +00001709
Eric Christopherd1737492014-04-29 00:16:40 +00001710bool
Roman Divackyc9e23d92012-09-12 14:47:47 +00001711PPCFrameLowering::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
Eric Christopherd1737492014-04-29 00:16:40 +00001712 MachineBasicBlock::iterator MI,
1713 const std::vector<CalleeSavedInfo> &CSI,
1714 const TargetRegisterInfo *TRI) const {
Roman Divackyc9e23d92012-09-12 14:47:47 +00001715
1716 // Currently, this function only handles SVR4 32- and 64-bit ABIs.
1717 // Return false otherwise to maintain pre-existing behavior.
1718 if (!Subtarget.isSVR4ABI())
1719 return false;
1720
1721 MachineFunction *MF = MBB.getParent();
1722 const PPCInstrInfo &TII =
Eric Christopher38522b82015-01-30 02:11:26 +00001723 *static_cast<const PPCInstrInfo *>(Subtarget.getInstrInfo());
Roman Divackyc9e23d92012-09-12 14:47:47 +00001724 DebugLoc DL;
1725 bool CRSpilled = false;
Hal Finkel2f293912013-04-13 23:06:15 +00001726 MachineInstrBuilder CRMIB;
Eric Christopherd1737492014-04-29 00:16:40 +00001727
Roman Divackyc9e23d92012-09-12 14:47:47 +00001728 for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
1729 unsigned Reg = CSI[i].getReg();
Hal Finkelac1a24b2013-06-28 22:29:56 +00001730 // Only Darwin actually uses the VRSAVE register, but it can still appear
1731 // here if, for example, @llvm.eh.unwind.init() is used. If we're not on
1732 // Darwin, ignore it.
1733 if (Reg == PPC::VRSAVE && !Subtarget.isDarwinABI())
1734 continue;
1735
Roman Divackyc9e23d92012-09-12 14:47:47 +00001736 // CR2 through CR4 are the nonvolatile CR fields.
1737 bool IsCRField = PPC::CR2 <= Reg && Reg <= PPC::CR4;
1738
Roman Divackyc9e23d92012-09-12 14:47:47 +00001739 // Add the callee-saved register as live-in; it's killed at the spill.
1740 MBB.addLiveIn(Reg);
1741
Hal Finkel2f293912013-04-13 23:06:15 +00001742 if (CRSpilled && IsCRField) {
1743 CRMIB.addReg(Reg, RegState::ImplicitKill);
1744 continue;
1745 }
1746
Roman Divackyc9e23d92012-09-12 14:47:47 +00001747 // Insert the spill to the stack frame.
1748 if (IsCRField) {
Hal Finkel67369882013-04-15 02:07:05 +00001749 PPCFunctionInfo *FuncInfo = MF->getInfo<PPCFunctionInfo>();
Roman Divackyc9e23d92012-09-12 14:47:47 +00001750 if (Subtarget.isPPC64()) {
Hal Finkel67369882013-04-15 02:07:05 +00001751 // The actual spill will happen at the start of the prologue.
1752 FuncInfo->addMustSaveCR(Reg);
Roman Divackyc9e23d92012-09-12 14:47:47 +00001753 } else {
Hal Finkel67369882013-04-15 02:07:05 +00001754 CRSpilled = true;
Bill Schmidtef3d1a22013-05-14 16:08:32 +00001755 FuncInfo->setSpillsCR();
Hal Finkel67369882013-04-15 02:07:05 +00001756
Eric Christopherd1737492014-04-29 00:16:40 +00001757 // 32-bit: FP-relative. Note that we made sure CR2-CR4 all have
1758 // the same frame index in PPCRegisterInfo::hasReservedSpillSlot.
1759 CRMIB = BuildMI(*MF, DL, TII.get(PPC::MFCR), PPC::R12)
Hal Finkel2f293912013-04-13 23:06:15 +00001760 .addReg(Reg, RegState::ImplicitKill);
1761
Eric Christopherd1737492014-04-29 00:16:40 +00001762 MBB.insert(MI, CRMIB);
1763 MBB.insert(MI, addFrameReference(BuildMI(*MF, DL, TII.get(PPC::STW))
1764 .addReg(PPC::R12,
1765 getKillRegState(true)),
1766 CSI[i].getFrameIdx()));
Roman Divackyc9e23d92012-09-12 14:47:47 +00001767 }
Roman Divackyc9e23d92012-09-12 14:47:47 +00001768 } else {
1769 const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(Reg);
1770 TII.storeRegToStackSlot(MBB, MI, Reg, true,
Eric Christopherd1737492014-04-29 00:16:40 +00001771 CSI[i].getFrameIdx(), RC, TRI);
Roman Divackyc9e23d92012-09-12 14:47:47 +00001772 }
1773 }
1774 return true;
1775}
1776
1777static void
Hal Finkeld85a04b2013-04-13 08:09:20 +00001778restoreCRs(bool isPPC64, bool is31,
1779 bool CR2Spilled, bool CR3Spilled, bool CR4Spilled,
Eric Christopherd1737492014-04-29 00:16:40 +00001780 MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
1781 const std::vector<CalleeSavedInfo> &CSI, unsigned CSIIndex) {
Roman Divackyc9e23d92012-09-12 14:47:47 +00001782
1783 MachineFunction *MF = MBB.getParent();
Eric Christophercccae792015-01-30 22:02:31 +00001784 const PPCInstrInfo &TII = *MF->getSubtarget<PPCSubtarget>().getInstrInfo();
Roman Divackyc9e23d92012-09-12 14:47:47 +00001785 DebugLoc DL;
1786 unsigned RestoreOp, MoveReg;
1787
Hal Finkel67369882013-04-15 02:07:05 +00001788 if (isPPC64)
1789 // This is handled during epilogue generation.
1790 return;
1791 else {
Roman Divackyc9e23d92012-09-12 14:47:47 +00001792 // 32-bit: FP-relative
1793 MBB.insert(MI, addFrameReference(BuildMI(*MF, DL, TII.get(PPC::LWZ),
Eric Christopherd1737492014-04-29 00:16:40 +00001794 PPC::R12),
1795 CSI[CSIIndex].getFrameIdx()));
Ulrich Weigand49f487e2013-07-03 17:59:07 +00001796 RestoreOp = PPC::MTOCRF;
Roman Divackyc9e23d92012-09-12 14:47:47 +00001797 MoveReg = PPC::R12;
1798 }
Eric Christopherd1737492014-04-29 00:16:40 +00001799
Roman Divackyc9e23d92012-09-12 14:47:47 +00001800 if (CR2Spilled)
1801 MBB.insert(MI, BuildMI(*MF, DL, TII.get(RestoreOp), PPC::CR2)
Hal Finkel035b4822013-03-28 03:38:16 +00001802 .addReg(MoveReg, getKillRegState(!CR3Spilled && !CR4Spilled)));
Roman Divackyc9e23d92012-09-12 14:47:47 +00001803
1804 if (CR3Spilled)
1805 MBB.insert(MI, BuildMI(*MF, DL, TII.get(RestoreOp), PPC::CR3)
Hal Finkel035b4822013-03-28 03:38:16 +00001806 .addReg(MoveReg, getKillRegState(!CR4Spilled)));
Roman Divackyc9e23d92012-09-12 14:47:47 +00001807
1808 if (CR4Spilled)
1809 MBB.insert(MI, BuildMI(*MF, DL, TII.get(RestoreOp), PPC::CR4)
Hal Finkel035b4822013-03-28 03:38:16 +00001810 .addReg(MoveReg, getKillRegState(true)));
Roman Divackyc9e23d92012-09-12 14:47:47 +00001811}
1812
Hans Wennborge1a2e902016-03-31 18:33:38 +00001813MachineBasicBlock::iterator PPCFrameLowering::
Eli Bendersky8da87162013-02-21 20:05:00 +00001814eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
1815 MachineBasicBlock::iterator I) const {
Eric Christopher38522b82015-01-30 02:11:26 +00001816 const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
Eli Bendersky8da87162013-02-21 20:05:00 +00001817 if (MF.getTarget().Options.GuaranteedTailCallOpt &&
1818 I->getOpcode() == PPC::ADJCALLSTACKUP) {
1819 // Add (actually subtract) back the amount the callee popped on return.
1820 if (int CalleeAmt = I->getOperand(1).getImm()) {
1821 bool is64Bit = Subtarget.isPPC64();
1822 CalleeAmt *= -1;
1823 unsigned StackReg = is64Bit ? PPC::X1 : PPC::R1;
1824 unsigned TmpReg = is64Bit ? PPC::X0 : PPC::R0;
1825 unsigned ADDIInstr = is64Bit ? PPC::ADDI8 : PPC::ADDI;
1826 unsigned ADDInstr = is64Bit ? PPC::ADD8 : PPC::ADD4;
1827 unsigned LISInstr = is64Bit ? PPC::LIS8 : PPC::LIS;
1828 unsigned ORIInstr = is64Bit ? PPC::ORI8 : PPC::ORI;
Duncan P. N. Exon Smithe5a22f42016-07-27 13:24:16 +00001829 const DebugLoc &dl = I->getDebugLoc();
Eli Bendersky8da87162013-02-21 20:05:00 +00001830
1831 if (isInt<16>(CalleeAmt)) {
1832 BuildMI(MBB, I, dl, TII.get(ADDIInstr), StackReg)
1833 .addReg(StackReg, RegState::Kill)
1834 .addImm(CalleeAmt);
1835 } else {
1836 MachineBasicBlock::iterator MBBI = I;
1837 BuildMI(MBB, MBBI, dl, TII.get(LISInstr), TmpReg)
1838 .addImm(CalleeAmt >> 16);
1839 BuildMI(MBB, MBBI, dl, TII.get(ORIInstr), TmpReg)
1840 .addReg(TmpReg, RegState::Kill)
1841 .addImm(CalleeAmt & 0xFFFF);
1842 BuildMI(MBB, MBBI, dl, TII.get(ADDInstr), StackReg)
1843 .addReg(StackReg, RegState::Kill)
1844 .addReg(TmpReg);
1845 }
1846 }
1847 }
1848 // Simply discard ADJCALLSTACKDOWN, ADJCALLSTACKUP instructions.
Hans Wennborge1a2e902016-03-31 18:33:38 +00001849 return MBB.erase(I);
Eli Bendersky8da87162013-02-21 20:05:00 +00001850}
1851
Eric Christopherd1737492014-04-29 00:16:40 +00001852bool
Roman Divackyc9e23d92012-09-12 14:47:47 +00001853PPCFrameLowering::restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
Eric Christopherd1737492014-04-29 00:16:40 +00001854 MachineBasicBlock::iterator MI,
1855 const std::vector<CalleeSavedInfo> &CSI,
1856 const TargetRegisterInfo *TRI) const {
Roman Divackyc9e23d92012-09-12 14:47:47 +00001857
1858 // Currently, this function only handles SVR4 32- and 64-bit ABIs.
1859 // Return false otherwise to maintain pre-existing behavior.
1860 if (!Subtarget.isSVR4ABI())
1861 return false;
1862
1863 MachineFunction *MF = MBB.getParent();
1864 const PPCInstrInfo &TII =
Eric Christopher38522b82015-01-30 02:11:26 +00001865 *static_cast<const PPCInstrInfo *>(Subtarget.getInstrInfo());
Roman Divackyc9e23d92012-09-12 14:47:47 +00001866 bool CR2Spilled = false;
1867 bool CR3Spilled = false;
1868 bool CR4Spilled = false;
1869 unsigned CSIIndex = 0;
1870
1871 // Initialize insertion-point logic; we will be restoring in reverse
1872 // order of spill.
1873 MachineBasicBlock::iterator I = MI, BeforeI = I;
1874 bool AtStart = I == MBB.begin();
1875
1876 if (!AtStart)
1877 --BeforeI;
1878
1879 for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
1880 unsigned Reg = CSI[i].getReg();
1881
Hal Finkelac1a24b2013-06-28 22:29:56 +00001882 // Only Darwin actually uses the VRSAVE register, but it can still appear
1883 // here if, for example, @llvm.eh.unwind.init() is used. If we're not on
1884 // Darwin, ignore it.
1885 if (Reg == PPC::VRSAVE && !Subtarget.isDarwinABI())
1886 continue;
1887
Roman Divackyc9e23d92012-09-12 14:47:47 +00001888 if (Reg == PPC::CR2) {
1889 CR2Spilled = true;
1890 // The spill slot is associated only with CR2, which is the
1891 // first nonvolatile spilled. Save it here.
1892 CSIIndex = i;
1893 continue;
1894 } else if (Reg == PPC::CR3) {
1895 CR3Spilled = true;
1896 continue;
1897 } else if (Reg == PPC::CR4) {
1898 CR4Spilled = true;
1899 continue;
1900 } else {
1901 // When we first encounter a non-CR register after seeing at
1902 // least one CR register, restore all spilled CRs together.
1903 if ((CR2Spilled || CR3Spilled || CR4Spilled)
Eric Christopherd1737492014-04-29 00:16:40 +00001904 && !(PPC::CR2 <= Reg && Reg <= PPC::CR4)) {
Hal Finkeld85a04b2013-04-13 08:09:20 +00001905 bool is31 = needsFP(*MF);
1906 restoreCRs(Subtarget.isPPC64(), is31,
1907 CR2Spilled, CR3Spilled, CR4Spilled,
Eric Christopherd1737492014-04-29 00:16:40 +00001908 MBB, I, CSI, CSIIndex);
1909 CR2Spilled = CR3Spilled = CR4Spilled = false;
Roman Divackyc9e23d92012-09-12 14:47:47 +00001910 }
1911
1912 // Default behavior for non-CR saves.
1913 const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(Reg);
1914 TII.loadRegFromStackSlot(MBB, I, Reg, CSI[i].getFrameIdx(),
Eric Christopherd1737492014-04-29 00:16:40 +00001915 RC, TRI);
Roman Divackyc9e23d92012-09-12 14:47:47 +00001916 assert(I != MBB.begin() &&
Eric Christopherd1737492014-04-29 00:16:40 +00001917 "loadRegFromStackSlot didn't insert any code!");
Roman Divackyc9e23d92012-09-12 14:47:47 +00001918 }
1919
1920 // Insert in reverse order.
1921 if (AtStart)
1922 I = MBB.begin();
1923 else {
1924 I = BeforeI;
1925 ++I;
Eric Christopherd1737492014-04-29 00:16:40 +00001926 }
Roman Divackyc9e23d92012-09-12 14:47:47 +00001927 }
1928
1929 // If we haven't yet spilled the CRs, do so now.
Hal Finkeld85a04b2013-04-13 08:09:20 +00001930 if (CR2Spilled || CR3Spilled || CR4Spilled) {
Eric Christopherd1737492014-04-29 00:16:40 +00001931 bool is31 = needsFP(*MF);
Hal Finkeld85a04b2013-04-13 08:09:20 +00001932 restoreCRs(Subtarget.isPPC64(), is31, CR2Spilled, CR3Spilled, CR4Spilled,
Eric Christopherd1737492014-04-29 00:16:40 +00001933 MBB, I, CSI, CSIIndex);
Hal Finkeld85a04b2013-04-13 08:09:20 +00001934 }
Roman Divackyc9e23d92012-09-12 14:47:47 +00001935
1936 return true;
1937}
Kit Bartond3b904d2015-09-10 01:55:44 +00001938
1939bool PPCFrameLowering::enableShrinkWrapping(const MachineFunction &MF) const {
Kit Bartonf4ce2f32015-11-30 18:59:41 +00001940 return (MF.getSubtarget<PPCSubtarget>().isSVR4ABI() &&
1941 MF.getSubtarget<PPCSubtarget>().isPPC64());
Kit Bartond3b904d2015-09-10 01:55:44 +00001942}