xref: /openbsd-src/gnu/llvm/llvm/lib/CodeGen/MachineFunction.cpp (revision 09467b48e8bc8b4905716062da846024139afbf2)
1*09467b48Spatrick //===- MachineFunction.cpp ------------------------------------------------===//
2*09467b48Spatrick //
3*09467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*09467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*09467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*09467b48Spatrick //
7*09467b48Spatrick //===----------------------------------------------------------------------===//
8*09467b48Spatrick //
9*09467b48Spatrick // Collect native machine code information for a function.  This allows
10*09467b48Spatrick // target-specific information about the generated code to be stored with each
11*09467b48Spatrick // function.
12*09467b48Spatrick //
13*09467b48Spatrick //===----------------------------------------------------------------------===//
14*09467b48Spatrick 
15*09467b48Spatrick #include "llvm/CodeGen/MachineFunction.h"
16*09467b48Spatrick #include "llvm/ADT/BitVector.h"
17*09467b48Spatrick #include "llvm/ADT/DenseMap.h"
18*09467b48Spatrick #include "llvm/ADT/DenseSet.h"
19*09467b48Spatrick #include "llvm/ADT/STLExtras.h"
20*09467b48Spatrick #include "llvm/ADT/SmallString.h"
21*09467b48Spatrick #include "llvm/ADT/SmallVector.h"
22*09467b48Spatrick #include "llvm/ADT/StringRef.h"
23*09467b48Spatrick #include "llvm/ADT/Twine.h"
24*09467b48Spatrick #include "llvm/Analysis/ConstantFolding.h"
25*09467b48Spatrick #include "llvm/Analysis/EHPersonalities.h"
26*09467b48Spatrick #include "llvm/CodeGen/MachineBasicBlock.h"
27*09467b48Spatrick #include "llvm/CodeGen/MachineConstantPool.h"
28*09467b48Spatrick #include "llvm/CodeGen/MachineFrameInfo.h"
29*09467b48Spatrick #include "llvm/CodeGen/MachineInstr.h"
30*09467b48Spatrick #include "llvm/CodeGen/MachineJumpTableInfo.h"
31*09467b48Spatrick #include "llvm/CodeGen/MachineMemOperand.h"
32*09467b48Spatrick #include "llvm/CodeGen/MachineModuleInfo.h"
33*09467b48Spatrick #include "llvm/CodeGen/MachineRegisterInfo.h"
34*09467b48Spatrick #include "llvm/CodeGen/PseudoSourceValue.h"
35*09467b48Spatrick #include "llvm/CodeGen/TargetFrameLowering.h"
36*09467b48Spatrick #include "llvm/CodeGen/TargetLowering.h"
37*09467b48Spatrick #include "llvm/CodeGen/TargetRegisterInfo.h"
38*09467b48Spatrick #include "llvm/CodeGen/TargetSubtargetInfo.h"
39*09467b48Spatrick #include "llvm/CodeGen/WasmEHFuncInfo.h"
40*09467b48Spatrick #include "llvm/CodeGen/WinEHFuncInfo.h"
41*09467b48Spatrick #include "llvm/Config/llvm-config.h"
42*09467b48Spatrick #include "llvm/IR/Attributes.h"
43*09467b48Spatrick #include "llvm/IR/BasicBlock.h"
44*09467b48Spatrick #include "llvm/IR/Constant.h"
45*09467b48Spatrick #include "llvm/IR/DataLayout.h"
46*09467b48Spatrick #include "llvm/IR/DebugInfoMetadata.h"
47*09467b48Spatrick #include "llvm/IR/DerivedTypes.h"
48*09467b48Spatrick #include "llvm/IR/Function.h"
49*09467b48Spatrick #include "llvm/IR/GlobalValue.h"
50*09467b48Spatrick #include "llvm/IR/Instruction.h"
51*09467b48Spatrick #include "llvm/IR/Instructions.h"
52*09467b48Spatrick #include "llvm/IR/Metadata.h"
53*09467b48Spatrick #include "llvm/IR/Module.h"
54*09467b48Spatrick #include "llvm/IR/ModuleSlotTracker.h"
55*09467b48Spatrick #include "llvm/IR/Value.h"
56*09467b48Spatrick #include "llvm/MC/MCContext.h"
57*09467b48Spatrick #include "llvm/MC/MCSymbol.h"
58*09467b48Spatrick #include "llvm/MC/SectionKind.h"
59*09467b48Spatrick #include "llvm/Support/Casting.h"
60*09467b48Spatrick #include "llvm/Support/CommandLine.h"
61*09467b48Spatrick #include "llvm/Support/Compiler.h"
62*09467b48Spatrick #include "llvm/Support/DOTGraphTraits.h"
63*09467b48Spatrick #include "llvm/Support/Debug.h"
64*09467b48Spatrick #include "llvm/Support/ErrorHandling.h"
65*09467b48Spatrick #include "llvm/Support/GraphWriter.h"
66*09467b48Spatrick #include "llvm/Support/raw_ostream.h"
67*09467b48Spatrick #include "llvm/Target/TargetMachine.h"
68*09467b48Spatrick #include <algorithm>
69*09467b48Spatrick #include <cassert>
70*09467b48Spatrick #include <cstddef>
71*09467b48Spatrick #include <cstdint>
72*09467b48Spatrick #include <iterator>
73*09467b48Spatrick #include <string>
74*09467b48Spatrick #include <utility>
75*09467b48Spatrick #include <vector>
76*09467b48Spatrick 
77*09467b48Spatrick using namespace llvm;
78*09467b48Spatrick 
79*09467b48Spatrick #define DEBUG_TYPE "codegen"
80*09467b48Spatrick 
81*09467b48Spatrick static cl::opt<unsigned> AlignAllFunctions(
82*09467b48Spatrick     "align-all-functions",
83*09467b48Spatrick     cl::desc("Force the alignment of all functions in log2 format (e.g. 4 "
84*09467b48Spatrick              "means align on 16B boundaries)."),
85*09467b48Spatrick     cl::init(0), cl::Hidden);
86*09467b48Spatrick 
87*09467b48Spatrick static const char *getPropertyName(MachineFunctionProperties::Property Prop) {
88*09467b48Spatrick   using P = MachineFunctionProperties::Property;
89*09467b48Spatrick 
90*09467b48Spatrick   switch(Prop) {
91*09467b48Spatrick   case P::FailedISel: return "FailedISel";
92*09467b48Spatrick   case P::IsSSA: return "IsSSA";
93*09467b48Spatrick   case P::Legalized: return "Legalized";
94*09467b48Spatrick   case P::NoPHIs: return "NoPHIs";
95*09467b48Spatrick   case P::NoVRegs: return "NoVRegs";
96*09467b48Spatrick   case P::RegBankSelected: return "RegBankSelected";
97*09467b48Spatrick   case P::Selected: return "Selected";
98*09467b48Spatrick   case P::TracksLiveness: return "TracksLiveness";
99*09467b48Spatrick   }
100*09467b48Spatrick   llvm_unreachable("Invalid machine function property");
101*09467b48Spatrick }
102*09467b48Spatrick 
103*09467b48Spatrick // Pin the vtable to this file.
104*09467b48Spatrick void MachineFunction::Delegate::anchor() {}
105*09467b48Spatrick 
106*09467b48Spatrick void MachineFunctionProperties::print(raw_ostream &OS) const {
107*09467b48Spatrick   const char *Separator = "";
108*09467b48Spatrick   for (BitVector::size_type I = 0; I < Properties.size(); ++I) {
109*09467b48Spatrick     if (!Properties[I])
110*09467b48Spatrick       continue;
111*09467b48Spatrick     OS << Separator << getPropertyName(static_cast<Property>(I));
112*09467b48Spatrick     Separator = ", ";
113*09467b48Spatrick   }
114*09467b48Spatrick }
115*09467b48Spatrick 
116*09467b48Spatrick //===----------------------------------------------------------------------===//
117*09467b48Spatrick // MachineFunction implementation
118*09467b48Spatrick //===----------------------------------------------------------------------===//
119*09467b48Spatrick 
120*09467b48Spatrick // Out-of-line virtual method.
121*09467b48Spatrick MachineFunctionInfo::~MachineFunctionInfo() = default;
122*09467b48Spatrick 
123*09467b48Spatrick void ilist_alloc_traits<MachineBasicBlock>::deleteNode(MachineBasicBlock *MBB) {
124*09467b48Spatrick   MBB->getParent()->DeleteMachineBasicBlock(MBB);
125*09467b48Spatrick }
126*09467b48Spatrick 
127*09467b48Spatrick static inline unsigned getFnStackAlignment(const TargetSubtargetInfo *STI,
128*09467b48Spatrick                                            const Function &F) {
129*09467b48Spatrick   if (F.hasFnAttribute(Attribute::StackAlignment))
130*09467b48Spatrick     return F.getFnStackAlignment();
131*09467b48Spatrick   return STI->getFrameLowering()->getStackAlignment();
132*09467b48Spatrick }
133*09467b48Spatrick 
134*09467b48Spatrick MachineFunction::MachineFunction(const Function &F,
135*09467b48Spatrick                                  const LLVMTargetMachine &Target,
136*09467b48Spatrick                                  const TargetSubtargetInfo &STI,
137*09467b48Spatrick                                  unsigned FunctionNum, MachineModuleInfo &mmi)
138*09467b48Spatrick     : F(F), Target(Target), STI(&STI), Ctx(mmi.getContext()), MMI(mmi) {
139*09467b48Spatrick   FunctionNumber = FunctionNum;
140*09467b48Spatrick   init();
141*09467b48Spatrick }
142*09467b48Spatrick 
143*09467b48Spatrick void MachineFunction::handleInsertion(MachineInstr &MI) {
144*09467b48Spatrick   if (TheDelegate)
145*09467b48Spatrick     TheDelegate->MF_HandleInsertion(MI);
146*09467b48Spatrick }
147*09467b48Spatrick 
148*09467b48Spatrick void MachineFunction::handleRemoval(MachineInstr &MI) {
149*09467b48Spatrick   if (TheDelegate)
150*09467b48Spatrick     TheDelegate->MF_HandleRemoval(MI);
151*09467b48Spatrick }
152*09467b48Spatrick 
153*09467b48Spatrick void MachineFunction::init() {
154*09467b48Spatrick   // Assume the function starts in SSA form with correct liveness.
155*09467b48Spatrick   Properties.set(MachineFunctionProperties::Property::IsSSA);
156*09467b48Spatrick   Properties.set(MachineFunctionProperties::Property::TracksLiveness);
157*09467b48Spatrick   if (STI->getRegisterInfo())
158*09467b48Spatrick     RegInfo = new (Allocator) MachineRegisterInfo(this);
159*09467b48Spatrick   else
160*09467b48Spatrick     RegInfo = nullptr;
161*09467b48Spatrick 
162*09467b48Spatrick   MFInfo = nullptr;
163*09467b48Spatrick   // We can realign the stack if the target supports it and the user hasn't
164*09467b48Spatrick   // explicitly asked us not to.
165*09467b48Spatrick   bool CanRealignSP = STI->getFrameLowering()->isStackRealignable() &&
166*09467b48Spatrick                       !F.hasFnAttribute("no-realign-stack");
167*09467b48Spatrick   FrameInfo = new (Allocator) MachineFrameInfo(
168*09467b48Spatrick       getFnStackAlignment(STI, F), /*StackRealignable=*/CanRealignSP,
169*09467b48Spatrick       /*ForcedRealign=*/CanRealignSP &&
170*09467b48Spatrick           F.hasFnAttribute(Attribute::StackAlignment));
171*09467b48Spatrick 
172*09467b48Spatrick   if (F.hasFnAttribute(Attribute::StackAlignment))
173*09467b48Spatrick     FrameInfo->ensureMaxAlignment(F.getFnStackAlignment());
174*09467b48Spatrick 
175*09467b48Spatrick   ConstantPool = new (Allocator) MachineConstantPool(getDataLayout());
176*09467b48Spatrick   Alignment = STI->getTargetLowering()->getMinFunctionAlignment();
177*09467b48Spatrick 
178*09467b48Spatrick   // FIXME: Shouldn't use pref alignment if explicit alignment is set on F.
179*09467b48Spatrick   // FIXME: Use Function::hasOptSize().
180*09467b48Spatrick   if (!F.hasFnAttribute(Attribute::OptimizeForSize))
181*09467b48Spatrick     Alignment = std::max(Alignment,
182*09467b48Spatrick                          STI->getTargetLowering()->getPrefFunctionAlignment());
183*09467b48Spatrick 
184*09467b48Spatrick   if (AlignAllFunctions)
185*09467b48Spatrick     Alignment = Align(1ULL << AlignAllFunctions);
186*09467b48Spatrick 
187*09467b48Spatrick   JumpTableInfo = nullptr;
188*09467b48Spatrick 
189*09467b48Spatrick   if (isFuncletEHPersonality(classifyEHPersonality(
190*09467b48Spatrick           F.hasPersonalityFn() ? F.getPersonalityFn() : nullptr))) {
191*09467b48Spatrick     WinEHInfo = new (Allocator) WinEHFuncInfo();
192*09467b48Spatrick   }
193*09467b48Spatrick 
194*09467b48Spatrick   if (isScopedEHPersonality(classifyEHPersonality(
195*09467b48Spatrick           F.hasPersonalityFn() ? F.getPersonalityFn() : nullptr))) {
196*09467b48Spatrick     WasmEHInfo = new (Allocator) WasmEHFuncInfo();
197*09467b48Spatrick   }
198*09467b48Spatrick 
199*09467b48Spatrick   assert(Target.isCompatibleDataLayout(getDataLayout()) &&
200*09467b48Spatrick          "Can't create a MachineFunction using a Module with a "
201*09467b48Spatrick          "Target-incompatible DataLayout attached\n");
202*09467b48Spatrick 
203*09467b48Spatrick   PSVManager =
204*09467b48Spatrick     std::make_unique<PseudoSourceValueManager>(*(getSubtarget().
205*09467b48Spatrick                                                   getInstrInfo()));
206*09467b48Spatrick }
207*09467b48Spatrick 
208*09467b48Spatrick MachineFunction::~MachineFunction() {
209*09467b48Spatrick   clear();
210*09467b48Spatrick }
211*09467b48Spatrick 
212*09467b48Spatrick void MachineFunction::clear() {
213*09467b48Spatrick   Properties.reset();
214*09467b48Spatrick   // Don't call destructors on MachineInstr and MachineOperand. All of their
215*09467b48Spatrick   // memory comes from the BumpPtrAllocator which is about to be purged.
216*09467b48Spatrick   //
217*09467b48Spatrick   // Do call MachineBasicBlock destructors, it contains std::vectors.
218*09467b48Spatrick   for (iterator I = begin(), E = end(); I != E; I = BasicBlocks.erase(I))
219*09467b48Spatrick     I->Insts.clearAndLeakNodesUnsafely();
220*09467b48Spatrick   MBBNumbering.clear();
221*09467b48Spatrick 
222*09467b48Spatrick   InstructionRecycler.clear(Allocator);
223*09467b48Spatrick   OperandRecycler.clear(Allocator);
224*09467b48Spatrick   BasicBlockRecycler.clear(Allocator);
225*09467b48Spatrick   CodeViewAnnotations.clear();
226*09467b48Spatrick   VariableDbgInfos.clear();
227*09467b48Spatrick   if (RegInfo) {
228*09467b48Spatrick     RegInfo->~MachineRegisterInfo();
229*09467b48Spatrick     Allocator.Deallocate(RegInfo);
230*09467b48Spatrick   }
231*09467b48Spatrick   if (MFInfo) {
232*09467b48Spatrick     MFInfo->~MachineFunctionInfo();
233*09467b48Spatrick     Allocator.Deallocate(MFInfo);
234*09467b48Spatrick   }
235*09467b48Spatrick 
236*09467b48Spatrick   FrameInfo->~MachineFrameInfo();
237*09467b48Spatrick   Allocator.Deallocate(FrameInfo);
238*09467b48Spatrick 
239*09467b48Spatrick   ConstantPool->~MachineConstantPool();
240*09467b48Spatrick   Allocator.Deallocate(ConstantPool);
241*09467b48Spatrick 
242*09467b48Spatrick   if (JumpTableInfo) {
243*09467b48Spatrick     JumpTableInfo->~MachineJumpTableInfo();
244*09467b48Spatrick     Allocator.Deallocate(JumpTableInfo);
245*09467b48Spatrick   }
246*09467b48Spatrick 
247*09467b48Spatrick   if (WinEHInfo) {
248*09467b48Spatrick     WinEHInfo->~WinEHFuncInfo();
249*09467b48Spatrick     Allocator.Deallocate(WinEHInfo);
250*09467b48Spatrick   }
251*09467b48Spatrick 
252*09467b48Spatrick   if (WasmEHInfo) {
253*09467b48Spatrick     WasmEHInfo->~WasmEHFuncInfo();
254*09467b48Spatrick     Allocator.Deallocate(WasmEHInfo);
255*09467b48Spatrick   }
256*09467b48Spatrick }
257*09467b48Spatrick 
258*09467b48Spatrick const DataLayout &MachineFunction::getDataLayout() const {
259*09467b48Spatrick   return F.getParent()->getDataLayout();
260*09467b48Spatrick }
261*09467b48Spatrick 
262*09467b48Spatrick /// Get the JumpTableInfo for this function.
263*09467b48Spatrick /// If it does not already exist, allocate one.
264*09467b48Spatrick MachineJumpTableInfo *MachineFunction::
265*09467b48Spatrick getOrCreateJumpTableInfo(unsigned EntryKind) {
266*09467b48Spatrick   if (JumpTableInfo) return JumpTableInfo;
267*09467b48Spatrick 
268*09467b48Spatrick   JumpTableInfo = new (Allocator)
269*09467b48Spatrick     MachineJumpTableInfo((MachineJumpTableInfo::JTEntryKind)EntryKind);
270*09467b48Spatrick   return JumpTableInfo;
271*09467b48Spatrick }
272*09467b48Spatrick 
273*09467b48Spatrick DenormalMode MachineFunction::getDenormalMode(const fltSemantics &FPType) const {
274*09467b48Spatrick   // TODO: Should probably avoid the connection to the IR and store directly
275*09467b48Spatrick   // in the MachineFunction.
276*09467b48Spatrick   Attribute Attr = F.getFnAttribute("denormal-fp-math");
277*09467b48Spatrick 
278*09467b48Spatrick   // FIXME: This should assume IEEE behavior on an unspecified
279*09467b48Spatrick   // attribute. However, the one current user incorrectly assumes a non-IEEE
280*09467b48Spatrick   // target by default.
281*09467b48Spatrick   StringRef Val = Attr.getValueAsString();
282*09467b48Spatrick   if (Val.empty())
283*09467b48Spatrick     return DenormalMode::Invalid;
284*09467b48Spatrick 
285*09467b48Spatrick   return parseDenormalFPAttribute(Val);
286*09467b48Spatrick }
287*09467b48Spatrick 
288*09467b48Spatrick /// Should we be emitting segmented stack stuff for the function
289*09467b48Spatrick bool MachineFunction::shouldSplitStack() const {
290*09467b48Spatrick   return getFunction().hasFnAttribute("split-stack");
291*09467b48Spatrick }
292*09467b48Spatrick 
293*09467b48Spatrick LLVM_NODISCARD unsigned
294*09467b48Spatrick MachineFunction::addFrameInst(const MCCFIInstruction &Inst) {
295*09467b48Spatrick   FrameInstructions.push_back(Inst);
296*09467b48Spatrick   return FrameInstructions.size() - 1;
297*09467b48Spatrick }
298*09467b48Spatrick 
299*09467b48Spatrick /// This discards all of the MachineBasicBlock numbers and recomputes them.
300*09467b48Spatrick /// This guarantees that the MBB numbers are sequential, dense, and match the
301*09467b48Spatrick /// ordering of the blocks within the function.  If a specific MachineBasicBlock
302*09467b48Spatrick /// is specified, only that block and those after it are renumbered.
303*09467b48Spatrick void MachineFunction::RenumberBlocks(MachineBasicBlock *MBB) {
304*09467b48Spatrick   if (empty()) { MBBNumbering.clear(); return; }
305*09467b48Spatrick   MachineFunction::iterator MBBI, E = end();
306*09467b48Spatrick   if (MBB == nullptr)
307*09467b48Spatrick     MBBI = begin();
308*09467b48Spatrick   else
309*09467b48Spatrick     MBBI = MBB->getIterator();
310*09467b48Spatrick 
311*09467b48Spatrick   // Figure out the block number this should have.
312*09467b48Spatrick   unsigned BlockNo = 0;
313*09467b48Spatrick   if (MBBI != begin())
314*09467b48Spatrick     BlockNo = std::prev(MBBI)->getNumber() + 1;
315*09467b48Spatrick 
316*09467b48Spatrick   for (; MBBI != E; ++MBBI, ++BlockNo) {
317*09467b48Spatrick     if (MBBI->getNumber() != (int)BlockNo) {
318*09467b48Spatrick       // Remove use of the old number.
319*09467b48Spatrick       if (MBBI->getNumber() != -1) {
320*09467b48Spatrick         assert(MBBNumbering[MBBI->getNumber()] == &*MBBI &&
321*09467b48Spatrick                "MBB number mismatch!");
322*09467b48Spatrick         MBBNumbering[MBBI->getNumber()] = nullptr;
323*09467b48Spatrick       }
324*09467b48Spatrick 
325*09467b48Spatrick       // If BlockNo is already taken, set that block's number to -1.
326*09467b48Spatrick       if (MBBNumbering[BlockNo])
327*09467b48Spatrick         MBBNumbering[BlockNo]->setNumber(-1);
328*09467b48Spatrick 
329*09467b48Spatrick       MBBNumbering[BlockNo] = &*MBBI;
330*09467b48Spatrick       MBBI->setNumber(BlockNo);
331*09467b48Spatrick     }
332*09467b48Spatrick   }
333*09467b48Spatrick 
334*09467b48Spatrick   // Okay, all the blocks are renumbered.  If we have compactified the block
335*09467b48Spatrick   // numbering, shrink MBBNumbering now.
336*09467b48Spatrick   assert(BlockNo <= MBBNumbering.size() && "Mismatch!");
337*09467b48Spatrick   MBBNumbering.resize(BlockNo);
338*09467b48Spatrick }
339*09467b48Spatrick 
340*09467b48Spatrick /// Allocate a new MachineInstr. Use this instead of `new MachineInstr'.
341*09467b48Spatrick MachineInstr *MachineFunction::CreateMachineInstr(const MCInstrDesc &MCID,
342*09467b48Spatrick                                                   const DebugLoc &DL,
343*09467b48Spatrick                                                   bool NoImp) {
344*09467b48Spatrick   return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
345*09467b48Spatrick     MachineInstr(*this, MCID, DL, NoImp);
346*09467b48Spatrick }
347*09467b48Spatrick 
348*09467b48Spatrick /// Create a new MachineInstr which is a copy of the 'Orig' instruction,
349*09467b48Spatrick /// identical in all ways except the instruction has no parent, prev, or next.
350*09467b48Spatrick MachineInstr *
351*09467b48Spatrick MachineFunction::CloneMachineInstr(const MachineInstr *Orig) {
352*09467b48Spatrick   return new (InstructionRecycler.Allocate<MachineInstr>(Allocator))
353*09467b48Spatrick              MachineInstr(*this, *Orig);
354*09467b48Spatrick }
355*09467b48Spatrick 
356*09467b48Spatrick MachineInstr &MachineFunction::CloneMachineInstrBundle(MachineBasicBlock &MBB,
357*09467b48Spatrick     MachineBasicBlock::iterator InsertBefore, const MachineInstr &Orig) {
358*09467b48Spatrick   MachineInstr *FirstClone = nullptr;
359*09467b48Spatrick   MachineBasicBlock::const_instr_iterator I = Orig.getIterator();
360*09467b48Spatrick   while (true) {
361*09467b48Spatrick     MachineInstr *Cloned = CloneMachineInstr(&*I);
362*09467b48Spatrick     MBB.insert(InsertBefore, Cloned);
363*09467b48Spatrick     if (FirstClone == nullptr) {
364*09467b48Spatrick       FirstClone = Cloned;
365*09467b48Spatrick     } else {
366*09467b48Spatrick       Cloned->bundleWithPred();
367*09467b48Spatrick     }
368*09467b48Spatrick 
369*09467b48Spatrick     if (!I->isBundledWithSucc())
370*09467b48Spatrick       break;
371*09467b48Spatrick     ++I;
372*09467b48Spatrick   }
373*09467b48Spatrick   return *FirstClone;
374*09467b48Spatrick }
375*09467b48Spatrick 
376*09467b48Spatrick /// Delete the given MachineInstr.
377*09467b48Spatrick ///
378*09467b48Spatrick /// This function also serves as the MachineInstr destructor - the real
379*09467b48Spatrick /// ~MachineInstr() destructor must be empty.
380*09467b48Spatrick void
381*09467b48Spatrick MachineFunction::DeleteMachineInstr(MachineInstr *MI) {
382*09467b48Spatrick   // Verify that a call site info is at valid state. This assertion should
383*09467b48Spatrick   // be triggered during the implementation of support for the
384*09467b48Spatrick   // call site info of a new architecture. If the assertion is triggered,
385*09467b48Spatrick   // back trace will tell where to insert a call to updateCallSiteInfo().
386*09467b48Spatrick   assert((!MI->isCall(MachineInstr::IgnoreBundle) ||
387*09467b48Spatrick           CallSitesInfo.find(MI) == CallSitesInfo.end()) &&
388*09467b48Spatrick          "Call site info was not updated!");
389*09467b48Spatrick   // Strip it for parts. The operand array and the MI object itself are
390*09467b48Spatrick   // independently recyclable.
391*09467b48Spatrick   if (MI->Operands)
392*09467b48Spatrick     deallocateOperandArray(MI->CapOperands, MI->Operands);
393*09467b48Spatrick   // Don't call ~MachineInstr() which must be trivial anyway because
394*09467b48Spatrick   // ~MachineFunction drops whole lists of MachineInstrs wihout calling their
395*09467b48Spatrick   // destructors.
396*09467b48Spatrick   InstructionRecycler.Deallocate(Allocator, MI);
397*09467b48Spatrick }
398*09467b48Spatrick 
399*09467b48Spatrick /// Allocate a new MachineBasicBlock. Use this instead of
400*09467b48Spatrick /// `new MachineBasicBlock'.
401*09467b48Spatrick MachineBasicBlock *
402*09467b48Spatrick MachineFunction::CreateMachineBasicBlock(const BasicBlock *bb) {
403*09467b48Spatrick   return new (BasicBlockRecycler.Allocate<MachineBasicBlock>(Allocator))
404*09467b48Spatrick              MachineBasicBlock(*this, bb);
405*09467b48Spatrick }
406*09467b48Spatrick 
407*09467b48Spatrick /// Delete the given MachineBasicBlock.
408*09467b48Spatrick void
409*09467b48Spatrick MachineFunction::DeleteMachineBasicBlock(MachineBasicBlock *MBB) {
410*09467b48Spatrick   assert(MBB->getParent() == this && "MBB parent mismatch!");
411*09467b48Spatrick   MBB->~MachineBasicBlock();
412*09467b48Spatrick   BasicBlockRecycler.Deallocate(Allocator, MBB);
413*09467b48Spatrick }
414*09467b48Spatrick 
415*09467b48Spatrick MachineMemOperand *MachineFunction::getMachineMemOperand(
416*09467b48Spatrick     MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, uint64_t s,
417*09467b48Spatrick     unsigned base_alignment, const AAMDNodes &AAInfo, const MDNode *Ranges,
418*09467b48Spatrick     SyncScope::ID SSID, AtomicOrdering Ordering,
419*09467b48Spatrick     AtomicOrdering FailureOrdering) {
420*09467b48Spatrick   return new (Allocator)
421*09467b48Spatrick       MachineMemOperand(PtrInfo, f, s, base_alignment, AAInfo, Ranges,
422*09467b48Spatrick                         SSID, Ordering, FailureOrdering);
423*09467b48Spatrick }
424*09467b48Spatrick 
425*09467b48Spatrick MachineMemOperand *
426*09467b48Spatrick MachineFunction::getMachineMemOperand(const MachineMemOperand *MMO,
427*09467b48Spatrick                                       int64_t Offset, uint64_t Size) {
428*09467b48Spatrick   const MachinePointerInfo &PtrInfo = MMO->getPointerInfo();
429*09467b48Spatrick 
430*09467b48Spatrick   // If there is no pointer value, the offset isn't tracked so we need to adjust
431*09467b48Spatrick   // the base alignment.
432*09467b48Spatrick   unsigned Align = PtrInfo.V.isNull()
433*09467b48Spatrick                        ? MinAlign(MMO->getBaseAlignment(), Offset)
434*09467b48Spatrick                        : MMO->getBaseAlignment();
435*09467b48Spatrick 
436*09467b48Spatrick   return new (Allocator)
437*09467b48Spatrick       MachineMemOperand(PtrInfo.getWithOffset(Offset), MMO->getFlags(), Size,
438*09467b48Spatrick                         Align, AAMDNodes(), nullptr, MMO->getSyncScopeID(),
439*09467b48Spatrick                         MMO->getOrdering(), MMO->getFailureOrdering());
440*09467b48Spatrick }
441*09467b48Spatrick 
442*09467b48Spatrick MachineMemOperand *
443*09467b48Spatrick MachineFunction::getMachineMemOperand(const MachineMemOperand *MMO,
444*09467b48Spatrick                                       const AAMDNodes &AAInfo) {
445*09467b48Spatrick   MachinePointerInfo MPI = MMO->getValue() ?
446*09467b48Spatrick              MachinePointerInfo(MMO->getValue(), MMO->getOffset()) :
447*09467b48Spatrick              MachinePointerInfo(MMO->getPseudoValue(), MMO->getOffset());
448*09467b48Spatrick 
449*09467b48Spatrick   return new (Allocator)
450*09467b48Spatrick              MachineMemOperand(MPI, MMO->getFlags(), MMO->getSize(),
451*09467b48Spatrick                                MMO->getBaseAlignment(), AAInfo,
452*09467b48Spatrick                                MMO->getRanges(), MMO->getSyncScopeID(),
453*09467b48Spatrick                                MMO->getOrdering(), MMO->getFailureOrdering());
454*09467b48Spatrick }
455*09467b48Spatrick 
456*09467b48Spatrick MachineMemOperand *
457*09467b48Spatrick MachineFunction::getMachineMemOperand(const MachineMemOperand *MMO,
458*09467b48Spatrick                                       MachineMemOperand::Flags Flags) {
459*09467b48Spatrick   return new (Allocator) MachineMemOperand(
460*09467b48Spatrick       MMO->getPointerInfo(), Flags, MMO->getSize(), MMO->getBaseAlignment(),
461*09467b48Spatrick       MMO->getAAInfo(), MMO->getRanges(), MMO->getSyncScopeID(),
462*09467b48Spatrick       MMO->getOrdering(), MMO->getFailureOrdering());
463*09467b48Spatrick }
464*09467b48Spatrick 
465*09467b48Spatrick MachineInstr::ExtraInfo *MachineFunction::createMIExtraInfo(
466*09467b48Spatrick     ArrayRef<MachineMemOperand *> MMOs, MCSymbol *PreInstrSymbol,
467*09467b48Spatrick     MCSymbol *PostInstrSymbol, MDNode *HeapAllocMarker) {
468*09467b48Spatrick   return MachineInstr::ExtraInfo::create(Allocator, MMOs, PreInstrSymbol,
469*09467b48Spatrick                                          PostInstrSymbol, HeapAllocMarker);
470*09467b48Spatrick }
471*09467b48Spatrick 
472*09467b48Spatrick const char *MachineFunction::createExternalSymbolName(StringRef Name) {
473*09467b48Spatrick   char *Dest = Allocator.Allocate<char>(Name.size() + 1);
474*09467b48Spatrick   llvm::copy(Name, Dest);
475*09467b48Spatrick   Dest[Name.size()] = 0;
476*09467b48Spatrick   return Dest;
477*09467b48Spatrick }
478*09467b48Spatrick 
479*09467b48Spatrick uint32_t *MachineFunction::allocateRegMask() {
480*09467b48Spatrick   unsigned NumRegs = getSubtarget().getRegisterInfo()->getNumRegs();
481*09467b48Spatrick   unsigned Size = MachineOperand::getRegMaskSize(NumRegs);
482*09467b48Spatrick   uint32_t *Mask = Allocator.Allocate<uint32_t>(Size);
483*09467b48Spatrick   memset(Mask, 0, Size * sizeof(Mask[0]));
484*09467b48Spatrick   return Mask;
485*09467b48Spatrick }
486*09467b48Spatrick 
487*09467b48Spatrick ArrayRef<int> MachineFunction::allocateShuffleMask(ArrayRef<int> Mask) {
488*09467b48Spatrick   int* AllocMask = Allocator.Allocate<int>(Mask.size());
489*09467b48Spatrick   copy(Mask, AllocMask);
490*09467b48Spatrick   return {AllocMask, Mask.size()};
491*09467b48Spatrick }
492*09467b48Spatrick 
493*09467b48Spatrick #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
494*09467b48Spatrick LLVM_DUMP_METHOD void MachineFunction::dump() const {
495*09467b48Spatrick   print(dbgs());
496*09467b48Spatrick }
497*09467b48Spatrick #endif
498*09467b48Spatrick 
499*09467b48Spatrick StringRef MachineFunction::getName() const {
500*09467b48Spatrick   return getFunction().getName();
501*09467b48Spatrick }
502*09467b48Spatrick 
503*09467b48Spatrick void MachineFunction::print(raw_ostream &OS, const SlotIndexes *Indexes) const {
504*09467b48Spatrick   OS << "# Machine code for function " << getName() << ": ";
505*09467b48Spatrick   getProperties().print(OS);
506*09467b48Spatrick   OS << '\n';
507*09467b48Spatrick 
508*09467b48Spatrick   // Print Frame Information
509*09467b48Spatrick   FrameInfo->print(*this, OS);
510*09467b48Spatrick 
511*09467b48Spatrick   // Print JumpTable Information
512*09467b48Spatrick   if (JumpTableInfo)
513*09467b48Spatrick     JumpTableInfo->print(OS);
514*09467b48Spatrick 
515*09467b48Spatrick   // Print Constant Pool
516*09467b48Spatrick   ConstantPool->print(OS);
517*09467b48Spatrick 
518*09467b48Spatrick   const TargetRegisterInfo *TRI = getSubtarget().getRegisterInfo();
519*09467b48Spatrick 
520*09467b48Spatrick   if (RegInfo && !RegInfo->livein_empty()) {
521*09467b48Spatrick     OS << "Function Live Ins: ";
522*09467b48Spatrick     for (MachineRegisterInfo::livein_iterator
523*09467b48Spatrick          I = RegInfo->livein_begin(), E = RegInfo->livein_end(); I != E; ++I) {
524*09467b48Spatrick       OS << printReg(I->first, TRI);
525*09467b48Spatrick       if (I->second)
526*09467b48Spatrick         OS << " in " << printReg(I->second, TRI);
527*09467b48Spatrick       if (std::next(I) != E)
528*09467b48Spatrick         OS << ", ";
529*09467b48Spatrick     }
530*09467b48Spatrick     OS << '\n';
531*09467b48Spatrick   }
532*09467b48Spatrick 
533*09467b48Spatrick   ModuleSlotTracker MST(getFunction().getParent());
534*09467b48Spatrick   MST.incorporateFunction(getFunction());
535*09467b48Spatrick   for (const auto &BB : *this) {
536*09467b48Spatrick     OS << '\n';
537*09467b48Spatrick     // If we print the whole function, print it at its most verbose level.
538*09467b48Spatrick     BB.print(OS, MST, Indexes, /*IsStandalone=*/true);
539*09467b48Spatrick   }
540*09467b48Spatrick 
541*09467b48Spatrick   OS << "\n# End machine code for function " << getName() << ".\n\n";
542*09467b48Spatrick }
543*09467b48Spatrick 
544*09467b48Spatrick /// True if this function needs frame moves for debug or exceptions.
545*09467b48Spatrick bool MachineFunction::needsFrameMoves() const {
546*09467b48Spatrick   return getMMI().hasDebugInfo() ||
547*09467b48Spatrick          getTarget().Options.ForceDwarfFrameSection ||
548*09467b48Spatrick          F.needsUnwindTableEntry();
549*09467b48Spatrick }
550*09467b48Spatrick 
551*09467b48Spatrick namespace llvm {
552*09467b48Spatrick 
553*09467b48Spatrick   template<>
554*09467b48Spatrick   struct DOTGraphTraits<const MachineFunction*> : public DefaultDOTGraphTraits {
555*09467b48Spatrick     DOTGraphTraits(bool isSimple = false) : DefaultDOTGraphTraits(isSimple) {}
556*09467b48Spatrick 
557*09467b48Spatrick     static std::string getGraphName(const MachineFunction *F) {
558*09467b48Spatrick       return ("CFG for '" + F->getName() + "' function").str();
559*09467b48Spatrick     }
560*09467b48Spatrick 
561*09467b48Spatrick     std::string getNodeLabel(const MachineBasicBlock *Node,
562*09467b48Spatrick                              const MachineFunction *Graph) {
563*09467b48Spatrick       std::string OutStr;
564*09467b48Spatrick       {
565*09467b48Spatrick         raw_string_ostream OSS(OutStr);
566*09467b48Spatrick 
567*09467b48Spatrick         if (isSimple()) {
568*09467b48Spatrick           OSS << printMBBReference(*Node);
569*09467b48Spatrick           if (const BasicBlock *BB = Node->getBasicBlock())
570*09467b48Spatrick             OSS << ": " << BB->getName();
571*09467b48Spatrick         } else
572*09467b48Spatrick           Node->print(OSS);
573*09467b48Spatrick       }
574*09467b48Spatrick 
575*09467b48Spatrick       if (OutStr[0] == '\n') OutStr.erase(OutStr.begin());
576*09467b48Spatrick 
577*09467b48Spatrick       // Process string output to make it nicer...
578*09467b48Spatrick       for (unsigned i = 0; i != OutStr.length(); ++i)
579*09467b48Spatrick         if (OutStr[i] == '\n') {                            // Left justify
580*09467b48Spatrick           OutStr[i] = '\\';
581*09467b48Spatrick           OutStr.insert(OutStr.begin()+i+1, 'l');
582*09467b48Spatrick         }
583*09467b48Spatrick       return OutStr;
584*09467b48Spatrick     }
585*09467b48Spatrick   };
586*09467b48Spatrick 
587*09467b48Spatrick } // end namespace llvm
588*09467b48Spatrick 
589*09467b48Spatrick void MachineFunction::viewCFG() const
590*09467b48Spatrick {
591*09467b48Spatrick #ifndef NDEBUG
592*09467b48Spatrick   ViewGraph(this, "mf" + getName());
593*09467b48Spatrick #else
594*09467b48Spatrick   errs() << "MachineFunction::viewCFG is only available in debug builds on "
595*09467b48Spatrick          << "systems with Graphviz or gv!\n";
596*09467b48Spatrick #endif // NDEBUG
597*09467b48Spatrick }
598*09467b48Spatrick 
599*09467b48Spatrick void MachineFunction::viewCFGOnly() const
600*09467b48Spatrick {
601*09467b48Spatrick #ifndef NDEBUG
602*09467b48Spatrick   ViewGraph(this, "mf" + getName(), true);
603*09467b48Spatrick #else
604*09467b48Spatrick   errs() << "MachineFunction::viewCFGOnly is only available in debug builds on "
605*09467b48Spatrick          << "systems with Graphviz or gv!\n";
606*09467b48Spatrick #endif // NDEBUG
607*09467b48Spatrick }
608*09467b48Spatrick 
609*09467b48Spatrick /// Add the specified physical register as a live-in value and
610*09467b48Spatrick /// create a corresponding virtual register for it.
611*09467b48Spatrick unsigned MachineFunction::addLiveIn(unsigned PReg,
612*09467b48Spatrick                                     const TargetRegisterClass *RC) {
613*09467b48Spatrick   MachineRegisterInfo &MRI = getRegInfo();
614*09467b48Spatrick   unsigned VReg = MRI.getLiveInVirtReg(PReg);
615*09467b48Spatrick   if (VReg) {
616*09467b48Spatrick     const TargetRegisterClass *VRegRC = MRI.getRegClass(VReg);
617*09467b48Spatrick     (void)VRegRC;
618*09467b48Spatrick     // A physical register can be added several times.
619*09467b48Spatrick     // Between two calls, the register class of the related virtual register
620*09467b48Spatrick     // may have been constrained to match some operation constraints.
621*09467b48Spatrick     // In that case, check that the current register class includes the
622*09467b48Spatrick     // physical register and is a sub class of the specified RC.
623*09467b48Spatrick     assert((VRegRC == RC || (VRegRC->contains(PReg) &&
624*09467b48Spatrick                              RC->hasSubClassEq(VRegRC))) &&
625*09467b48Spatrick             "Register class mismatch!");
626*09467b48Spatrick     return VReg;
627*09467b48Spatrick   }
628*09467b48Spatrick   VReg = MRI.createVirtualRegister(RC);
629*09467b48Spatrick   MRI.addLiveIn(PReg, VReg);
630*09467b48Spatrick   return VReg;
631*09467b48Spatrick }
632*09467b48Spatrick 
633*09467b48Spatrick /// Return the MCSymbol for the specified non-empty jump table.
634*09467b48Spatrick /// If isLinkerPrivate is specified, an 'l' label is returned, otherwise a
635*09467b48Spatrick /// normal 'L' label is returned.
636*09467b48Spatrick MCSymbol *MachineFunction::getJTISymbol(unsigned JTI, MCContext &Ctx,
637*09467b48Spatrick                                         bool isLinkerPrivate) const {
638*09467b48Spatrick   const DataLayout &DL = getDataLayout();
639*09467b48Spatrick   assert(JumpTableInfo && "No jump tables");
640*09467b48Spatrick   assert(JTI < JumpTableInfo->getJumpTables().size() && "Invalid JTI!");
641*09467b48Spatrick 
642*09467b48Spatrick   StringRef Prefix = isLinkerPrivate ? DL.getLinkerPrivateGlobalPrefix()
643*09467b48Spatrick                                      : DL.getPrivateGlobalPrefix();
644*09467b48Spatrick   SmallString<60> Name;
645*09467b48Spatrick   raw_svector_ostream(Name)
646*09467b48Spatrick     << Prefix << "JTI" << getFunctionNumber() << '_' << JTI;
647*09467b48Spatrick   return Ctx.getOrCreateSymbol(Name);
648*09467b48Spatrick }
649*09467b48Spatrick 
650*09467b48Spatrick /// Return a function-local symbol to represent the PIC base.
651*09467b48Spatrick MCSymbol *MachineFunction::getPICBaseSymbol() const {
652*09467b48Spatrick   const DataLayout &DL = getDataLayout();
653*09467b48Spatrick   return Ctx.getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
654*09467b48Spatrick                                Twine(getFunctionNumber()) + "$pb");
655*09467b48Spatrick }
656*09467b48Spatrick 
657*09467b48Spatrick /// \name Exception Handling
658*09467b48Spatrick /// \{
659*09467b48Spatrick 
660*09467b48Spatrick LandingPadInfo &
661*09467b48Spatrick MachineFunction::getOrCreateLandingPadInfo(MachineBasicBlock *LandingPad) {
662*09467b48Spatrick   unsigned N = LandingPads.size();
663*09467b48Spatrick   for (unsigned i = 0; i < N; ++i) {
664*09467b48Spatrick     LandingPadInfo &LP = LandingPads[i];
665*09467b48Spatrick     if (LP.LandingPadBlock == LandingPad)
666*09467b48Spatrick       return LP;
667*09467b48Spatrick   }
668*09467b48Spatrick 
669*09467b48Spatrick   LandingPads.push_back(LandingPadInfo(LandingPad));
670*09467b48Spatrick   return LandingPads[N];
671*09467b48Spatrick }
672*09467b48Spatrick 
673*09467b48Spatrick void MachineFunction::addInvoke(MachineBasicBlock *LandingPad,
674*09467b48Spatrick                                 MCSymbol *BeginLabel, MCSymbol *EndLabel) {
675*09467b48Spatrick   LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
676*09467b48Spatrick   LP.BeginLabels.push_back(BeginLabel);
677*09467b48Spatrick   LP.EndLabels.push_back(EndLabel);
678*09467b48Spatrick }
679*09467b48Spatrick 
680*09467b48Spatrick MCSymbol *MachineFunction::addLandingPad(MachineBasicBlock *LandingPad) {
681*09467b48Spatrick   MCSymbol *LandingPadLabel = Ctx.createTempSymbol();
682*09467b48Spatrick   LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
683*09467b48Spatrick   LP.LandingPadLabel = LandingPadLabel;
684*09467b48Spatrick 
685*09467b48Spatrick   const Instruction *FirstI = LandingPad->getBasicBlock()->getFirstNonPHI();
686*09467b48Spatrick   if (const auto *LPI = dyn_cast<LandingPadInst>(FirstI)) {
687*09467b48Spatrick     if (const auto *PF =
688*09467b48Spatrick             dyn_cast<Function>(F.getPersonalityFn()->stripPointerCasts()))
689*09467b48Spatrick       getMMI().addPersonality(PF);
690*09467b48Spatrick 
691*09467b48Spatrick     if (LPI->isCleanup())
692*09467b48Spatrick       addCleanup(LandingPad);
693*09467b48Spatrick 
694*09467b48Spatrick     // FIXME: New EH - Add the clauses in reverse order. This isn't 100%
695*09467b48Spatrick     //        correct, but we need to do it this way because of how the DWARF EH
696*09467b48Spatrick     //        emitter processes the clauses.
697*09467b48Spatrick     for (unsigned I = LPI->getNumClauses(); I != 0; --I) {
698*09467b48Spatrick       Value *Val = LPI->getClause(I - 1);
699*09467b48Spatrick       if (LPI->isCatch(I - 1)) {
700*09467b48Spatrick         addCatchTypeInfo(LandingPad,
701*09467b48Spatrick                          dyn_cast<GlobalValue>(Val->stripPointerCasts()));
702*09467b48Spatrick       } else {
703*09467b48Spatrick         // Add filters in a list.
704*09467b48Spatrick         auto *CVal = cast<Constant>(Val);
705*09467b48Spatrick         SmallVector<const GlobalValue *, 4> FilterList;
706*09467b48Spatrick         for (User::op_iterator II = CVal->op_begin(), IE = CVal->op_end();
707*09467b48Spatrick              II != IE; ++II)
708*09467b48Spatrick           FilterList.push_back(cast<GlobalValue>((*II)->stripPointerCasts()));
709*09467b48Spatrick 
710*09467b48Spatrick         addFilterTypeInfo(LandingPad, FilterList);
711*09467b48Spatrick       }
712*09467b48Spatrick     }
713*09467b48Spatrick 
714*09467b48Spatrick   } else if (const auto *CPI = dyn_cast<CatchPadInst>(FirstI)) {
715*09467b48Spatrick     for (unsigned I = CPI->getNumArgOperands(); I != 0; --I) {
716*09467b48Spatrick       Value *TypeInfo = CPI->getArgOperand(I - 1)->stripPointerCasts();
717*09467b48Spatrick       addCatchTypeInfo(LandingPad, dyn_cast<GlobalValue>(TypeInfo));
718*09467b48Spatrick     }
719*09467b48Spatrick 
720*09467b48Spatrick   } else {
721*09467b48Spatrick     assert(isa<CleanupPadInst>(FirstI) && "Invalid landingpad!");
722*09467b48Spatrick   }
723*09467b48Spatrick 
724*09467b48Spatrick   return LandingPadLabel;
725*09467b48Spatrick }
726*09467b48Spatrick 
727*09467b48Spatrick void MachineFunction::addCatchTypeInfo(MachineBasicBlock *LandingPad,
728*09467b48Spatrick                                        ArrayRef<const GlobalValue *> TyInfo) {
729*09467b48Spatrick   LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
730*09467b48Spatrick   for (unsigned N = TyInfo.size(); N; --N)
731*09467b48Spatrick     LP.TypeIds.push_back(getTypeIDFor(TyInfo[N - 1]));
732*09467b48Spatrick }
733*09467b48Spatrick 
734*09467b48Spatrick void MachineFunction::addFilterTypeInfo(MachineBasicBlock *LandingPad,
735*09467b48Spatrick                                         ArrayRef<const GlobalValue *> TyInfo) {
736*09467b48Spatrick   LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
737*09467b48Spatrick   std::vector<unsigned> IdsInFilter(TyInfo.size());
738*09467b48Spatrick   for (unsigned I = 0, E = TyInfo.size(); I != E; ++I)
739*09467b48Spatrick     IdsInFilter[I] = getTypeIDFor(TyInfo[I]);
740*09467b48Spatrick   LP.TypeIds.push_back(getFilterIDFor(IdsInFilter));
741*09467b48Spatrick }
742*09467b48Spatrick 
743*09467b48Spatrick void MachineFunction::tidyLandingPads(DenseMap<MCSymbol *, uintptr_t> *LPMap,
744*09467b48Spatrick                                       bool TidyIfNoBeginLabels) {
745*09467b48Spatrick   for (unsigned i = 0; i != LandingPads.size(); ) {
746*09467b48Spatrick     LandingPadInfo &LandingPad = LandingPads[i];
747*09467b48Spatrick     if (LandingPad.LandingPadLabel &&
748*09467b48Spatrick         !LandingPad.LandingPadLabel->isDefined() &&
749*09467b48Spatrick         (!LPMap || (*LPMap)[LandingPad.LandingPadLabel] == 0))
750*09467b48Spatrick       LandingPad.LandingPadLabel = nullptr;
751*09467b48Spatrick 
752*09467b48Spatrick     // Special case: we *should* emit LPs with null LP MBB. This indicates
753*09467b48Spatrick     // "nounwind" case.
754*09467b48Spatrick     if (!LandingPad.LandingPadLabel && LandingPad.LandingPadBlock) {
755*09467b48Spatrick       LandingPads.erase(LandingPads.begin() + i);
756*09467b48Spatrick       continue;
757*09467b48Spatrick     }
758*09467b48Spatrick 
759*09467b48Spatrick     if (TidyIfNoBeginLabels) {
760*09467b48Spatrick       for (unsigned j = 0, e = LandingPads[i].BeginLabels.size(); j != e; ++j) {
761*09467b48Spatrick         MCSymbol *BeginLabel = LandingPad.BeginLabels[j];
762*09467b48Spatrick         MCSymbol *EndLabel = LandingPad.EndLabels[j];
763*09467b48Spatrick         if ((BeginLabel->isDefined() || (LPMap && (*LPMap)[BeginLabel] != 0)) &&
764*09467b48Spatrick             (EndLabel->isDefined() || (LPMap && (*LPMap)[EndLabel] != 0)))
765*09467b48Spatrick           continue;
766*09467b48Spatrick 
767*09467b48Spatrick         LandingPad.BeginLabels.erase(LandingPad.BeginLabels.begin() + j);
768*09467b48Spatrick         LandingPad.EndLabels.erase(LandingPad.EndLabels.begin() + j);
769*09467b48Spatrick         --j;
770*09467b48Spatrick         --e;
771*09467b48Spatrick       }
772*09467b48Spatrick 
773*09467b48Spatrick       // Remove landing pads with no try-ranges.
774*09467b48Spatrick       if (LandingPads[i].BeginLabels.empty()) {
775*09467b48Spatrick         LandingPads.erase(LandingPads.begin() + i);
776*09467b48Spatrick         continue;
777*09467b48Spatrick       }
778*09467b48Spatrick     }
779*09467b48Spatrick 
780*09467b48Spatrick     // If there is no landing pad, ensure that the list of typeids is empty.
781*09467b48Spatrick     // If the only typeid is a cleanup, this is the same as having no typeids.
782*09467b48Spatrick     if (!LandingPad.LandingPadBlock ||
783*09467b48Spatrick         (LandingPad.TypeIds.size() == 1 && !LandingPad.TypeIds[0]))
784*09467b48Spatrick       LandingPad.TypeIds.clear();
785*09467b48Spatrick     ++i;
786*09467b48Spatrick   }
787*09467b48Spatrick }
788*09467b48Spatrick 
789*09467b48Spatrick void MachineFunction::addCleanup(MachineBasicBlock *LandingPad) {
790*09467b48Spatrick   LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
791*09467b48Spatrick   LP.TypeIds.push_back(0);
792*09467b48Spatrick }
793*09467b48Spatrick 
794*09467b48Spatrick void MachineFunction::addSEHCatchHandler(MachineBasicBlock *LandingPad,
795*09467b48Spatrick                                          const Function *Filter,
796*09467b48Spatrick                                          const BlockAddress *RecoverBA) {
797*09467b48Spatrick   LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
798*09467b48Spatrick   SEHHandler Handler;
799*09467b48Spatrick   Handler.FilterOrFinally = Filter;
800*09467b48Spatrick   Handler.RecoverBA = RecoverBA;
801*09467b48Spatrick   LP.SEHHandlers.push_back(Handler);
802*09467b48Spatrick }
803*09467b48Spatrick 
804*09467b48Spatrick void MachineFunction::addSEHCleanupHandler(MachineBasicBlock *LandingPad,
805*09467b48Spatrick                                            const Function *Cleanup) {
806*09467b48Spatrick   LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
807*09467b48Spatrick   SEHHandler Handler;
808*09467b48Spatrick   Handler.FilterOrFinally = Cleanup;
809*09467b48Spatrick   Handler.RecoverBA = nullptr;
810*09467b48Spatrick   LP.SEHHandlers.push_back(Handler);
811*09467b48Spatrick }
812*09467b48Spatrick 
813*09467b48Spatrick void MachineFunction::setCallSiteLandingPad(MCSymbol *Sym,
814*09467b48Spatrick                                             ArrayRef<unsigned> Sites) {
815*09467b48Spatrick   LPadToCallSiteMap[Sym].append(Sites.begin(), Sites.end());
816*09467b48Spatrick }
817*09467b48Spatrick 
818*09467b48Spatrick unsigned MachineFunction::getTypeIDFor(const GlobalValue *TI) {
819*09467b48Spatrick   for (unsigned i = 0, N = TypeInfos.size(); i != N; ++i)
820*09467b48Spatrick     if (TypeInfos[i] == TI) return i + 1;
821*09467b48Spatrick 
822*09467b48Spatrick   TypeInfos.push_back(TI);
823*09467b48Spatrick   return TypeInfos.size();
824*09467b48Spatrick }
825*09467b48Spatrick 
826*09467b48Spatrick int MachineFunction::getFilterIDFor(std::vector<unsigned> &TyIds) {
827*09467b48Spatrick   // If the new filter coincides with the tail of an existing filter, then
828*09467b48Spatrick   // re-use the existing filter.  Folding filters more than this requires
829*09467b48Spatrick   // re-ordering filters and/or their elements - probably not worth it.
830*09467b48Spatrick   for (std::vector<unsigned>::iterator I = FilterEnds.begin(),
831*09467b48Spatrick        E = FilterEnds.end(); I != E; ++I) {
832*09467b48Spatrick     unsigned i = *I, j = TyIds.size();
833*09467b48Spatrick 
834*09467b48Spatrick     while (i && j)
835*09467b48Spatrick       if (FilterIds[--i] != TyIds[--j])
836*09467b48Spatrick         goto try_next;
837*09467b48Spatrick 
838*09467b48Spatrick     if (!j)
839*09467b48Spatrick       // The new filter coincides with range [i, end) of the existing filter.
840*09467b48Spatrick       return -(1 + i);
841*09467b48Spatrick 
842*09467b48Spatrick try_next:;
843*09467b48Spatrick   }
844*09467b48Spatrick 
845*09467b48Spatrick   // Add the new filter.
846*09467b48Spatrick   int FilterID = -(1 + FilterIds.size());
847*09467b48Spatrick   FilterIds.reserve(FilterIds.size() + TyIds.size() + 1);
848*09467b48Spatrick   FilterIds.insert(FilterIds.end(), TyIds.begin(), TyIds.end());
849*09467b48Spatrick   FilterEnds.push_back(FilterIds.size());
850*09467b48Spatrick   FilterIds.push_back(0); // terminator
851*09467b48Spatrick   return FilterID;
852*09467b48Spatrick }
853*09467b48Spatrick 
854*09467b48Spatrick MachineFunction::CallSiteInfoMap::iterator
855*09467b48Spatrick MachineFunction::getCallSiteInfo(const MachineInstr *MI) {
856*09467b48Spatrick   assert(MI->isCall() && "Call site info refers only to call instructions!");
857*09467b48Spatrick 
858*09467b48Spatrick   if (!Target.Options.EnableDebugEntryValues)
859*09467b48Spatrick     return CallSitesInfo.end();
860*09467b48Spatrick   return CallSitesInfo.find(MI);
861*09467b48Spatrick }
862*09467b48Spatrick 
863*09467b48Spatrick void MachineFunction::moveCallSiteInfo(const MachineInstr *Old,
864*09467b48Spatrick                                        const MachineInstr *New) {
865*09467b48Spatrick   assert(New->isCall() && "Call site info refers only to call instructions!");
866*09467b48Spatrick 
867*09467b48Spatrick   CallSiteInfoMap::iterator CSIt = getCallSiteInfo(Old);
868*09467b48Spatrick   if (CSIt == CallSitesInfo.end())
869*09467b48Spatrick     return;
870*09467b48Spatrick 
871*09467b48Spatrick   CallSiteInfo CSInfo = std::move(CSIt->second);
872*09467b48Spatrick   CallSitesInfo.erase(CSIt);
873*09467b48Spatrick   CallSitesInfo[New] = CSInfo;
874*09467b48Spatrick }
875*09467b48Spatrick 
876*09467b48Spatrick void MachineFunction::eraseCallSiteInfo(const MachineInstr *MI) {
877*09467b48Spatrick   CallSiteInfoMap::iterator CSIt = getCallSiteInfo(MI);
878*09467b48Spatrick   if (CSIt == CallSitesInfo.end())
879*09467b48Spatrick     return;
880*09467b48Spatrick   CallSitesInfo.erase(CSIt);
881*09467b48Spatrick }
882*09467b48Spatrick 
883*09467b48Spatrick void MachineFunction::copyCallSiteInfo(const MachineInstr *Old,
884*09467b48Spatrick                                        const MachineInstr *New) {
885*09467b48Spatrick   assert(New->isCall() && "Call site info refers only to call instructions!");
886*09467b48Spatrick 
887*09467b48Spatrick   CallSiteInfoMap::iterator CSIt = getCallSiteInfo(Old);
888*09467b48Spatrick   if (CSIt == CallSitesInfo.end())
889*09467b48Spatrick     return;
890*09467b48Spatrick 
891*09467b48Spatrick   CallSiteInfo CSInfo = CSIt->second;
892*09467b48Spatrick   CallSitesInfo[New] = CSInfo;
893*09467b48Spatrick }
894*09467b48Spatrick 
895*09467b48Spatrick /// \}
896*09467b48Spatrick 
897*09467b48Spatrick //===----------------------------------------------------------------------===//
898*09467b48Spatrick //  MachineJumpTableInfo implementation
899*09467b48Spatrick //===----------------------------------------------------------------------===//
900*09467b48Spatrick 
901*09467b48Spatrick /// Return the size of each entry in the jump table.
902*09467b48Spatrick unsigned MachineJumpTableInfo::getEntrySize(const DataLayout &TD) const {
903*09467b48Spatrick   // The size of a jump table entry is 4 bytes unless the entry is just the
904*09467b48Spatrick   // address of a block, in which case it is the pointer size.
905*09467b48Spatrick   switch (getEntryKind()) {
906*09467b48Spatrick   case MachineJumpTableInfo::EK_BlockAddress:
907*09467b48Spatrick     return TD.getPointerSize();
908*09467b48Spatrick   case MachineJumpTableInfo::EK_GPRel64BlockAddress:
909*09467b48Spatrick     return 8;
910*09467b48Spatrick   case MachineJumpTableInfo::EK_GPRel32BlockAddress:
911*09467b48Spatrick   case MachineJumpTableInfo::EK_LabelDifference32:
912*09467b48Spatrick   case MachineJumpTableInfo::EK_Custom32:
913*09467b48Spatrick     return 4;
914*09467b48Spatrick   case MachineJumpTableInfo::EK_Inline:
915*09467b48Spatrick     return 0;
916*09467b48Spatrick   }
917*09467b48Spatrick   llvm_unreachable("Unknown jump table encoding!");
918*09467b48Spatrick }
919*09467b48Spatrick 
920*09467b48Spatrick /// Return the alignment of each entry in the jump table.
921*09467b48Spatrick unsigned MachineJumpTableInfo::getEntryAlignment(const DataLayout &TD) const {
922*09467b48Spatrick   // The alignment of a jump table entry is the alignment of int32 unless the
923*09467b48Spatrick   // entry is just the address of a block, in which case it is the pointer
924*09467b48Spatrick   // alignment.
925*09467b48Spatrick   switch (getEntryKind()) {
926*09467b48Spatrick   case MachineJumpTableInfo::EK_BlockAddress:
927*09467b48Spatrick     return TD.getPointerABIAlignment(0).value();
928*09467b48Spatrick   case MachineJumpTableInfo::EK_GPRel64BlockAddress:
929*09467b48Spatrick     return TD.getABIIntegerTypeAlignment(64).value();
930*09467b48Spatrick   case MachineJumpTableInfo::EK_GPRel32BlockAddress:
931*09467b48Spatrick   case MachineJumpTableInfo::EK_LabelDifference32:
932*09467b48Spatrick   case MachineJumpTableInfo::EK_Custom32:
933*09467b48Spatrick     return TD.getABIIntegerTypeAlignment(32).value();
934*09467b48Spatrick   case MachineJumpTableInfo::EK_Inline:
935*09467b48Spatrick     return 1;
936*09467b48Spatrick   }
937*09467b48Spatrick   llvm_unreachable("Unknown jump table encoding!");
938*09467b48Spatrick }
939*09467b48Spatrick 
940*09467b48Spatrick /// Create a new jump table entry in the jump table info.
941*09467b48Spatrick unsigned MachineJumpTableInfo::createJumpTableIndex(
942*09467b48Spatrick                                const std::vector<MachineBasicBlock*> &DestBBs) {
943*09467b48Spatrick   assert(!DestBBs.empty() && "Cannot create an empty jump table!");
944*09467b48Spatrick   JumpTables.push_back(MachineJumpTableEntry(DestBBs));
945*09467b48Spatrick   return JumpTables.size()-1;
946*09467b48Spatrick }
947*09467b48Spatrick 
948*09467b48Spatrick /// If Old is the target of any jump tables, update the jump tables to branch
949*09467b48Spatrick /// to New instead.
950*09467b48Spatrick bool MachineJumpTableInfo::ReplaceMBBInJumpTables(MachineBasicBlock *Old,
951*09467b48Spatrick                                                   MachineBasicBlock *New) {
952*09467b48Spatrick   assert(Old != New && "Not making a change?");
953*09467b48Spatrick   bool MadeChange = false;
954*09467b48Spatrick   for (size_t i = 0, e = JumpTables.size(); i != e; ++i)
955*09467b48Spatrick     ReplaceMBBInJumpTable(i, Old, New);
956*09467b48Spatrick   return MadeChange;
957*09467b48Spatrick }
958*09467b48Spatrick 
959*09467b48Spatrick /// If Old is a target of the jump tables, update the jump table to branch to
960*09467b48Spatrick /// New instead.
961*09467b48Spatrick bool MachineJumpTableInfo::ReplaceMBBInJumpTable(unsigned Idx,
962*09467b48Spatrick                                                  MachineBasicBlock *Old,
963*09467b48Spatrick                                                  MachineBasicBlock *New) {
964*09467b48Spatrick   assert(Old != New && "Not making a change?");
965*09467b48Spatrick   bool MadeChange = false;
966*09467b48Spatrick   MachineJumpTableEntry &JTE = JumpTables[Idx];
967*09467b48Spatrick   for (size_t j = 0, e = JTE.MBBs.size(); j != e; ++j)
968*09467b48Spatrick     if (JTE.MBBs[j] == Old) {
969*09467b48Spatrick       JTE.MBBs[j] = New;
970*09467b48Spatrick       MadeChange = true;
971*09467b48Spatrick     }
972*09467b48Spatrick   return MadeChange;
973*09467b48Spatrick }
974*09467b48Spatrick 
975*09467b48Spatrick void MachineJumpTableInfo::print(raw_ostream &OS) const {
976*09467b48Spatrick   if (JumpTables.empty()) return;
977*09467b48Spatrick 
978*09467b48Spatrick   OS << "Jump Tables:\n";
979*09467b48Spatrick 
980*09467b48Spatrick   for (unsigned i = 0, e = JumpTables.size(); i != e; ++i) {
981*09467b48Spatrick     OS << printJumpTableEntryReference(i) << ':';
982*09467b48Spatrick     for (unsigned j = 0, f = JumpTables[i].MBBs.size(); j != f; ++j)
983*09467b48Spatrick       OS << ' ' << printMBBReference(*JumpTables[i].MBBs[j]);
984*09467b48Spatrick     if (i != e)
985*09467b48Spatrick       OS << '\n';
986*09467b48Spatrick   }
987*09467b48Spatrick 
988*09467b48Spatrick   OS << '\n';
989*09467b48Spatrick }
990*09467b48Spatrick 
991*09467b48Spatrick #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
992*09467b48Spatrick LLVM_DUMP_METHOD void MachineJumpTableInfo::dump() const { print(dbgs()); }
993*09467b48Spatrick #endif
994*09467b48Spatrick 
995*09467b48Spatrick Printable llvm::printJumpTableEntryReference(unsigned Idx) {
996*09467b48Spatrick   return Printable([Idx](raw_ostream &OS) { OS << "%jump-table." << Idx; });
997*09467b48Spatrick }
998*09467b48Spatrick 
999*09467b48Spatrick //===----------------------------------------------------------------------===//
1000*09467b48Spatrick //  MachineConstantPool implementation
1001*09467b48Spatrick //===----------------------------------------------------------------------===//
1002*09467b48Spatrick 
1003*09467b48Spatrick void MachineConstantPoolValue::anchor() {}
1004*09467b48Spatrick 
1005*09467b48Spatrick Type *MachineConstantPoolEntry::getType() const {
1006*09467b48Spatrick   if (isMachineConstantPoolEntry())
1007*09467b48Spatrick     return Val.MachineCPVal->getType();
1008*09467b48Spatrick   return Val.ConstVal->getType();
1009*09467b48Spatrick }
1010*09467b48Spatrick 
1011*09467b48Spatrick bool MachineConstantPoolEntry::needsRelocation() const {
1012*09467b48Spatrick   if (isMachineConstantPoolEntry())
1013*09467b48Spatrick     return true;
1014*09467b48Spatrick   return Val.ConstVal->needsRelocation();
1015*09467b48Spatrick }
1016*09467b48Spatrick 
1017*09467b48Spatrick SectionKind
1018*09467b48Spatrick MachineConstantPoolEntry::getSectionKind(const DataLayout *DL) const {
1019*09467b48Spatrick   if (needsRelocation())
1020*09467b48Spatrick     return SectionKind::getReadOnlyWithRel();
1021*09467b48Spatrick   switch (DL->getTypeAllocSize(getType())) {
1022*09467b48Spatrick   case 4:
1023*09467b48Spatrick     return SectionKind::getMergeableConst4();
1024*09467b48Spatrick   case 8:
1025*09467b48Spatrick     return SectionKind::getMergeableConst8();
1026*09467b48Spatrick   case 16:
1027*09467b48Spatrick     return SectionKind::getMergeableConst16();
1028*09467b48Spatrick   case 32:
1029*09467b48Spatrick     return SectionKind::getMergeableConst32();
1030*09467b48Spatrick   default:
1031*09467b48Spatrick     return SectionKind::getReadOnly();
1032*09467b48Spatrick   }
1033*09467b48Spatrick }
1034*09467b48Spatrick 
1035*09467b48Spatrick MachineConstantPool::~MachineConstantPool() {
1036*09467b48Spatrick   // A constant may be a member of both Constants and MachineCPVsSharingEntries,
1037*09467b48Spatrick   // so keep track of which we've deleted to avoid double deletions.
1038*09467b48Spatrick   DenseSet<MachineConstantPoolValue*> Deleted;
1039*09467b48Spatrick   for (unsigned i = 0, e = Constants.size(); i != e; ++i)
1040*09467b48Spatrick     if (Constants[i].isMachineConstantPoolEntry()) {
1041*09467b48Spatrick       Deleted.insert(Constants[i].Val.MachineCPVal);
1042*09467b48Spatrick       delete Constants[i].Val.MachineCPVal;
1043*09467b48Spatrick     }
1044*09467b48Spatrick   for (DenseSet<MachineConstantPoolValue*>::iterator I =
1045*09467b48Spatrick        MachineCPVsSharingEntries.begin(), E = MachineCPVsSharingEntries.end();
1046*09467b48Spatrick        I != E; ++I) {
1047*09467b48Spatrick     if (Deleted.count(*I) == 0)
1048*09467b48Spatrick       delete *I;
1049*09467b48Spatrick   }
1050*09467b48Spatrick }
1051*09467b48Spatrick 
1052*09467b48Spatrick /// Test whether the given two constants can be allocated the same constant pool
1053*09467b48Spatrick /// entry.
1054*09467b48Spatrick static bool CanShareConstantPoolEntry(const Constant *A, const Constant *B,
1055*09467b48Spatrick                                       const DataLayout &DL) {
1056*09467b48Spatrick   // Handle the trivial case quickly.
1057*09467b48Spatrick   if (A == B) return true;
1058*09467b48Spatrick 
1059*09467b48Spatrick   // If they have the same type but weren't the same constant, quickly
1060*09467b48Spatrick   // reject them.
1061*09467b48Spatrick   if (A->getType() == B->getType()) return false;
1062*09467b48Spatrick 
1063*09467b48Spatrick   // We can't handle structs or arrays.
1064*09467b48Spatrick   if (isa<StructType>(A->getType()) || isa<ArrayType>(A->getType()) ||
1065*09467b48Spatrick       isa<StructType>(B->getType()) || isa<ArrayType>(B->getType()))
1066*09467b48Spatrick     return false;
1067*09467b48Spatrick 
1068*09467b48Spatrick   // For now, only support constants with the same size.
1069*09467b48Spatrick   uint64_t StoreSize = DL.getTypeStoreSize(A->getType());
1070*09467b48Spatrick   if (StoreSize != DL.getTypeStoreSize(B->getType()) || StoreSize > 128)
1071*09467b48Spatrick     return false;
1072*09467b48Spatrick 
1073*09467b48Spatrick   Type *IntTy = IntegerType::get(A->getContext(), StoreSize*8);
1074*09467b48Spatrick 
1075*09467b48Spatrick   // Try constant folding a bitcast of both instructions to an integer.  If we
1076*09467b48Spatrick   // get two identical ConstantInt's, then we are good to share them.  We use
1077*09467b48Spatrick   // the constant folding APIs to do this so that we get the benefit of
1078*09467b48Spatrick   // DataLayout.
1079*09467b48Spatrick   if (isa<PointerType>(A->getType()))
1080*09467b48Spatrick     A = ConstantFoldCastOperand(Instruction::PtrToInt,
1081*09467b48Spatrick                                 const_cast<Constant *>(A), IntTy, DL);
1082*09467b48Spatrick   else if (A->getType() != IntTy)
1083*09467b48Spatrick     A = ConstantFoldCastOperand(Instruction::BitCast, const_cast<Constant *>(A),
1084*09467b48Spatrick                                 IntTy, DL);
1085*09467b48Spatrick   if (isa<PointerType>(B->getType()))
1086*09467b48Spatrick     B = ConstantFoldCastOperand(Instruction::PtrToInt,
1087*09467b48Spatrick                                 const_cast<Constant *>(B), IntTy, DL);
1088*09467b48Spatrick   else if (B->getType() != IntTy)
1089*09467b48Spatrick     B = ConstantFoldCastOperand(Instruction::BitCast, const_cast<Constant *>(B),
1090*09467b48Spatrick                                 IntTy, DL);
1091*09467b48Spatrick 
1092*09467b48Spatrick   return A == B;
1093*09467b48Spatrick }
1094*09467b48Spatrick 
1095*09467b48Spatrick /// Create a new entry in the constant pool or return an existing one.
1096*09467b48Spatrick /// User must specify the log2 of the minimum required alignment for the object.
1097*09467b48Spatrick unsigned MachineConstantPool::getConstantPoolIndex(const Constant *C,
1098*09467b48Spatrick                                                    unsigned Alignment) {
1099*09467b48Spatrick   assert(Alignment && "Alignment must be specified!");
1100*09467b48Spatrick   if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1101*09467b48Spatrick 
1102*09467b48Spatrick   // Check to see if we already have this constant.
1103*09467b48Spatrick   //
1104*09467b48Spatrick   // FIXME, this could be made much more efficient for large constant pools.
1105*09467b48Spatrick   for (unsigned i = 0, e = Constants.size(); i != e; ++i)
1106*09467b48Spatrick     if (!Constants[i].isMachineConstantPoolEntry() &&
1107*09467b48Spatrick         CanShareConstantPoolEntry(Constants[i].Val.ConstVal, C, DL)) {
1108*09467b48Spatrick       if ((unsigned)Constants[i].getAlignment() < Alignment)
1109*09467b48Spatrick         Constants[i].Alignment = Alignment;
1110*09467b48Spatrick       return i;
1111*09467b48Spatrick     }
1112*09467b48Spatrick 
1113*09467b48Spatrick   Constants.push_back(MachineConstantPoolEntry(C, Alignment));
1114*09467b48Spatrick   return Constants.size()-1;
1115*09467b48Spatrick }
1116*09467b48Spatrick 
1117*09467b48Spatrick unsigned MachineConstantPool::getConstantPoolIndex(MachineConstantPoolValue *V,
1118*09467b48Spatrick                                                    unsigned Alignment) {
1119*09467b48Spatrick   assert(Alignment && "Alignment must be specified!");
1120*09467b48Spatrick   if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1121*09467b48Spatrick 
1122*09467b48Spatrick   // Check to see if we already have this constant.
1123*09467b48Spatrick   //
1124*09467b48Spatrick   // FIXME, this could be made much more efficient for large constant pools.
1125*09467b48Spatrick   int Idx = V->getExistingMachineCPValue(this, Alignment);
1126*09467b48Spatrick   if (Idx != -1) {
1127*09467b48Spatrick     MachineCPVsSharingEntries.insert(V);
1128*09467b48Spatrick     return (unsigned)Idx;
1129*09467b48Spatrick   }
1130*09467b48Spatrick 
1131*09467b48Spatrick   Constants.push_back(MachineConstantPoolEntry(V, Alignment));
1132*09467b48Spatrick   return Constants.size()-1;
1133*09467b48Spatrick }
1134*09467b48Spatrick 
1135*09467b48Spatrick void MachineConstantPool::print(raw_ostream &OS) const {
1136*09467b48Spatrick   if (Constants.empty()) return;
1137*09467b48Spatrick 
1138*09467b48Spatrick   OS << "Constant Pool:\n";
1139*09467b48Spatrick   for (unsigned i = 0, e = Constants.size(); i != e; ++i) {
1140*09467b48Spatrick     OS << "  cp#" << i << ": ";
1141*09467b48Spatrick     if (Constants[i].isMachineConstantPoolEntry())
1142*09467b48Spatrick       Constants[i].Val.MachineCPVal->print(OS);
1143*09467b48Spatrick     else
1144*09467b48Spatrick       Constants[i].Val.ConstVal->printAsOperand(OS, /*PrintType=*/false);
1145*09467b48Spatrick     OS << ", align=" << Constants[i].getAlignment();
1146*09467b48Spatrick     OS << "\n";
1147*09467b48Spatrick   }
1148*09467b48Spatrick }
1149*09467b48Spatrick 
1150*09467b48Spatrick #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1151*09467b48Spatrick LLVM_DUMP_METHOD void MachineConstantPool::dump() const { print(dbgs()); }
1152*09467b48Spatrick #endif
1153