MachineFunction.cpp revision db125cfaf57cc83e7dd7453de2d509bc8efd0e5e
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/Config/config.h"
2084bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner#include "llvm/CodeGen/MachineConstantPool.h"
21098612b0e8b864d6db82bb10b633d630cccd8562David Greene#include "llvm/CodeGen/MachineFunction.h"
2216c45e9de896ea37d48d093dbe02fc9a4c1b9f8fChris Lattner#include "llvm/CodeGen/MachineFunctionPass.h"
23eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner#include "llvm/CodeGen/MachineFrameInfo.h"
2484bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner#include "llvm/CodeGen/MachineInstr.h"
2537efe6764568a3829fee26aba532283131d1a104Nate Begeman#include "llvm/CodeGen/MachineJumpTableInfo.h"
26820e55e9ad3cb3b17780e84863648e431b571d25Chris Lattner#include "llvm/CodeGen/MachineModuleInfo.h"
2784bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner#include "llvm/CodeGen/MachineRegisterInfo.h"
2816c45e9de896ea37d48d093dbe02fc9a4c1b9f8fChris Lattner#include "llvm/CodeGen/Passes.h"
29beeb93e6ba48af2661eabc4872d8b159fb43e5dbChris Lattner#include "llvm/MC/MCAsmInfo.h"
30beeb93e6ba48af2661eabc4872d8b159fb43e5dbChris Lattner#include "llvm/MC/MCContext.h"
31c99fd879c0f4bbc56c29d508fec7935e6cbd7ed0Devang Patel#include "llvm/Analysis/DebugInfo.h"
32dc55481841d5ac060c279a61c944f192ad9bb23eDavid Greene#include "llvm/Support/Debug.h"
3307000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Anderson#include "llvm/Target/TargetData.h"
3420c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling#include "llvm/Target/TargetLowering.h"
35f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner#include "llvm/Target/TargetMachine.h"
3616c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#include "llvm/Target/TargetFrameLowering.h"
37beeb93e6ba48af2661eabc4872d8b159fb43e5dbChris Lattner#include "llvm/ADT/SmallString.h"
38beeb93e6ba48af2661eabc4872d8b159fb43e5dbChris Lattner#include "llvm/ADT/STLExtras.h"
39f28bbda2c6c965dbd28e73e06c9e09231a77b0dcChris Lattner#include "llvm/Support/GraphWriter.h"
40944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner#include "llvm/Support/raw_ostream.h"
4107f32d48f1e16bcdc621985549548a5849215238Chris Lattnerusing namespace llvm;
42f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner
43b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner//===----------------------------------------------------------------------===//
44227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner// MachineFunction implementation
45b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner//===----------------------------------------------------------------------===//
469d5d7598db72c00a0fb89dc77198e4f6ebc5294dChris Lattner
47a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris Lattner// Out of line virtual method.
48a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris LattnerMachineFunctionInfo::~MachineFunctionInfo() {}
49a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris Lattner
50fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanvoid ilist_traits<MachineBasicBlock>::deleteNode(MachineBasicBlock *MBB) {
518e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MBB->getParent()->DeleteMachineBasicBlock(MBB);
52792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner}
53227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner
54ae541aad5c36cb3e4256514447d1f81e253079c7Dan GohmanMachineFunction::MachineFunction(const Function *F, const TargetMachine &TM,
557a5a3f75eb6751c35682f506887c34bf57d6ea3eNicolas Geoffray                                 unsigned FunctionNum, MachineModuleInfo &mmi,
567a5a3f75eb6751c35682f506887c34bf57d6ea3eNicolas Geoffray                                 GCModuleInfo* gmi)
577a5a3f75eb6751c35682f506887c34bf57d6ea3eNicolas Geoffray  : Fn(F), Target(TM), Ctx(mmi.getContext()), MMI(mmi), GMI(gmi) {
58e2b997b7b5360b4793c524a801e988fd37b80b93Matthijs Kooijman  if (TM.getRegisterInfo())
599553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman    RegInfo = new (Allocator) MachineRegisterInfo(*TM.getRegisterInfo());
60e2b997b7b5360b4793c524a801e988fd37b80b93Matthijs Kooijman  else
61e2b997b7b5360b4793c524a801e988fd37b80b93Matthijs Kooijman    RegInfo = 0;
62ad8281607f066c2cce5c3625009d8ee0761dbf35Chris Lattner  MFInfo = 0;
6316c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov  FrameInfo = new (Allocator) MachineFrameInfo(*TM.getFrameLowering());
645dfa26795da9c521babd598ef911e6d95bd20d37Charles Davis  if (Fn->hasFnAttr(Attribute::StackAlignment))
655dfa26795da9c521babd598ef911e6d95bd20d37Charles Davis    FrameInfo->setMaxAlignment(Attribute::getStackAlignmentFromAttrs(
665dfa26795da9c521babd598ef911e6d95bd20d37Charles Davis        Fn->getAttributes().getFnAttributes()));
679553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman  ConstantPool = new (Allocator) MachineConstantPool(TM.getTargetData());
68fc5d305597ea6336d75bd7f3b741e8d57d6a5105Eli Friedman  Alignment = TM.getTargetLowering()->getMinFunctionAlignment();
69fc5d305597ea6336d75bd7f3b741e8d57d6a5105Eli Friedman  // FIXME: Shouldn't use pref alignment if explicit alignment is set on Fn.
70fc5d305597ea6336d75bd7f3b741e8d57d6a5105Eli Friedman  if (!Fn->hasFnAttr(Attribute::OptimizeForSize))
71fc5d305597ea6336d75bd7f3b741e8d57d6a5105Eli Friedman    Alignment = std::max(Alignment,
72fc5d305597ea6336d75bd7f3b741e8d57d6a5105Eli Friedman                         TM.getTargetLowering()->getPrefFunctionAlignment());
73b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner  FunctionNumber = FunctionNum;
74071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  JumpTableInfo = 0;
75831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattner}
76831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattner
7776d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis EvlogimenosMachineFunction::~MachineFunction() {
784b9a4006748b8d72a04504a5fc1f5daa73bf69f9Chris Lattner  BasicBlocks.clear();
798e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  InstructionRecycler.clear(Allocator);
808e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  BasicBlockRecycler.clear(Allocator);
81dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling  if (RegInfo) {
82dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling    RegInfo->~MachineRegisterInfo();
83dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling    Allocator.Deallocate(RegInfo);
84dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling  }
858e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  if (MFInfo) {
86dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling    MFInfo->~MachineFunctionInfo();
87dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling    Allocator.Deallocate(MFInfo);
888e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  }
898e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  FrameInfo->~MachineFrameInfo();         Allocator.Deallocate(FrameInfo);
908e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  ConstantPool->~MachineConstantPool();   Allocator.Deallocate(ConstantPool);
91071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner
92071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  if (JumpTableInfo) {
93071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner    JumpTableInfo->~MachineJumpTableInfo();
94071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner    Allocator.Deallocate(JumpTableInfo);
95071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  }
961049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner}
971049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
98071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner/// getOrCreateJumpTableInfo - Get the JumpTableInfo for this function, if it
99071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner/// does already exist, allocate one.
100071c62fad0b25ad4131e7f984173a796c1e63f61Chris LattnerMachineJumpTableInfo *MachineFunction::
101071c62fad0b25ad4131e7f984173a796c1e63f61Chris LattnergetOrCreateJumpTableInfo(unsigned EntryKind) {
102071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  if (JumpTableInfo) return JumpTableInfo;
103071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner
1049553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman  JumpTableInfo = new (Allocator)
105071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner    MachineJumpTableInfo((MachineJumpTableInfo::JTEntryKind)EntryKind);
106071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  return JumpTableInfo;
107071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner}
108e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
109e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner/// RenumberBlocks - This discards all of the MachineBasicBlock numbers and
110e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner/// recomputes them.  This guarantees that the MBB numbers are sequential,
111e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner/// dense, and match the ordering of the blocks within the function.  If a
112e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner/// specific MachineBasicBlock is specified, only that block and those after
113e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner/// it are renumbered.
114e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattnervoid MachineFunction::RenumberBlocks(MachineBasicBlock *MBB) {
115e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  if (empty()) { MBBNumbering.clear(); return; }
116e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  MachineFunction::iterator MBBI, E = end();
117e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  if (MBB == 0)
118e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner    MBBI = begin();
119e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  else
120e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner    MBBI = MBB;
121e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
122e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  // Figure out the block number this should have.
123e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  unsigned BlockNo = 0;
124f28bbda2c6c965dbd28e73e06c9e09231a77b0dcChris Lattner  if (MBBI != begin())
125f28bbda2c6c965dbd28e73e06c9e09231a77b0dcChris Lattner    BlockNo = prior(MBBI)->getNumber()+1;
126e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
127e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  for (; MBBI != E; ++MBBI, ++BlockNo) {
128e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner    if (MBBI->getNumber() != (int)BlockNo) {
129e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner      // Remove use of the old number.
130e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner      if (MBBI->getNumber() != -1) {
131e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner        assert(MBBNumbering[MBBI->getNumber()] == &*MBBI &&
132e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner               "MBB number mismatch!");
133e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner        MBBNumbering[MBBI->getNumber()] = 0;
134e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner      }
135e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
136e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner      // If BlockNo is already taken, set that block's number to -1.
137e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner      if (MBBNumbering[BlockNo])
138e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner        MBBNumbering[BlockNo]->setNumber(-1);
139e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
140e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner      MBBNumbering[BlockNo] = MBBI;
141e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner      MBBI->setNumber(BlockNo);
142e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner    }
143e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  }
144e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
145e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  // Okay, all the blocks are renumbered.  If we have compactified the block
146e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  // numbering, shrink MBBNumbering now.
147e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  assert(BlockNo <= MBBNumbering.size() && "Mismatch!");
148e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  MBBNumbering.resize(BlockNo);
149e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner}
150e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
1518e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// CreateMachineInstr - Allocate a new MachineInstr. Use this instead
1528e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// of `new MachineInstr'.
1538e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman///
1548e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineInstr *
155e837dead3c8dc3445ef6a0e2322179c57e264a13Evan ChengMachineFunction::CreateMachineInstr(const MCInstrDesc &MCID,
1569bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling                                    DebugLoc DL, bool NoImp) {
1578e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
158e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng    MachineInstr(MCID, DL, NoImp);
1598e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman}
1608e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
1618e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// CloneMachineInstr - Create a new MachineInstr which is a copy of the
162f451cb870efcf9e0302d25ed05f4cac6bb494e42Dan Gohman/// 'Orig' instruction, identical in all ways except the instruction
1638e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// has no parent, prev, or next.
1648e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman///
1658e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineInstr *
1668e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineFunction::CloneMachineInstr(const MachineInstr *Orig) {
1678e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
1688e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman             MachineInstr(*this, *Orig);
1698e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman}
1708e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
1718e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// DeleteMachineInstr - Delete the given MachineInstr.
1728e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman///
1738e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmanvoid
1748e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineFunction::DeleteMachineInstr(MachineInstr *MI) {
1758e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MI->~MachineInstr();
1768e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  InstructionRecycler.Deallocate(Allocator, MI);
1778e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman}
1788e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
1798e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// CreateMachineBasicBlock - Allocate a new MachineBasicBlock. Use this
1808e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// instead of `new MachineBasicBlock'.
1818e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman///
1828e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineBasicBlock *
1838e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineFunction::CreateMachineBasicBlock(const BasicBlock *bb) {
1848e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  return new (BasicBlockRecycler.Allocate<MachineBasicBlock>(Allocator))
1858e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman             MachineBasicBlock(*this, bb);
1868e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman}
187e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
1888e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// DeleteMachineBasicBlock - Delete the given MachineBasicBlock.
1898e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman///
1908e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmanvoid
1918e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineFunction::DeleteMachineBasicBlock(MachineBasicBlock *MBB) {
1928e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  assert(MBB->getParent() == this && "MBB parent mismatch!");
1938e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MBB->~MachineBasicBlock();
1948e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  BasicBlockRecycler.Deallocate(Allocator, MBB);
1958e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman}
1968e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
197c76909abfec876c6b751d693ebd3df07df686aa0Dan GohmanMachineMemOperand *
198da39c3964423744b4d79aebef8bece3e9141d5fcChris LattnerMachineFunction::getMachineMemOperand(MachinePointerInfo PtrInfo, unsigned f,
199f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                                      uint64_t s, unsigned base_alignment,
200f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                                      const MDNode *TBAAInfo) {
201f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman  return new (Allocator) MachineMemOperand(PtrInfo, f, s, base_alignment,
202f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                                           TBAAInfo);
203c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman}
204c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
205c76909abfec876c6b751d693ebd3df07df686aa0Dan GohmanMachineMemOperand *
206c76909abfec876c6b751d693ebd3df07df686aa0Dan GohmanMachineFunction::getMachineMemOperand(const MachineMemOperand *MMO,
207c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                                      int64_t Offset, uint64_t Size) {
2089553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman  return new (Allocator)
209da39c3964423744b4d79aebef8bece3e9141d5fcChris Lattner             MachineMemOperand(MachinePointerInfo(MMO->getValue(),
210da39c3964423744b4d79aebef8bece3e9141d5fcChris Lattner                                                  MMO->getOffset()+Offset),
211f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                               MMO->getFlags(), Size,
212f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                               MMO->getBaseAlignment(), 0);
213c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman}
214c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
215c76909abfec876c6b751d693ebd3df07df686aa0Dan GohmanMachineInstr::mmo_iterator
216c76909abfec876c6b751d693ebd3df07df686aa0Dan GohmanMachineFunction::allocateMemRefsArray(unsigned long Num) {
217c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  return Allocator.Allocate<MachineMemOperand *>(Num);
218c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman}
219c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
22091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohmanstd::pair<MachineInstr::mmo_iterator, MachineInstr::mmo_iterator>
22191e69c37153eb7d8cd149d9c2484c3115027b90fDan GohmanMachineFunction::extractLoadMemRefs(MachineInstr::mmo_iterator Begin,
22291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman                                    MachineInstr::mmo_iterator End) {
22391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  // Count the number of load mem refs.
22491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  unsigned Num = 0;
22591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  for (MachineInstr::mmo_iterator I = Begin; I != End; ++I)
22691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman    if ((*I)->isLoad())
22791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      ++Num;
22891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman
22991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  // Allocate a new array and populate it with the load information.
23091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  MachineInstr::mmo_iterator Result = allocateMemRefsArray(Num);
23191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  unsigned Index = 0;
23291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  for (MachineInstr::mmo_iterator I = Begin; I != End; ++I) {
23391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman    if ((*I)->isLoad()) {
23491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      if (!(*I)->isStore())
23591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        // Reuse the MMO.
23691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        Result[Index] = *I;
23791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      else {
23891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        // Clone the MMO and unset the store flag.
23991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        MachineMemOperand *JustLoad =
24093a95ae8a9d8eb19dc0d90281473be2fb1c05a17Chris Lattner          getMachineMemOperand((*I)->getPointerInfo(),
24191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman                               (*I)->getFlags() & ~MachineMemOperand::MOStore,
242f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                               (*I)->getSize(), (*I)->getBaseAlignment(),
243f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                               (*I)->getTBAAInfo());
24491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        Result[Index] = JustLoad;
24591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      }
24691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      ++Index;
24791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman    }
24891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  }
24991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  return std::make_pair(Result, Result + Num);
25091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman}
25191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman
25291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohmanstd::pair<MachineInstr::mmo_iterator, MachineInstr::mmo_iterator>
25391e69c37153eb7d8cd149d9c2484c3115027b90fDan GohmanMachineFunction::extractStoreMemRefs(MachineInstr::mmo_iterator Begin,
25491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman                                     MachineInstr::mmo_iterator End) {
25591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  // Count the number of load mem refs.
25691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  unsigned Num = 0;
25791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  for (MachineInstr::mmo_iterator I = Begin; I != End; ++I)
25891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman    if ((*I)->isStore())
25991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      ++Num;
26091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman
26191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  // Allocate a new array and populate it with the store information.
26291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  MachineInstr::mmo_iterator Result = allocateMemRefsArray(Num);
26391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  unsigned Index = 0;
26491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  for (MachineInstr::mmo_iterator I = Begin; I != End; ++I) {
26591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman    if ((*I)->isStore()) {
26691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      if (!(*I)->isLoad())
26791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        // Reuse the MMO.
26891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        Result[Index] = *I;
26991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      else {
27091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        // Clone the MMO and unset the load flag.
27191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        MachineMemOperand *JustStore =
27293a95ae8a9d8eb19dc0d90281473be2fb1c05a17Chris Lattner          getMachineMemOperand((*I)->getPointerInfo(),
27391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman                               (*I)->getFlags() & ~MachineMemOperand::MOLoad,
274f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                               (*I)->getSize(), (*I)->getBaseAlignment(),
275f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                               (*I)->getTBAAInfo());
27691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman        Result[Index] = JustStore;
27791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      }
27891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman      ++Index;
27991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman    }
28091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  }
28191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  return std::make_pair(Result, Result + Num);
28291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman}
28391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman
2848e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmanvoid MachineFunction::dump() const {
285dc55481841d5ac060c279a61c944f192ad9bb23eDavid Greene  print(dbgs());
2868e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman}
2871049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
288f4a1e1a69f0727762a73ef0d551e3bbd16b7c04eJakob Stoklund Olesenvoid MachineFunction::print(raw_ostream &OS, SlotIndexes *Indexes) const {
2890ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  OS << "# Machine code for function " << Fn->getName() << ":\n";
290955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner
291955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner  // Print Frame Information
2928e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  FrameInfo->print(*this, OS);
29337efe6764568a3829fee26aba532283131d1a104Nate Begeman
29437efe6764568a3829fee26aba532283131d1a104Nate Begeman  // Print JumpTable Information
295071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  if (JumpTableInfo)
296071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner    JumpTableInfo->print(OS);
2974d149cdae1553426f49623fdae215d481d56d955Chris Lattner
2984d149cdae1553426f49623fdae215d481d56d955Chris Lattner  // Print Constant Pool
299d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattner  ConstantPool->print(OS);
300a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner
3016f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman  const TargetRegisterInfo *TRI = getTarget().getRegisterInfo();
302a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner
303e2b997b7b5360b4793c524a801e988fd37b80b93Matthijs Kooijman  if (RegInfo && !RegInfo->livein_empty()) {
3040ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    OS << "Function Live Ins: ";
30584bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner    for (MachineRegisterInfo::livein_iterator
30684bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner         I = RegInfo->livein_begin(), E = RegInfo->livein_end(); I != E; ++I) {
307e2f669fb3fa7a6bee4196999b119a98f31c072a3Jakob Stoklund Olesen      OS << PrintReg(I->first, TRI);
3084e92027837136233db0fc1c1a4fa2bc456d74de3Chris Lattner      if (I->second)
309e2f669fb3fa7a6bee4196999b119a98f31c072a3Jakob Stoklund Olesen        OS << " in " << PrintReg(I->second, TRI);
3107896c9f436a4eda5ec15e882a7505ba482a2fcd0Chris Lattner      if (llvm::next(I) != E)
3110ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman        OS << ", ";
312a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner    }
313d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattner    OS << '\n';
314a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner  }
315e2b997b7b5360b4793c524a801e988fd37b80b93Matthijs Kooijman  if (RegInfo && !RegInfo->liveout_empty()) {
316e2f669fb3fa7a6bee4196999b119a98f31c072a3Jakob Stoklund Olesen    OS << "Function Live Outs:";
31784bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner    for (MachineRegisterInfo::liveout_iterator
318e2f669fb3fa7a6bee4196999b119a98f31c072a3Jakob Stoklund Olesen         I = RegInfo->liveout_begin(), E = RegInfo->liveout_end(); I != E; ++I)
319e2f669fb3fa7a6bee4196999b119a98f31c072a3Jakob Stoklund Olesen      OS << ' ' << PrintReg(*I, TRI);
320d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattner    OS << '\n';
321a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner  }
322a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner
3230ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  for (const_iterator BB = begin(), E = end(); BB != E; ++BB) {
3240ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    OS << '\n';
325f4a1e1a69f0727762a73ef0d551e3bbd16b7c04eJakob Stoklund Olesen    BB->print(OS, Indexes);
3260ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  }
32747b716483ef2d057c8a0015af20685755e606d0dBrian Gaeke
3280ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  OS << "\n# End machine code for function " << Fn->getName() << ".\n\n";
3291049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner}
3301049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
33171bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenosnamespace llvm {
33276d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos  template<>
33376d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos  struct DOTGraphTraits<const MachineFunction*> : public DefaultDOTGraphTraits {
334a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser
335a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser  DOTGraphTraits (bool isSimple=false) : DefaultDOTGraphTraits(isSimple) {}
336a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser
33776d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos    static std::string getGraphName(const MachineFunction *F) {
338f6ccee5a9d2b9573f679bca6266ade3eb8cd3f88Daniel Dunbar      return "CFG for '" + F->getFunction()->getNameStr() + "' function";
33976d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos    }
34071bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
34156f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser    std::string getNodeLabel(const MachineBasicBlock *Node,
34256f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser                             const MachineFunction *Graph) {
343cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner      std::string OutStr;
344cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner      {
345cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner        raw_string_ostream OSS(OutStr);
346e5f4e9fb2be8525a8ca16bd4719665ed7402b55bJakob Stoklund Olesen
347e5f4e9fb2be8525a8ca16bd4719665ed7402b55bJakob Stoklund Olesen        if (isSimple()) {
348e5f4e9fb2be8525a8ca16bd4719665ed7402b55bJakob Stoklund Olesen          OSS << "BB#" << Node->getNumber();
349e5f4e9fb2be8525a8ca16bd4719665ed7402b55bJakob Stoklund Olesen          if (const BasicBlock *BB = Node->getBasicBlock())
350e5f4e9fb2be8525a8ca16bd4719665ed7402b55bJakob Stoklund Olesen            OSS << ": " << BB->getName();
351e5f4e9fb2be8525a8ca16bd4719665ed7402b55bJakob Stoklund Olesen        } else
352cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner          Node->print(OSS);
35376d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos      }
35471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
35576d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos      if (OutStr[0] == '\n') OutStr.erase(OutStr.begin());
35671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
35776d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos      // Process string output to make it nicer...
35876d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos      for (unsigned i = 0; i != OutStr.length(); ++i)
35976d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos        if (OutStr[i] == '\n') {                            // Left justify
36076d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos          OutStr[i] = '\\';
36176d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos          OutStr.insert(OutStr.begin()+i+1, 'l');
36276d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos        }
36376d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos      return OutStr;
36476d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos    }
36576d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos  };
36671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos}
36771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
36871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenosvoid MachineFunction::viewCFG() const
36971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos{
370851a22db2bdbcab1768a87c4f02b5972e48db5edJim Laskey#ifndef NDEBUG
371f6ccee5a9d2b9573f679bca6266ade3eb8cd3f88Daniel Dunbar  ViewGraph(this, "mf" + getFunction()->getNameStr());
3729d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#else
373643fffe429cc467584c795f6177741944729e0a5Dan Gohman  errs() << "MachineFunction::viewCFG is only available in debug builds on "
37443ed267db3512823a9698f810be4e64bee227270Daniel Dunbar         << "systems with Graphviz or gv!\n";
3759d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#endif // NDEBUG
37671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos}
37771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
37871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenosvoid MachineFunction::viewCFGOnly() const
37971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos{
3808cbc94afb71fd2da72d8f1284f7f53e39019fdecOwen Anderson#ifndef NDEBUG
381f6ccee5a9d2b9573f679bca6266ade3eb8cd3f88Daniel Dunbar  ViewGraph(this, "mf" + getFunction()->getNameStr(), true);
3828cbc94afb71fd2da72d8f1284f7f53e39019fdecOwen Anderson#else
383643fffe429cc467584c795f6177741944729e0a5Dan Gohman  errs() << "MachineFunction::viewCFGOnly is only available in debug builds on "
38443ed267db3512823a9698f810be4e64bee227270Daniel Dunbar         << "systems with Graphviz or gv!\n";
3858cbc94afb71fd2da72d8f1284f7f53e39019fdecOwen Anderson#endif // NDEBUG
38671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos}
38771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
388998e125a87d49f28c714d8223a37746850401057Bob Wilson/// addLiveIn - Add the specified physical register as a live-in value and
389998e125a87d49f28c714d8223a37746850401057Bob Wilson/// create a corresponding virtual register for it.
390998e125a87d49f28c714d8223a37746850401057Bob Wilsonunsigned MachineFunction::addLiveIn(unsigned PReg,
39168e6beeccc0b9ac2e8d3687a8a5b7d4b172edca1Devang Patel                                    const TargetRegisterClass *RC) {
3923946043a80a043b3cf43b34bf068feaadc46485bEvan Cheng  MachineRegisterInfo &MRI = getRegInfo();
3933946043a80a043b3cf43b34bf068feaadc46485bEvan Cheng  unsigned VReg = MRI.getLiveInVirtReg(PReg);
3943946043a80a043b3cf43b34bf068feaadc46485bEvan Cheng  if (VReg) {
3953946043a80a043b3cf43b34bf068feaadc46485bEvan Cheng    assert(MRI.getRegClass(VReg) == RC && "Register class mismatch!");
3963946043a80a043b3cf43b34bf068feaadc46485bEvan Cheng    return VReg;
3973946043a80a043b3cf43b34bf068feaadc46485bEvan Cheng  }
3983946043a80a043b3cf43b34bf068feaadc46485bEvan Cheng  VReg = MRI.createVirtualRegister(RC);
3993946043a80a043b3cf43b34bf068feaadc46485bEvan Cheng  MRI.addLiveIn(PReg, VReg);
400998e125a87d49f28c714d8223a37746850401057Bob Wilson  return VReg;
401998e125a87d49f28c714d8223a37746850401057Bob Wilson}
402998e125a87d49f28c714d8223a37746850401057Bob Wilson
403589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner/// getJTISymbol - Return the MCSymbol for the specified non-empty jump table.
40407d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling/// If isLinkerPrivate is specified, an 'l' label is returned, otherwise a
40507d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling/// normal 'L' label is returned.
40607d317711781d8c9268f7d6afcf1ba7eadf1d127Bill WendlingMCSymbol *MachineFunction::getJTISymbol(unsigned JTI, MCContext &Ctx,
40707d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling                                        bool isLinkerPrivate) const {
408589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner  assert(JumpTableInfo && "No jump tables");
409589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner
410de4c08008a10aba59171c56086d96c760990a4cbChandler Carruth  assert(JTI < JumpTableInfo->getJumpTables().size() && "Invalid JTI!");
411589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner  const MCAsmInfo &MAI = *getTarget().getMCAsmInfo();
412589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner
41307d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling  const char *Prefix = isLinkerPrivate ? MAI.getLinkerPrivateGlobalPrefix() :
41407d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling                                         MAI.getPrivateGlobalPrefix();
415589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner  SmallString<60> Name;
416589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner  raw_svector_ostream(Name)
417589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner    << Prefix << "JTI" << getFunctionNumber() << '_' << JTI;
4189b97a73dedf736e14b04a3d1a153f10d25b2507bChris Lattner  return Ctx.GetOrCreateSymbol(Name.str());
419589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner}
420589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner
421142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner/// getPICBaseSymbol - Return a function-local symbol to represent the PIC
422142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner/// base.
423142b531e024c7b814df74951b378b9e3e11d0d42Chris LattnerMCSymbol *MachineFunction::getPICBaseSymbol() const {
424142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner  const MCAsmInfo &MAI = *Target.getMCAsmInfo();
425142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner  return Ctx.GetOrCreateSymbol(Twine(MAI.getPrivateGlobalPrefix())+
426142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner                               Twine(getFunctionNumber())+"$pb");
427142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner}
428589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner
429955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner//===----------------------------------------------------------------------===//
430eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner//  MachineFrameInfo implementation
431955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner//===----------------------------------------------------------------------===//
432955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner
4331612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner/// CreateFixedObject - Create a new object at a fixed location on the stack.
4341612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner/// All fixed objects should be created before other objects are created for
4351612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner/// efficiency. By default, fixed objects are immutable. This returns an
4361612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner/// index with a negative value.
4371612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner///
4381612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattnerint MachineFrameInfo::CreateFixedObject(uint64_t Size, int64_t SPOffset,
439ed2ae136d29dd36122d2476801e7d7a86e8301e3Evan Cheng                                        bool Immutable) {
4401612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner  assert(Size != 0 && "Cannot allocate zero size fixed stack objects!");
441f2f490368797fff899e8025133f10c37e3a2ebe5Evan Cheng  // The alignment of the frame index can be determined from its offset from
442f2f490368797fff899e8025133f10c37e3a2ebe5Evan Cheng  // the incoming frame position.  If the frame object is at offset 32 and
443f2f490368797fff899e8025133f10c37e3a2ebe5Evan Cheng  // the stack is guaranteed to be 16-byte aligned, then we know that the
444f2f490368797fff899e8025133f10c37e3a2ebe5Evan Cheng  // object is 16-byte aligned.
445f2f490368797fff899e8025133f10c37e3a2ebe5Evan Cheng  unsigned StackAlign = TFI.getStackAlignment();
446f2f490368797fff899e8025133f10c37e3a2ebe5Evan Cheng  unsigned Align = MinAlign(SPOffset, StackAlign);
447f2f490368797fff899e8025133f10c37e3a2ebe5Evan Cheng  Objects.insert(Objects.begin(), StackObject(Size, Align, SPOffset, Immutable,
448dfc2c51d12fd53822279b6e564cdd5cef5c00b46Bill Wendling                                              /*isSS*/false, false));
4491612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner  return -++NumFixedObjects;
4501612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner}
4511612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner
4521612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner
4534a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund OlesenBitVector
4544a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund OlesenMachineFrameInfo::getPristineRegs(const MachineBasicBlock *MBB) const {
4554a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  assert(MBB && "MBB must be valid");
4564a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  const MachineFunction *MF = MBB->getParent();
4574a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  assert(MF && "MBB must be part of a MachineFunction");
4584a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  const TargetMachine &TM = MF->getTarget();
4594a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  const TargetRegisterInfo *TRI = TM.getRegisterInfo();
4604a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  BitVector BV(TRI->getNumRegs());
4614a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen
4624a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  // Before CSI is calculated, no registers are considered pristine. They can be
4634a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  // freely used and PEI will make sure they are saved.
4644a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  if (!isCalleeSavedInfoValid())
4654a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen    return BV;
4664a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen
4674a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  for (const unsigned *CSR = TRI->getCalleeSavedRegs(MF); CSR && *CSR; ++CSR)
4684a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen    BV.set(*CSR);
4694a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen
4704a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  // The entry MBB always has all CSRs pristine.
4714a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  if (MBB == &MF->front())
4724a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen    return BV;
4734a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen
4744a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  // On other MBBs the saved CSRs are not pristine.
4754a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  const std::vector<CalleeSavedInfo> &CSI = getCalleeSavedInfo();
4764a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
4774a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen         E = CSI.end(); I != E; ++I)
4784a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen    BV.reset(I->getReg());
4794a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen
4804a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen  return BV;
4814a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen}
4824a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen
4834a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen
484d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattnervoid MachineFrameInfo::print(const MachineFunction &MF, raw_ostream &OS) const{
4850ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  if (Objects.empty()) return;
4860ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman
48716c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov  const TargetFrameLowering *FI = MF.getTarget().getFrameLowering();
48806140888b1fed24910031f23c302c6a3221f3c42Matthijs Kooijman  int ValOffset = (FI ? FI->getOffsetOfLocalArea() : 0);
4899085d8a9a9000eeaa7cf337ccbdca41d528c99c2Chris Lattner
4900ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  OS << "Frame Objects:\n";
4910ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman
492955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner  for (unsigned i = 0, e = Objects.size(); i != e; ++i) {
493955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner    const StackObject &SO = Objects[i];
4940ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    OS << "  fi#" << (int)(i-NumFixedObjects) << ": ";
495d36531249a9a9500e516148e7e72d4c0a7a4d0eeEvan Cheng    if (SO.Size == ~0ULL) {
496d36531249a9a9500e516148e7e72d4c0a7a4d0eeEvan Cheng      OS << "dead\n";
497d36531249a9a9500e516148e7e72d4c0a7a4d0eeEvan Cheng      continue;
498d36531249a9a9500e516148e7e72d4c0a7a4d0eeEvan Cheng    }
499955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner    if (SO.Size == 0)
500955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner      OS << "variable sized";
501955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner    else
5020ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman      OS << "size=" << SO.Size;
5030ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    OS << ", align=" << SO.Alignment;
50476d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos
505955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner    if (i < NumFixedObjects)
5060ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman      OS << ", fixed";
507955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner    if (i < NumFixedObjects || SO.SPOffset != -1) {
508a401b1e1c5eb9563617db8a2477b4c5f8b239521Chris Lattner      int64_t Off = SO.SPOffset - ValOffset;
5090ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman      OS << ", at location [SP";
5109085d8a9a9000eeaa7cf337ccbdca41d528c99c2Chris Lattner      if (Off > 0)
51176d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos        OS << "+" << Off;
5129085d8a9a9000eeaa7cf337ccbdca41d528c99c2Chris Lattner      else if (Off < 0)
51376d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos        OS << Off;
514955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner      OS << "]";
515955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner    }
516955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner    OS << "\n";
517955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner  }
518955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner}
519955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner
5209085d8a9a9000eeaa7cf337ccbdca41d528c99c2Chris Lattnervoid MachineFrameInfo::dump(const MachineFunction &MF) const {
521dc55481841d5ac060c279a61c944f192ad9bb23eDavid Greene  print(MF, dbgs());
5229085d8a9a9000eeaa7cf337ccbdca41d528c99c2Chris Lattner}
523955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner
524955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner//===----------------------------------------------------------------------===//
52537efe6764568a3829fee26aba532283131d1a104Nate Begeman//  MachineJumpTableInfo implementation
52637efe6764568a3829fee26aba532283131d1a104Nate Begeman//===----------------------------------------------------------------------===//
52737efe6764568a3829fee26aba532283131d1a104Nate Begeman
528071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner/// getEntrySize - Return the size of each entry in the jump table.
529071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattnerunsigned MachineJumpTableInfo::getEntrySize(const TargetData &TD) const {
530071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  // The size of a jump table entry is 4 bytes unless the entry is just the
531071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  // address of a block, in which case it is the pointer size.
532071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  switch (getEntryKind()) {
533071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  case MachineJumpTableInfo::EK_BlockAddress:
534071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner    return TD.getPointerSize();
535071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  case MachineJumpTableInfo::EK_GPRel32BlockAddress:
536071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  case MachineJumpTableInfo::EK_LabelDifference32:
53785fe07866a3b240d9facef3b2f2ea81a0a8db018Chris Lattner  case MachineJumpTableInfo::EK_Custom32:
538071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner    return 4;
53995da605e15a6f108b551ecc6772823ea53de3007Richard Osborne  case MachineJumpTableInfo::EK_Inline:
54095da605e15a6f108b551ecc6772823ea53de3007Richard Osborne    return 0;
541071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  }
542071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  assert(0 && "Unknown jump table encoding!");
543071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  return ~0;
544071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner}
545071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner
546071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner/// getEntryAlignment - Return the alignment of each entry in the jump table.
547071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattnerunsigned MachineJumpTableInfo::getEntryAlignment(const TargetData &TD) const {
548071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  // The alignment of a jump table entry is the alignment of int32 unless the
549071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  // entry is just the address of a block, in which case it is the pointer
550071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  // alignment.
551071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  switch (getEntryKind()) {
552071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  case MachineJumpTableInfo::EK_BlockAddress:
553071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner    return TD.getPointerABIAlignment();
554071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  case MachineJumpTableInfo::EK_GPRel32BlockAddress:
555071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  case MachineJumpTableInfo::EK_LabelDifference32:
55685fe07866a3b240d9facef3b2f2ea81a0a8db018Chris Lattner  case MachineJumpTableInfo::EK_Custom32:
557071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner    return TD.getABIIntegerTypeAlignment(32);
55895da605e15a6f108b551ecc6772823ea53de3007Richard Osborne  case MachineJumpTableInfo::EK_Inline:
55995da605e15a6f108b551ecc6772823ea53de3007Richard Osborne    return 1;
560071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  }
561071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  assert(0 && "Unknown jump table encoding!");
562071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  return ~0;
563071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner}
564071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner
565d1ec31dca534a8816d7f2fcbfdc7ed4476b471d3Bob Wilson/// createJumpTableIndex - Create a new jump table entry in the jump table info.
56637efe6764568a3829fee26aba532283131d1a104Nate Begeman///
567d1ec31dca534a8816d7f2fcbfdc7ed4476b471d3Bob Wilsonunsigned MachineJumpTableInfo::createJumpTableIndex(
568a4eb44a285984ec999de632beb5145b099f5416dChris Lattner                               const std::vector<MachineBasicBlock*> &DestBBs) {
569e7251a0377334bdb57bd188828bf89c9e3980fadChris Lattner  assert(!DestBBs.empty() && "Cannot create an empty jump table!");
57037efe6764568a3829fee26aba532283131d1a104Nate Begeman  JumpTables.push_back(MachineJumpTableEntry(DestBBs));
57137efe6764568a3829fee26aba532283131d1a104Nate Begeman  return JumpTables.size()-1;
57237efe6764568a3829fee26aba532283131d1a104Nate Begeman}
57337efe6764568a3829fee26aba532283131d1a104Nate Begeman
574593ea05957b98472a916278d64229ceda223c50bDan Gohman/// ReplaceMBBInJumpTables - If Old is the target of any jump tables, update
575593ea05957b98472a916278d64229ceda223c50bDan Gohman/// the jump tables to branch to New instead.
576beeb93e6ba48af2661eabc4872d8b159fb43e5dbChris Lattnerbool MachineJumpTableInfo::ReplaceMBBInJumpTables(MachineBasicBlock *Old,
577beeb93e6ba48af2661eabc4872d8b159fb43e5dbChris Lattner                                                  MachineBasicBlock *New) {
578593ea05957b98472a916278d64229ceda223c50bDan Gohman  assert(Old != New && "Not making a change?");
579593ea05957b98472a916278d64229ceda223c50bDan Gohman  bool MadeChange = false;
58068bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach  for (size_t i = 0, e = JumpTables.size(); i != e; ++i)
58168bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach    ReplaceMBBInJumpTable(i, Old, New);
58268bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach  return MadeChange;
58368bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach}
58468bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach
58568bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach/// ReplaceMBBInJumpTable - If Old is a target of the jump tables, update
58668bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach/// the jump table to branch to New instead.
587beeb93e6ba48af2661eabc4872d8b159fb43e5dbChris Lattnerbool MachineJumpTableInfo::ReplaceMBBInJumpTable(unsigned Idx,
588beeb93e6ba48af2661eabc4872d8b159fb43e5dbChris Lattner                                                 MachineBasicBlock *Old,
589beeb93e6ba48af2661eabc4872d8b159fb43e5dbChris Lattner                                                 MachineBasicBlock *New) {
59068bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach  assert(Old != New && "Not making a change?");
59168bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach  bool MadeChange = false;
59268bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach  MachineJumpTableEntry &JTE = JumpTables[Idx];
59368bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach  for (size_t j = 0, e = JTE.MBBs.size(); j != e; ++j)
59468bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach    if (JTE.MBBs[j] == Old) {
59568bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach      JTE.MBBs[j] = New;
59668bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach      MadeChange = true;
59768bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach    }
598593ea05957b98472a916278d64229ceda223c50bDan Gohman  return MadeChange;
599593ea05957b98472a916278d64229ceda223c50bDan Gohman}
60037efe6764568a3829fee26aba532283131d1a104Nate Begeman
601d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattnervoid MachineJumpTableInfo::print(raw_ostream &OS) const {
6020ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  if (JumpTables.empty()) return;
6030ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman
6040ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  OS << "Jump Tables:\n";
6050ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman
60637efe6764568a3829fee26aba532283131d1a104Nate Begeman  for (unsigned i = 0, e = JumpTables.size(); i != e; ++i) {
6070ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    OS << "  jt#" << i << ": ";
6080ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    for (unsigned j = 0, f = JumpTables[i].MBBs.size(); j != f; ++j)
6090ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman      OS << " BB#" << JumpTables[i].MBBs[j]->getNumber();
61037efe6764568a3829fee26aba532283131d1a104Nate Begeman  }
6110ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman
6120ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  OS << '\n';
61337efe6764568a3829fee26aba532283131d1a104Nate Begeman}
61437efe6764568a3829fee26aba532283131d1a104Nate Begeman
615dc55481841d5ac060c279a61c944f192ad9bb23eDavid Greenevoid MachineJumpTableInfo::dump() const { print(dbgs()); }
61637efe6764568a3829fee26aba532283131d1a104Nate Begeman
61737efe6764568a3829fee26aba532283131d1a104Nate Begeman
61837efe6764568a3829fee26aba532283131d1a104Nate Begeman//===----------------------------------------------------------------------===//
6194d149cdae1553426f49623fdae215d481d56d955Chris Lattner//  MachineConstantPool implementation
6204d149cdae1553426f49623fdae215d481d56d955Chris Lattner//===----------------------------------------------------------------------===//
6214d149cdae1553426f49623fdae215d481d56d955Chris Lattner
622db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris LattnerType *MachineConstantPoolEntry::getType() const {
6239abd7c38675ad305c733b7e90578255271afc6bdEvan Cheng  if (isMachineConstantPoolEntry())
624cb4596364369ea36ff5675eb12fc62d0c6f1f0ddChris Lattner    return Val.MachineCPVal->getType();
6259abd7c38675ad305c733b7e90578255271afc6bdEvan Cheng  return Val.ConstVal->getType();
6269abd7c38675ad305c733b7e90578255271afc6bdEvan Cheng}
6279abd7c38675ad305c733b7e90578255271afc6bdEvan Cheng
628cb4596364369ea36ff5675eb12fc62d0c6f1f0ddChris Lattner
629354c0165e755fd857bc89792243b82387ee3936dChris Lattnerunsigned MachineConstantPoolEntry::getRelocationInfo() const {
630cb4596364369ea36ff5675eb12fc62d0c6f1f0ddChris Lattner  if (isMachineConstantPoolEntry())
631354c0165e755fd857bc89792243b82387ee3936dChris Lattner    return Val.MachineCPVal->getRelocationInfo();
6327cf12c7efd37dc12c3ed536a3f4c373dddac2b85Chris Lattner  return Val.ConstVal->getRelocationInfo();
633cb4596364369ea36ff5675eb12fc62d0c6f1f0ddChris Lattner}
634cb4596364369ea36ff5675eb12fc62d0c6f1f0ddChris Lattner
635d6594ae54cfde4db4d30272192645c0a45fb9902Evan ChengMachineConstantPool::~MachineConstantPool() {
636d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  for (unsigned i = 0, e = Constants.size(); i != e; ++i)
637d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    if (Constants[i].isMachineConstantPoolEntry())
638d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng      delete Constants[i].Val.MachineCPVal;
6395567869637383969dced0b84dbd19da12682df6bCameron Zwarich  for (DenseSet<MachineConstantPoolValue*>::iterator I =
6405567869637383969dced0b84dbd19da12682df6bCameron Zwarich       MachineCPVsSharingEntries.begin(), E = MachineCPVsSharingEntries.end();
6415567869637383969dced0b84dbd19da12682df6bCameron Zwarich       I != E; ++I)
6425567869637383969dced0b84dbd19da12682df6bCameron Zwarich    delete *I;
643d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng}
644d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng
64583f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman/// CanShareConstantPoolEntry - Test whether the given two constants
64683f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman/// can be allocated the same constant pool entry.
64746510a73e977273ec67747eb34cbdb43f815e451Dan Gohmanstatic bool CanShareConstantPoolEntry(const Constant *A, const Constant *B,
64883f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman                                      const TargetData *TD) {
64983f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // Handle the trivial case quickly.
65083f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  if (A == B) return true;
65183f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman
65283f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // If they have the same type but weren't the same constant, quickly
65383f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // reject them.
65483f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  if (A->getType() == B->getType()) return false;
65583f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman
65683f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // For now, only support constants with the same size.
65783f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  if (TD->getTypeStoreSize(A->getType()) != TD->getTypeStoreSize(B->getType()))
65883f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman    return false;
65983f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman
66083f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // If a floating-point value and an integer value have the same encoding,
66183f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // they can share a constant-pool entry.
66246510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  if (const ConstantFP *AFP = dyn_cast<ConstantFP>(A))
66346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman    if (const ConstantInt *BI = dyn_cast<ConstantInt>(B))
66483f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman      return AFP->getValueAPF().bitcastToAPInt() == BI->getValue();
66546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  if (const ConstantFP *BFP = dyn_cast<ConstantFP>(B))
66646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman    if (const ConstantInt *AI = dyn_cast<ConstantInt>(A))
66783f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman      return BFP->getValueAPF().bitcastToAPInt() == AI->getValue();
66883f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman
66983f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // Two vectors can share an entry if each pair of corresponding
67083f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // elements could.
67146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  if (const ConstantVector *AV = dyn_cast<ConstantVector>(A))
67246510a73e977273ec67747eb34cbdb43f815e451Dan Gohman    if (const ConstantVector *BV = dyn_cast<ConstantVector>(B)) {
67383f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman      if (AV->getType()->getNumElements() != BV->getType()->getNumElements())
67483f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman        return false;
67583f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman      for (unsigned i = 0, e = AV->getType()->getNumElements(); i != e; ++i)
67660d686df5471f7156a6b8afa5859346272216c56Dan Gohman        if (!CanShareConstantPoolEntry(AV->getOperand(i),
67760d686df5471f7156a6b8afa5859346272216c56Dan Gohman                                       BV->getOperand(i), TD))
67883f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman          return false;
67983f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman      return true;
68083f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman    }
68183f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman
68283f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  // TODO: Handle other cases.
68383f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman
68483f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman  return false;
68583f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman}
68683f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman
6873029f920519e0871a5aad5d7c592281093953733Chris Lattner/// getConstantPoolIndex - Create a new entry in the constant pool or return
68805ae98346a190d74c2c8799c3af2f8ca23e47c27Dan Gohman/// an existing one.  User must specify the log2 of the minimum required
68905ae98346a190d74c2c8799c3af2f8ca23e47c27Dan Gohman/// alignment for the object.
6903029f920519e0871a5aad5d7c592281093953733Chris Lattner///
69146510a73e977273ec67747eb34cbdb43f815e451Dan Gohmanunsigned MachineConstantPool::getConstantPoolIndex(const Constant *C,
6923029f920519e0871a5aad5d7c592281093953733Chris Lattner                                                   unsigned Alignment) {
6933029f920519e0871a5aad5d7c592281093953733Chris Lattner  assert(Alignment && "Alignment must be specified!");
6943029f920519e0871a5aad5d7c592281093953733Chris Lattner  if (Alignment > PoolAlignment) PoolAlignment = Alignment;
69583f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman
6963029f920519e0871a5aad5d7c592281093953733Chris Lattner  // Check to see if we already have this constant.
6973029f920519e0871a5aad5d7c592281093953733Chris Lattner  //
6983029f920519e0871a5aad5d7c592281093953733Chris Lattner  // FIXME, this could be made much more efficient for large constant pools.
6993029f920519e0871a5aad5d7c592281093953733Chris Lattner  for (unsigned i = 0, e = Constants.size(); i != e; ++i)
70083f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman    if (!Constants[i].isMachineConstantPoolEntry() &&
70183f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman        CanShareConstantPoolEntry(Constants[i].Val.ConstVal, C, TD)) {
70283f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman      if ((unsigned)Constants[i].getAlignment() < Alignment)
70383f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman        Constants[i].Alignment = Alignment;
7043029f920519e0871a5aad5d7c592281093953733Chris Lattner      return i;
70583f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman    }
7063029f920519e0871a5aad5d7c592281093953733Chris Lattner
7071606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng  Constants.push_back(MachineConstantPoolEntry(C, Alignment));
7083029f920519e0871a5aad5d7c592281093953733Chris Lattner  return Constants.size()-1;
7093029f920519e0871a5aad5d7c592281093953733Chris Lattner}
7103029f920519e0871a5aad5d7c592281093953733Chris Lattner
711d6594ae54cfde4db4d30272192645c0a45fb9902Evan Chengunsigned MachineConstantPool::getConstantPoolIndex(MachineConstantPoolValue *V,
712d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng                                                   unsigned Alignment) {
713d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  assert(Alignment && "Alignment must be specified!");
714d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  if (Alignment > PoolAlignment) PoolAlignment = Alignment;
715d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng
716d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  // Check to see if we already have this constant.
717d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  //
718d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  // FIXME, this could be made much more efficient for large constant pools.
719d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  int Idx = V->getExistingMachineCPValue(this, Alignment);
7205567869637383969dced0b84dbd19da12682df6bCameron Zwarich  if (Idx != -1) {
7215567869637383969dced0b84dbd19da12682df6bCameron Zwarich    MachineCPVsSharingEntries.insert(V);
722d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    return (unsigned)Idx;
7235567869637383969dced0b84dbd19da12682df6bCameron Zwarich  }
7241606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng
7251606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng  Constants.push_back(MachineConstantPoolEntry(V, Alignment));
726d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng  return Constants.size()-1;
727d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng}
728d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng
72962ca32540f950d500227f1863b95cd08ad28099eChris Lattnervoid MachineConstantPool::print(raw_ostream &OS) const {
7300ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  if (Constants.empty()) return;
7310ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman
7320ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman  OS << "Constant Pool:\n";
733b8973bd8f50d7321635e1e07b81a880a0828d185Evan Cheng  for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
7340ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    OS << "  cp#" << i << ": ";
735d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    if (Constants[i].isMachineConstantPoolEntry())
736d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng      Constants[i].Val.MachineCPVal->print(OS);
737d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng    else
738d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng      OS << *(Value*)Constants[i].Val.ConstVal;
7390ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman    OS << ", align=" << Constants[i].getAlignment();
740b8973bd8f50d7321635e1e07b81a880a0828d185Evan Cheng    OS << "\n";
741b8973bd8f50d7321635e1e07b81a880a0828d185Evan Cheng  }
7424d149cdae1553426f49623fdae215d481d56d955Chris Lattner}
7434d149cdae1553426f49623fdae215d481d56d955Chris Lattner
744dc55481841d5ac060c279a61c944f192ad9bb23eDavid Greenevoid MachineConstantPool::dump() const { print(dbgs()); }
745