Fix more stack layout issues in the MBlaze backend.
[oota-llvm.git] / lib / Target / MBlaze / MBlazeFrameInfo.cpp
1 //=======- MBlazeFrameInfo.cpp - MBlaze Frame Information ------*- C++ -*-====//
2 //
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 //
10 // This file contains the MBlaze implementation of TargetFrameInfo class.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #define DEBUG_TYPE "mblaze-frame-info"
15
16 #include "MBlazeFrameInfo.h"
17 #include "MBlazeInstrInfo.h"
18 #include "MBlazeMachineFunction.h"
19 #include "InstPrinter/MBlazeInstPrinter.h"
20 #include "llvm/Function.h"
21 #include "llvm/CodeGen/MachineFrameInfo.h"
22 #include "llvm/CodeGen/MachineFunction.h"
23 #include "llvm/CodeGen/MachineInstrBuilder.h"
24 #include "llvm/CodeGen/MachineModuleInfo.h"
25 #include "llvm/CodeGen/MachineRegisterInfo.h"
26 #include "llvm/Target/TargetData.h"
27 #include "llvm/Target/TargetOptions.h"
28 #include "llvm/Support/CommandLine.h"
29 #include "llvm/Support/Debug.h"
30 #include "llvm/Support/ErrorHandling.h"
31 #include "llvm/Support/raw_ostream.h"
32
33 using namespace llvm;
34
35 namespace llvm {
36   cl::opt<bool> DisableStackAdjust(
37     "disable-mblaze-stack-adjust",
38     cl::init(false),
39     cl::desc("Disable MBlaze stack layout adjustment."),
40     cl::Hidden);
41 }
42
43 static void replaceFrameIndexes(MachineFunction &MF, 
44                                 SmallVector<std::pair<int,int64_t>, 16> &FR) {
45   MachineFrameInfo *MFI = MF.getFrameInfo();
46   const SmallVector<std::pair<int,int64_t>, 16>::iterator FRB = FR.begin();
47   const SmallVector<std::pair<int,int64_t>, 16>::iterator FRE = FR.end();
48
49   SmallVector<std::pair<int,int64_t>, 16>::iterator FRI = FRB;
50   for (; FRI != FRE; ++FRI) {
51     MFI->RemoveStackObject(FRI->first);
52     int NFI = MFI->CreateFixedObject(4, FRI->second, true);
53
54     for (MachineFunction::iterator MB=MF.begin(), ME=MF.end(); MB!=ME; ++MB) {
55       MachineBasicBlock::iterator MBB = MB->begin();
56       const MachineBasicBlock::iterator MBE = MB->end();
57
58       for (; MBB != MBE; ++MBB) {
59         MachineInstr::mop_iterator MIB = MBB->operands_begin();
60         const MachineInstr::mop_iterator MIE = MBB->operands_end();
61
62         for (MachineInstr::mop_iterator MII = MIB; MII != MIE; ++MII) {
63           if (!MII->isFI() || MII->getIndex() != FRI->first) continue;
64           DEBUG(dbgs() << "FOUND FI#" << MII->getIndex() << "\n");
65           MII->setIndex(NFI);
66         }
67       }
68     }
69   }
70 }
71
72 //===----------------------------------------------------------------------===//
73 //
74 // Stack Frame Processing methods
75 // +----------------------------+
76 //
77 // The stack is allocated decrementing the stack pointer on
78 // the first instruction of a function prologue. Once decremented,
79 // all stack references are are done through a positive offset
80 // from the stack/frame pointer, so the stack is considered
81 // to grow up.
82 //
83 //===----------------------------------------------------------------------===//
84
85 static void analyzeFrameIndexes(MachineFunction &MF) {
86   if (DisableStackAdjust) return;
87
88   MachineFrameInfo *MFI = MF.getFrameInfo();
89   MBlazeFunctionInfo *MBlazeFI = MF.getInfo<MBlazeFunctionInfo>();
90   const MachineRegisterInfo &MRI = MF.getRegInfo();
91
92   MachineRegisterInfo::livein_iterator LII = MRI.livein_begin();
93   MachineRegisterInfo::livein_iterator LIE = MRI.livein_end();
94   const SmallVector<int, 16> &LiveInFI = MBlazeFI->getLiveIn();
95   SmallVector<MachineInstr*, 16> EraseInstr;
96   SmallVector<std::pair<int,int64_t>, 16> FrameRelocate;
97
98   MachineBasicBlock *MBB = MF.getBlockNumbered(0);
99   MachineBasicBlock::iterator MIB = MBB->begin();
100   MachineBasicBlock::iterator MIE = MBB->end();
101
102   int StackAdjust = 0;
103   int StackOffset = -28;
104
105   // In this loop we are searching frame indexes that corrospond to incoming
106   // arguments that are already in the stack. We look for instruction sequences
107   // like the following:
108   //    
109   //    LWI REG, FI1, 0
110   //    ...
111   //    SWI REG, FI2, 0
112   //
113   // As long as there are no defs of REG in the ... part, we can eliminate
114   // the SWI instruction because the value has already been stored to the
115   // stack by the caller. All we need to do is locate FI at the correct
116   // stack location according to the calling convensions.
117   //
118   // Additionally, if the SWI operation kills the def of REG then we don't
119   // need the LWI operation so we can erase it as well.
120   for (unsigned i = 0, e = LiveInFI.size(); i < e; ++i) {
121     for (MachineBasicBlock::iterator I=MIB; I != MIE; ++I) {
122       if (I->getOpcode() != MBlaze::LWI || I->getNumOperands() != 3 ||
123           !I->getOperand(1).isFI() || !I->getOperand(0).isReg() ||
124           I->getOperand(1).getIndex() != LiveInFI[i]) continue;
125
126       unsigned FIReg = I->getOperand(0).getReg();
127       MachineBasicBlock::iterator SI = I;
128       for (SI++; SI != MIE; ++SI) {
129         if (!SI->getOperand(0).isReg() ||
130             !SI->getOperand(1).isFI() ||
131             SI->getOpcode() != MBlaze::SWI) continue;
132
133         int FI = SI->getOperand(1).getIndex();
134         if (SI->getOperand(0).getReg() != FIReg ||
135             MFI->isFixedObjectIndex(FI) ||
136             MFI->getObjectSize(FI) != 4) continue;
137
138         if (SI->getOperand(0).isDef()) break;
139
140         if (SI->getOperand(0).isKill()) {
141           DEBUG(dbgs() << "LWI for FI#" << I->getOperand(1).getIndex() 
142                        << " removed\n");
143           EraseInstr.push_back(I);
144         }
145
146         EraseInstr.push_back(SI);
147         DEBUG(dbgs() << "SWI for FI#" << FI << " removed\n");
148
149         FrameRelocate.push_back(std::make_pair(FI,StackOffset));
150         DEBUG(dbgs() << "FI#" << FI << " relocated to " << StackOffset << "\n");
151
152         StackOffset -= 4;
153         StackAdjust += 4;
154         break;
155       }
156     }
157   }
158
159   // In this loop we are searching for frame indexes that corrospond to
160   // incoming arguments that are in registers. We look for instruction
161   // sequences like the following:
162   //    
163   //    ...  SWI REG, FI, 0
164   // 
165   // As long as the ... part does not define REG and if REG is an incoming
166   // parameter register then we know that, according to ABI convensions, the
167   // caller has allocated stack space for it already.  Instead of allocating
168   // stack space on our frame, we record the correct location in the callers
169   // frame.
170   for (MachineRegisterInfo::livein_iterator LI = LII; LI != LIE; ++LI) {
171     for (MachineBasicBlock::iterator I=MIB; I != MIE; ++I) {
172       if (I->definesRegister(LI->first))
173         break;
174
175       if (I->getOpcode() != MBlaze::SWI || I->getNumOperands() != 3 ||
176           !I->getOperand(1).isFI() || !I->getOperand(0).isReg() ||
177           I->getOperand(1).getIndex() < 0) continue;
178
179       if (I->getOperand(0).getReg() == LI->first) {
180         int FI = I->getOperand(1).getIndex();
181         MBlazeFI->recordLiveIn(FI);
182
183         int FILoc = 0;
184         switch (LI->first) {
185         default: llvm_unreachable("invalid incoming parameter!");
186         case MBlaze::R5:  FILoc = -4; break;
187         case MBlaze::R6:  FILoc = -8; break;
188         case MBlaze::R7:  FILoc = -12; break;
189         case MBlaze::R8:  FILoc = -16; break;
190         case MBlaze::R9:  FILoc = -20; break;
191         case MBlaze::R10: FILoc = -24; break;
192         }
193
194         StackAdjust += 4;
195         FrameRelocate.push_back(std::make_pair(FI,FILoc));
196         DEBUG(dbgs() << "FI#" << FI << " relocated to " << FILoc << "\n");
197         break;
198       }
199     }
200   }
201
202   // Go ahead and erase all of the instructions that we determined were
203   // no longer needed.
204   for (int i = 0, e = EraseInstr.size(); i < e; ++i)
205     MBB->erase(EraseInstr[i]);
206
207   // Replace all of the frame indexes that we have relocated with new
208   // fixed object frame indexes.
209   replaceFrameIndexes(MF, FrameRelocate);
210 }
211
212 static void interruptFrameLayout(MachineFunction &MF) {
213   const Function *F = MF.getFunction();
214   llvm::CallingConv::ID CallConv = F->getCallingConv();
215
216   // If this function is not using either the interrupt_handler
217   // calling convention or the save_volatiles calling convention
218   // then we don't need to do any additional frame layout.
219   if (CallConv != llvm::CallingConv::MBLAZE_INTR &&
220       CallConv != llvm::CallingConv::MBLAZE_SVOL)
221       return;
222
223   MachineFrameInfo *MFI = MF.getFrameInfo();
224   const MachineRegisterInfo &MRI = MF.getRegInfo();
225   const MBlazeInstrInfo &TII =
226     *static_cast<const MBlazeInstrInfo*>(MF.getTarget().getInstrInfo());
227
228   // Determine if the calling convention is the interrupt_handler
229   // calling convention. Some pieces of the prologue and epilogue
230   // only need to be emitted if we are lowering and interrupt handler.
231   bool isIntr = CallConv == llvm::CallingConv::MBLAZE_INTR;
232
233   // Determine where to put prologue and epilogue additions
234   MachineBasicBlock &MENT   = MF.front();
235   MachineBasicBlock &MEXT   = MF.back();
236
237   MachineBasicBlock::iterator MENTI = MENT.begin();
238   MachineBasicBlock::iterator MEXTI = prior(MEXT.end());
239
240   DebugLoc ENTDL = MENTI != MENT.end() ? MENTI->getDebugLoc() : DebugLoc();
241   DebugLoc EXTDL = MEXTI != MEXT.end() ? MEXTI->getDebugLoc() : DebugLoc();
242
243   // Store the frame indexes generated during prologue additions for use
244   // when we are generating the epilogue additions.
245   SmallVector<int, 10> VFI;
246
247   // Build the prologue SWI for R3 - R12 if needed. Note that R11 must
248   // always have a SWI because it is used when processing RMSR.
249   for (unsigned r = MBlaze::R3; r <= MBlaze::R12; ++r) {
250     if (!MRI.isPhysRegUsed(r) && !(isIntr && r == MBlaze::R11)) continue;
251     
252     int FI = MFI->CreateStackObject(4,4,false,false);
253     VFI.push_back(FI);
254
255     BuildMI(MENT, MENTI, ENTDL, TII.get(MBlaze::SWI), r)
256       .addFrameIndex(FI).addImm(0);
257   }
258     
259   // Build the prologue SWI for R17, R18
260   int R17FI = MFI->CreateStackObject(4,4,false,false);
261   int R18FI = MFI->CreateStackObject(4,4,false,false);
262
263   BuildMI(MENT, MENTI, ENTDL, TII.get(MBlaze::SWI), MBlaze::R17)
264     .addFrameIndex(R17FI).addImm(0);
265     
266   BuildMI(MENT, MENTI, ENTDL, TII.get(MBlaze::SWI), MBlaze::R18)
267     .addFrameIndex(R18FI).addImm(0);
268
269   // Buid the prologue SWI and the epilogue LWI for RMSR if needed
270   if (isIntr) {
271     int MSRFI = MFI->CreateStackObject(4,4,false,false);
272     BuildMI(MENT, MENTI, ENTDL, TII.get(MBlaze::MFS), MBlaze::R11)
273       .addReg(MBlaze::RMSR);
274     BuildMI(MENT, MENTI, ENTDL, TII.get(MBlaze::SWI), MBlaze::R11)
275       .addFrameIndex(MSRFI).addImm(0);
276
277     BuildMI(MEXT, MEXTI, EXTDL, TII.get(MBlaze::LWI), MBlaze::R11)
278       .addFrameIndex(MSRFI).addImm(0);
279     BuildMI(MEXT, MEXTI, EXTDL, TII.get(MBlaze::MTS), MBlaze::RMSR)
280       .addReg(MBlaze::R11);
281   }
282
283   // Build the epilogue LWI for R17, R18
284   BuildMI(MEXT, MEXTI, EXTDL, TII.get(MBlaze::LWI), MBlaze::R18)
285     .addFrameIndex(R18FI).addImm(0);
286
287   BuildMI(MEXT, MEXTI, EXTDL, TII.get(MBlaze::LWI), MBlaze::R17)
288     .addFrameIndex(R17FI).addImm(0);
289
290   // Build the epilogue LWI for R3 - R12 if needed
291   for (unsigned r = MBlaze::R12, i = VFI.size(); r >= MBlaze::R3; --r) {
292     if (!MRI.isPhysRegUsed(r)) continue;
293     BuildMI(MEXT, MEXTI, EXTDL, TII.get(MBlaze::LWI), r)
294       .addFrameIndex(VFI[--i]).addImm(0);
295   }
296 }
297
298 static void determineFrameLayout(MachineFunction &MF) {
299   MachineFrameInfo *MFI = MF.getFrameInfo();
300   MBlazeFunctionInfo *MBlazeFI = MF.getInfo<MBlazeFunctionInfo>();
301
302   // Replace the dummy '0' SPOffset by the negative offsets, as explained on
303   // LowerFORMAL_ARGUMENTS. Leaving '0' for while is necessary to avoid
304   // the approach done by calculateFrameObjectOffsets to the stack frame.
305   MBlazeFI->adjustLoadArgsFI(MFI);
306   MBlazeFI->adjustStoreVarArgsFI(MFI);
307
308   // Get the number of bytes to allocate from the FrameInfo
309   unsigned FrameSize = MFI->getStackSize();
310   DEBUG(dbgs() << "Original Frame Size: " << FrameSize << "\n" );
311
312   // Get the alignments provided by the target, and the maximum alignment
313   // (if any) of the fixed frame objects.
314   // unsigned MaxAlign = MFI->getMaxAlignment();
315   unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment();
316   unsigned AlignMask = TargetAlign - 1;
317
318   // Make sure the frame is aligned.
319   FrameSize = (FrameSize + AlignMask) & ~AlignMask;
320   MFI->setStackSize(FrameSize);
321   DEBUG(dbgs() << "Aligned Frame Size: " << FrameSize << "\n" );
322 }
323
324 // hasFP - Return true if the specified function should have a dedicated frame
325 // pointer register.  This is true if the function has variable sized allocas or
326 // if frame pointer elimination is disabled.
327 bool MBlazeFrameInfo::hasFP(const MachineFunction &MF) const {
328   const MachineFrameInfo *MFI = MF.getFrameInfo();
329   return DisableFramePointerElim(MF) || MFI->hasVarSizedObjects();
330 }
331
332 void MBlazeFrameInfo::emitPrologue(MachineFunction &MF) const {
333   MachineBasicBlock &MBB   = MF.front();
334   MachineFrameInfo *MFI    = MF.getFrameInfo();
335   const MBlazeInstrInfo &TII =
336     *static_cast<const MBlazeInstrInfo*>(MF.getTarget().getInstrInfo());
337   MBlazeFunctionInfo *MBlazeFI = MF.getInfo<MBlazeFunctionInfo>();
338   MachineBasicBlock::iterator MBBI = MBB.begin();
339   DebugLoc DL = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc();
340
341   llvm::CallingConv::ID CallConv = MF.getFunction()->getCallingConv();
342   bool requiresRA = CallConv == llvm::CallingConv::MBLAZE_INTR;
343
344   // Determine the correct frame layout
345   determineFrameLayout(MF);
346
347   // Get the number of bytes to allocate from the FrameInfo.
348   unsigned StackSize = MFI->getStackSize();
349
350   // No need to allocate space on the stack.
351   if (StackSize == 0 && !MFI->adjustsStack() && !requiresRA) return;
352
353   int FPOffset = MBlazeFI->getFPStackOffset();
354   int RAOffset = MBlazeFI->getRAStackOffset();
355
356   // Adjust stack : addi R1, R1, -imm
357   BuildMI(MBB, MBBI, DL, TII.get(MBlaze::ADDIK), MBlaze::R1)
358       .addReg(MBlaze::R1).addImm(-StackSize);
359
360   // swi  R15, R1, stack_loc
361   if (MFI->adjustsStack() || requiresRA) {
362     BuildMI(MBB, MBBI, DL, TII.get(MBlaze::SWI))
363         .addReg(MBlaze::R15).addReg(MBlaze::R1).addImm(RAOffset);
364   }
365
366   if (hasFP(MF)) {
367     // swi  R19, R1, stack_loc
368     BuildMI(MBB, MBBI, DL, TII.get(MBlaze::SWI))
369       .addReg(MBlaze::R19).addReg(MBlaze::R1).addImm(FPOffset);
370
371     // add R19, R1, R0
372     BuildMI(MBB, MBBI, DL, TII.get(MBlaze::ADD), MBlaze::R19)
373       .addReg(MBlaze::R1).addReg(MBlaze::R0);
374   }
375 }
376
377 void MBlazeFrameInfo::emitEpilogue(MachineFunction &MF,
378                                    MachineBasicBlock &MBB) const {
379   MachineBasicBlock::iterator MBBI = prior(MBB.end());
380   MachineFrameInfo *MFI            = MF.getFrameInfo();
381   MBlazeFunctionInfo *MBlazeFI     = MF.getInfo<MBlazeFunctionInfo>();
382   const MBlazeInstrInfo &TII =
383     *static_cast<const MBlazeInstrInfo*>(MF.getTarget().getInstrInfo());
384
385   DebugLoc dl = MBBI->getDebugLoc();
386
387   llvm::CallingConv::ID CallConv = MF.getFunction()->getCallingConv();
388   bool requiresRA = CallConv == llvm::CallingConv::MBLAZE_INTR;
389
390   // Get the FI's where RA and FP are saved.
391   int FPOffset = MBlazeFI->getFPStackOffset();
392   int RAOffset = MBlazeFI->getRAStackOffset();
393
394   if (hasFP(MF)) {
395     // add R1, R19, R0
396     BuildMI(MBB, MBBI, dl, TII.get(MBlaze::ADD), MBlaze::R1)
397       .addReg(MBlaze::R19).addReg(MBlaze::R0);
398
399     // lwi  R19, R1, stack_loc
400     BuildMI(MBB, MBBI, dl, TII.get(MBlaze::LWI), MBlaze::R19)
401       .addReg(MBlaze::R1).addImm(FPOffset);
402   }
403
404   // lwi R15, R1, stack_loc
405   if (MFI->adjustsStack() || requiresRA) {
406     BuildMI(MBB, MBBI, dl, TII.get(MBlaze::LWI), MBlaze::R15)
407       .addReg(MBlaze::R1).addImm(RAOffset);
408   }
409
410   // Get the number of bytes from FrameInfo
411   int StackSize = (int) MFI->getStackSize();
412
413   // addi R1, R1, imm
414   if (StackSize) {
415     BuildMI(MBB, MBBI, dl, TII.get(MBlaze::ADDIK), MBlaze::R1)
416       .addReg(MBlaze::R1).addImm(StackSize);
417   }
418 }
419
420 void MBlazeFrameInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,                                                            RegScavenger *RS)
421                                                            const {
422   MachineFrameInfo *MFI = MF.getFrameInfo();
423   MBlazeFunctionInfo *MBlazeFI = MF.getInfo<MBlazeFunctionInfo>();
424   llvm::CallingConv::ID CallConv = MF.getFunction()->getCallingConv();
425   bool requiresRA = CallConv == llvm::CallingConv::MBLAZE_INTR;
426
427   if (MFI->adjustsStack() || requiresRA) {
428     MBlazeFI->setRAStackOffset(0);
429     MFI->CreateFixedObject(4,0,true);
430   }
431
432   if (hasFP(MF)) {
433     MBlazeFI->setFPStackOffset(4);
434     MFI->CreateFixedObject(4,4,true);
435   }
436
437   interruptFrameLayout(MF);
438   analyzeFrameIndexes(MF);
439 }