MachineFunction.cpp revision 142b531e024c7b814df74951b378b9e3e11d0d42
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" 368bd66e690779c838db51f55cf0b31d7206b3b659Chris Lattner#include "llvm/Target/TargetFrameInfo.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; 639553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman FrameInfo = new (Allocator) MachineFrameInfo(*TM.getFrameInfo()); 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()); 6820c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling Alignment = TM.getTargetLowering()->getFunctionAlignment(F); 69b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner FunctionNumber = FunctionNum; 70071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner JumpTableInfo = 0; 71831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattner} 72831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattner 7376d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis EvlogimenosMachineFunction::~MachineFunction() { 744b9a4006748b8d72a04504a5fc1f5daa73bf69f9Chris Lattner BasicBlocks.clear(); 758e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman InstructionRecycler.clear(Allocator); 768e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman BasicBlockRecycler.clear(Allocator); 77dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling if (RegInfo) { 78dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling RegInfo->~MachineRegisterInfo(); 79dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling Allocator.Deallocate(RegInfo); 80dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling } 818e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman if (MFInfo) { 82dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling MFInfo->~MachineFunctionInfo(); 83dd37b360d7ecc95b4a077bb64cca22b764788751Bill Wendling Allocator.Deallocate(MFInfo); 848e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman } 858e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman FrameInfo->~MachineFrameInfo(); Allocator.Deallocate(FrameInfo); 868e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman ConstantPool->~MachineConstantPool(); Allocator.Deallocate(ConstantPool); 87071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner 88071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner if (JumpTableInfo) { 89071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner JumpTableInfo->~MachineJumpTableInfo(); 90071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner Allocator.Deallocate(JumpTableInfo); 91071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner } 921049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 931049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 94071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner/// getOrCreateJumpTableInfo - Get the JumpTableInfo for this function, if it 95071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner/// does already exist, allocate one. 96071c62fad0b25ad4131e7f984173a796c1e63f61Chris LattnerMachineJumpTableInfo *MachineFunction:: 97071c62fad0b25ad4131e7f984173a796c1e63f61Chris LattnergetOrCreateJumpTableInfo(unsigned EntryKind) { 98071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner if (JumpTableInfo) return JumpTableInfo; 99071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner 1009553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman JumpTableInfo = new (Allocator) 101071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner MachineJumpTableInfo((MachineJumpTableInfo::JTEntryKind)EntryKind); 102071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner return JumpTableInfo; 103071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner} 104e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner 105e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner/// RenumberBlocks - This discards all of the MachineBasicBlock numbers and 106e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner/// recomputes them. This guarantees that the MBB numbers are sequential, 107e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner/// dense, and match the ordering of the blocks within the function. If a 108e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner/// specific MachineBasicBlock is specified, only that block and those after 109e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner/// it are renumbered. 110e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattnervoid MachineFunction::RenumberBlocks(MachineBasicBlock *MBB) { 111e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner if (empty()) { MBBNumbering.clear(); return; } 112e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner MachineFunction::iterator MBBI, E = end(); 113e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner if (MBB == 0) 114e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner MBBI = begin(); 115e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner else 116e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner MBBI = MBB; 117e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner 118e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner // Figure out the block number this should have. 119e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner unsigned BlockNo = 0; 120f28bbda2c6c965dbd28e73e06c9e09231a77b0dcChris Lattner if (MBBI != begin()) 121f28bbda2c6c965dbd28e73e06c9e09231a77b0dcChris Lattner BlockNo = prior(MBBI)->getNumber()+1; 122e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner 123e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner for (; MBBI != E; ++MBBI, ++BlockNo) { 124e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner if (MBBI->getNumber() != (int)BlockNo) { 125e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner // Remove use of the old number. 126e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner if (MBBI->getNumber() != -1) { 127e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner assert(MBBNumbering[MBBI->getNumber()] == &*MBBI && 128e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner "MBB number mismatch!"); 129e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner MBBNumbering[MBBI->getNumber()] = 0; 130e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner } 131e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner 132e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner // If BlockNo is already taken, set that block's number to -1. 133e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner if (MBBNumbering[BlockNo]) 134e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner MBBNumbering[BlockNo]->setNumber(-1); 135e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner 136e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner MBBNumbering[BlockNo] = MBBI; 137e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner MBBI->setNumber(BlockNo); 138e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner } 139e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner } 140e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner 141e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner // Okay, all the blocks are renumbered. If we have compactified the block 142e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner // numbering, shrink MBBNumbering now. 143e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner assert(BlockNo <= MBBNumbering.size() && "Mismatch!"); 144e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner MBBNumbering.resize(BlockNo); 145e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner} 146e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner 1478e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// CreateMachineInstr - Allocate a new MachineInstr. Use this instead 1488e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// of `new MachineInstr'. 1498e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// 1508e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineInstr * 1519bc96a57206cbebaa9b0ba9979f949eb10c1592cBill WendlingMachineFunction::CreateMachineInstr(const TargetInstrDesc &TID, 1529bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, bool NoImp) { 1538e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman return new (InstructionRecycler.Allocate<MachineInstr>(Allocator)) 1549bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling MachineInstr(TID, DL, NoImp); 1558e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman} 1568e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman 1578e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// CloneMachineInstr - Create a new MachineInstr which is a copy of the 158f451cb870efcf9e0302d25ed05f4cac6bb494e42Dan Gohman/// 'Orig' instruction, identical in all ways except the instruction 1598e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// has no parent, prev, or next. 1608e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// 1618e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineInstr * 1628e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineFunction::CloneMachineInstr(const MachineInstr *Orig) { 1638e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman return new (InstructionRecycler.Allocate<MachineInstr>(Allocator)) 1648e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman MachineInstr(*this, *Orig); 1658e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman} 1668e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman 1678e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// DeleteMachineInstr - Delete the given MachineInstr. 1688e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// 1698e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmanvoid 1708e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineFunction::DeleteMachineInstr(MachineInstr *MI) { 1718e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman MI->~MachineInstr(); 1728e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman InstructionRecycler.Deallocate(Allocator, MI); 1738e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman} 1748e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman 1758e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// CreateMachineBasicBlock - Allocate a new MachineBasicBlock. Use this 1768e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// instead of `new MachineBasicBlock'. 1778e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// 1788e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineBasicBlock * 1798e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineFunction::CreateMachineBasicBlock(const BasicBlock *bb) { 1808e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman return new (BasicBlockRecycler.Allocate<MachineBasicBlock>(Allocator)) 1818e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman MachineBasicBlock(*this, bb); 1828e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman} 183e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner 1848e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// DeleteMachineBasicBlock - Delete the given MachineBasicBlock. 1858e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman/// 1868e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmanvoid 1878e5f2c6f65841542e2a7092553fe42a00048e4c7Dan GohmanMachineFunction::DeleteMachineBasicBlock(MachineBasicBlock *MBB) { 1888e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman assert(MBB->getParent() == this && "MBB parent mismatch!"); 1898e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman MBB->~MachineBasicBlock(); 1908e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman BasicBlockRecycler.Deallocate(Allocator, MBB); 1918e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman} 1928e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman 193c76909abfec876c6b751d693ebd3df07df686aa0Dan GohmanMachineMemOperand * 194da39c3964423744b4d79aebef8bece3e9141d5fcChris LattnerMachineFunction::getMachineMemOperand(MachinePointerInfo PtrInfo, unsigned f, 195f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman uint64_t s, unsigned base_alignment, 196f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman const MDNode *TBAAInfo) { 197f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman return new (Allocator) MachineMemOperand(PtrInfo, f, s, base_alignment, 198f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman TBAAInfo); 199c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman} 200c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman 201c76909abfec876c6b751d693ebd3df07df686aa0Dan GohmanMachineMemOperand * 202c76909abfec876c6b751d693ebd3df07df686aa0Dan GohmanMachineFunction::getMachineMemOperand(const MachineMemOperand *MMO, 203c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman int64_t Offset, uint64_t Size) { 2049553188fccbf0ae9c5b6bef26d0d2bd5feff8b59Dan Gohman return new (Allocator) 205da39c3964423744b4d79aebef8bece3e9141d5fcChris Lattner MachineMemOperand(MachinePointerInfo(MMO->getValue(), 206da39c3964423744b4d79aebef8bece3e9141d5fcChris Lattner MMO->getOffset()+Offset), 207f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman MMO->getFlags(), Size, 208f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman MMO->getBaseAlignment(), 0); 209c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman} 210c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman 211c76909abfec876c6b751d693ebd3df07df686aa0Dan GohmanMachineInstr::mmo_iterator 212c76909abfec876c6b751d693ebd3df07df686aa0Dan GohmanMachineFunction::allocateMemRefsArray(unsigned long Num) { 213c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman return Allocator.Allocate<MachineMemOperand *>(Num); 214c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman} 215c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman 21691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohmanstd::pair<MachineInstr::mmo_iterator, MachineInstr::mmo_iterator> 21791e69c37153eb7d8cd149d9c2484c3115027b90fDan GohmanMachineFunction::extractLoadMemRefs(MachineInstr::mmo_iterator Begin, 21891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman MachineInstr::mmo_iterator End) { 21991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman // Count the number of load mem refs. 22091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman unsigned Num = 0; 22191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman for (MachineInstr::mmo_iterator I = Begin; I != End; ++I) 22291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman if ((*I)->isLoad()) 22391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman ++Num; 22491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman 22591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman // Allocate a new array and populate it with the load information. 22691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman MachineInstr::mmo_iterator Result = allocateMemRefsArray(Num); 22791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman unsigned Index = 0; 22891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman for (MachineInstr::mmo_iterator I = Begin; I != End; ++I) { 22991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman if ((*I)->isLoad()) { 23091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman if (!(*I)->isStore()) 23191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman // Reuse the MMO. 23291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman Result[Index] = *I; 23391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman else { 23491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman // Clone the MMO and unset the store flag. 23591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman MachineMemOperand *JustLoad = 23693a95ae8a9d8eb19dc0d90281473be2fb1c05a17Chris Lattner getMachineMemOperand((*I)->getPointerInfo(), 23791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman (*I)->getFlags() & ~MachineMemOperand::MOStore, 238f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman (*I)->getSize(), (*I)->getBaseAlignment(), 239f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman (*I)->getTBAAInfo()); 24091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman Result[Index] = JustLoad; 24191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman } 24291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman ++Index; 24391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman } 24491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman } 24591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman return std::make_pair(Result, Result + Num); 24691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman} 24791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman 24891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohmanstd::pair<MachineInstr::mmo_iterator, MachineInstr::mmo_iterator> 24991e69c37153eb7d8cd149d9c2484c3115027b90fDan GohmanMachineFunction::extractStoreMemRefs(MachineInstr::mmo_iterator Begin, 25091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman MachineInstr::mmo_iterator End) { 25191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman // Count the number of load mem refs. 25291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman unsigned Num = 0; 25391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman for (MachineInstr::mmo_iterator I = Begin; I != End; ++I) 25491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman if ((*I)->isStore()) 25591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman ++Num; 25691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman 25791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman // Allocate a new array and populate it with the store information. 25891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman MachineInstr::mmo_iterator Result = allocateMemRefsArray(Num); 25991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman unsigned Index = 0; 26091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman for (MachineInstr::mmo_iterator I = Begin; I != End; ++I) { 26191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman if ((*I)->isStore()) { 26291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman if (!(*I)->isLoad()) 26391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman // Reuse the MMO. 26491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman Result[Index] = *I; 26591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman else { 26691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman // Clone the MMO and unset the load flag. 26791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman MachineMemOperand *JustStore = 26893a95ae8a9d8eb19dc0d90281473be2fb1c05a17Chris Lattner getMachineMemOperand((*I)->getPointerInfo(), 26991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman (*I)->getFlags() & ~MachineMemOperand::MOLoad, 270f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman (*I)->getSize(), (*I)->getBaseAlignment(), 271f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman (*I)->getTBAAInfo()); 27291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman Result[Index] = JustStore; 27391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman } 27491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman ++Index; 27591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman } 27691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman } 27791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman return std::make_pair(Result, Result + Num); 27891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman} 27991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman 2808e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmanvoid MachineFunction::dump() const { 281dc55481841d5ac060c279a61c944f192ad9bb23eDavid Greene print(dbgs()); 2828e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman} 2831049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 284f4a1e1a69f0727762a73ef0d551e3bbd16b7c04eJakob Stoklund Olesenvoid MachineFunction::print(raw_ostream &OS, SlotIndexes *Indexes) const { 2850ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << "# Machine code for function " << Fn->getName() << ":\n"; 286955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner 287955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner // Print Frame Information 2888e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman FrameInfo->print(*this, OS); 28937efe6764568a3829fee26aba532283131d1a104Nate Begeman 29037efe6764568a3829fee26aba532283131d1a104Nate Begeman // Print JumpTable Information 291071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner if (JumpTableInfo) 292071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner JumpTableInfo->print(OS); 2934d149cdae1553426f49623fdae215d481d56d955Chris Lattner 2944d149cdae1553426f49623fdae215d481d56d955Chris Lattner // Print Constant Pool 295d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattner ConstantPool->print(OS); 296a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner 2976f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman const TargetRegisterInfo *TRI = getTarget().getRegisterInfo(); 298a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner 299e2b997b7b5360b4793c524a801e988fd37b80b93Matthijs Kooijman if (RegInfo && !RegInfo->livein_empty()) { 3000ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << "Function Live Ins: "; 30184bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner for (MachineRegisterInfo::livein_iterator 30284bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner I = RegInfo->livein_begin(), E = RegInfo->livein_end(); I != E; ++I) { 3036f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman if (TRI) 3040ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << "%" << TRI->getName(I->first); 305a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner else 3060ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << " %physreg" << I->first; 3074e92027837136233db0fc1c1a4fa2bc456d74de3Chris Lattner 3084e92027837136233db0fc1c1a4fa2bc456d74de3Chris Lattner if (I->second) 3090ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << " in reg%" << I->second; 3100ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman 3117896c9f436a4eda5ec15e882a7505ba482a2fcd0Chris Lattner if (llvm::next(I) != E) 3120ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << ", "; 313a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner } 314d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattner OS << '\n'; 315a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner } 316e2b997b7b5360b4793c524a801e988fd37b80b93Matthijs Kooijman if (RegInfo && !RegInfo->liveout_empty()) { 3170ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << "Function Live Outs: "; 31884bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner for (MachineRegisterInfo::liveout_iterator 3190ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman I = RegInfo->liveout_begin(), E = RegInfo->liveout_end(); I != E; ++I){ 3206f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman if (TRI) 3210ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << '%' << TRI->getName(*I); 322a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner else 3230ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << "%physreg" << *I; 3240ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman 3257896c9f436a4eda5ec15e882a7505ba482a2fcd0Chris Lattner if (llvm::next(I) != E) 3260ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << " "; 3270ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman } 328d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattner OS << '\n'; 329a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner } 330a1f68ca94e763945f9accc75768a55a84bae6cfbChris Lattner 3310ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman for (const_iterator BB = begin(), E = end(); BB != E; ++BB) { 3320ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << '\n'; 333f4a1e1a69f0727762a73ef0d551e3bbd16b7c04eJakob Stoklund Olesen BB->print(OS, Indexes); 3340ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman } 33547b716483ef2d057c8a0015af20685755e606d0dBrian Gaeke 3360ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << "\n# End machine code for function " << Fn->getName() << ".\n\n"; 3371049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 3381049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 33971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenosnamespace llvm { 34076d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos template<> 34176d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos struct DOTGraphTraits<const MachineFunction*> : public DefaultDOTGraphTraits { 342a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser 343a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser DOTGraphTraits (bool isSimple=false) : DefaultDOTGraphTraits(isSimple) {} 344a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser 34576d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos static std::string getGraphName(const MachineFunction *F) { 346f6ccee5a9d2b9573f679bca6266ade3eb8cd3f88Daniel Dunbar return "CFG for '" + F->getFunction()->getNameStr() + "' function"; 34776d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos } 34871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos 34956f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser std::string getNodeLabel(const MachineBasicBlock *Node, 35056f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser const MachineFunction *Graph) { 351cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner std::string OutStr; 352cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner { 353cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner raw_string_ostream OSS(OutStr); 354e5f4e9fb2be8525a8ca16bd4719665ed7402b55bJakob Stoklund Olesen 355e5f4e9fb2be8525a8ca16bd4719665ed7402b55bJakob Stoklund Olesen if (isSimple()) { 356e5f4e9fb2be8525a8ca16bd4719665ed7402b55bJakob Stoklund Olesen OSS << "BB#" << Node->getNumber(); 357e5f4e9fb2be8525a8ca16bd4719665ed7402b55bJakob Stoklund Olesen if (const BasicBlock *BB = Node->getBasicBlock()) 358e5f4e9fb2be8525a8ca16bd4719665ed7402b55bJakob Stoklund Olesen OSS << ": " << BB->getName(); 359e5f4e9fb2be8525a8ca16bd4719665ed7402b55bJakob Stoklund Olesen } else 360cf143a4d917699f8f4202f331fa9e184070471fbChris Lattner Node->print(OSS); 36176d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos } 36271bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos 36376d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos if (OutStr[0] == '\n') OutStr.erase(OutStr.begin()); 36471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos 36576d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos // Process string output to make it nicer... 36676d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos for (unsigned i = 0; i != OutStr.length(); ++i) 36776d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos if (OutStr[i] == '\n') { // Left justify 36876d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos OutStr[i] = '\\'; 36976d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos OutStr.insert(OutStr.begin()+i+1, 'l'); 37076d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos } 37176d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos return OutStr; 37276d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos } 37376d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos }; 37471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos} 37571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos 37671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenosvoid MachineFunction::viewCFG() const 37771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos{ 378851a22db2bdbcab1768a87c4f02b5972e48db5edJim Laskey#ifndef NDEBUG 379f6ccee5a9d2b9573f679bca6266ade3eb8cd3f88Daniel Dunbar ViewGraph(this, "mf" + getFunction()->getNameStr()); 3809d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#else 381643fffe429cc467584c795f6177741944729e0a5Dan Gohman errs() << "MachineFunction::viewCFG is only available in debug builds on " 38243ed267db3512823a9698f810be4e64bee227270Daniel Dunbar << "systems with Graphviz or gv!\n"; 3839d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#endif // NDEBUG 38471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos} 38571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos 38671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenosvoid MachineFunction::viewCFGOnly() const 38771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos{ 3888cbc94afb71fd2da72d8f1284f7f53e39019fdecOwen Anderson#ifndef NDEBUG 389f6ccee5a9d2b9573f679bca6266ade3eb8cd3f88Daniel Dunbar ViewGraph(this, "mf" + getFunction()->getNameStr(), true); 3908cbc94afb71fd2da72d8f1284f7f53e39019fdecOwen Anderson#else 391643fffe429cc467584c795f6177741944729e0a5Dan Gohman errs() << "MachineFunction::viewCFGOnly is only available in debug builds on " 39243ed267db3512823a9698f810be4e64bee227270Daniel Dunbar << "systems with Graphviz or gv!\n"; 3938cbc94afb71fd2da72d8f1284f7f53e39019fdecOwen Anderson#endif // NDEBUG 39471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos} 39571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos 396998e125a87d49f28c714d8223a37746850401057Bob Wilson/// addLiveIn - Add the specified physical register as a live-in value and 397998e125a87d49f28c714d8223a37746850401057Bob Wilson/// create a corresponding virtual register for it. 398998e125a87d49f28c714d8223a37746850401057Bob Wilsonunsigned MachineFunction::addLiveIn(unsigned PReg, 399998e125a87d49f28c714d8223a37746850401057Bob Wilson const TargetRegisterClass *RC) { 4003946043a80a043b3cf43b34bf068feaadc46485bEvan Cheng MachineRegisterInfo &MRI = getRegInfo(); 4013946043a80a043b3cf43b34bf068feaadc46485bEvan Cheng unsigned VReg = MRI.getLiveInVirtReg(PReg); 4023946043a80a043b3cf43b34bf068feaadc46485bEvan Cheng if (VReg) { 4033946043a80a043b3cf43b34bf068feaadc46485bEvan Cheng assert(MRI.getRegClass(VReg) == RC && "Register class mismatch!"); 4043946043a80a043b3cf43b34bf068feaadc46485bEvan Cheng return VReg; 4053946043a80a043b3cf43b34bf068feaadc46485bEvan Cheng } 4063946043a80a043b3cf43b34bf068feaadc46485bEvan Cheng VReg = MRI.createVirtualRegister(RC); 4073946043a80a043b3cf43b34bf068feaadc46485bEvan Cheng MRI.addLiveIn(PReg, VReg); 408998e125a87d49f28c714d8223a37746850401057Bob Wilson return VReg; 409998e125a87d49f28c714d8223a37746850401057Bob Wilson} 410998e125a87d49f28c714d8223a37746850401057Bob Wilson 411589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner/// getJTISymbol - Return the MCSymbol for the specified non-empty jump table. 41207d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling/// If isLinkerPrivate is specified, an 'l' label is returned, otherwise a 41307d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling/// normal 'L' label is returned. 41407d317711781d8c9268f7d6afcf1ba7eadf1d127Bill WendlingMCSymbol *MachineFunction::getJTISymbol(unsigned JTI, MCContext &Ctx, 41507d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling bool isLinkerPrivate) const { 416589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner assert(JumpTableInfo && "No jump tables"); 417589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner 418de4c08008a10aba59171c56086d96c760990a4cbChandler Carruth assert(JTI < JumpTableInfo->getJumpTables().size() && "Invalid JTI!"); 419589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner const MCAsmInfo &MAI = *getTarget().getMCAsmInfo(); 420589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner 42107d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling const char *Prefix = isLinkerPrivate ? MAI.getLinkerPrivateGlobalPrefix() : 42207d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling MAI.getPrivateGlobalPrefix(); 423589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner SmallString<60> Name; 424589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner raw_svector_ostream(Name) 425589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner << Prefix << "JTI" << getFunctionNumber() << '_' << JTI; 4269b97a73dedf736e14b04a3d1a153f10d25b2507bChris Lattner return Ctx.GetOrCreateSymbol(Name.str()); 427589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner} 428589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner 429142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner/// getPICBaseSymbol - Return a function-local symbol to represent the PIC 430142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner/// base. 431142b531e024c7b814df74951b378b9e3e11d0d42Chris LattnerMCSymbol *MachineFunction::getPICBaseSymbol() const { 432142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner const MCAsmInfo &MAI = *Target.getMCAsmInfo(); 433142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner return Ctx.GetOrCreateSymbol(Twine(MAI.getPrivateGlobalPrefix())+ 434142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner Twine(getFunctionNumber())+"$pb"); 435142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner} 436589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner 437955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner//===----------------------------------------------------------------------===// 438eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner// MachineFrameInfo implementation 439955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner//===----------------------------------------------------------------------===// 440955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner 4411612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner/// CreateFixedObject - Create a new object at a fixed location on the stack. 4421612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner/// All fixed objects should be created before other objects are created for 4431612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner/// efficiency. By default, fixed objects are immutable. This returns an 4441612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner/// index with a negative value. 4451612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner/// 4461612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattnerint MachineFrameInfo::CreateFixedObject(uint64_t Size, int64_t SPOffset, 447ed2ae136d29dd36122d2476801e7d7a86e8301e3Evan Cheng bool Immutable) { 4481612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner assert(Size != 0 && "Cannot allocate zero size fixed stack objects!"); 449f2f490368797fff899e8025133f10c37e3a2ebe5Evan Cheng // The alignment of the frame index can be determined from its offset from 450f2f490368797fff899e8025133f10c37e3a2ebe5Evan Cheng // the incoming frame position. If the frame object is at offset 32 and 451f2f490368797fff899e8025133f10c37e3a2ebe5Evan Cheng // the stack is guaranteed to be 16-byte aligned, then we know that the 452f2f490368797fff899e8025133f10c37e3a2ebe5Evan Cheng // object is 16-byte aligned. 453f2f490368797fff899e8025133f10c37e3a2ebe5Evan Cheng unsigned StackAlign = TFI.getStackAlignment(); 454f2f490368797fff899e8025133f10c37e3a2ebe5Evan Cheng unsigned Align = MinAlign(SPOffset, StackAlign); 455f2f490368797fff899e8025133f10c37e3a2ebe5Evan Cheng Objects.insert(Objects.begin(), StackObject(Size, Align, SPOffset, Immutable, 456dfc2c51d12fd53822279b6e564cdd5cef5c00b46Bill Wendling /*isSS*/false, false)); 4571612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner return -++NumFixedObjects; 4581612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner} 4591612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner 4601612faae3cf7ecfaddba64f7064f0ce4b32dd471Chris Lattner 4614a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund OlesenBitVector 4624a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund OlesenMachineFrameInfo::getPristineRegs(const MachineBasicBlock *MBB) const { 4634a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen assert(MBB && "MBB must be valid"); 4644a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen const MachineFunction *MF = MBB->getParent(); 4654a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen assert(MF && "MBB must be part of a MachineFunction"); 4664a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen const TargetMachine &TM = MF->getTarget(); 4674a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen const TargetRegisterInfo *TRI = TM.getRegisterInfo(); 4684a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen BitVector BV(TRI->getNumRegs()); 4694a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen 4704a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen // Before CSI is calculated, no registers are considered pristine. They can be 4714a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen // freely used and PEI will make sure they are saved. 4724a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen if (!isCalleeSavedInfoValid()) 4734a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen return BV; 4744a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen 4754a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen for (const unsigned *CSR = TRI->getCalleeSavedRegs(MF); CSR && *CSR; ++CSR) 4764a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen BV.set(*CSR); 4774a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen 4784a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen // The entry MBB always has all CSRs pristine. 4794a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen if (MBB == &MF->front()) 4804a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen return BV; 4814a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen 4824a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen // On other MBBs the saved CSRs are not pristine. 4834a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen const std::vector<CalleeSavedInfo> &CSI = getCalleeSavedInfo(); 4844a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(), 4854a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen E = CSI.end(); I != E; ++I) 4864a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen BV.reset(I->getReg()); 4874a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen 4884a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen return BV; 4894a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen} 4904a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen 4914a0f08c5fc14d840e4e411fade036f1cd815b795Jakob Stoklund Olesen 492d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattnervoid MachineFrameInfo::print(const MachineFunction &MF, raw_ostream &OS) const{ 4930ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman if (Objects.empty()) return; 4940ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman 49506140888b1fed24910031f23c302c6a3221f3c42Matthijs Kooijman const TargetFrameInfo *FI = MF.getTarget().getFrameInfo(); 49606140888b1fed24910031f23c302c6a3221f3c42Matthijs Kooijman int ValOffset = (FI ? FI->getOffsetOfLocalArea() : 0); 4979085d8a9a9000eeaa7cf337ccbdca41d528c99c2Chris Lattner 4980ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << "Frame Objects:\n"; 4990ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman 500955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner for (unsigned i = 0, e = Objects.size(); i != e; ++i) { 501955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner const StackObject &SO = Objects[i]; 5020ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << " fi#" << (int)(i-NumFixedObjects) << ": "; 503d36531249a9a9500e516148e7e72d4c0a7a4d0eeEvan Cheng if (SO.Size == ~0ULL) { 504d36531249a9a9500e516148e7e72d4c0a7a4d0eeEvan Cheng OS << "dead\n"; 505d36531249a9a9500e516148e7e72d4c0a7a4d0eeEvan Cheng continue; 506d36531249a9a9500e516148e7e72d4c0a7a4d0eeEvan Cheng } 507955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner if (SO.Size == 0) 508955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner OS << "variable sized"; 509955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner else 5100ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << "size=" << SO.Size; 5110ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << ", align=" << SO.Alignment; 51276d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos 513955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner if (i < NumFixedObjects) 5140ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << ", fixed"; 515955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner if (i < NumFixedObjects || SO.SPOffset != -1) { 516a401b1e1c5eb9563617db8a2477b4c5f8b239521Chris Lattner int64_t Off = SO.SPOffset - ValOffset; 5170ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << ", at location [SP"; 5189085d8a9a9000eeaa7cf337ccbdca41d528c99c2Chris Lattner if (Off > 0) 51976d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos OS << "+" << Off; 5209085d8a9a9000eeaa7cf337ccbdca41d528c99c2Chris Lattner else if (Off < 0) 52176d9daccebc589dbf0f9cbb23326c7d50a26f17dAlkis Evlogimenos OS << Off; 522955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner OS << "]"; 523955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner } 524955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner OS << "\n"; 525955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner } 526955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner} 527955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner 5289085d8a9a9000eeaa7cf337ccbdca41d528c99c2Chris Lattnervoid MachineFrameInfo::dump(const MachineFunction &MF) const { 529dc55481841d5ac060c279a61c944f192ad9bb23eDavid Greene print(MF, dbgs()); 5309085d8a9a9000eeaa7cf337ccbdca41d528c99c2Chris Lattner} 531955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner 532955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner//===----------------------------------------------------------------------===// 53337efe6764568a3829fee26aba532283131d1a104Nate Begeman// MachineJumpTableInfo implementation 53437efe6764568a3829fee26aba532283131d1a104Nate Begeman//===----------------------------------------------------------------------===// 53537efe6764568a3829fee26aba532283131d1a104Nate Begeman 536071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner/// getEntrySize - Return the size of each entry in the jump table. 537071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattnerunsigned MachineJumpTableInfo::getEntrySize(const TargetData &TD) const { 538071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner // The size of a jump table entry is 4 bytes unless the entry is just the 539071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner // address of a block, in which case it is the pointer size. 540071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner switch (getEntryKind()) { 541071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner case MachineJumpTableInfo::EK_BlockAddress: 542071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner return TD.getPointerSize(); 543071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner case MachineJumpTableInfo::EK_GPRel32BlockAddress: 544071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner case MachineJumpTableInfo::EK_LabelDifference32: 54585fe07866a3b240d9facef3b2f2ea81a0a8db018Chris Lattner case MachineJumpTableInfo::EK_Custom32: 546071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner return 4; 54795da605e15a6f108b551ecc6772823ea53de3007Richard Osborne case MachineJumpTableInfo::EK_Inline: 54895da605e15a6f108b551ecc6772823ea53de3007Richard Osborne return 0; 549071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner } 550071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner assert(0 && "Unknown jump table encoding!"); 551071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner return ~0; 552071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner} 553071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner 554071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner/// getEntryAlignment - Return the alignment of each entry in the jump table. 555071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattnerunsigned MachineJumpTableInfo::getEntryAlignment(const TargetData &TD) const { 556071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner // The alignment of a jump table entry is the alignment of int32 unless the 557071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner // entry is just the address of a block, in which case it is the pointer 558071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner // alignment. 559071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner switch (getEntryKind()) { 560071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner case MachineJumpTableInfo::EK_BlockAddress: 561071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner return TD.getPointerABIAlignment(); 562071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner case MachineJumpTableInfo::EK_GPRel32BlockAddress: 563071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner case MachineJumpTableInfo::EK_LabelDifference32: 56485fe07866a3b240d9facef3b2f2ea81a0a8db018Chris Lattner case MachineJumpTableInfo::EK_Custom32: 565071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner return TD.getABIIntegerTypeAlignment(32); 56695da605e15a6f108b551ecc6772823ea53de3007Richard Osborne case MachineJumpTableInfo::EK_Inline: 56795da605e15a6f108b551ecc6772823ea53de3007Richard Osborne return 1; 568071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner } 569071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner assert(0 && "Unknown jump table encoding!"); 570071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner return ~0; 571071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner} 572071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner 573d1ec31dca534a8816d7f2fcbfdc7ed4476b471d3Bob Wilson/// createJumpTableIndex - Create a new jump table entry in the jump table info. 57437efe6764568a3829fee26aba532283131d1a104Nate Begeman/// 575d1ec31dca534a8816d7f2fcbfdc7ed4476b471d3Bob Wilsonunsigned MachineJumpTableInfo::createJumpTableIndex( 576a4eb44a285984ec999de632beb5145b099f5416dChris Lattner const std::vector<MachineBasicBlock*> &DestBBs) { 577e7251a0377334bdb57bd188828bf89c9e3980fadChris Lattner assert(!DestBBs.empty() && "Cannot create an empty jump table!"); 57837efe6764568a3829fee26aba532283131d1a104Nate Begeman JumpTables.push_back(MachineJumpTableEntry(DestBBs)); 57937efe6764568a3829fee26aba532283131d1a104Nate Begeman return JumpTables.size()-1; 58037efe6764568a3829fee26aba532283131d1a104Nate Begeman} 58137efe6764568a3829fee26aba532283131d1a104Nate Begeman 582593ea05957b98472a916278d64229ceda223c50bDan Gohman/// ReplaceMBBInJumpTables - If Old is the target of any jump tables, update 583593ea05957b98472a916278d64229ceda223c50bDan Gohman/// the jump tables to branch to New instead. 584beeb93e6ba48af2661eabc4872d8b159fb43e5dbChris Lattnerbool MachineJumpTableInfo::ReplaceMBBInJumpTables(MachineBasicBlock *Old, 585beeb93e6ba48af2661eabc4872d8b159fb43e5dbChris Lattner MachineBasicBlock *New) { 586593ea05957b98472a916278d64229ceda223c50bDan Gohman assert(Old != New && "Not making a change?"); 587593ea05957b98472a916278d64229ceda223c50bDan Gohman bool MadeChange = false; 58868bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach for (size_t i = 0, e = JumpTables.size(); i != e; ++i) 58968bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach ReplaceMBBInJumpTable(i, Old, New); 59068bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach return MadeChange; 59168bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach} 59268bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach 59368bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach/// ReplaceMBBInJumpTable - If Old is a target of the jump tables, update 59468bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach/// the jump table to branch to New instead. 595beeb93e6ba48af2661eabc4872d8b159fb43e5dbChris Lattnerbool MachineJumpTableInfo::ReplaceMBBInJumpTable(unsigned Idx, 596beeb93e6ba48af2661eabc4872d8b159fb43e5dbChris Lattner MachineBasicBlock *Old, 597beeb93e6ba48af2661eabc4872d8b159fb43e5dbChris Lattner MachineBasicBlock *New) { 59868bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach assert(Old != New && "Not making a change?"); 59968bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach bool MadeChange = false; 60068bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach MachineJumpTableEntry &JTE = JumpTables[Idx]; 60168bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach for (size_t j = 0, e = JTE.MBBs.size(); j != e; ++j) 60268bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach if (JTE.MBBs[j] == Old) { 60368bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach JTE.MBBs[j] = New; 60468bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach MadeChange = true; 60568bb60f6a4e0902769f72d1badda4e37cd873ffbJim Grosbach } 606593ea05957b98472a916278d64229ceda223c50bDan Gohman return MadeChange; 607593ea05957b98472a916278d64229ceda223c50bDan Gohman} 60837efe6764568a3829fee26aba532283131d1a104Nate Begeman 609d74c556e9aaad81a188158b7ba12d7ccffb30936Chris Lattnervoid MachineJumpTableInfo::print(raw_ostream &OS) const { 6100ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman if (JumpTables.empty()) return; 6110ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman 6120ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << "Jump Tables:\n"; 6130ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman 61437efe6764568a3829fee26aba532283131d1a104Nate Begeman for (unsigned i = 0, e = JumpTables.size(); i != e; ++i) { 6150ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << " jt#" << i << ": "; 6160ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman for (unsigned j = 0, f = JumpTables[i].MBBs.size(); j != f; ++j) 6170ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << " BB#" << JumpTables[i].MBBs[j]->getNumber(); 61837efe6764568a3829fee26aba532283131d1a104Nate Begeman } 6190ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman 6200ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << '\n'; 62137efe6764568a3829fee26aba532283131d1a104Nate Begeman} 62237efe6764568a3829fee26aba532283131d1a104Nate Begeman 623dc55481841d5ac060c279a61c944f192ad9bb23eDavid Greenevoid MachineJumpTableInfo::dump() const { print(dbgs()); } 62437efe6764568a3829fee26aba532283131d1a104Nate Begeman 62537efe6764568a3829fee26aba532283131d1a104Nate Begeman 62637efe6764568a3829fee26aba532283131d1a104Nate Begeman//===----------------------------------------------------------------------===// 6274d149cdae1553426f49623fdae215d481d56d955Chris Lattner// MachineConstantPool implementation 6284d149cdae1553426f49623fdae215d481d56d955Chris Lattner//===----------------------------------------------------------------------===// 6294d149cdae1553426f49623fdae215d481d56d955Chris Lattner 6309abd7c38675ad305c733b7e90578255271afc6bdEvan Chengconst Type *MachineConstantPoolEntry::getType() const { 6319abd7c38675ad305c733b7e90578255271afc6bdEvan Cheng if (isMachineConstantPoolEntry()) 632cb4596364369ea36ff5675eb12fc62d0c6f1f0ddChris Lattner return Val.MachineCPVal->getType(); 6339abd7c38675ad305c733b7e90578255271afc6bdEvan Cheng return Val.ConstVal->getType(); 6349abd7c38675ad305c733b7e90578255271afc6bdEvan Cheng} 6359abd7c38675ad305c733b7e90578255271afc6bdEvan Cheng 636cb4596364369ea36ff5675eb12fc62d0c6f1f0ddChris Lattner 637354c0165e755fd857bc89792243b82387ee3936dChris Lattnerunsigned MachineConstantPoolEntry::getRelocationInfo() const { 638cb4596364369ea36ff5675eb12fc62d0c6f1f0ddChris Lattner if (isMachineConstantPoolEntry()) 639354c0165e755fd857bc89792243b82387ee3936dChris Lattner return Val.MachineCPVal->getRelocationInfo(); 6407cf12c7efd37dc12c3ed536a3f4c373dddac2b85Chris Lattner return Val.ConstVal->getRelocationInfo(); 641cb4596364369ea36ff5675eb12fc62d0c6f1f0ddChris Lattner} 642cb4596364369ea36ff5675eb12fc62d0c6f1f0ddChris Lattner 643d6594ae54cfde4db4d30272192645c0a45fb9902Evan ChengMachineConstantPool::~MachineConstantPool() { 644d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng for (unsigned i = 0, e = Constants.size(); i != e; ++i) 645d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng if (Constants[i].isMachineConstantPoolEntry()) 646d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng delete Constants[i].Val.MachineCPVal; 647d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng} 648d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 64983f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman/// CanShareConstantPoolEntry - Test whether the given two constants 65083f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman/// can be allocated the same constant pool entry. 65146510a73e977273ec67747eb34cbdb43f815e451Dan Gohmanstatic bool CanShareConstantPoolEntry(const Constant *A, const Constant *B, 65283f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman const TargetData *TD) { 65383f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman // Handle the trivial case quickly. 65483f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman if (A == B) return true; 65583f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman 65683f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman // If they have the same type but weren't the same constant, quickly 65783f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman // reject them. 65883f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman if (A->getType() == B->getType()) return false; 65983f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman 66083f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman // For now, only support constants with the same size. 66183f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman if (TD->getTypeStoreSize(A->getType()) != TD->getTypeStoreSize(B->getType())) 66283f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman return false; 66383f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman 66483f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman // If a floating-point value and an integer value have the same encoding, 66583f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman // they can share a constant-pool entry. 66646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman if (const ConstantFP *AFP = dyn_cast<ConstantFP>(A)) 66746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman if (const ConstantInt *BI = dyn_cast<ConstantInt>(B)) 66883f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman return AFP->getValueAPF().bitcastToAPInt() == BI->getValue(); 66946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman if (const ConstantFP *BFP = dyn_cast<ConstantFP>(B)) 67046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman if (const ConstantInt *AI = dyn_cast<ConstantInt>(A)) 67183f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman return BFP->getValueAPF().bitcastToAPInt() == AI->getValue(); 67283f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman 67383f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman // Two vectors can share an entry if each pair of corresponding 67483f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman // elements could. 67546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman if (const ConstantVector *AV = dyn_cast<ConstantVector>(A)) 67646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman if (const ConstantVector *BV = dyn_cast<ConstantVector>(B)) { 67783f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman if (AV->getType()->getNumElements() != BV->getType()->getNumElements()) 67883f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman return false; 67983f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman for (unsigned i = 0, e = AV->getType()->getNumElements(); i != e; ++i) 68060d686df5471f7156a6b8afa5859346272216c56Dan Gohman if (!CanShareConstantPoolEntry(AV->getOperand(i), 68160d686df5471f7156a6b8afa5859346272216c56Dan Gohman BV->getOperand(i), TD)) 68283f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman return false; 68383f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman return true; 68483f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman } 68583f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman 68683f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman // TODO: Handle other cases. 68783f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman 68883f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman return false; 68983f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman} 69083f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman 6913029f920519e0871a5aad5d7c592281093953733Chris Lattner/// getConstantPoolIndex - Create a new entry in the constant pool or return 69205ae98346a190d74c2c8799c3af2f8ca23e47c27Dan Gohman/// an existing one. User must specify the log2 of the minimum required 69305ae98346a190d74c2c8799c3af2f8ca23e47c27Dan Gohman/// alignment for the object. 6943029f920519e0871a5aad5d7c592281093953733Chris Lattner/// 69546510a73e977273ec67747eb34cbdb43f815e451Dan Gohmanunsigned MachineConstantPool::getConstantPoolIndex(const Constant *C, 6963029f920519e0871a5aad5d7c592281093953733Chris Lattner unsigned Alignment) { 6973029f920519e0871a5aad5d7c592281093953733Chris Lattner assert(Alignment && "Alignment must be specified!"); 6983029f920519e0871a5aad5d7c592281093953733Chris Lattner if (Alignment > PoolAlignment) PoolAlignment = Alignment; 69983f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman 7003029f920519e0871a5aad5d7c592281093953733Chris Lattner // Check to see if we already have this constant. 7013029f920519e0871a5aad5d7c592281093953733Chris Lattner // 7023029f920519e0871a5aad5d7c592281093953733Chris Lattner // FIXME, this could be made much more efficient for large constant pools. 7033029f920519e0871a5aad5d7c592281093953733Chris Lattner for (unsigned i = 0, e = Constants.size(); i != e; ++i) 70483f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman if (!Constants[i].isMachineConstantPoolEntry() && 70583f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman CanShareConstantPoolEntry(Constants[i].Val.ConstVal, C, TD)) { 70683f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman if ((unsigned)Constants[i].getAlignment() < Alignment) 70783f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman Constants[i].Alignment = Alignment; 7083029f920519e0871a5aad5d7c592281093953733Chris Lattner return i; 70983f6120c9a1fe758b2502b060cd7ae9a981ecc39Dan Gohman } 7103029f920519e0871a5aad5d7c592281093953733Chris Lattner 7111606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng Constants.push_back(MachineConstantPoolEntry(C, Alignment)); 7123029f920519e0871a5aad5d7c592281093953733Chris Lattner return Constants.size()-1; 7133029f920519e0871a5aad5d7c592281093953733Chris Lattner} 7143029f920519e0871a5aad5d7c592281093953733Chris Lattner 715d6594ae54cfde4db4d30272192645c0a45fb9902Evan Chengunsigned MachineConstantPool::getConstantPoolIndex(MachineConstantPoolValue *V, 716d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng unsigned Alignment) { 717d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng assert(Alignment && "Alignment must be specified!"); 718d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng if (Alignment > PoolAlignment) PoolAlignment = Alignment; 719d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 720d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng // Check to see if we already have this constant. 721d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng // 722d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng // FIXME, this could be made much more efficient for large constant pools. 723d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng int Idx = V->getExistingMachineCPValue(this, Alignment); 724d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng if (Idx != -1) 725d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng return (unsigned)Idx; 7261606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng 7271606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng Constants.push_back(MachineConstantPoolEntry(V, Alignment)); 728d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng return Constants.size()-1; 729d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng} 730d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 73162ca32540f950d500227f1863b95cd08ad28099eChris Lattnervoid MachineConstantPool::print(raw_ostream &OS) const { 7320ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman if (Constants.empty()) return; 7330ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman 7340ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << "Constant Pool:\n"; 735b8973bd8f50d7321635e1e07b81a880a0828d185Evan Cheng for (unsigned i = 0, e = Constants.size(); i != e; ++i) { 7360ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << " cp#" << i << ": "; 737d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng if (Constants[i].isMachineConstantPoolEntry()) 738d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng Constants[i].Val.MachineCPVal->print(OS); 739d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng else 740d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng OS << *(Value*)Constants[i].Val.ConstVal; 7410ba90f3e34b826b039bdfece1415ef032c4ad3f5Dan Gohman OS << ", align=" << Constants[i].getAlignment(); 742b8973bd8f50d7321635e1e07b81a880a0828d185Evan Cheng OS << "\n"; 743b8973bd8f50d7321635e1e07b81a880a0828d185Evan Cheng } 7444d149cdae1553426f49623fdae215d481d56d955Chris Lattner} 7454d149cdae1553426f49623fdae215d481d56d955Chris Lattner 746dc55481841d5ac060c279a61c944f192ad9bb23eDavid Greenevoid MachineConstantPool::dump() const { print(dbgs()); } 747