MachineFunction.cpp revision 68bb60f6a4e0902769f72d1badda4e37cd873ffb
16b9445389a226b4ac97ceb89a34ee1a5bf921714Chris Lattner//===-- MachineFunction.cpp -----------------------------------------------===//
276d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos//
3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//                     The LLVM Compiler Infrastructure
4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
776d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos//
8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===//
976d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos//
106b9445389a226b4ac97ceb89a34ee1a5bf921714Chris Lattner// Collect native machine code information for a function.  This allows
116b9445389a226b4ac97ceb89a34ee1a5bf921714Chris Lattner// target-specific information about the generated code to be stored with each
126b9445389a226b4ac97ceb89a34ee1a5bf921714Chris Lattner// function.
136b9445389a226b4ac97ceb89a34ee1a5bf921714Chris Lattner//
146b9445389a226b4ac97ceb89a34ee1a5bf921714Chris Lattner//===----------------------------------------------------------------------===//
15f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner
16d2b7cec527a0efa552628378ebca7a8ca63bb45dChris Lattner#include "llvm/DerivedTypes.h"
1720c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling#include "llvm/Function.h"
1820c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling#include "llvm/Instructions.h"
1920c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling#include "llvm/ADT/STLExtras.h"
2020c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling#include "llvm/Config/config.h"
2184bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner#include "llvm/CodeGen/MachineConstantPool.h"
22098612b0e8b864d6db82bb10b633d630cccd8562David Greene#include "llvm/CodeGen/MachineFunction.h"
2316c45e9de896ea37d48d093dbe02fc9a4c1b9f8fChris Lattner#include "llvm/CodeGen/MachineFunctionPass.h"
24eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner#include "llvm/CodeGen/MachineFrameInfo.h"
2584bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner#include "llvm/CodeGen/MachineInstr.h"
2637efe6764568a3829fee26aba532283131d1a104Nate Begeman#include "llvm/CodeGen/MachineJumpTableInfo.h"
2784bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner#include "llvm/CodeGen/MachineRegisterInfo.h"
2816c45e9de896ea37d48d093dbe02fc9a4c1b9f8fChris Lattner#include "llvm/CodeGen/Passes.h"
2907000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Anderson#include "llvm/Target/TargetData.h"
3020c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling#include "llvm/Target/TargetLowering.h"
31f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner#include "llvm/Target/TargetMachine.h"
328bd66e690779c838db51f55cf0b31d7206b3b659Chris Lattner#include "llvm/Target/TargetFrameInfo.h"
33f28bbda2c6c965dbd28e73e06c9e09231a77b0dcChris Lattner#include "llvm/Support/GraphWriter.h"
34944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner#include "llvm/Support/raw_ostream.h"
3507f32d48f1e16bcdc621985549548a5849215238Chris Lattnerusing namespace llvm;
36f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner
37227c3d355b017393963a690f9f27d1de7fa359bcChris Lattnernamespace {
386726b6d75a8b679068a58cb954ba97cf9d1690baNick Lewycky  struct Printer : public MachineFunctionPass {
391997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel    static char ID;
40794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel
41cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner    raw_ostream &OS;
42d4baf0f74ca54dcbb61d199f4b184d6012d7179fChris Lattner    const std::string Banner;
4309caa3751f3c53a8c8a7a81c2a60d6c8ddf5a980Brian Gaeke
44cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner    Printer(raw_ostream &os, const std::string &banner)
45ae73dc1448d25b02cabc7c64c86c64371453dda8Dan Gohman      : MachineFunctionPass(&ID), OS(os), Banner(banner) {}
4609caa3751f3c53a8c8a7a81c2a60d6c8ddf5a980Brian Gaeke
471049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    const char *getPassName() const { return "MachineFunction Printer"; }
481049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
491049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
501049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      AU.setPreservesAll();
51ad2afc2a421a0e41603d5eee412d4d8c77e9bc1cDan Gohman      MachineFunctionPass::getAnalysisUsage(AU);
521049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    }
531049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
5416c45e9de896ea37d48d093dbe02fc9a4c1b9f8fChris Lattner    bool runOnMachineFunction(MachineFunction &MF) {
550ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman      OS << "# " << Banner << ":\n";
56cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner      MF.print(OS);
571049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      return false;
581049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    }
591049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  };
601997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel  char Printer::ID = 0;
61227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner}
62227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner
63275872e79950dafc6699f6502cee52f74b84a22aDaniel Dunbar/// Returns a newly-created MachineFunction Printer pass. The default banner is
64275872e79950dafc6699f6502cee52f74b84a22aDaniel Dunbar/// empty.
6509caa3751f3c53a8c8a7a81c2a60d6c8ddf5a980Brian Gaeke///
66cf143a4d917699f8f4202f331fa9e184070471fbChris LattnerFunctionPass *llvm::createMachineFunctionPrinterPass(raw_ostream &OS,
67ce9c41e77a2ec75d48a173b9baf0f4a3bf49fac7Chris Lattner                                                     const std::string &Banner){
6809caa3751f3c53a8c8a7a81c2a60d6c8ddf5a980Brian Gaeke  return new Printer(OS, Banner);
691049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner}
701049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
71227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner//===---------------------------------------------------------------------===//
72227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner// MachineFunction implementation
73227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner//===---------------------------------------------------------------------===//
749d5d7598db72c00a0fb89dc77198e4f6ebc5294dChris Lattner
75a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris Lattner// Out of line virtual method.
76a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris LattnerMachineFunctionInfo::~MachineFunctionInfo() {}
77a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris Lattner
78fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanvoid ilist_traits<MachineBasicBlock>::deleteNode(MachineBasicBlock *MBB) {
798e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MBB->getParent()->DeleteMachineBasicBlock(MBB);
80792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner}
81227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner
82ad2afc2a421a0e41603d5eee412d4d8c77e9bc1cDan GohmanMachineFunction::MachineFunction(Function *F,
83955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner                                 const TargetMachine &TM)
84f266f89634363cb067a5b43cbe33f79c4397c08cDan Gohman  : Fn(F), Target(TM) {
85e2b997b7b5360b4793c524a801e988fd37b80b93Matthijs Kooijman  if (TM.getRegisterInfo())
86e2b997b7b5360b4793c524a801e988fd37b80b93Matthijs Kooijman    RegInfo = new (Allocator.Allocate<MachineRegisterInfo>())
87e2b997b7b5360b4793c524a801e988fd37b80b93Matthijs Kooijman                  MachineRegisterInfo(*TM.getRegisterInfo());
88e2b997b7b5360b4793c524a801e988fd37b80b93Matthijs Kooijman  else
89e2b997b7b5360b4793c524a801e988fd37b80b93Matthijs Kooijman    RegInfo = 0;
90ad8281607f066c2cce5c3625009d8ee0761dbf35Chris Lattner  MFInfo = 0;
918e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  FrameInfo = new (Allocator.Allocate<MachineFrameInfo>())
928e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman                  MachineFrameInfo(*TM.getFrameInfo());
938e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  ConstantPool = new (Allocator.Allocate<MachineConstantPool>())
948e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman                     MachineConstantPool(TM.getTargetData());
9520c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling  Alignment = TM.getTargetLowering()->getFunctionAlignment(F);
96dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling
97acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey  // Set up jump table.
98acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey  const TargetData &TD = *TM.getTargetData();
99acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey  bool IsPic = TM.getRelocationModel() == Reloc::PIC_;
100acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey  unsigned EntrySize = IsPic ? 4 : TD.getPointerSize();
1011d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  unsigned TyAlignment = IsPic ?
1021d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson                       TD.getABITypeAlignment(Type::getInt32Ty(F->getContext()))
103dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling                               : TD.getPointerABIAlignment();
1048e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  JumpTableInfo = new (Allocator.Allocate<MachineJumpTableInfo>())
105dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling                      MachineJumpTableInfo(EntrySize, TyAlignment);
106831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattner}
107831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattner
10876d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis EvlogimenosMachineFunction::~MachineFunction() {
1094b9a4006748b8d72a04504a5fc1f5daa73bf69f9Chris Lattner  BasicBlocks.clear();
1108e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  InstructionRecycler.clear(Allocator);
1118e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  BasicBlockRecycler.clear(Allocator);
112dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling  if (RegInfo) {
113dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling    RegInfo->~MachineRegisterInfo();
114dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling    Allocator.Deallocate(RegInfo);
115dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling  }
1168e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  if (MFInfo) {
117dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling    MFInfo->~MachineFunctionInfo();
118dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling    Allocator.Deallocate(MFInfo);
1198e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  }
1208e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  FrameInfo->~MachineFrameInfo();         Allocator.Deallocate(FrameInfo);
1218e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  ConstantPool->~MachineConstantPool();   Allocator.Deallocate(ConstantPool);
1228e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  JumpTableInfo->~MachineJumpTableInfo(); Allocator.Deallocate(JumpTableInfo);
1231049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner}
1241049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
125e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
126e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner/// RenumberBlocks - This discards all of the MachineBasicBlock numbers and
127e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner/// recomputes them.  This guarantees that the MBB numbers are sequential,
128e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner/// dense, and match the ordering of the blocks within the function.  If a
129e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner/// specific MachineBasicBlock is specified, only that block and those after
130e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner/// it are renumbered.
131e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattnervoid MachineFunction::RenumberBlocks(MachineBasicBlock *MBB) {
132e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  if (empty()) { MBBNumbering.clear(); return; }
133e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  MachineFunction::iterator MBBI, E = end();
134e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  if (MBB == 0)
135e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner    MBBI = begin();
136e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  else
137e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner    MBBI = MBB;
138e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
139e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  // Figure out the block number this should have.
140e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  unsigned BlockNo = 0;
141f28bbda2c6c965dbd28e73e06c9e09231a77b0dcChris Lattner  if (MBBI != begin())
142f28bbda2c6c965dbd28e73e06c9e09231a77b0dcChris Lattner    BlockNo = prior(MBBI)->getNumber()+1;
143e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
144e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  for (; MBBI != E; ++MBBI, ++BlockNo) {
145e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner    if (MBBI->getNumber() != (int)BlockNo) {
146e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner      // Remove use of the old number.
147e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner      if (MBBI->getNumber() != -1) {
148e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner        assert(MBBNumbering[MBBI->getNumber()] == &*MBBI &&
149e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner               "MBB number mismatch!");
150e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner        MBBNumbering[MBBI->getNumber()] = 0;
151e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner      }
152e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
153e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner      // If BlockNo is already taken, set that block's number to -1.
154e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner      if (MBBNumbering[BlockNo])
155e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner        MBBNumbering[BlockNo]->setNumber(-1);
156e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
157e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner      MBBNumbering[BlockNo] = MBBI;
158e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner      MBBI->setNumber(BlockNo);
159e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner    }
160e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  }
161e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
162e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  // Okay, all the blocks are renumbered.  If we have compactified the block
163e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  // numbering, shrink MBBNumbering now.
164e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  assert(BlockNo <= MBBNumbering.size() && "Mismatch!");
165e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  MBBNumbering.resize(BlockNo);
166e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner}
167e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
1688e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// CreateMachineInstr - Allocate a new MachineInstr. Use this instead
1698e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// of `new MachineInstr'.
1708e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman///
1718e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineInstr *
1729bc96a57206cbebaa9b0ba9979f949eb10c1592cBill WendlingMachineFunction::CreateMachineInstr(const TargetInstrDesc &TID,
1739bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling                                    DebugLoc DL, bool NoImp) {
1748e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
1759bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling    MachineInstr(TID, DL, NoImp);
1768e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman}
1778e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
1788e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// CloneMachineInstr - Create a new MachineInstr which is a copy of the
1798e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// 'Orig' instruction, identical in all ways except the the instruction
1808e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// has no parent, prev, or next.
1818e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman///
1828e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineInstr *
1838e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineFunction::CloneMachineInstr(const MachineInstr *Orig) {
1848e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
1858e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman             MachineInstr(*this, *Orig);
1868e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman}
1878e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
1888e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// DeleteMachineInstr - Delete the given MachineInstr.
1898e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman///
1908e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmanvoid
1918e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineFunction::DeleteMachineInstr(MachineInstr *MI) {
1928e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MI->~MachineInstr();
1938e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  InstructionRecycler.Deallocate(Allocator, MI);
1948e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman}
1958e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
1968e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// CreateMachineBasicBlock - Allocate a new MachineBasicBlock. Use this
1978e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// instead of `new MachineBasicBlock'.
1988e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman///
1998e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineBasicBlock *
2008e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineFunction::CreateMachineBasicBlock(const BasicBlock *bb) {
2018e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  return new (BasicBlockRecycler.Allocate<MachineBasicBlock>(Allocator))
2028e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman             MachineBasicBlock(*this, bb);
2038e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman}
204e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
2058e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// DeleteMachineBasicBlock - Delete the given MachineBasicBlock.
2068e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman///
2078e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmanvoid
2088e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineFunction::DeleteMachineBasicBlock(MachineBasicBlock *MBB) {
2098e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  assert(MBB->getParent() == this && "MBB parent mismatch!");
2108e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MBB->~MachineBasicBlock();
2118e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  BasicBlockRecycler.Deallocate(Allocator, MBB);
2128e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman}
2138e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
214c76909abfec876c6b751d693ebd3df07df686aa0Dan GohmanMachineMemOperand *
215c76909abfec876c6b751d693ebd3df07df686aa0Dan GohmanMachineFunction::getMachineMemOperand(const Value *v, unsigned f,
216c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                                      int64_t o, uint64_t s,
217c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                                      unsigned base_alignment) {
218c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  return new (Allocator.Allocate<MachineMemOperand>())
219c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman             MachineMemOperand(v, f, o, s, base_alignment);
220c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman}
221c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
222c76909abfec876c6b751d693ebd3df07df686aa0Dan GohmanMachineMemOperand *
223c76909abfec876c6b751d693ebd3df07df686aa0Dan GohmanMachineFunction::getMachineMemOperand(const MachineMemOperand *MMO,
224c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                                      int64_t Offset, uint64_t Size) {
225c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  return new (Allocator.Allocate<MachineMemOperand>())
226c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman             MachineMemOperand(MMO->getValue(), MMO->getFlags(),
227c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                               int64_t(uint64_t(MMO->getOffset()) +
228c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                                       uint64_t(Offset)),
229c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                               Size, MMO->getBaseAlignment());
230c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman}
231c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
232c76909abfec876c6b751d693ebd3df07df686aa0Dan GohmanMachineInstr::mmo_iterator
233c76909abfec876c6b751d693ebd3df07df686aa0Dan GohmanMachineFunction::allocateMemRefsArray(unsigned long Num) {
234c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  return Allocator.Allocate<MachineMemOperand *>(Num);
235c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman}
236c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
23791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohmanstd::pair<MachineInstr::mmo_iterator, MachineInstr::mmo_iterator>
23891e69c37153eb7d8cd149d9c2484c3115027b90fDan GohmanMachineFunction::extractLoadMemRefs(MachineInstr::mmo_iterator Begin,
23991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman                                    MachineInstr::mmo_iterator End) {
24091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  // Count the number of load mem refs.
24191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  unsigned Num = 0;
24291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  for (MachineInstr::mmo_iterator I = Begin; I != End; ++I)
24391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman    if ((*I)->isLoad())
24491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      ++Num;
24591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman
24691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  // Allocate a new array and populate it with the load information.
24791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  MachineInstr::mmo_iterator Result = allocateMemRefsArray(Num);
24891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  unsigned Index = 0;
24991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  for (MachineInstr::mmo_iterator I = Begin; I != End; ++I) {
25091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman    if ((*I)->isLoad()) {
25191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      if (!(*I)->isStore())
25291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        // Reuse the MMO.
25391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        Result[Index] = *I;
25491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      else {
25591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        // Clone the MMO and unset the store flag.
25691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        MachineMemOperand *JustLoad =
25791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman          getMachineMemOperand((*I)->getValue(),
25891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman                               (*I)->getFlags() & ~MachineMemOperand::MOStore,
25991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman                               (*I)->getOffset(), (*I)->getSize(),
26091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman                               (*I)->getBaseAlignment());
26191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        Result[Index] = JustLoad;
26291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      }
26391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      ++Index;
26491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman    }
26591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  }
26691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  return std::make_pair(Result, Result + Num);
26791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman}
26891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman
26991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohmanstd::pair<MachineInstr::mmo_iterator, MachineInstr::mmo_iterator>
27091e69c37153eb7d8cd149d9c2484c3115027b90fDan GohmanMachineFunction::extractStoreMemRefs(MachineInstr::mmo_iterator Begin,
27191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman                                     MachineInstr::mmo_iterator End) {
27291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  // Count the number of load mem refs.
27391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  unsigned Num = 0;
27491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  for (MachineInstr::mmo_iterator I = Begin; I != End; ++I)
27591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman    if ((*I)->isStore())
27691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      ++Num;
27791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman
27891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  // Allocate a new array and populate it with the store information.
27991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  MachineInstr::mmo_iterator Result = allocateMemRefsArray(Num);
28091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  unsigned Index = 0;
28191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  for (MachineInstr::mmo_iterator I = Begin; I != End; ++I) {
28291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman    if ((*I)->isStore()) {
28391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      if (!(*I)->isLoad())
28491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        // Reuse the MMO.
28591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        Result[Index] = *I;
28691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      else {
28791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        // Clone the MMO and unset the load flag.
28891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        MachineMemOperand *JustStore =
28991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman          getMachineMemOperand((*I)->getValue(),
29091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman                               (*I)->getFlags() & ~MachineMemOperand::MOLoad,
29191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman                               (*I)->getOffset(), (*I)->getSize(),
29291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman                               (*I)->getBaseAlignment());
29391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        Result[Index] = JustStore;
29491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      }
29591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      ++Index;
29691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman    }
29791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  }
29891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  return std::make_pair(Result, Result + Num);
29991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman}
30091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman
3018e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmanvoid MachineFunction::dump() const {
302d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattner  print(errs());
3038e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman}
3041049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
305d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattnervoid MachineFunction::print(raw_ostream &OS) const {
3060ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  OS << "# Machine code for function " << Fn->getName() << ":\n";
307955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner
308955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner  // Print Frame Information
3098e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  FrameInfo->print(*this, OS);
31037efe6764568a3829fee26aba532283131d1a104Nate Begeman
31137efe6764568a3829fee26aba532283131d1a104Nate Begeman  // Print JumpTable Information
3128e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  JumpTableInfo->print(OS);
3134d149cdae1553426f49623fdae215d481d56d955Chris Lattner
3144d149cdae1553426f49623fdae215d481d56d955Chris Lattner  // Print Constant Pool
315d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattner  ConstantPool->print(OS);
316a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner
3176f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman  const TargetRegisterInfo *TRI = getTarget().getRegisterInfo();
318a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner
319e2b997b7b5360b4793c524a801e988fd37b80b93Matthijs Kooijman  if (RegInfo && !RegInfo->livein_empty()) {
3200ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    OS << "Function Live Ins: ";
32184bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner    for (MachineRegisterInfo::livein_iterator
32284bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner         I = RegInfo->livein_begin(), E = RegInfo->livein_end(); I != E; ++I) {
3236f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman      if (TRI)
3240ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman        OS << "%" << TRI->getName(I->first);
325a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner      else
3260ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman        OS << " %physreg" << I->first;
3274e92027837136233db0fc1c1a4fa2bc456d74de3Chris Lattner
3284e92027837136233db0fc1c1a4fa2bc456d74de3Chris Lattner      if (I->second)
3290ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman        OS << " in reg%" << I->second;
3300ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman
3310ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman      if (next(I) != E)
3320ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman        OS << ", ";
333a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner    }
334d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattner    OS << '\n';
335a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner  }
336e2b997b7b5360b4793c524a801e988fd37b80b93Matthijs Kooijman  if (RegInfo && !RegInfo->liveout_empty()) {
3370ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    OS << "Function Live Outs: ";
33884bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner    for (MachineRegisterInfo::liveout_iterator
3390ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman         I = RegInfo->liveout_begin(), E = RegInfo->liveout_end(); I != E; ++I){
3406f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman      if (TRI)
3410ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman        OS << '%' << TRI->getName(*I);
342a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner      else
3430ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman        OS << "%physreg" << *I;
3440ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman
3450ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman      if (next(I) != E)
3460ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman        OS << " ";
3470ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    }
348d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattner    OS << '\n';
349a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner  }
350a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner
3510ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  for (const_iterator BB = begin(), E = end(); BB != E; ++BB) {
3520ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    OS << '\n';
3532d8e3d20be377112999670f210200b3658762571Chris Lattner    BB->print(OS);
3540ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  }
35547b716483ef2d057c8a0015af20685755e606d0dBrian Gaeke
3560ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  OS << "\n# End machine code for function " << Fn->getName() << ".\n\n";
3571049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner}
3581049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
35971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenosnamespace llvm {
36076d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos  template<>
36176d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos  struct DOTGraphTraits<const MachineFunction*> : public DefaultDOTGraphTraits {
36276d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos    static std::string getGraphName(const MachineFunction *F) {
363f6ccee5a9d2b9573f679bca6266ade3eb8cd3f88Daniel Dunbar      return "CFG for '" + F->getFunction()->getNameStr() + "' function";
36476d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos    }
36571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
36676d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos    static std::string getNodeLabel(const MachineBasicBlock *Node,
3678cbc94afb71fd2da72d8f1284f7f53e39019fdecOwen Anderson                                    const MachineFunction *Graph,
3688cbc94afb71fd2da72d8f1284f7f53e39019fdecOwen Anderson                                    bool ShortNames) {
3698cbc94afb71fd2da72d8f1284f7f53e39019fdecOwen Anderson      if (ShortNames && Node->getBasicBlock() &&
37076d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos          !Node->getBasicBlock()->getName().empty())
371f6ccee5a9d2b9573f679bca6266ade3eb8cd3f88Daniel Dunbar        return Node->getBasicBlock()->getNameStr() + ":";
37271bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
373cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner      std::string OutStr;
374cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner      {
375cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner        raw_string_ostream OSS(OutStr);
376cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner
377cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner        if (ShortNames)
378cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner          OSS << Node->getNumber() << ':';
379cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner        else
380cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner          Node->print(OSS);
38176d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos      }
38271bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
38376d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos      if (OutStr[0] == '\n') OutStr.erase(OutStr.begin());
38471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
38576d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos      // Process string output to make it nicer...
38676d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos      for (unsigned i = 0; i != OutStr.length(); ++i)
38776d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos        if (OutStr[i] == '\n') {                            // Left justify
38876d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos          OutStr[i] = '\\';
38976d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos          OutStr.insert(OutStr.begin()+i+1, 'l');
39076d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos        }
39176d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos      return OutStr;
39276d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos    }
39376d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos  };
39471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos}
39571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
39671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenosvoid MachineFunction::viewCFG() const
39771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos{
398851a22db2bdbcab1768a87c4f02b5972e48db5edJim Laskey#ifndef NDEBUG
399f6ccee5a9d2b9573f679bca6266ade3eb8cd3f88Daniel Dunbar  ViewGraph(this, "mf" + getFunction()->getNameStr());
4009d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#else
40143ed267db3512823a9698f810be4e64bee227270Daniel Dunbar  errs() << "SelectionDAG::viewGraph is only available in debug builds on "
40243ed267db3512823a9698f810be4e64bee227270Daniel Dunbar         << "systems with Graphviz or gv!\n";
4039d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#endif // NDEBUG
40471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos}
40571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
40671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenosvoid MachineFunction::viewCFGOnly() const
40771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos{
4088cbc94afb71fd2da72d8f1284f7f53e39019fdecOwen Anderson#ifndef NDEBUG
409f6ccee5a9d2b9573f679bca6266ade3eb8cd3f88Daniel Dunbar  ViewGraph(this, "mf" + getFunction()->getNameStr(), true);
4108cbc94afb71fd2da72d8f1284f7f53e39019fdecOwen Anderson#else
41143ed267db3512823a9698f810be4e64bee227270Daniel Dunbar  errs() << "SelectionDAG::viewGraph is only available in debug builds on "
41243ed267db3512823a9698f810be4e64bee227270Daniel Dunbar         << "systems with Graphviz or gv!\n";
4138cbc94afb71fd2da72d8f1284f7f53e39019fdecOwen Anderson#endif // NDEBUG
41471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos}
41571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
416998e125a87d49f28c714d8223a37746850401057Bob Wilson/// addLiveIn - Add the specified physical register as a live-in value and
417998e125a87d49f28c714d8223a37746850401057Bob Wilson/// create a corresponding virtual register for it.
418998e125a87d49f28c714d8223a37746850401057Bob Wilsonunsigned MachineFunction::addLiveIn(unsigned PReg,
419998e125a87d49f28c714d8223a37746850401057Bob Wilson                                    const TargetRegisterClass *RC) {
420998e125a87d49f28c714d8223a37746850401057Bob Wilson  assert(RC->contains(PReg) && "Not the correct regclass!");
421998e125a87d49f28c714d8223a37746850401057Bob Wilson  unsigned VReg = getRegInfo().createVirtualRegister(RC);
422998e125a87d49f28c714d8223a37746850401057Bob Wilson  getRegInfo().addLiveIn(PReg, VReg);
423998e125a87d49f28c714d8223a37746850401057Bob Wilson  return VReg;
424998e125a87d49f28c714d8223a37746850401057Bob Wilson}
425998e125a87d49f28c714d8223a37746850401057Bob Wilson
42685e3af9b70cc48535b3d41049bae907335f184abBill Wendling/// getDebugLocTuple - Get the DebugLocTuple for a given DebugLoc object.
427a929c68bfcbe840bd26d336efaa80a6a275e802cBill WendlingDebugLocTuple MachineFunction::getDebugLocTuple(DebugLoc DL) const {
42844f6ac640ab5181f9da1fc3b507df4ef2e4f1fd4Bill Wendling  unsigned Idx = DL.getIndex();
42985e3af9b70cc48535b3d41049bae907335f184abBill Wendling  assert(Idx < DebugLocInfo.DebugLocations.size() &&
43085e3af9b70cc48535b3d41049bae907335f184abBill Wendling         "Invalid index into debug locations!");
43185e3af9b70cc48535b3d41049bae907335f184abBill Wendling  return DebugLocInfo.DebugLocations[Idx];
43285e3af9b70cc48535b3d41049bae907335f184abBill Wendling}
43385e3af9b70cc48535b3d41049bae907335f184abBill Wendling
434955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner//===----------------------------------------------------------------------===//
435eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner//  MachineFrameInfo implementation
436955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner//===----------------------------------------------------------------------===//
437955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner
4381612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner/// CreateFixedObject - Create a new object at a fixed location on the stack.
4391612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner/// All fixed objects should be created before other objects are created for
4401612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner/// efficiency. By default, fixed objects are immutable. This returns an
4411612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner/// index with a negative value.
4421612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner///
4431612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattnerint MachineFrameInfo::CreateFixedObject(uint64_t Size, int64_t SPOffset,
4443f2bf85d14759cc4b28a86805f566ac805a54d00David Greene                                        bool Immutable, bool isSS) {
4451612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner  assert(Size != 0 && "Cannot allocate zero size fixed stack objects!");
4463f2bf85d14759cc4b28a86805f566ac805a54d00David Greene  Objects.insert(Objects.begin(), StackObject(Size, 1, SPOffset, Immutable,
4473f2bf85d14759cc4b28a86805f566ac805a54d00David Greene                                              isSS));
4481612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner  return -++NumFixedObjects;
4491612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner}
4501612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner
4511612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner
4524a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund OlesenBitVector
4534a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund OlesenMachineFrameInfo::getPristineRegs(const MachineBasicBlock *MBB) const {
4544a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  assert(MBB && "MBB must be valid");
4554a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  const MachineFunction *MF = MBB->getParent();
4564a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  assert(MF && "MBB must be part of a MachineFunction");
4574a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  const TargetMachine &TM = MF->getTarget();
4584a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  const TargetRegisterInfo *TRI = TM.getRegisterInfo();
4594a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  BitVector BV(TRI->getNumRegs());
4604a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen
4614a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  // Before CSI is calculated, no registers are considered pristine. They can be
4624a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  // freely used and PEI will make sure they are saved.
4634a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  if (!isCalleeSavedInfoValid())
4644a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen    return BV;
4654a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen
4664a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  for (const unsigned *CSR = TRI->getCalleeSavedRegs(MF); CSR && *CSR; ++CSR)
4674a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen    BV.set(*CSR);
4684a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen
4694a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  // The entry MBB always has all CSRs pristine.
4704a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  if (MBB == &MF->front())
4714a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen    return BV;
4724a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen
4734a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  // On other MBBs the saved CSRs are not pristine.
4744a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  const std::vector<CalleeSavedInfo> &CSI = getCalleeSavedInfo();
4754a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
4764a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen         E = CSI.end(); I != E; ++I)
4774a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen    BV.reset(I->getReg());
4784a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen
4794a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  return BV;
4804a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen}
4814a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen
4824a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen
483d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattnervoid MachineFrameInfo::print(const MachineFunction &MF, raw_ostream &OS) const{
4840ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  if (Objects.empty()) return;
4850ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman
48606140888b1fed24910031f23c302c6a3221f3c42Matthijs Kooijman  const TargetFrameInfo *FI = MF.getTarget().getFrameInfo();
48706140888b1fed24910031f23c302c6a3221f3c42Matthijs Kooijman  int ValOffset = (FI ? FI->getOffsetOfLocalArea() : 0);
4889085d8a9a9000eeaa7cf337ccbdca41d528c99c2Chris Lattner
4890ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  OS << "Frame Objects:\n";
4900ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman
491955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner  for (unsigned i = 0, e = Objects.size(); i != e; ++i) {
492955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner    const StackObject &SO = Objects[i];
4930ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    OS << "  fi#" << (int)(i-NumFixedObjects) << ": ";
494d36531249a9a9500e516148e7e72d4c0a7a4d0eeEvan Cheng    if (SO.Size == ~0ULL) {
495d36531249a9a9500e516148e7e72d4c0a7a4d0eeEvan Cheng      OS << "dead\n";
496d36531249a9a9500e516148e7e72d4c0a7a4d0eeEvan Cheng      continue;
497d36531249a9a9500e516148e7e72d4c0a7a4d0eeEvan Cheng    }
498955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner    if (SO.Size == 0)
499955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner      OS << "variable sized";
500955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner    else
5010ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman      OS << "size=" << SO.Size;
5020ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    OS << ", align=" << SO.Alignment;
50376d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos
504955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner    if (i < NumFixedObjects)
5050ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman      OS << ", fixed";
506955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner    if (i < NumFixedObjects || SO.SPOffset != -1) {
507a401b1e1c5eb9563617db8a2477b4c5f8b239521Chris Lattner      int64_t Off = SO.SPOffset - ValOffset;
5080ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman      OS << ", at location [SP";
5099085d8a9a9000eeaa7cf337ccbdca41d528c99c2Chris Lattner      if (Off > 0)
51076d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos        OS << "+" << Off;
5119085d8a9a9000eeaa7cf337ccbdca41d528c99c2Chris Lattner      else if (Off < 0)
51276d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos        OS << Off;
513955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner      OS << "]";
514955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner    }
515955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner    OS << "\n";
516955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner  }
517955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner}
518955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner
5199085d8a9a9000eeaa7cf337ccbdca41d528c99c2Chris Lattnervoid MachineFrameInfo::dump(const MachineFunction &MF) const {
520d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattner  print(MF, errs());
5219085d8a9a9000eeaa7cf337ccbdca41d528c99c2Chris Lattner}
522955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner
523955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner//===----------------------------------------------------------------------===//
52437efe6764568a3829fee26aba532283131d1a104Nate Begeman//  MachineJumpTableInfo implementation
52537efe6764568a3829fee26aba532283131d1a104Nate Begeman//===----------------------------------------------------------------------===//
52637efe6764568a3829fee26aba532283131d1a104Nate Begeman
52737efe6764568a3829fee26aba532283131d1a104Nate Begeman/// getJumpTableIndex - Create a new jump table entry in the jump table info
52837efe6764568a3829fee26aba532283131d1a104Nate Begeman/// or return an existing one.
52937efe6764568a3829fee26aba532283131d1a104Nate Begeman///
53037efe6764568a3829fee26aba532283131d1a104Nate Begemanunsigned MachineJumpTableInfo::getJumpTableIndex(
531a4eb44a285984ec999de632beb5145b099f5416dChris Lattner                               const std::vector<MachineBasicBlock*> &DestBBs) {
532e7251a0377334bdb57bd188828bf89c9e3980fadChris Lattner  assert(!DestBBs.empty() && "Cannot create an empty jump table!");
53337efe6764568a3829fee26aba532283131d1a104Nate Begeman  for (unsigned i = 0, e = JumpTables.size(); i != e; ++i)
53437efe6764568a3829fee26aba532283131d1a104Nate Begeman    if (JumpTables[i].MBBs == DestBBs)
53537efe6764568a3829fee26aba532283131d1a104Nate Begeman      return i;
53637efe6764568a3829fee26aba532283131d1a104Nate Begeman
53737efe6764568a3829fee26aba532283131d1a104Nate Begeman  JumpTables.push_back(MachineJumpTableEntry(DestBBs));
53837efe6764568a3829fee26aba532283131d1a104Nate Begeman  return JumpTables.size()-1;
53937efe6764568a3829fee26aba532283131d1a104Nate Begeman}
54037efe6764568a3829fee26aba532283131d1a104Nate Begeman
541593ea05957b98472a916278d64229ceda223c50bDan Gohman/// ReplaceMBBInJumpTables - If Old is the target of any jump tables, update
542593ea05957b98472a916278d64229ceda223c50bDan Gohman/// the jump tables to branch to New instead.
543593ea05957b98472a916278d64229ceda223c50bDan Gohmanbool
544593ea05957b98472a916278d64229ceda223c50bDan GohmanMachineJumpTableInfo::ReplaceMBBInJumpTables(MachineBasicBlock *Old,
545593ea05957b98472a916278d64229ceda223c50bDan Gohman                                             MachineBasicBlock *New) {
546593ea05957b98472a916278d64229ceda223c50bDan Gohman  assert(Old != New && "Not making a change?");
547593ea05957b98472a916278d64229ceda223c50bDan Gohman  bool MadeChange = false;
54868bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach  for (size_t i = 0, e = JumpTables.size(); i != e; ++i)
54968bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach    ReplaceMBBInJumpTable(i, Old, New);
55068bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach  return MadeChange;
55168bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach}
55268bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach
55368bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach/// ReplaceMBBInJumpTable - If Old is a target of the jump tables, update
55468bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach/// the jump table to branch to New instead.
55568bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbachbool
55668bb60f6a4e0902769f72d1badda4e37cd873ffbJim GrosbachMachineJumpTableInfo::ReplaceMBBInJumpTable(unsigned Idx,
55768bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach                                            MachineBasicBlock *Old,
55868bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach                                            MachineBasicBlock *New) {
55968bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach  assert(Old != New && "Not making a change?");
56068bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach  bool MadeChange = false;
56168bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach  MachineJumpTableEntry &JTE = JumpTables[Idx];
56268bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach  for (size_t j = 0, e = JTE.MBBs.size(); j != e; ++j)
56368bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach    if (JTE.MBBs[j] == Old) {
56468bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach      JTE.MBBs[j] = New;
56568bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach      MadeChange = true;
56668bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach    }
567593ea05957b98472a916278d64229ceda223c50bDan Gohman  return MadeChange;
568593ea05957b98472a916278d64229ceda223c50bDan Gohman}
56937efe6764568a3829fee26aba532283131d1a104Nate Begeman
570d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattnervoid MachineJumpTableInfo::print(raw_ostream &OS) const {
5710ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  if (JumpTables.empty()) return;
5720ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman
5730ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  OS << "Jump Tables:\n";
5740ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman
57537efe6764568a3829fee26aba532283131d1a104Nate Begeman  for (unsigned i = 0, e = JumpTables.size(); i != e; ++i) {
5760ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    OS << "  jt#" << i << ": ";
5770ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    for (unsigned j = 0, f = JumpTables[i].MBBs.size(); j != f; ++j)
5780ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman      OS << " BB#" << JumpTables[i].MBBs[j]->getNumber();
57937efe6764568a3829fee26aba532283131d1a104Nate Begeman  }
5800ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman
5810ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  OS << '\n';
58237efe6764568a3829fee26aba532283131d1a104Nate Begeman}
58337efe6764568a3829fee26aba532283131d1a104Nate Begeman
584d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattnervoid MachineJumpTableInfo::dump() const { print(errs()); }
58537efe6764568a3829fee26aba532283131d1a104Nate Begeman
58637efe6764568a3829fee26aba532283131d1a104Nate Begeman
58737efe6764568a3829fee26aba532283131d1a104Nate Begeman//===----------------------------------------------------------------------===//
5884d149cdae1553426f49623fdae215d481d56d955Chris Lattner//  MachineConstantPool implementation
5894d149cdae1553426f49623fdae215d481d56d955Chris Lattner//===----------------------------------------------------------------------===//
5904d149cdae1553426f49623fdae215d481d56d955Chris Lattner
5919abd7c38675ad305c733b7e90578255271afc6bdEvan Chengconst Type *MachineConstantPoolEntry::getType() const {
5929abd7c38675ad305c733b7e90578255271afc6bdEvan Cheng  if (isMachineConstantPoolEntry())
593cb4596364369ea36ff5675eb12fc62d0c6f1f0ddChris Lattner    return Val.MachineCPVal->getType();
5949abd7c38675ad305c733b7e90578255271afc6bdEvan Cheng  return Val.ConstVal->getType();
5959abd7c38675ad305c733b7e90578255271afc6bdEvan Cheng}
5969abd7c38675ad305c733b7e90578255271afc6bdEvan Cheng
597cb4596364369ea36ff5675eb12fc62d0c6f1f0ddChris Lattner
598354c0165e755fd857bc89792243b82387ee3936dChris Lattnerunsigned MachineConstantPoolEntry::getRelocationInfo() const {
599cb4596364369ea36ff5675eb12fc62d0c6f1f0ddChris Lattner  if (isMachineConstantPoolEntry())
600354c0165e755fd857bc89792243b82387ee3936dChris Lattner    return Val.MachineCPVal->getRelocationInfo();
6017cf12c7efd37dc12c3ed536a3f4c373dddac2b85Chris Lattner  return Val.ConstVal->getRelocationInfo();
602cb4596364369ea36ff5675eb12fc62d0c6f1f0ddChris Lattner}
603cb4596364369ea36ff5675eb12fc62d0c6f1f0ddChris Lattner
604d6594ae54cfde4db4d30272192645c0a45fb9902Evan ChengMachineConstantPool::~MachineConstantPool() {
605d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  for (unsigned i = 0, e = Constants.size(); i != e; ++i)
606d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    if (Constants[i].isMachineConstantPoolEntry())
607d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng      delete Constants[i].Val.MachineCPVal;
608d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng}
609d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng
61083f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman/// CanShareConstantPoolEntry - Test whether the given two constants
61183f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman/// can be allocated the same constant pool entry.
61283f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohmanstatic bool CanShareConstantPoolEntry(Constant *A, Constant *B,
61383f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman                                      const TargetData *TD) {
61483f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // Handle the trivial case quickly.
61583f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  if (A == B) return true;
61683f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman
61783f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // If they have the same type but weren't the same constant, quickly
61883f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // reject them.
61983f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  if (A->getType() == B->getType()) return false;
62083f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman
62183f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // For now, only support constants with the same size.
62283f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  if (TD->getTypeStoreSize(A->getType()) != TD->getTypeStoreSize(B->getType()))
62383f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman    return false;
62483f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman
62583f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // If a floating-point value and an integer value have the same encoding,
62683f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // they can share a constant-pool entry.
62783f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  if (ConstantFP *AFP = dyn_cast<ConstantFP>(A))
62883f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman    if (ConstantInt *BI = dyn_cast<ConstantInt>(B))
62983f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman      return AFP->getValueAPF().bitcastToAPInt() == BI->getValue();
63083f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  if (ConstantFP *BFP = dyn_cast<ConstantFP>(B))
63183f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman    if (ConstantInt *AI = dyn_cast<ConstantInt>(A))
63283f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman      return BFP->getValueAPF().bitcastToAPInt() == AI->getValue();
63383f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman
63483f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // Two vectors can share an entry if each pair of corresponding
63583f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // elements could.
63683f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  if (ConstantVector *AV = dyn_cast<ConstantVector>(A))
63783f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman    if (ConstantVector *BV = dyn_cast<ConstantVector>(B)) {
63883f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman      if (AV->getType()->getNumElements() != BV->getType()->getNumElements())
63983f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman        return false;
64083f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman      for (unsigned i = 0, e = AV->getType()->getNumElements(); i != e; ++i)
64160d686df5471f7156a6b8afa5859346272216c56Dan Gohman        if (!CanShareConstantPoolEntry(AV->getOperand(i),
64260d686df5471f7156a6b8afa5859346272216c56Dan Gohman                                       BV->getOperand(i), TD))
64383f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman          return false;
64483f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman      return true;
64583f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman    }
64683f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman
64783f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // TODO: Handle other cases.
64883f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman
64983f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  return false;
65083f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman}
65183f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman
6523029f920519e0871a5aad5d7c592281093953733Chris Lattner/// getConstantPoolIndex - Create a new entry in the constant pool or return
65305ae98346a190d74c2c8799c3af2f8ca23e47c27Dan Gohman/// an existing one.  User must specify the log2 of the minimum required
65405ae98346a190d74c2c8799c3af2f8ca23e47c27Dan Gohman/// alignment for the object.
6553029f920519e0871a5aad5d7c592281093953733Chris Lattner///
6563029f920519e0871a5aad5d7c592281093953733Chris Lattnerunsigned MachineConstantPool::getConstantPoolIndex(Constant *C,
6573029f920519e0871a5aad5d7c592281093953733Chris Lattner                                                   unsigned Alignment) {
6583029f920519e0871a5aad5d7c592281093953733Chris Lattner  assert(Alignment && "Alignment must be specified!");
6593029f920519e0871a5aad5d7c592281093953733Chris Lattner  if (Alignment > PoolAlignment) PoolAlignment = Alignment;
66083f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman
6613029f920519e0871a5aad5d7c592281093953733Chris Lattner  // Check to see if we already have this constant.
6623029f920519e0871a5aad5d7c592281093953733Chris Lattner  //
6633029f920519e0871a5aad5d7c592281093953733Chris Lattner  // FIXME, this could be made much more efficient for large constant pools.
6643029f920519e0871a5aad5d7c592281093953733Chris Lattner  for (unsigned i = 0, e = Constants.size(); i != e; ++i)
66583f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman    if (!Constants[i].isMachineConstantPoolEntry() &&
66683f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman        CanShareConstantPoolEntry(Constants[i].Val.ConstVal, C, TD)) {
66783f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman      if ((unsigned)Constants[i].getAlignment() < Alignment)
66883f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman        Constants[i].Alignment = Alignment;
6693029f920519e0871a5aad5d7c592281093953733Chris Lattner      return i;
67083f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman    }
6713029f920519e0871a5aad5d7c592281093953733Chris Lattner
6721606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng  Constants.push_back(MachineConstantPoolEntry(C, Alignment));
6733029f920519e0871a5aad5d7c592281093953733Chris Lattner  return Constants.size()-1;
6743029f920519e0871a5aad5d7c592281093953733Chris Lattner}
6753029f920519e0871a5aad5d7c592281093953733Chris Lattner
676d6594ae54cfde4db4d30272192645c0a45fb9902Evan Chengunsigned MachineConstantPool::getConstantPoolIndex(MachineConstantPoolValue *V,
677d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng                                                   unsigned Alignment) {
678d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  assert(Alignment && "Alignment must be specified!");
679d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  if (Alignment > PoolAlignment) PoolAlignment = Alignment;
680d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng
681d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  // Check to see if we already have this constant.
682d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  //
683d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  // FIXME, this could be made much more efficient for large constant pools.
684d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  int Idx = V->getExistingMachineCPValue(this, Alignment);
685d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  if (Idx != -1)
686d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    return (unsigned)Idx;
6871606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng
6881606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng  Constants.push_back(MachineConstantPoolEntry(V, Alignment));
689d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  return Constants.size()-1;
690d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng}
691d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng
69262ca32540f950d500227f1863b95cd08ad28099eChris Lattnervoid MachineConstantPool::print(raw_ostream &OS) const {
6930ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  if (Constants.empty()) return;
6940ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman
6950ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  OS << "Constant Pool:\n";
696b8973bd8f50d7321635e1e07b81a880a0828d185Evan Cheng  for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
6970ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    OS << "  cp#" << i << ": ";
698d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    if (Constants[i].isMachineConstantPoolEntry())
699d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng      Constants[i].Val.MachineCPVal->print(OS);
700d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    else
701d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng      OS << *(Value*)Constants[i].Val.ConstVal;
7020ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    OS << ", align=" << Constants[i].getAlignment();
703b8973bd8f50d7321635e1e07b81a880a0828d185Evan Cheng    OS << "\n";
704b8973bd8f50d7321635e1e07b81a880a0828d185Evan Cheng  }
7054d149cdae1553426f49623fdae215d481d56d955Chris Lattner}
7064d149cdae1553426f49623fdae215d481d56d955Chris Lattner
707f871ccb853a2ccbe8675c912330c041b318be8cdDan Gohmanvoid MachineConstantPool::dump() const { print(errs()); }
708