ba8be69fe35ac1169f924e898e0ac8418b29cb06
[oota-llvm.git] / lib / Target / X86 / X86RegisterInfo.cpp
1 //===- X86RegisterInfo.cpp - X86 Register 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 X86 implementation of the TargetRegisterInfo class.
11 // This file is responsible for the frame pointer elimination optimization
12 // on X86.
13 //
14 //===----------------------------------------------------------------------===//
15
16 #include "X86.h"
17 #include "X86RegisterInfo.h"
18 #include "X86InstrBuilder.h"
19 #include "X86MachineFunctionInfo.h"
20 #include "X86Subtarget.h"
21 #include "X86TargetMachine.h"
22 #include "llvm/Constants.h"
23 #include "llvm/Function.h"
24 #include "llvm/Type.h"
25 #include "llvm/CodeGen/ValueTypes.h"
26 #include "llvm/CodeGen/MachineInstrBuilder.h"
27 #include "llvm/CodeGen/MachineFunction.h"
28 #include "llvm/CodeGen/MachineFunctionPass.h"
29 #include "llvm/CodeGen/MachineFrameInfo.h"
30 #include "llvm/CodeGen/MachineModuleInfo.h"
31 #include "llvm/CodeGen/MachineRegisterInfo.h"
32 #include "llvm/MC/MCAsmInfo.h"
33 #include "llvm/Target/TargetFrameLowering.h"
34 #include "llvm/Target/TargetInstrInfo.h"
35 #include "llvm/Target/TargetMachine.h"
36 #include "llvm/Target/TargetOptions.h"
37 #include "llvm/ADT/BitVector.h"
38 #include "llvm/ADT/STLExtras.h"
39 #include "llvm/Support/ErrorHandling.h"
40 #include "llvm/Support/CommandLine.h"
41
42 #define GET_REGINFO_TARGET_DESC
43 #include "X86GenRegisterInfo.inc"
44
45 using namespace llvm;
46
47 cl::opt<bool>
48 ForceStackAlign("force-align-stack",
49                  cl::desc("Force align the stack to the minimum alignment"
50                            " needed for the function."),
51                  cl::init(false), cl::Hidden);
52
53 X86RegisterInfo::X86RegisterInfo(X86TargetMachine &tm,
54                                  const TargetInstrInfo &tii)
55   : X86GenRegisterInfo(tm.getSubtarget<X86Subtarget>().is64Bit()
56                          ? X86::RIP : X86::EIP,
57                        X86_MC::getDwarfRegFlavour(tm.getTargetTriple(), false),
58                        X86_MC::getDwarfRegFlavour(tm.getTargetTriple(), true)),
59                        TM(tm), TII(tii) {
60   X86_MC::InitLLVM2SEHRegisterMapping(this);
61
62   // Cache some information.
63   const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
64   Is64Bit = Subtarget->is64Bit();
65   IsWin64 = Subtarget->isTargetWin64();
66
67   if (Is64Bit) {
68     SlotSize = 8;
69     StackPtr = X86::RSP;
70     FramePtr = X86::RBP;
71   } else {
72     SlotSize = 4;
73     StackPtr = X86::ESP;
74     FramePtr = X86::EBP;
75   }
76 }
77
78 /// getCompactUnwindRegNum - This function maps the register to the number for
79 /// compact unwind encoding. Return -1 if the register isn't valid.
80 int X86RegisterInfo::getCompactUnwindRegNum(unsigned RegNum, bool isEH) const {
81   switch (getLLVMRegNum(RegNum, isEH)) {
82   case X86::EBX: case X86::RBX: return 1;
83   case X86::ECX: case X86::R12: return 2;
84   case X86::EDX: case X86::R13: return 3;
85   case X86::EDI: case X86::R14: return 4;
86   case X86::ESI: case X86::R15: return 5;
87   case X86::EBP: case X86::RBP: return 6;
88   }
89
90   return -1;
91 }
92
93 int
94 X86RegisterInfo::getSEHRegNum(unsigned i) const {
95   int reg = X86_MC::getX86RegNum(i);
96   switch (i) {
97   case X86::R8:  case X86::R8D:  case X86::R8W:  case X86::R8B:
98   case X86::R9:  case X86::R9D:  case X86::R9W:  case X86::R9B:
99   case X86::R10: case X86::R10D: case X86::R10W: case X86::R10B:
100   case X86::R11: case X86::R11D: case X86::R11W: case X86::R11B:
101   case X86::R12: case X86::R12D: case X86::R12W: case X86::R12B:
102   case X86::R13: case X86::R13D: case X86::R13W: case X86::R13B:
103   case X86::R14: case X86::R14D: case X86::R14W: case X86::R14B:
104   case X86::R15: case X86::R15D: case X86::R15W: case X86::R15B:
105   case X86::XMM8: case X86::XMM9: case X86::XMM10: case X86::XMM11:
106   case X86::XMM12: case X86::XMM13: case X86::XMM14: case X86::XMM15:
107   case X86::YMM8: case X86::YMM9: case X86::YMM10: case X86::YMM11:
108   case X86::YMM12: case X86::YMM13: case X86::YMM14: case X86::YMM15:
109     reg += 8;
110   }
111   return reg;
112 }
113
114 const TargetRegisterClass *
115 X86RegisterInfo::getMatchingSuperRegClass(const TargetRegisterClass *A,
116                                           const TargetRegisterClass *B,
117                                           unsigned SubIdx) const {
118   switch (SubIdx) {
119   default: return 0;
120   case X86::sub_8bit:
121     if (B == &X86::GR8RegClass) {
122       if (A->getSize() == 2 || A->getSize() == 4 || A->getSize() == 8)
123         return A;
124     } else if (B == &X86::GR8_ABCD_LRegClass || B == &X86::GR8_ABCD_HRegClass) {
125       if (A == &X86::GR64RegClass || A == &X86::GR64_ABCDRegClass ||
126           A == &X86::GR64_NOREXRegClass ||
127           A == &X86::GR64_NOSPRegClass ||
128           A == &X86::GR64_NOREX_NOSPRegClass)
129         return &X86::GR64_ABCDRegClass;
130       else if (A == &X86::GR32RegClass || A == &X86::GR32_ABCDRegClass ||
131                A == &X86::GR32_NOREXRegClass ||
132                A == &X86::GR32_NOSPRegClass)
133         return &X86::GR32_ABCDRegClass;
134       else if (A == &X86::GR16RegClass || A == &X86::GR16_ABCDRegClass ||
135                A == &X86::GR16_NOREXRegClass)
136         return &X86::GR16_ABCDRegClass;
137     } else if (B == &X86::GR8_NOREXRegClass) {
138       if (A == &X86::GR64RegClass || A == &X86::GR64_NOREXRegClass ||
139           A == &X86::GR64_NOSPRegClass || A == &X86::GR64_NOREX_NOSPRegClass)
140         return &X86::GR64_NOREXRegClass;
141       else if (A == &X86::GR64_ABCDRegClass)
142         return &X86::GR64_ABCDRegClass;
143       else if (A == &X86::GR32RegClass || A == &X86::GR32_NOREXRegClass ||
144                A == &X86::GR32_NOSPRegClass)
145         return &X86::GR32_NOREXRegClass;
146       else if (A == &X86::GR32_ABCDRegClass)
147         return &X86::GR32_ABCDRegClass;
148       else if (A == &X86::GR16RegClass || A == &X86::GR16_NOREXRegClass)
149         return &X86::GR16_NOREXRegClass;
150       else if (A == &X86::GR16_ABCDRegClass)
151         return &X86::GR16_ABCDRegClass;
152     }
153     break;
154   case X86::sub_8bit_hi:
155     if (B->hasSubClassEq(&X86::GR8_ABCD_HRegClass))
156       switch (A->getSize()) {
157         case 2: return getCommonSubClass(A, &X86::GR16_ABCDRegClass);
158         case 4: return getCommonSubClass(A, &X86::GR32_ABCDRegClass);
159         case 8: return getCommonSubClass(A, &X86::GR64_ABCDRegClass);
160         default: return 0;
161       }
162     break;
163   case X86::sub_16bit:
164     if (B == &X86::GR16RegClass) {
165       if (A->getSize() == 4 || A->getSize() == 8)
166         return A;
167     } else if (B == &X86::GR16_ABCDRegClass) {
168       if (A == &X86::GR64RegClass || A == &X86::GR64_ABCDRegClass ||
169           A == &X86::GR64_NOREXRegClass ||
170           A == &X86::GR64_NOSPRegClass ||
171           A == &X86::GR64_NOREX_NOSPRegClass)
172         return &X86::GR64_ABCDRegClass;
173       else if (A == &X86::GR32RegClass || A == &X86::GR32_ABCDRegClass ||
174                A == &X86::GR32_NOREXRegClass || A == &X86::GR32_NOSPRegClass)
175         return &X86::GR32_ABCDRegClass;
176     } else if (B == &X86::GR16_NOREXRegClass) {
177       if (A == &X86::GR64RegClass || A == &X86::GR64_NOREXRegClass ||
178           A == &X86::GR64_NOSPRegClass || A == &X86::GR64_NOREX_NOSPRegClass)
179         return &X86::GR64_NOREXRegClass;
180       else if (A == &X86::GR64_ABCDRegClass)
181         return &X86::GR64_ABCDRegClass;
182       else if (A == &X86::GR32RegClass || A == &X86::GR32_NOREXRegClass ||
183                A == &X86::GR32_NOSPRegClass)
184         return &X86::GR32_NOREXRegClass;
185       else if (A == &X86::GR32_ABCDRegClass)
186         return &X86::GR64_ABCDRegClass;
187     }
188     break;
189   case X86::sub_32bit:
190     if (B == &X86::GR32RegClass) {
191       if (A->getSize() == 8)
192         return A;
193     } else if (B == &X86::GR32_NOSPRegClass) {
194       if (A == &X86::GR64RegClass || A == &X86::GR64_NOSPRegClass)
195         return &X86::GR64_NOSPRegClass;
196       if (A->getSize() == 8)
197         return getCommonSubClass(A, &X86::GR64_NOSPRegClass);
198     } else if (B == &X86::GR32_ABCDRegClass) {
199       if (A == &X86::GR64RegClass || A == &X86::GR64_ABCDRegClass ||
200           A == &X86::GR64_NOREXRegClass ||
201           A == &X86::GR64_NOSPRegClass ||
202           A == &X86::GR64_NOREX_NOSPRegClass)
203         return &X86::GR64_ABCDRegClass;
204     } else if (B == &X86::GR32_NOREXRegClass) {
205       if (A == &X86::GR64RegClass || A == &X86::GR64_NOREXRegClass)
206         return &X86::GR64_NOREXRegClass;
207       else if (A == &X86::GR64_NOSPRegClass || A == &X86::GR64_NOREX_NOSPRegClass)
208         return &X86::GR64_NOREX_NOSPRegClass;
209       else if (A == &X86::GR64_ABCDRegClass)
210         return &X86::GR64_ABCDRegClass;
211     } else if (B == &X86::GR32_NOREX_NOSPRegClass) {
212       if (A == &X86::GR64RegClass || A == &X86::GR64_NOREXRegClass ||
213           A == &X86::GR64_NOSPRegClass || A == &X86::GR64_NOREX_NOSPRegClass)
214         return &X86::GR64_NOREX_NOSPRegClass;
215       else if (A == &X86::GR64_ABCDRegClass)
216         return &X86::GR64_ABCDRegClass;
217     }
218     break;
219   case X86::sub_ss:
220     if (B == &X86::FR32RegClass)
221       return A;
222     break;
223   case X86::sub_sd:
224     if (B == &X86::FR64RegClass)
225       return A;
226     break;
227   case X86::sub_xmm:
228     if (B == &X86::VR128RegClass)
229       return A;
230     break;
231   }
232   return 0;
233 }
234
235 const TargetRegisterClass*
236 X86RegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC) const{
237   const TargetRegisterClass *Super = RC;
238   TargetRegisterClass::sc_iterator I = RC->superclasses_begin();
239   do {
240     switch (Super->getID()) {
241     case X86::GR8RegClassID:
242     case X86::GR16RegClassID:
243     case X86::GR32RegClassID:
244     case X86::GR64RegClassID:
245     case X86::FR32RegClassID:
246     case X86::FR64RegClassID:
247     case X86::RFP32RegClassID:
248     case X86::RFP64RegClassID:
249     case X86::RFP80RegClassID:
250     case X86::VR128RegClassID:
251     case X86::VR256RegClassID:
252       // Don't return a super-class that would shrink the spill size.
253       // That can happen with the vector and float classes.
254       if (Super->getSize() == RC->getSize())
255         return Super;
256     }
257     Super = *I++;
258   } while (Super);
259   return RC;
260 }
261
262 const TargetRegisterClass *
263 X86RegisterInfo::getPointerRegClass(unsigned Kind) const {
264   switch (Kind) {
265   default: llvm_unreachable("Unexpected Kind in getPointerRegClass!");
266   case 0: // Normal GPRs.
267     if (TM.getSubtarget<X86Subtarget>().is64Bit())
268       return &X86::GR64RegClass;
269     return &X86::GR32RegClass;
270   case 1: // Normal GPRs except the stack pointer (for encoding reasons).
271     if (TM.getSubtarget<X86Subtarget>().is64Bit())
272       return &X86::GR64_NOSPRegClass;
273     return &X86::GR32_NOSPRegClass;
274   case 2: // Available for tailcall (not callee-saved GPRs).
275     if (TM.getSubtarget<X86Subtarget>().isTargetWin64())
276       return &X86::GR64_TCW64RegClass;
277     if (TM.getSubtarget<X86Subtarget>().is64Bit())
278       return &X86::GR64_TCRegClass;
279     return &X86::GR32_TCRegClass;
280   }
281 }
282
283 const TargetRegisterClass *
284 X86RegisterInfo::getCrossCopyRegClass(const TargetRegisterClass *RC) const {
285   if (RC == &X86::CCRRegClass) {
286     if (Is64Bit)
287       return &X86::GR64RegClass;
288     else
289       return &X86::GR32RegClass;
290   }
291   return RC;
292 }
293
294 unsigned
295 X86RegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
296                                      MachineFunction &MF) const {
297   const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
298
299   unsigned FPDiff = TFI->hasFP(MF) ? 1 : 0;
300   switch (RC->getID()) {
301   default:
302     return 0;
303   case X86::GR32RegClassID:
304     return 4 - FPDiff;
305   case X86::GR64RegClassID:
306     return 12 - FPDiff;
307   case X86::VR128RegClassID:
308     return TM.getSubtarget<X86Subtarget>().is64Bit() ? 10 : 4;
309   case X86::VR64RegClassID:
310     return 4;
311   }
312 }
313
314 const unsigned *
315 X86RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
316   bool callsEHReturn = false;
317   bool ghcCall = false;
318
319   if (MF) {
320     callsEHReturn = MF->getMMI().callsEHReturn();
321     const Function *F = MF->getFunction();
322     ghcCall = (F ? F->getCallingConv() == CallingConv::GHC : false);
323   }
324
325   static const unsigned GhcCalleeSavedRegs[] = {
326     0
327   };
328
329   static const unsigned CalleeSavedRegs32Bit[] = {
330     X86::ESI, X86::EDI, X86::EBX, X86::EBP,  0
331   };
332
333   static const unsigned CalleeSavedRegs32EHRet[] = {
334     X86::EAX, X86::EDX, X86::ESI, X86::EDI, X86::EBX, X86::EBP,  0
335   };
336
337   static const unsigned CalleeSavedRegs64Bit[] = {
338     X86::RBX, X86::R12, X86::R13, X86::R14, X86::R15, X86::RBP, 0
339   };
340
341   static const unsigned CalleeSavedRegs64EHRet[] = {
342     X86::RAX, X86::RDX, X86::RBX, X86::R12,
343     X86::R13, X86::R14, X86::R15, X86::RBP, 0
344   };
345
346   static const unsigned CalleeSavedRegsWin64[] = {
347     X86::RBX,   X86::RBP,   X86::RDI,   X86::RSI,
348     X86::R12,   X86::R13,   X86::R14,   X86::R15,
349     X86::XMM6,  X86::XMM7,  X86::XMM8,  X86::XMM9,
350     X86::XMM10, X86::XMM11, X86::XMM12, X86::XMM13,
351     X86::XMM14, X86::XMM15, 0
352   };
353
354   if (ghcCall) {
355     return GhcCalleeSavedRegs;
356   } else if (Is64Bit) {
357     if (IsWin64)
358       return CalleeSavedRegsWin64;
359     else
360       return (callsEHReturn ? CalleeSavedRegs64EHRet : CalleeSavedRegs64Bit);
361   } else {
362     return (callsEHReturn ? CalleeSavedRegs32EHRet : CalleeSavedRegs32Bit);
363   }
364 }
365
366 BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
367   BitVector Reserved(getNumRegs());
368   const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
369
370   // Set the stack-pointer register and its aliases as reserved.
371   Reserved.set(X86::RSP);
372   Reserved.set(X86::ESP);
373   Reserved.set(X86::SP);
374   Reserved.set(X86::SPL);
375
376   // Set the instruction pointer register and its aliases as reserved.
377   Reserved.set(X86::RIP);
378   Reserved.set(X86::EIP);
379   Reserved.set(X86::IP);
380
381   // Set the frame-pointer register and its aliases as reserved if needed.
382   if (TFI->hasFP(MF)) {
383     Reserved.set(X86::RBP);
384     Reserved.set(X86::EBP);
385     Reserved.set(X86::BP);
386     Reserved.set(X86::BPL);
387   }
388
389   // Mark the segment registers as reserved.
390   Reserved.set(X86::CS);
391   Reserved.set(X86::SS);
392   Reserved.set(X86::DS);
393   Reserved.set(X86::ES);
394   Reserved.set(X86::FS);
395   Reserved.set(X86::GS);
396
397   // Reserve the registers that only exist in 64-bit mode.
398   if (!Is64Bit) {
399     // These 8-bit registers are part of the x86-64 extension even though their
400     // super-registers are old 32-bits.
401     Reserved.set(X86::SIL);
402     Reserved.set(X86::DIL);
403     Reserved.set(X86::BPL);
404     Reserved.set(X86::SPL);
405
406     for (unsigned n = 0; n != 8; ++n) {
407       // R8, R9, ...
408       const unsigned GPR64[] = {
409         X86::R8,  X86::R9,  X86::R10, X86::R11,
410         X86::R12, X86::R13, X86::R14, X86::R15
411       };
412       for (const unsigned *AI = getOverlaps(GPR64[n]); unsigned Reg = *AI; ++AI)
413         Reserved.set(Reg);
414
415       // XMM8, XMM9, ...
416       assert(X86::XMM15 == X86::XMM8+7);
417       for (const unsigned *AI = getOverlaps(X86::XMM8 + n); unsigned Reg = *AI;
418            ++AI)
419         Reserved.set(Reg);
420     }
421   }
422
423   return Reserved;
424 }
425
426 //===----------------------------------------------------------------------===//
427 // Stack Frame Processing methods
428 //===----------------------------------------------------------------------===//
429
430 bool X86RegisterInfo::canRealignStack(const MachineFunction &MF) const {
431   const MachineFrameInfo *MFI = MF.getFrameInfo();
432   return (RealignStack &&
433           !MFI->hasVarSizedObjects());
434 }
435
436 bool X86RegisterInfo::needsStackRealignment(const MachineFunction &MF) const {
437   const MachineFrameInfo *MFI = MF.getFrameInfo();
438   const Function *F = MF.getFunction();
439   unsigned StackAlign = TM.getFrameLowering()->getStackAlignment();
440   bool requiresRealignment = ((MFI->getMaxAlignment() > StackAlign) ||
441                                F->hasFnAttr(Attribute::StackAlignment));
442
443   // FIXME: Currently we don't support stack realignment for functions with
444   //        variable-sized allocas.
445   // FIXME: It's more complicated than this...
446   if (0 && requiresRealignment && MFI->hasVarSizedObjects())
447     report_fatal_error(
448       "Stack realignment in presence of dynamic allocas is not supported");
449
450   // If we've requested that we force align the stack do so now.
451   if (ForceStackAlign)
452     return canRealignStack(MF);
453
454   return requiresRealignment && canRealignStack(MF);
455 }
456
457 bool X86RegisterInfo::hasReservedSpillSlot(const MachineFunction &MF,
458                                            unsigned Reg, int &FrameIdx) const {
459   const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
460
461   if (Reg == FramePtr && TFI->hasFP(MF)) {
462     FrameIdx = MF.getFrameInfo()->getObjectIndexBegin();
463     return true;
464   }
465   return false;
466 }
467
468 static unsigned getSUBriOpcode(unsigned is64Bit, int64_t Imm) {
469   if (is64Bit) {
470     if (isInt<8>(Imm))
471       return X86::SUB64ri8;
472     return X86::SUB64ri32;
473   } else {
474     if (isInt<8>(Imm))
475       return X86::SUB32ri8;
476     return X86::SUB32ri;
477   }
478 }
479
480 static unsigned getADDriOpcode(unsigned is64Bit, int64_t Imm) {
481   if (is64Bit) {
482     if (isInt<8>(Imm))
483       return X86::ADD64ri8;
484     return X86::ADD64ri32;
485   } else {
486     if (isInt<8>(Imm))
487       return X86::ADD32ri8;
488     return X86::ADD32ri;
489   }
490 }
491
492 void X86RegisterInfo::
493 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
494                               MachineBasicBlock::iterator I) const {
495   const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
496   bool reseveCallFrame = TFI->hasReservedCallFrame(MF);
497   int Opcode = I->getOpcode();
498   bool isDestroy = Opcode == TII.getCallFrameDestroyOpcode();
499   DebugLoc DL = I->getDebugLoc();
500   uint64_t Amount = !reseveCallFrame ? I->getOperand(0).getImm() : 0;
501   uint64_t CalleeAmt = isDestroy ? I->getOperand(1).getImm() : 0;
502   I = MBB.erase(I);
503
504   if (!reseveCallFrame) {
505     // If the stack pointer can be changed after prologue, turn the
506     // adjcallstackup instruction into a 'sub ESP, <amt>' and the
507     // adjcallstackdown instruction into 'add ESP, <amt>'
508     // TODO: consider using push / pop instead of sub + store / add
509     if (Amount == 0)
510       return;
511
512     // We need to keep the stack aligned properly.  To do this, we round the
513     // amount of space needed for the outgoing arguments up to the next
514     // alignment boundary.
515     unsigned StackAlign = TM.getFrameLowering()->getStackAlignment();
516     Amount = (Amount + StackAlign - 1) / StackAlign * StackAlign;
517
518     MachineInstr *New = 0;
519     if (Opcode == TII.getCallFrameSetupOpcode()) {
520       New = BuildMI(MF, DL, TII.get(getSUBriOpcode(Is64Bit, Amount)),
521                     StackPtr)
522         .addReg(StackPtr)
523         .addImm(Amount);
524     } else {
525       assert(Opcode == TII.getCallFrameDestroyOpcode());
526
527       // Factor out the amount the callee already popped.
528       Amount -= CalleeAmt;
529
530       if (Amount) {
531         unsigned Opc = getADDriOpcode(Is64Bit, Amount);
532         New = BuildMI(MF, DL, TII.get(Opc), StackPtr)
533           .addReg(StackPtr).addImm(Amount);
534       }
535     }
536
537     if (New) {
538       // The EFLAGS implicit def is dead.
539       New->getOperand(3).setIsDead();
540
541       // Replace the pseudo instruction with a new instruction.
542       MBB.insert(I, New);
543     }
544
545     return;
546   }
547
548   if (Opcode == TII.getCallFrameDestroyOpcode() && CalleeAmt) {
549     // If we are performing frame pointer elimination and if the callee pops
550     // something off the stack pointer, add it back.  We do this until we have
551     // more advanced stack pointer tracking ability.
552     unsigned Opc = getSUBriOpcode(Is64Bit, CalleeAmt);
553     MachineInstr *New = BuildMI(MF, DL, TII.get(Opc), StackPtr)
554       .addReg(StackPtr).addImm(CalleeAmt);
555
556     // The EFLAGS implicit def is dead.
557     New->getOperand(3).setIsDead();
558
559     // We are not tracking the stack pointer adjustment by the callee, so make
560     // sure we restore the stack pointer immediately after the call, there may
561     // be spill code inserted between the CALL and ADJCALLSTACKUP instructions.
562     MachineBasicBlock::iterator B = MBB.begin();
563     while (I != B && !llvm::prior(I)->getDesc().isCall())
564       --I;
565     MBB.insert(I, New);
566   }
567 }
568
569 void
570 X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
571                                      int SPAdj, RegScavenger *RS) const{
572   assert(SPAdj == 0 && "Unexpected");
573
574   unsigned i = 0;
575   MachineInstr &MI = *II;
576   MachineFunction &MF = *MI.getParent()->getParent();
577   const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
578
579   while (!MI.getOperand(i).isFI()) {
580     ++i;
581     assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
582   }
583
584   int FrameIndex = MI.getOperand(i).getIndex();
585   unsigned BasePtr;
586
587   unsigned Opc = MI.getOpcode();
588   bool AfterFPPop = Opc == X86::TAILJMPm64 || Opc == X86::TAILJMPm;
589   if (needsStackRealignment(MF))
590     BasePtr = (FrameIndex < 0 ? FramePtr : StackPtr);
591   else if (AfterFPPop)
592     BasePtr = StackPtr;
593   else
594     BasePtr = (TFI->hasFP(MF) ? FramePtr : StackPtr);
595
596   // This must be part of a four operand memory reference.  Replace the
597   // FrameIndex with base register with EBP.  Add an offset to the offset.
598   MI.getOperand(i).ChangeToRegister(BasePtr, false);
599
600   // Now add the frame object offset to the offset from EBP.
601   int FIOffset;
602   if (AfterFPPop) {
603     // Tail call jmp happens after FP is popped.
604     const MachineFrameInfo *MFI = MF.getFrameInfo();
605     FIOffset = MFI->getObjectOffset(FrameIndex) - TFI->getOffsetOfLocalArea();
606   } else
607     FIOffset = TFI->getFrameIndexOffset(MF, FrameIndex);
608
609   if (MI.getOperand(i+3).isImm()) {
610     // Offset is a 32-bit integer.
611     int Imm = (int)(MI.getOperand(i + 3).getImm());
612     int Offset = FIOffset + Imm;
613     assert((!Is64Bit || isInt<32>((long long)FIOffset + Imm)) &&
614            "Requesting 64-bit offset in 32-bit immediate!");
615     MI.getOperand(i + 3).ChangeToImmediate(Offset);
616   } else {
617     // Offset is symbolic. This is extremely rare.
618     uint64_t Offset = FIOffset + (uint64_t)MI.getOperand(i+3).getOffset();
619     MI.getOperand(i+3).setOffset(Offset);
620   }
621 }
622
623 unsigned X86RegisterInfo::getFrameRegister(const MachineFunction &MF) const {
624   const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
625   return TFI->hasFP(MF) ? FramePtr : StackPtr;
626 }
627
628 unsigned X86RegisterInfo::getEHExceptionRegister() const {
629   llvm_unreachable("What is the exception register");
630   return 0;
631 }
632
633 unsigned X86RegisterInfo::getEHHandlerRegister() const {
634   llvm_unreachable("What is the exception handler register");
635   return 0;
636 }
637
638 namespace llvm {
639 unsigned getX86SubSuperRegister(unsigned Reg, EVT VT, bool High) {
640   switch (VT.getSimpleVT().SimpleTy) {
641   default: return Reg;
642   case MVT::i8:
643     if (High) {
644       switch (Reg) {
645       default: return 0;
646       case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
647         return X86::AH;
648       case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
649         return X86::DH;
650       case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
651         return X86::CH;
652       case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
653         return X86::BH;
654       }
655     } else {
656       switch (Reg) {
657       default: return 0;
658       case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
659         return X86::AL;
660       case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
661         return X86::DL;
662       case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
663         return X86::CL;
664       case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
665         return X86::BL;
666       case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
667         return X86::SIL;
668       case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
669         return X86::DIL;
670       case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
671         return X86::BPL;
672       case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
673         return X86::SPL;
674       case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
675         return X86::R8B;
676       case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
677         return X86::R9B;
678       case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
679         return X86::R10B;
680       case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
681         return X86::R11B;
682       case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
683         return X86::R12B;
684       case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
685         return X86::R13B;
686       case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
687         return X86::R14B;
688       case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
689         return X86::R15B;
690       }
691     }
692   case MVT::i16:
693     switch (Reg) {
694     default: return Reg;
695     case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
696       return X86::AX;
697     case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
698       return X86::DX;
699     case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
700       return X86::CX;
701     case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
702       return X86::BX;
703     case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
704       return X86::SI;
705     case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
706       return X86::DI;
707     case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
708       return X86::BP;
709     case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
710       return X86::SP;
711     case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
712       return X86::R8W;
713     case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
714       return X86::R9W;
715     case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
716       return X86::R10W;
717     case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
718       return X86::R11W;
719     case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
720       return X86::R12W;
721     case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
722       return X86::R13W;
723     case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
724       return X86::R14W;
725     case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
726       return X86::R15W;
727     }
728   case MVT::i32:
729     switch (Reg) {
730     default: return Reg;
731     case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
732       return X86::EAX;
733     case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
734       return X86::EDX;
735     case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
736       return X86::ECX;
737     case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
738       return X86::EBX;
739     case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
740       return X86::ESI;
741     case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
742       return X86::EDI;
743     case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
744       return X86::EBP;
745     case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
746       return X86::ESP;
747     case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
748       return X86::R8D;
749     case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
750       return X86::R9D;
751     case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
752       return X86::R10D;
753     case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
754       return X86::R11D;
755     case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
756       return X86::R12D;
757     case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
758       return X86::R13D;
759     case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
760       return X86::R14D;
761     case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
762       return X86::R15D;
763     }
764   case MVT::i64:
765     switch (Reg) {
766     default: return Reg;
767     case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
768       return X86::RAX;
769     case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
770       return X86::RDX;
771     case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
772       return X86::RCX;
773     case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
774       return X86::RBX;
775     case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
776       return X86::RSI;
777     case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
778       return X86::RDI;
779     case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
780       return X86::RBP;
781     case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
782       return X86::RSP;
783     case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
784       return X86::R8;
785     case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
786       return X86::R9;
787     case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
788       return X86::R10;
789     case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
790       return X86::R11;
791     case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
792       return X86::R12;
793     case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
794       return X86::R13;
795     case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
796       return X86::R14;
797     case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
798       return X86::R15;
799     }
800   }
801
802   return Reg;
803 }
804 }
805
806 namespace {
807   struct MSAH : public MachineFunctionPass {
808     static char ID;
809     MSAH() : MachineFunctionPass(ID) {}
810
811     virtual bool runOnMachineFunction(MachineFunction &MF) {
812       const X86TargetMachine *TM =
813         static_cast<const X86TargetMachine *>(&MF.getTarget());
814       const TargetFrameLowering *TFI = TM->getFrameLowering();
815       MachineRegisterInfo &RI = MF.getRegInfo();
816       X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
817       unsigned StackAlignment = TFI->getStackAlignment();
818
819       // Be over-conservative: scan over all vreg defs and find whether vector
820       // registers are used. If yes, there is a possibility that vector register
821       // will be spilled and thus require dynamic stack realignment.
822       for (unsigned i = 0, e = RI.getNumVirtRegs(); i != e; ++i) {
823         unsigned Reg = TargetRegisterInfo::index2VirtReg(i);
824         if (RI.getRegClass(Reg)->getAlignment() > StackAlignment) {
825           FuncInfo->setForceFramePointer(true);
826           return true;
827         }
828       }
829       // Nothing to do
830       return false;
831     }
832
833     virtual const char *getPassName() const {
834       return "X86 Maximal Stack Alignment Check";
835     }
836
837     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
838       AU.setPreservesCFG();
839       MachineFunctionPass::getAnalysisUsage(AU);
840     }
841   };
842
843   char MSAH::ID = 0;
844 }
845
846 FunctionPass*
847 llvm::createX86MaxStackAlignmentHeuristicPass() { return new MSAH(); }