MachineFunction.cpp revision 2531a6415ff9c082bb1c11c27f1b03aa3e1b97df
1//===-- MachineFunction.cpp -----------------------------------------------===//
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// Collect native machine code information for a function.  This allows
11// target-specific information about the generated code to be stored with each
12// function.
13//
14//===----------------------------------------------------------------------===//
15
16#include "llvm/CodeGen/MachineFunction.h"
17#include "llvm/Function.h"
18#include "llvm/CodeGen/MachineConstantPool.h"
19#include "llvm/CodeGen/MachineFunctionPass.h"
20#include "llvm/CodeGen/MachineFrameInfo.h"
21#include "llvm/CodeGen/MachineInstr.h"
22#include "llvm/CodeGen/MachineJumpTableInfo.h"
23#include "llvm/CodeGen/MachineModuleInfo.h"
24#include "llvm/CodeGen/MachineRegisterInfo.h"
25#include "llvm/CodeGen/Passes.h"
26#include "llvm/MC/MCAsmInfo.h"
27#include "llvm/MC/MCContext.h"
28#include "llvm/Analysis/ConstantFolding.h"
29#include "llvm/Analysis/DebugInfo.h"
30#include "llvm/Support/Debug.h"
31#include "llvm/Target/TargetData.h"
32#include "llvm/Target/TargetLowering.h"
33#include "llvm/Target/TargetMachine.h"
34#include "llvm/Target/TargetFrameLowering.h"
35#include "llvm/ADT/SmallString.h"
36#include "llvm/ADT/STLExtras.h"
37#include "llvm/Support/GraphWriter.h"
38#include "llvm/Support/raw_ostream.h"
39using namespace llvm;
40
41//===----------------------------------------------------------------------===//
42// MachineFunction implementation
43//===----------------------------------------------------------------------===//
44
45// Out of line virtual method.
46MachineFunctionInfo::~MachineFunctionInfo() {}
47
48void ilist_traits<MachineBasicBlock>::deleteNode(MachineBasicBlock *MBB) {
49  MBB->getParent()->DeleteMachineBasicBlock(MBB);
50}
51
52MachineFunction::MachineFunction(const Function *F, const TargetMachine &TM,
53                                 unsigned FunctionNum, MachineModuleInfo &mmi,
54                                 GCModuleInfo* gmi)
55  : Fn(F), Target(TM), Ctx(mmi.getContext()), MMI(mmi), GMI(gmi) {
56  if (TM.getRegisterInfo())
57    RegInfo = new (Allocator) MachineRegisterInfo(*TM.getRegisterInfo());
58  else
59    RegInfo = 0;
60  MFInfo = 0;
61  FrameInfo = new (Allocator) MachineFrameInfo(*TM.getFrameLowering());
62  if (Fn->hasFnAttr(Attribute::StackAlignment))
63    FrameInfo->ensureMaxAlignment(Attribute::getStackAlignmentFromAttrs(
64        Fn->getAttributes().getFnAttributes()));
65  ConstantPool = new (Allocator) MachineConstantPool(TM.getTargetData());
66  Alignment = TM.getTargetLowering()->getMinFunctionAlignment();
67  // FIXME: Shouldn't use pref alignment if explicit alignment is set on Fn.
68  if (!Fn->hasFnAttr(Attribute::OptimizeForSize))
69    Alignment = std::max(Alignment,
70                         TM.getTargetLowering()->getPrefFunctionAlignment());
71  FunctionNumber = FunctionNum;
72  JumpTableInfo = 0;
73}
74
75MachineFunction::~MachineFunction() {
76  BasicBlocks.clear();
77  InstructionRecycler.clear(Allocator);
78  BasicBlockRecycler.clear(Allocator);
79  if (RegInfo) {
80    RegInfo->~MachineRegisterInfo();
81    Allocator.Deallocate(RegInfo);
82  }
83  if (MFInfo) {
84    MFInfo->~MachineFunctionInfo();
85    Allocator.Deallocate(MFInfo);
86  }
87  FrameInfo->~MachineFrameInfo();         Allocator.Deallocate(FrameInfo);
88  ConstantPool->~MachineConstantPool();   Allocator.Deallocate(ConstantPool);
89
90  if (JumpTableInfo) {
91    JumpTableInfo->~MachineJumpTableInfo();
92    Allocator.Deallocate(JumpTableInfo);
93  }
94}
95
96/// getOrCreateJumpTableInfo - Get the JumpTableInfo for this function, if it
97/// does already exist, allocate one.
98MachineJumpTableInfo *MachineFunction::
99getOrCreateJumpTableInfo(unsigned EntryKind) {
100  if (JumpTableInfo) return JumpTableInfo;
101
102  JumpTableInfo = new (Allocator)
103    MachineJumpTableInfo((MachineJumpTableInfo::JTEntryKind)EntryKind);
104  return JumpTableInfo;
105}
106
107/// RenumberBlocks - This discards all of the MachineBasicBlock numbers and
108/// recomputes them.  This guarantees that the MBB numbers are sequential,
109/// dense, and match the ordering of the blocks within the function.  If a
110/// specific MachineBasicBlock is specified, only that block and those after
111/// it are renumbered.
112void MachineFunction::RenumberBlocks(MachineBasicBlock *MBB) {
113  if (empty()) { MBBNumbering.clear(); return; }
114  MachineFunction::iterator MBBI, E = end();
115  if (MBB == 0)
116    MBBI = begin();
117  else
118    MBBI = MBB;
119
120  // Figure out the block number this should have.
121  unsigned BlockNo = 0;
122  if (MBBI != begin())
123    BlockNo = prior(MBBI)->getNumber()+1;
124
125  for (; MBBI != E; ++MBBI, ++BlockNo) {
126    if (MBBI->getNumber() != (int)BlockNo) {
127      // Remove use of the old number.
128      if (MBBI->getNumber() != -1) {
129        assert(MBBNumbering[MBBI->getNumber()] == &*MBBI &&
130               "MBB number mismatch!");
131        MBBNumbering[MBBI->getNumber()] = 0;
132      }
133
134      // If BlockNo is already taken, set that block's number to -1.
135      if (MBBNumbering[BlockNo])
136        MBBNumbering[BlockNo]->setNumber(-1);
137
138      MBBNumbering[BlockNo] = MBBI;
139      MBBI->setNumber(BlockNo);
140    }
141  }
142
143  // Okay, all the blocks are renumbered.  If we have compactified the block
144  // numbering, shrink MBBNumbering now.
145  assert(BlockNo <= MBBNumbering.size() && "Mismatch!");
146  MBBNumbering.resize(BlockNo);
147}
148
149/// CreateMachineInstr - Allocate a new MachineInstr. Use this instead
150/// of `new MachineInstr'.
151///
152MachineInstr *
153MachineFunction::CreateMachineInstr(const MCInstrDesc &MCID,
154                                    DebugLoc DL, bool NoImp) {
155  return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
156    MachineInstr(MCID, DL, NoImp);
157}
158
159/// CloneMachineInstr - Create a new MachineInstr which is a copy of the
160/// 'Orig' instruction, identical in all ways except the instruction
161/// has no parent, prev, or next.
162///
163MachineInstr *
164MachineFunction::CloneMachineInstr(const MachineInstr *Orig) {
165  return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
166             MachineInstr(*this, *Orig);
167}
168
169/// DeleteMachineInstr - Delete the given MachineInstr.
170///
171void
172MachineFunction::DeleteMachineInstr(MachineInstr *MI) {
173  MI->~MachineInstr();
174  InstructionRecycler.Deallocate(Allocator, MI);
175}
176
177/// CreateMachineBasicBlock - Allocate a new MachineBasicBlock. Use this
178/// instead of `new MachineBasicBlock'.
179///
180MachineBasicBlock *
181MachineFunction::CreateMachineBasicBlock(const BasicBlock *bb) {
182  return new (BasicBlockRecycler.Allocate<MachineBasicBlock>(Allocator))
183             MachineBasicBlock(*this, bb);
184}
185
186/// DeleteMachineBasicBlock - Delete the given MachineBasicBlock.
187///
188void
189MachineFunction::DeleteMachineBasicBlock(MachineBasicBlock *MBB) {
190  assert(MBB->getParent() == this && "MBB parent mismatch!");
191  MBB->~MachineBasicBlock();
192  BasicBlockRecycler.Deallocate(Allocator, MBB);
193}
194
195MachineMemOperand *
196MachineFunction::getMachineMemOperand(MachinePointerInfo PtrInfo, unsigned f,
197                                      uint64_t s, unsigned base_alignment,
198                                      const MDNode *TBAAInfo,
199                                      const MDNode *Ranges) {
200  return new (Allocator) MachineMemOperand(PtrInfo, f, s, base_alignment,
201                                           TBAAInfo, Ranges);
202}
203
204MachineMemOperand *
205MachineFunction::getMachineMemOperand(const MachineMemOperand *MMO,
206                                      int64_t Offset, uint64_t Size) {
207  return new (Allocator)
208             MachineMemOperand(MachinePointerInfo(MMO->getValue(),
209                                                  MMO->getOffset()+Offset),
210                               MMO->getFlags(), Size,
211                               MMO->getBaseAlignment(), 0);
212}
213
214MachineInstr::mmo_iterator
215MachineFunction::allocateMemRefsArray(unsigned long Num) {
216  return Allocator.Allocate<MachineMemOperand *>(Num);
217}
218
219std::pair<MachineInstr::mmo_iterator, MachineInstr::mmo_iterator>
220MachineFunction::extractLoadMemRefs(MachineInstr::mmo_iterator Begin,
221                                    MachineInstr::mmo_iterator End) {
222  // Count the number of load mem refs.
223  unsigned Num = 0;
224  for (MachineInstr::mmo_iterator I = Begin; I != End; ++I)
225    if ((*I)->isLoad())
226      ++Num;
227
228  // Allocate a new array and populate it with the load information.
229  MachineInstr::mmo_iterator Result = allocateMemRefsArray(Num);
230  unsigned Index = 0;
231  for (MachineInstr::mmo_iterator I = Begin; I != End; ++I) {
232    if ((*I)->isLoad()) {
233      if (!(*I)->isStore())
234        // Reuse the MMO.
235        Result[Index] = *I;
236      else {
237        // Clone the MMO and unset the store flag.
238        MachineMemOperand *JustLoad =
239          getMachineMemOperand((*I)->getPointerInfo(),
240                               (*I)->getFlags() & ~MachineMemOperand::MOStore,
241                               (*I)->getSize(), (*I)->getBaseAlignment(),
242                               (*I)->getTBAAInfo());
243        Result[Index] = JustLoad;
244      }
245      ++Index;
246    }
247  }
248  return std::make_pair(Result, Result + Num);
249}
250
251std::pair<MachineInstr::mmo_iterator, MachineInstr::mmo_iterator>
252MachineFunction::extractStoreMemRefs(MachineInstr::mmo_iterator Begin,
253                                     MachineInstr::mmo_iterator End) {
254  // Count the number of load mem refs.
255  unsigned Num = 0;
256  for (MachineInstr::mmo_iterator I = Begin; I != End; ++I)
257    if ((*I)->isStore())
258      ++Num;
259
260  // Allocate a new array and populate it with the store information.
261  MachineInstr::mmo_iterator Result = allocateMemRefsArray(Num);
262  unsigned Index = 0;
263  for (MachineInstr::mmo_iterator I = Begin; I != End; ++I) {
264    if ((*I)->isStore()) {
265      if (!(*I)->isLoad())
266        // Reuse the MMO.
267        Result[Index] = *I;
268      else {
269        // Clone the MMO and unset the load flag.
270        MachineMemOperand *JustStore =
271          getMachineMemOperand((*I)->getPointerInfo(),
272                               (*I)->getFlags() & ~MachineMemOperand::MOLoad,
273                               (*I)->getSize(), (*I)->getBaseAlignment(),
274                               (*I)->getTBAAInfo());
275        Result[Index] = JustStore;
276      }
277      ++Index;
278    }
279  }
280  return std::make_pair(Result, Result + Num);
281}
282
283void MachineFunction::dump() const {
284  print(dbgs());
285}
286
287void MachineFunction::print(raw_ostream &OS, SlotIndexes *Indexes) const {
288  OS << "# Machine code for function " << Fn->getName() << ": ";
289  if (RegInfo) {
290    OS << (RegInfo->isSSA() ? "SSA" : "Post SSA");
291    if (!RegInfo->tracksLiveness())
292      OS << ", not tracking liveness";
293  }
294  OS << '\n';
295
296  // Print Frame Information
297  FrameInfo->print(*this, OS);
298
299  // Print JumpTable Information
300  if (JumpTableInfo)
301    JumpTableInfo->print(OS);
302
303  // Print Constant Pool
304  ConstantPool->print(OS);
305
306  const TargetRegisterInfo *TRI = getTarget().getRegisterInfo();
307
308  if (RegInfo && !RegInfo->livein_empty()) {
309    OS << "Function Live Ins: ";
310    for (MachineRegisterInfo::livein_iterator
311         I = RegInfo->livein_begin(), E = RegInfo->livein_end(); I != E; ++I) {
312      OS << PrintReg(I->first, TRI);
313      if (I->second)
314        OS << " in " << PrintReg(I->second, TRI);
315      if (llvm::next(I) != E)
316        OS << ", ";
317    }
318    OS << '\n';
319  }
320  if (RegInfo && !RegInfo->liveout_empty()) {
321    OS << "Function Live Outs:";
322    for (MachineRegisterInfo::liveout_iterator
323         I = RegInfo->liveout_begin(), E = RegInfo->liveout_end(); I != E; ++I)
324      OS << ' ' << PrintReg(*I, TRI);
325    OS << '\n';
326  }
327
328  for (const_iterator BB = begin(), E = end(); BB != E; ++BB) {
329    OS << '\n';
330    BB->print(OS, Indexes);
331  }
332
333  OS << "\n# End machine code for function " << Fn->getName() << ".\n\n";
334}
335
336namespace llvm {
337  template<>
338  struct DOTGraphTraits<const MachineFunction*> : public DefaultDOTGraphTraits {
339
340  DOTGraphTraits (bool isSimple=false) : DefaultDOTGraphTraits(isSimple) {}
341
342    static std::string getGraphName(const MachineFunction *F) {
343      return "CFG for '" + F->getFunction()->getName().str() + "' function";
344    }
345
346    std::string getNodeLabel(const MachineBasicBlock *Node,
347                             const MachineFunction *Graph) {
348      std::string OutStr;
349      {
350        raw_string_ostream OSS(OutStr);
351
352        if (isSimple()) {
353          OSS << "BB#" << Node->getNumber();
354          if (const BasicBlock *BB = Node->getBasicBlock())
355            OSS << ": " << BB->getName();
356        } else
357          Node->print(OSS);
358      }
359
360      if (OutStr[0] == '\n') OutStr.erase(OutStr.begin());
361
362      // Process string output to make it nicer...
363      for (unsigned i = 0; i != OutStr.length(); ++i)
364        if (OutStr[i] == '\n') {                            // Left justify
365          OutStr[i] = '\\';
366          OutStr.insert(OutStr.begin()+i+1, 'l');
367        }
368      return OutStr;
369    }
370  };
371}
372
373void MachineFunction::viewCFG() const
374{
375#ifndef NDEBUG
376  ViewGraph(this, "mf" + getFunction()->getName());
377#else
378  errs() << "MachineFunction::viewCFG is only available in debug builds on "
379         << "systems with Graphviz or gv!\n";
380#endif // NDEBUG
381}
382
383void MachineFunction::viewCFGOnly() const
384{
385#ifndef NDEBUG
386  ViewGraph(this, "mf" + getFunction()->getName(), true);
387#else
388  errs() << "MachineFunction::viewCFGOnly is only available in debug builds on "
389         << "systems with Graphviz or gv!\n";
390#endif // NDEBUG
391}
392
393/// addLiveIn - Add the specified physical register as a live-in value and
394/// create a corresponding virtual register for it.
395unsigned MachineFunction::addLiveIn(unsigned PReg,
396                                    const TargetRegisterClass *RC) {
397  MachineRegisterInfo &MRI = getRegInfo();
398  unsigned VReg = MRI.getLiveInVirtReg(PReg);
399  if (VReg) {
400    assert(MRI.getRegClass(VReg) == RC && "Register class mismatch!");
401    return VReg;
402  }
403  VReg = MRI.createVirtualRegister(RC);
404  MRI.addLiveIn(PReg, VReg);
405  return VReg;
406}
407
408/// getJTISymbol - Return the MCSymbol for the specified non-empty jump table.
409/// If isLinkerPrivate is specified, an 'l' label is returned, otherwise a
410/// normal 'L' label is returned.
411MCSymbol *MachineFunction::getJTISymbol(unsigned JTI, MCContext &Ctx,
412                                        bool isLinkerPrivate) const {
413  assert(JumpTableInfo && "No jump tables");
414
415  assert(JTI < JumpTableInfo->getJumpTables().size() && "Invalid JTI!");
416  const MCAsmInfo &MAI = *getTarget().getMCAsmInfo();
417
418  const char *Prefix = isLinkerPrivate ? MAI.getLinkerPrivateGlobalPrefix() :
419                                         MAI.getPrivateGlobalPrefix();
420  SmallString<60> Name;
421  raw_svector_ostream(Name)
422    << Prefix << "JTI" << getFunctionNumber() << '_' << JTI;
423  return Ctx.GetOrCreateSymbol(Name.str());
424}
425
426/// getPICBaseSymbol - Return a function-local symbol to represent the PIC
427/// base.
428MCSymbol *MachineFunction::getPICBaseSymbol() const {
429  const MCAsmInfo &MAI = *Target.getMCAsmInfo();
430  return Ctx.GetOrCreateSymbol(Twine(MAI.getPrivateGlobalPrefix())+
431                               Twine(getFunctionNumber())+"$pb");
432}
433
434//===----------------------------------------------------------------------===//
435//  MachineFrameInfo implementation
436//===----------------------------------------------------------------------===//
437
438/// CreateFixedObject - Create a new object at a fixed location on the stack.
439/// All fixed objects should be created before other objects are created for
440/// efficiency. By default, fixed objects are immutable. This returns an
441/// index with a negative value.
442///
443int MachineFrameInfo::CreateFixedObject(uint64_t Size, int64_t SPOffset,
444                                        bool Immutable) {
445  assert(Size != 0 && "Cannot allocate zero size fixed stack objects!");
446  // The alignment of the frame index can be determined from its offset from
447  // the incoming frame position.  If the frame object is at offset 32 and
448  // the stack is guaranteed to be 16-byte aligned, then we know that the
449  // object is 16-byte aligned.
450  unsigned StackAlign = TFI.getStackAlignment();
451  unsigned Align = MinAlign(SPOffset, StackAlign);
452  Objects.insert(Objects.begin(), StackObject(Size, Align, SPOffset, Immutable,
453                                              /*isSS*/false, false));
454  return -++NumFixedObjects;
455}
456
457
458BitVector
459MachineFrameInfo::getPristineRegs(const MachineBasicBlock *MBB) const {
460  assert(MBB && "MBB must be valid");
461  const MachineFunction *MF = MBB->getParent();
462  assert(MF && "MBB must be part of a MachineFunction");
463  const TargetMachine &TM = MF->getTarget();
464  const TargetRegisterInfo *TRI = TM.getRegisterInfo();
465  BitVector BV(TRI->getNumRegs());
466
467  // Before CSI is calculated, no registers are considered pristine. They can be
468  // freely used and PEI will make sure they are saved.
469  if (!isCalleeSavedInfoValid())
470    return BV;
471
472  for (const uint16_t *CSR = TRI->getCalleeSavedRegs(MF); CSR && *CSR; ++CSR)
473    BV.set(*CSR);
474
475  // The entry MBB always has all CSRs pristine.
476  if (MBB == &MF->front())
477    return BV;
478
479  // On other MBBs the saved CSRs are not pristine.
480  const std::vector<CalleeSavedInfo> &CSI = getCalleeSavedInfo();
481  for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
482         E = CSI.end(); I != E; ++I)
483    BV.reset(I->getReg());
484
485  return BV;
486}
487
488
489void MachineFrameInfo::print(const MachineFunction &MF, raw_ostream &OS) const{
490  if (Objects.empty()) return;
491
492  const TargetFrameLowering *FI = MF.getTarget().getFrameLowering();
493  int ValOffset = (FI ? FI->getOffsetOfLocalArea() : 0);
494
495  OS << "Frame Objects:\n";
496
497  for (unsigned i = 0, e = Objects.size(); i != e; ++i) {
498    const StackObject &SO = Objects[i];
499    OS << "  fi#" << (int)(i-NumFixedObjects) << ": ";
500    if (SO.Size == ~0ULL) {
501      OS << "dead\n";
502      continue;
503    }
504    if (SO.Size == 0)
505      OS << "variable sized";
506    else
507      OS << "size=" << SO.Size;
508    OS << ", align=" << SO.Alignment;
509
510    if (i < NumFixedObjects)
511      OS << ", fixed";
512    if (i < NumFixedObjects || SO.SPOffset != -1) {
513      int64_t Off = SO.SPOffset - ValOffset;
514      OS << ", at location [SP";
515      if (Off > 0)
516        OS << "+" << Off;
517      else if (Off < 0)
518        OS << Off;
519      OS << "]";
520    }
521    OS << "\n";
522  }
523}
524
525void MachineFrameInfo::dump(const MachineFunction &MF) const {
526  print(MF, dbgs());
527}
528
529//===----------------------------------------------------------------------===//
530//  MachineJumpTableInfo implementation
531//===----------------------------------------------------------------------===//
532
533/// getEntrySize - Return the size of each entry in the jump table.
534unsigned MachineJumpTableInfo::getEntrySize(const TargetData &TD) const {
535  // The size of a jump table entry is 4 bytes unless the entry is just the
536  // address of a block, in which case it is the pointer size.
537  switch (getEntryKind()) {
538  case MachineJumpTableInfo::EK_BlockAddress:
539    return TD.getPointerSize();
540  case MachineJumpTableInfo::EK_GPRel64BlockAddress:
541    return 8;
542  case MachineJumpTableInfo::EK_GPRel32BlockAddress:
543  case MachineJumpTableInfo::EK_LabelDifference32:
544  case MachineJumpTableInfo::EK_Custom32:
545    return 4;
546  case MachineJumpTableInfo::EK_Inline:
547    return 0;
548  }
549  llvm_unreachable("Unknown jump table encoding!");
550}
551
552/// getEntryAlignment - Return the alignment of each entry in the jump table.
553unsigned MachineJumpTableInfo::getEntryAlignment(const TargetData &TD) const {
554  // The alignment of a jump table entry is the alignment of int32 unless the
555  // entry is just the address of a block, in which case it is the pointer
556  // alignment.
557  switch (getEntryKind()) {
558  case MachineJumpTableInfo::EK_BlockAddress:
559    return TD.getPointerABIAlignment();
560  case MachineJumpTableInfo::EK_GPRel64BlockAddress:
561    return TD.getABIIntegerTypeAlignment(64);
562  case MachineJumpTableInfo::EK_GPRel32BlockAddress:
563  case MachineJumpTableInfo::EK_LabelDifference32:
564  case MachineJumpTableInfo::EK_Custom32:
565    return TD.getABIIntegerTypeAlignment(32);
566  case MachineJumpTableInfo::EK_Inline:
567    return 1;
568  }
569  llvm_unreachable("Unknown jump table encoding!");
570}
571
572/// createJumpTableIndex - Create a new jump table entry in the jump table info.
573///
574unsigned MachineJumpTableInfo::createJumpTableIndex(
575                               const std::vector<MachineBasicBlock*> &DestBBs) {
576  assert(!DestBBs.empty() && "Cannot create an empty jump table!");
577  JumpTables.push_back(MachineJumpTableEntry(DestBBs));
578  return JumpTables.size()-1;
579}
580
581/// ReplaceMBBInJumpTables - If Old is the target of any jump tables, update
582/// the jump tables to branch to New instead.
583bool MachineJumpTableInfo::ReplaceMBBInJumpTables(MachineBasicBlock *Old,
584                                                  MachineBasicBlock *New) {
585  assert(Old != New && "Not making a change?");
586  bool MadeChange = false;
587  for (size_t i = 0, e = JumpTables.size(); i != e; ++i)
588    ReplaceMBBInJumpTable(i, Old, New);
589  return MadeChange;
590}
591
592/// ReplaceMBBInJumpTable - If Old is a target of the jump tables, update
593/// the jump table to branch to New instead.
594bool MachineJumpTableInfo::ReplaceMBBInJumpTable(unsigned Idx,
595                                                 MachineBasicBlock *Old,
596                                                 MachineBasicBlock *New) {
597  assert(Old != New && "Not making a change?");
598  bool MadeChange = false;
599  MachineJumpTableEntry &JTE = JumpTables[Idx];
600  for (size_t j = 0, e = JTE.MBBs.size(); j != e; ++j)
601    if (JTE.MBBs[j] == Old) {
602      JTE.MBBs[j] = New;
603      MadeChange = true;
604    }
605  return MadeChange;
606}
607
608void MachineJumpTableInfo::print(raw_ostream &OS) const {
609  if (JumpTables.empty()) return;
610
611  OS << "Jump Tables:\n";
612
613  for (unsigned i = 0, e = JumpTables.size(); i != e; ++i) {
614    OS << "  jt#" << i << ": ";
615    for (unsigned j = 0, f = JumpTables[i].MBBs.size(); j != f; ++j)
616      OS << " BB#" << JumpTables[i].MBBs[j]->getNumber();
617  }
618
619  OS << '\n';
620}
621
622void MachineJumpTableInfo::dump() const { print(dbgs()); }
623
624
625//===----------------------------------------------------------------------===//
626//  MachineConstantPool implementation
627//===----------------------------------------------------------------------===//
628
629void MachineConstantPoolValue::anchor() { }
630
631Type *MachineConstantPoolEntry::getType() const {
632  if (isMachineConstantPoolEntry())
633    return Val.MachineCPVal->getType();
634  return Val.ConstVal->getType();
635}
636
637
638unsigned MachineConstantPoolEntry::getRelocationInfo() const {
639  if (isMachineConstantPoolEntry())
640    return Val.MachineCPVal->getRelocationInfo();
641  return Val.ConstVal->getRelocationInfo();
642}
643
644MachineConstantPool::~MachineConstantPool() {
645  for (unsigned i = 0, e = Constants.size(); i != e; ++i)
646    if (Constants[i].isMachineConstantPoolEntry())
647      delete Constants[i].Val.MachineCPVal;
648  for (DenseSet<MachineConstantPoolValue*>::iterator I =
649       MachineCPVsSharingEntries.begin(), E = MachineCPVsSharingEntries.end();
650       I != E; ++I)
651    delete *I;
652}
653
654/// CanShareConstantPoolEntry - Test whether the given two constants
655/// can be allocated the same constant pool entry.
656static bool CanShareConstantPoolEntry(const Constant *A, const Constant *B,
657                                      const TargetData *TD) {
658  // Handle the trivial case quickly.
659  if (A == B) return true;
660
661  // If they have the same type but weren't the same constant, quickly
662  // reject them.
663  if (A->getType() == B->getType()) return false;
664
665  // We can't handle structs or arrays.
666  if (isa<StructType>(A->getType()) || isa<ArrayType>(A->getType()) ||
667      isa<StructType>(B->getType()) || isa<ArrayType>(B->getType()))
668    return false;
669
670  // For now, only support constants with the same size.
671  uint64_t StoreSize = TD->getTypeStoreSize(A->getType());
672  if (StoreSize != TD->getTypeStoreSize(B->getType()) ||
673      StoreSize > 128)
674    return false;
675
676  Type *IntTy = IntegerType::get(A->getContext(), StoreSize*8);
677
678  // Try constant folding a bitcast of both instructions to an integer.  If we
679  // get two identical ConstantInt's, then we are good to share them.  We use
680  // the constant folding APIs to do this so that we get the benefit of
681  // TargetData.
682  if (isa<PointerType>(A->getType()))
683    A = ConstantFoldInstOperands(Instruction::PtrToInt, IntTy,
684                                 const_cast<Constant*>(A), TD);
685  else if (A->getType() != IntTy)
686    A = ConstantFoldInstOperands(Instruction::BitCast, IntTy,
687                                 const_cast<Constant*>(A), TD);
688  if (isa<PointerType>(B->getType()))
689    B = ConstantFoldInstOperands(Instruction::PtrToInt, IntTy,
690                                 const_cast<Constant*>(B), TD);
691  else if (B->getType() != IntTy)
692    B = ConstantFoldInstOperands(Instruction::BitCast, IntTy,
693                                 const_cast<Constant*>(B), TD);
694
695  return A == B;
696}
697
698/// getConstantPoolIndex - Create a new entry in the constant pool or return
699/// an existing one.  User must specify the log2 of the minimum required
700/// alignment for the object.
701///
702unsigned MachineConstantPool::getConstantPoolIndex(const Constant *C,
703                                                   unsigned Alignment) {
704  assert(Alignment && "Alignment must be specified!");
705  if (Alignment > PoolAlignment) PoolAlignment = Alignment;
706
707  // Check to see if we already have this constant.
708  //
709  // FIXME, this could be made much more efficient for large constant pools.
710  for (unsigned i = 0, e = Constants.size(); i != e; ++i)
711    if (!Constants[i].isMachineConstantPoolEntry() &&
712        CanShareConstantPoolEntry(Constants[i].Val.ConstVal, C, TD)) {
713      if ((unsigned)Constants[i].getAlignment() < Alignment)
714        Constants[i].Alignment = Alignment;
715      return i;
716    }
717
718  Constants.push_back(MachineConstantPoolEntry(C, Alignment));
719  return Constants.size()-1;
720}
721
722unsigned MachineConstantPool::getConstantPoolIndex(MachineConstantPoolValue *V,
723                                                   unsigned Alignment) {
724  assert(Alignment && "Alignment must be specified!");
725  if (Alignment > PoolAlignment) PoolAlignment = Alignment;
726
727  // Check to see if we already have this constant.
728  //
729  // FIXME, this could be made much more efficient for large constant pools.
730  int Idx = V->getExistingMachineCPValue(this, Alignment);
731  if (Idx != -1) {
732    MachineCPVsSharingEntries.insert(V);
733    return (unsigned)Idx;
734  }
735
736  Constants.push_back(MachineConstantPoolEntry(V, Alignment));
737  return Constants.size()-1;
738}
739
740void MachineConstantPool::print(raw_ostream &OS) const {
741  if (Constants.empty()) return;
742
743  OS << "Constant Pool:\n";
744  for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
745    OS << "  cp#" << i << ": ";
746    if (Constants[i].isMachineConstantPoolEntry())
747      Constants[i].Val.MachineCPVal->print(OS);
748    else
749      OS << *(Value*)Constants[i].Val.ConstVal;
750    OS << ", align=" << Constants[i].getAlignment();
751    OS << "\n";
752  }
753}
754
755void MachineConstantPool::dump() const { print(dbgs()); }
756