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