ARMMachineFunctionInfo.h revision 6948897e478cbd66626159776a8017b3c18579b9
131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- ARMMachineFuctionInfo.h - ARM machine function info -----*- C++ -*-===//
2764ab52dd80310a205c9888bf166d09dab858f90Jim Grosbach//
3a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//                     The LLVM Compiler Infrastructure
4a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7764ab52dd80310a205c9888bf166d09dab858f90Jim Grosbach//
8a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===//
9a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
10a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// This file declares ARM-specific per-machine-function information.
11a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
12a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===//
13a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_ARM_ARMMACHINEFUNCTIONINFO_H
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_ARM_ARMMACHINEFUNCTIONINFO_H
16a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
17a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "ARMSubtarget.h"
18a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/ADT/BitVector.h"
19ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/ADT/DenseMap.h"
20a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "llvm/CodeGen/MachineFunction.h"
21a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "llvm/Target/TargetMachine.h"
22a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Target/TargetRegisterInfo.h"
23a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
24a8e2989ece6dc46df59b0768184028257f913843Evan Chengnamespace llvm {
25a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
26ca3f06963c21ee34c7454be807c4d72af3b0f3adBob Wilson/// ARMFunctionInfo - This class is derived from MachineFunctionInfo and
27ca3f06963c21ee34c7454be807c4d72af3b0f3adBob Wilson/// contains private ARM-specific information for each MachineFunction.
28a8e2989ece6dc46df59b0768184028257f913843Evan Chengclass ARMFunctionInfo : public MachineFunctionInfo {
292d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
30a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
31a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  /// isThumb - True if this function is compiled under Thumb mode.
32bd24f3f398bc26d686836dc412f3c1997953f427Dale Johannesen  /// Used to initialized Align, so must precede it.
33a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  bool isThumb;
34a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
355e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin  /// hasThumb2 - True if the target architecture supports Thumb2. Do not use
365e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin  /// to determine if function is compiled under Thumb mode, for that use
375e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin  /// 'isThumb'.
385e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin  bool hasThumb2;
395e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin
40083bc97344d618884ef04bc1ba1fc4ddf14d867dStepan Dyatkovskiy  /// StByValParamsPadding - For parameter that is split between
41083bc97344d618884ef04bc1ba1fc4ddf14d867dStepan Dyatkovskiy  /// GPRs and memory; while recovering GPRs part, when
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// StackAlignment > 4, and GPRs-part-size mod StackAlignment != 0,
43083bc97344d618884ef04bc1ba1fc4ddf14d867dStepan Dyatkovskiy  /// we need to insert gap before parameter start address. It allows to
44083bc97344d618884ef04bc1ba1fc4ddf14d867dStepan Dyatkovskiy  /// "attach" GPR-part to the part that was passed via stack.
45083bc97344d618884ef04bc1ba1fc4ddf14d867dStepan Dyatkovskiy  unsigned StByValParamsPadding;
46083bc97344d618884ef04bc1ba1fc4ddf14d867dStepan Dyatkovskiy
47a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  /// VarArgsRegSaveSize - Size of the register save area for vararg functions.
48a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  ///
49f65e4932f83ac0c36594d97fca73dc9a9fd26672Stepan Dyatkovskiy  unsigned ArgRegsSaveSize;
50a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
5137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// ReturnRegsCount - Number of registers used up in the return.
5237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned ReturnRegsCount;
5337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
5475e18c403e4046057cb99accb3afc7cdf6fadd61Evan Cheng  /// HasStackFrame - True if this function has a stack frame. Set by
55a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  /// processFunctionBeforeCalleeSavedScan().
5675e18c403e4046057cb99accb3afc7cdf6fadd61Evan Cheng  bool HasStackFrame;
57a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
58ac096808a3accc516ae7c193c9a2c1392bf3301aEvan Cheng  /// RestoreSPFromFP - True if epilogue should restore SP from FP. Set by
59ac096808a3accc516ae7c193c9a2c1392bf3301aEvan Cheng  /// emitPrologue.
60ac096808a3accc516ae7c193c9a2c1392bf3301aEvan Cheng  bool RestoreSPFromFP;
61ac096808a3accc516ae7c193c9a2c1392bf3301aEvan Cheng
62f49407b790d8664d8ff9c103931b115ebe9cc96eEvan Cheng  /// LRSpilledForFarJump - True if the LR register has been for spilled to
63f49407b790d8664d8ff9c103931b115ebe9cc96eEvan Cheng  /// enable far jump.
64f49407b790d8664d8ff9c103931b115ebe9cc96eEvan Cheng  bool LRSpilledForFarJump;
6578268b943669cd0c0e1e874e2a329fcf200bd59bEvan Cheng
6675e18c403e4046057cb99accb3afc7cdf6fadd61Evan Cheng  /// FramePtrSpillOffset - If HasStackFrame, this records the frame pointer
67a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  /// spill stack offset.
68a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  unsigned FramePtrSpillOffset;
69a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
70ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  /// GPRCS1Offset, GPRCS2Offset, DPRCSOffset - Starting offset of callee saved
71ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  /// register spills areas. For Mac OS X:
72a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  ///
73ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  /// GPR callee-saved (1) : r4, r5, r6, r7, lr
74ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  /// --------------------------------------------
75ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  /// GPR callee-saved (2) : r8, r10, r11
76a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  /// --------------------------------------------
77a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  /// DPR callee-saved : d8 - d15
78f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  ///
79f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  /// Also see AlignedDPRCSRegs below. Not all D-regs need to go in area 3.
80f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  /// Some may be spilled after the stack has been realigned.
81ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  unsigned GPRCS1Offset;
82ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  unsigned GPRCS2Offset;
83a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  unsigned DPRCSOffset;
84a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
85ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  /// GPRCS1Size, GPRCS2Size, DPRCSSize - Sizes of callee saved register spills
86ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  /// areas.
87ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  unsigned GPRCS1Size;
88ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  unsigned GPRCS2Size;
8937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned DPRCSAlignGapSize;
90a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  unsigned DPRCSSize;
91a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
92f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  /// NumAlignedDPRCS2Regs - The number of callee-saved DPRs that are saved in
93f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  /// the aligned portion of the stack frame.  This is always a contiguous
94f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  /// sequence of D-registers starting from d8.
95f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  ///
96f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  /// We do not keep track of the frame indices used for these registers - they
97f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  /// behave like any other frame index in the aligned stack frame.  These
98f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  /// registers also aren't included in DPRCSSize above.
99f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  unsigned NumAlignedDPRCS2Regs;
100f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen
1015de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  unsigned PICLabelUId;
102f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng
1031e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  /// VarArgsFrameIndex - FrameIndex for start of varargs area.
1041e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  int VarArgsFrameIndex;
1051e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
10686050dc8cc0aaea8c9dfeb89de02cafbd7f48d92Evan Cheng  /// HasITBlocks - True if IT blocks have been inserted.
10786050dc8cc0aaea8c9dfeb89de02cafbd7f48d92Evan Cheng  bool HasITBlocks;
10886050dc8cc0aaea8c9dfeb89de02cafbd7f48d92Evan Cheng
10998b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov  /// CPEClones - Track constant pool entries clones created by Constant Island
11098b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov  /// pass.
11198b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov  DenseMap<unsigned, unsigned> CPEClones;
11298b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov
1138f50647662560167b88851f92c3c891d2e7c1696Jush Lu  /// GlobalBaseReg - keeps track of the virtual register initialized for
1148f50647662560167b88851f92c3c891d2e7c1696Jush Lu  /// use as the global base register. This is used for PIC in some PIC
1158f50647662560167b88851f92c3c891d2e7c1696Jush Lu  /// relocation models.
1168f50647662560167b88851f92c3c891d2e7c1696Jush Lu  unsigned GlobalBaseReg;
1178f50647662560167b88851f92c3c891d2e7c1696Jush Lu
11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// ArgumentStackSize - amount of bytes on stack consumed by the arguments
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// being passed on the stack
12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned ArgumentStackSize;
12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
12237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// CoalescedWeights - mapping of basic blocks to the rolling counter of
12337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// coalesced weights.
12437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  DenseMap<const MachineBasicBlock*, unsigned> CoalescedWeights;
12537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
126a8e2989ece6dc46df59b0768184028257f913843Evan Chengpublic:
127a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  ARMFunctionInfo() :
1285e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin    isThumb(false),
1295e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin    hasThumb2(false),
13037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    ArgRegsSaveSize(0), ReturnRegsCount(0), HasStackFrame(false),
13137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    RestoreSPFromFP(false),
1321f30dcbd8dcf18cabb4be780fcf492869d5dcab9Jim Grosbach    LRSpilledForFarJump(false),
133ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach    FramePtrSpillOffset(0), GPRCS1Offset(0), GPRCS2Offset(0), DPRCSOffset(0),
13437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    GPRCS1Size(0), GPRCS2Size(0), DPRCSAlignGapSize(0), DPRCSSize(0),
1356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    NumAlignedDPRCS2Regs(0), PICLabelUId(0),
1368f50647662560167b88851f92c3c891d2e7c1696Jush Lu    VarArgsFrameIndex(0), HasITBlocks(false), GlobalBaseReg(0) {}
137a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
138c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  explicit ARMFunctionInfo(MachineFunction &MF);
139a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
140a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  bool isThumbFunction() const { return isThumb; }
141f1daf7d8abebd6e0104a6b41a774ccbb19a51c60David Goodwin  bool isThumb1OnlyFunction() const { return isThumb && !hasThumb2; }
1425e47a9a6e46bd271eba058fb831da1a1edf8707cDavid Goodwin  bool isThumb2Function() const { return isThumb && hasThumb2; }
143a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
144083bc97344d618884ef04bc1ba1fc4ddf14d867dStepan Dyatkovskiy  unsigned getStoredByValParamsPadding() const { return StByValParamsPadding; }
145083bc97344d618884ef04bc1ba1fc4ddf14d867dStepan Dyatkovskiy  void setStoredByValParamsPadding(unsigned p) { StByValParamsPadding = p; }
146083bc97344d618884ef04bc1ba1fc4ddf14d867dStepan Dyatkovskiy
1474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  unsigned getArgRegsSaveSize() const { return ArgRegsSaveSize; }
148f65e4932f83ac0c36594d97fca73dc9a9fd26672Stepan Dyatkovskiy  void setArgRegsSaveSize(unsigned s) { ArgRegsSaveSize = s; }
149a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
15037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned getReturnRegsCount() const { return ReturnRegsCount; }
15137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void setReturnRegsCount(unsigned s) { ReturnRegsCount = s; }
15237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
15375e18c403e4046057cb99accb3afc7cdf6fadd61Evan Cheng  bool hasStackFrame() const { return HasStackFrame; }
15475e18c403e4046057cb99accb3afc7cdf6fadd61Evan Cheng  void setHasStackFrame(bool s) { HasStackFrame = s; }
15578268b943669cd0c0e1e874e2a329fcf200bd59bEvan Cheng
156ac096808a3accc516ae7c193c9a2c1392bf3301aEvan Cheng  bool shouldRestoreSPFromFP() const { return RestoreSPFromFP; }
157ac096808a3accc516ae7c193c9a2c1392bf3301aEvan Cheng  void setShouldRestoreSPFromFP(bool s) { RestoreSPFromFP = s; }
158ac096808a3accc516ae7c193c9a2c1392bf3301aEvan Cheng
159f49407b790d8664d8ff9c103931b115ebe9cc96eEvan Cheng  bool isLRSpilledForFarJump() const { return LRSpilledForFarJump; }
160f49407b790d8664d8ff9c103931b115ebe9cc96eEvan Cheng  void setLRIsSpilledForFarJump(bool s) { LRSpilledForFarJump = s; }
16178268b943669cd0c0e1e874e2a329fcf200bd59bEvan Cheng
162a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  unsigned getFramePtrSpillOffset() const { return FramePtrSpillOffset; }
163a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  void setFramePtrSpillOffset(unsigned o) { FramePtrSpillOffset = o; }
164764ab52dd80310a205c9888bf166d09dab858f90Jim Grosbach
165f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  unsigned getNumAlignedDPRCS2Regs() const { return NumAlignedDPRCS2Regs; }
166f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen  void setNumAlignedDPRCS2Regs(unsigned n) { NumAlignedDPRCS2Regs = n; }
167f06f6f50e9844b88cfbb9fb896fff9c3a752966bJakob Stoklund Olesen
168ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  unsigned getGPRCalleeSavedArea1Offset() const { return GPRCS1Offset; }
169ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  unsigned getGPRCalleeSavedArea2Offset() const { return GPRCS2Offset; }
170a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  unsigned getDPRCalleeSavedAreaOffset()  const { return DPRCSOffset; }
171a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
172ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  void setGPRCalleeSavedArea1Offset(unsigned o) { GPRCS1Offset = o; }
173ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  void setGPRCalleeSavedArea2Offset(unsigned o) { GPRCS2Offset = o; }
174a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  void setDPRCalleeSavedAreaOffset(unsigned o)  { DPRCSOffset = o; }
175a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
176ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  unsigned getGPRCalleeSavedArea1Size() const { return GPRCS1Size; }
177ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  unsigned getGPRCalleeSavedArea2Size() const { return GPRCS2Size; }
17837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned getDPRCalleeSavedGapSize() const   { return DPRCSAlignGapSize; }
179a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  unsigned getDPRCalleeSavedAreaSize()  const { return DPRCSSize; }
180a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
181ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  void setGPRCalleeSavedArea1Size(unsigned s) { GPRCS1Size = s; }
182ab3d00e5350fd4c097e2a5b077da7584692029a7Jim Grosbach  void setGPRCalleeSavedArea2Size(unsigned s) { GPRCS2Size = s; }
18337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void setDPRCalleeSavedGapSize(unsigned s)   { DPRCSAlignGapSize = s; }
184a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  void setDPRCalleeSavedAreaSize(unsigned s)  { DPRCSSize = s; }
185a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned getArgumentStackSize() const { return ArgumentStackSize; }
18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void setArgumentStackSize(unsigned size) { ArgumentStackSize = size; }
18836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1895de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  void initPICLabelUId(unsigned UId) {
1905de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng    PICLabelUId = UId;
191f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng  }
192f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng
1935de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  unsigned getNumPICLabels() const {
1945de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng    return PICLabelUId;
195f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng  }
196f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng
1975de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  unsigned createPICLabelUId() {
1985de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng    return PICLabelUId++;
199f1bbb9577a42cf7dc3079412f1dd7683e3a03665Evan Cheng  }
2001e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
2011e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
2021e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
20386050dc8cc0aaea8c9dfeb89de02cafbd7f48d92Evan Cheng
20486050dc8cc0aaea8c9dfeb89de02cafbd7f48d92Evan Cheng  bool hasITBlocks() const { return HasITBlocks; }
20586050dc8cc0aaea8c9dfeb89de02cafbd7f48d92Evan Cheng  void setHasITBlocks(bool h) { HasITBlocks = h; }
20698b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov
2078f50647662560167b88851f92c3c891d2e7c1696Jush Lu  unsigned getGlobalBaseReg() const { return GlobalBaseReg; }
2088f50647662560167b88851f92c3c891d2e7c1696Jush Lu  void setGlobalBaseReg(unsigned Reg) { GlobalBaseReg = Reg; }
2098f50647662560167b88851f92c3c891d2e7c1696Jush Lu
21098b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov  void recordCPEClone(unsigned CPIdx, unsigned CPCloneIdx) {
21198b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov    if (!CPEClones.insert(std::make_pair(CPCloneIdx, CPIdx)).second)
212c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      llvm_unreachable("Duplicate entries!");
21398b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov  }
21498b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov
21598b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov  unsigned getOriginalCPIdx(unsigned CloneIdx) const {
21698b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov    DenseMap<unsigned, unsigned>::const_iterator I = CPEClones.find(CloneIdx);
21798b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov    if (I != CPEClones.end())
21898b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov      return I->second;
21998b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov    else
22098b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov      return -1U;
22198b928ea71576c243bdb203879d966be9cde5f3cAnton Korobeynikov  }
22237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
22337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  DenseMap<const MachineBasicBlock*, unsigned>::iterator getCoalescedWeight(
22437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                  MachineBasicBlock* MBB) {
22537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    auto It = CoalescedWeights.find(MBB);
22637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (It == CoalescedWeights.end()) {
22737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      It = CoalescedWeights.insert(std::make_pair(MBB, 0)).first;
22837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
22937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return It;
23037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
231a8e2989ece6dc46df59b0768184028257f913843Evan Cheng};
232a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} // End llvm namespace
233a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
23437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#endif
235