12cab237bSDimitry Andric //===- ARMConstantPoolValue.cpp - ARM constantpool value ------------------===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky //                     The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
10f22ef01cSRoman Divacky // This file implements the ARM specific constantpool value class.
11f22ef01cSRoman Divacky //
12f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
13f22ef01cSRoman Divacky 
14f22ef01cSRoman Divacky #include "ARMConstantPoolValue.h"
15f22ef01cSRoman Divacky #include "llvm/ADT/FoldingSet.h"
166122f3e6SDimitry Andric #include "llvm/CodeGen/MachineBasicBlock.h"
17*4ba319b5SDimitry Andric #include "llvm/Config/llvm-config.h"
18139f7f9bSDimitry Andric #include "llvm/IR/Constant.h"
19139f7f9bSDimitry Andric #include "llvm/IR/Constants.h"
20139f7f9bSDimitry Andric #include "llvm/IR/GlobalValue.h"
21139f7f9bSDimitry Andric #include "llvm/IR/Type.h"
227a7e6055SDimitry Andric #include "llvm/Support/Casting.h"
237a7e6055SDimitry Andric #include "llvm/Support/Compiler.h"
247a7e6055SDimitry Andric #include "llvm/Support/ErrorHandling.h"
25f22ef01cSRoman Divacky #include "llvm/Support/raw_ostream.h"
267a7e6055SDimitry Andric 
27f22ef01cSRoman Divacky using namespace llvm;
28f22ef01cSRoman Divacky 
296122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
306122f3e6SDimitry Andric // ARMConstantPoolValue
316122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
326122f3e6SDimitry Andric 
ARMConstantPoolValue(Type * Ty,unsigned id,ARMCP::ARMCPKind kind,unsigned char PCAdj,ARMCP::ARMCPModifier modifier,bool addCurrentAddress)336122f3e6SDimitry Andric ARMConstantPoolValue::ARMConstantPoolValue(Type *Ty, unsigned id,
346122f3e6SDimitry Andric                                            ARMCP::ARMCPKind kind,
35f22ef01cSRoman Divacky                                            unsigned char PCAdj,
366122f3e6SDimitry Andric                                            ARMCP::ARMCPModifier modifier,
376122f3e6SDimitry Andric                                            bool addCurrentAddress)
386122f3e6SDimitry Andric   : MachineConstantPoolValue(Ty), LabelId(id), Kind(kind),
396122f3e6SDimitry Andric     PCAdjust(PCAdj), Modifier(modifier),
406122f3e6SDimitry Andric     AddCurrentAddress(addCurrentAddress) {}
41f22ef01cSRoman Divacky 
ARMConstantPoolValue(LLVMContext & C,unsigned id,ARMCP::ARMCPKind kind,unsigned char PCAdj,ARMCP::ARMCPModifier modifier,bool addCurrentAddress)426122f3e6SDimitry Andric ARMConstantPoolValue::ARMConstantPoolValue(LLVMContext &C, unsigned id,
436122f3e6SDimitry Andric                                            ARMCP::ARMCPKind kind,
44f22ef01cSRoman Divacky                                            unsigned char PCAdj,
456122f3e6SDimitry Andric                                            ARMCP::ARMCPModifier modifier,
466122f3e6SDimitry Andric                                            bool addCurrentAddress)
476122f3e6SDimitry Andric   : MachineConstantPoolValue((Type*)Type::getInt32Ty(C)),
486122f3e6SDimitry Andric     LabelId(id), Kind(kind), PCAdjust(PCAdj), Modifier(modifier),
496122f3e6SDimitry Andric     AddCurrentAddress(addCurrentAddress) {}
50f22ef01cSRoman Divacky 
517a7e6055SDimitry Andric ARMConstantPoolValue::~ARMConstantPoolValue() = default;
52f22ef01cSRoman Divacky 
getModifierText() const53d88c1a5aSDimitry Andric StringRef ARMConstantPoolValue::getModifierText() const {
546122f3e6SDimitry Andric   switch (Modifier) {
556122f3e6SDimitry Andric     // FIXME: Are these case sensitive? It'd be nice to lower-case all the
566122f3e6SDimitry Andric     // strings if that's legal.
573ca95b02SDimitry Andric   case ARMCP::no_modifier:
583ca95b02SDimitry Andric     return "none";
593ca95b02SDimitry Andric   case ARMCP::TLSGD:
603ca95b02SDimitry Andric     return "tlsgd";
613ca95b02SDimitry Andric   case ARMCP::GOT_PREL:
623ca95b02SDimitry Andric     return "GOT_PREL";
633ca95b02SDimitry Andric   case ARMCP::GOTTPOFF:
643ca95b02SDimitry Andric     return "gottpoff";
653ca95b02SDimitry Andric   case ARMCP::TPOFF:
663ca95b02SDimitry Andric     return "tpoff";
67d88c1a5aSDimitry Andric   case ARMCP::SBREL:
68d88c1a5aSDimitry Andric     return "SBREL";
693ca95b02SDimitry Andric   case ARMCP::SECREL:
703ca95b02SDimitry Andric     return "secrel32";
71f22ef01cSRoman Divacky   }
72dff0c46cSDimitry Andric   llvm_unreachable("Unknown modifier!");
732754fe60SDimitry Andric }
742754fe60SDimitry Andric 
getExistingMachineCPValue(MachineConstantPool * CP,unsigned Alignment)75f22ef01cSRoman Divacky int ARMConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP,
76f22ef01cSRoman Divacky                                                     unsigned Alignment) {
77dff0c46cSDimitry Andric   llvm_unreachable("Shouldn't be calling this directly!");
78f22ef01cSRoman Divacky }
79f22ef01cSRoman Divacky 
80f22ef01cSRoman Divacky void
addSelectionDAGCSEId(FoldingSetNodeID & ID)816122f3e6SDimitry Andric ARMConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
82f22ef01cSRoman Divacky   ID.AddInteger(LabelId);
83f22ef01cSRoman Divacky   ID.AddInteger(PCAdjust);
84f22ef01cSRoman Divacky }
85f22ef01cSRoman Divacky 
86f22ef01cSRoman Divacky bool
hasSameValue(ARMConstantPoolValue * ACPV)87f22ef01cSRoman Divacky ARMConstantPoolValue::hasSameValue(ARMConstantPoolValue *ACPV) {
88f22ef01cSRoman Divacky   if (ACPV->Kind == Kind &&
89f22ef01cSRoman Divacky       ACPV->PCAdjust == PCAdjust &&
903ca95b02SDimitry Andric       ACPV->Modifier == Modifier &&
913ca95b02SDimitry Andric       ACPV->LabelId == LabelId &&
923ca95b02SDimitry Andric       ACPV->AddCurrentAddress == AddCurrentAddress) {
93f22ef01cSRoman Divacky     // Two PC relative constpool entries containing the same GV address or
94f22ef01cSRoman Divacky     // external symbols. FIXME: What about blockaddress?
95f22ef01cSRoman Divacky     if (Kind == ARMCP::CPValue || Kind == ARMCP::CPExtSymbol)
96f22ef01cSRoman Divacky       return true;
97f22ef01cSRoman Divacky   }
98f22ef01cSRoman Divacky   return false;
99f22ef01cSRoman Divacky }
100f22ef01cSRoman Divacky 
1017a7e6055SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump() const1023ca95b02SDimitry Andric LLVM_DUMP_METHOD void ARMConstantPoolValue::dump() const {
103f22ef01cSRoman Divacky   errs() << "  " << *this;
104f22ef01cSRoman Divacky }
1057a7e6055SDimitry Andric #endif
106f22ef01cSRoman Divacky 
print(raw_ostream & O) const107f22ef01cSRoman Divacky void ARMConstantPoolValue::print(raw_ostream &O) const {
1082754fe60SDimitry Andric   if (Modifier) O << "(" << getModifierText() << ")";
109f22ef01cSRoman Divacky   if (PCAdjust != 0) {
110f22ef01cSRoman Divacky     O << "-(LPC" << LabelId << "+" << (unsigned)PCAdjust;
111f22ef01cSRoman Divacky     if (AddCurrentAddress) O << "-.";
112f22ef01cSRoman Divacky     O << ")";
113f22ef01cSRoman Divacky   }
114f22ef01cSRoman Divacky }
1156122f3e6SDimitry Andric 
1166122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
1176122f3e6SDimitry Andric // ARMConstantPoolConstant
1186122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
1196122f3e6SDimitry Andric 
ARMConstantPoolConstant(Type * Ty,const Constant * C,unsigned ID,ARMCP::ARMCPKind Kind,unsigned char PCAdj,ARMCP::ARMCPModifier Modifier,bool AddCurrentAddress)1206122f3e6SDimitry Andric ARMConstantPoolConstant::ARMConstantPoolConstant(Type *Ty,
1216122f3e6SDimitry Andric                                                  const Constant *C,
1226122f3e6SDimitry Andric                                                  unsigned ID,
1236122f3e6SDimitry Andric                                                  ARMCP::ARMCPKind Kind,
1246122f3e6SDimitry Andric                                                  unsigned char PCAdj,
1256122f3e6SDimitry Andric                                                  ARMCP::ARMCPModifier Modifier,
1266122f3e6SDimitry Andric                                                  bool AddCurrentAddress)
1276122f3e6SDimitry Andric   : ARMConstantPoolValue(Ty, ID, Kind, PCAdj, Modifier, AddCurrentAddress),
1286122f3e6SDimitry Andric     CVal(C) {}
1296122f3e6SDimitry Andric 
ARMConstantPoolConstant(const Constant * C,unsigned ID,ARMCP::ARMCPKind Kind,unsigned char PCAdj,ARMCP::ARMCPModifier Modifier,bool AddCurrentAddress)1306122f3e6SDimitry Andric ARMConstantPoolConstant::ARMConstantPoolConstant(const Constant *C,
1316122f3e6SDimitry Andric                                                  unsigned ID,
1326122f3e6SDimitry Andric                                                  ARMCP::ARMCPKind Kind,
1336122f3e6SDimitry Andric                                                  unsigned char PCAdj,
1346122f3e6SDimitry Andric                                                  ARMCP::ARMCPModifier Modifier,
1356122f3e6SDimitry Andric                                                  bool AddCurrentAddress)
1366122f3e6SDimitry Andric   : ARMConstantPoolValue((Type*)C->getType(), ID, Kind, PCAdj, Modifier,
1376122f3e6SDimitry Andric                          AddCurrentAddress),
1386122f3e6SDimitry Andric     CVal(C) {}
1396122f3e6SDimitry Andric 
ARMConstantPoolConstant(const GlobalVariable * GV,const Constant * C)140d88c1a5aSDimitry Andric ARMConstantPoolConstant::ARMConstantPoolConstant(const GlobalVariable *GV,
141d88c1a5aSDimitry Andric                                                  const Constant *C)
142d88c1a5aSDimitry Andric     : ARMConstantPoolValue((Type *)C->getType(), 0, ARMCP::CPPromotedGlobal, 0,
1432cab237bSDimitry Andric                            ARMCP::no_modifier, false), CVal(C) {
1442cab237bSDimitry Andric   GVars.insert(GV);
1452cab237bSDimitry Andric }
146d88c1a5aSDimitry Andric 
1476122f3e6SDimitry Andric ARMConstantPoolConstant *
Create(const Constant * C,unsigned ID)1486122f3e6SDimitry Andric ARMConstantPoolConstant::Create(const Constant *C, unsigned ID) {
1496122f3e6SDimitry Andric   return new ARMConstantPoolConstant(C, ID, ARMCP::CPValue, 0,
1506122f3e6SDimitry Andric                                      ARMCP::no_modifier, false);
1516122f3e6SDimitry Andric }
1526122f3e6SDimitry Andric 
1536122f3e6SDimitry Andric ARMConstantPoolConstant *
Create(const GlobalVariable * GVar,const Constant * Initializer)154d88c1a5aSDimitry Andric ARMConstantPoolConstant::Create(const GlobalVariable *GVar,
155d88c1a5aSDimitry Andric                                 const Constant *Initializer) {
156d88c1a5aSDimitry Andric   return new ARMConstantPoolConstant(GVar, Initializer);
157d88c1a5aSDimitry Andric }
158d88c1a5aSDimitry Andric 
159d88c1a5aSDimitry Andric ARMConstantPoolConstant *
Create(const GlobalValue * GV,ARMCP::ARMCPModifier Modifier)1606122f3e6SDimitry Andric ARMConstantPoolConstant::Create(const GlobalValue *GV,
1616122f3e6SDimitry Andric                                 ARMCP::ARMCPModifier Modifier) {
1626122f3e6SDimitry Andric   return new ARMConstantPoolConstant((Type*)Type::getInt32Ty(GV->getContext()),
1636122f3e6SDimitry Andric                                      GV, 0, ARMCP::CPValue, 0,
1646122f3e6SDimitry Andric                                      Modifier, false);
1656122f3e6SDimitry Andric }
1666122f3e6SDimitry Andric 
1676122f3e6SDimitry Andric ARMConstantPoolConstant *
Create(const Constant * C,unsigned ID,ARMCP::ARMCPKind Kind,unsigned char PCAdj)1686122f3e6SDimitry Andric ARMConstantPoolConstant::Create(const Constant *C, unsigned ID,
1696122f3e6SDimitry Andric                                 ARMCP::ARMCPKind Kind, unsigned char PCAdj) {
1706122f3e6SDimitry Andric   return new ARMConstantPoolConstant(C, ID, Kind, PCAdj,
1716122f3e6SDimitry Andric                                      ARMCP::no_modifier, false);
1726122f3e6SDimitry Andric }
1736122f3e6SDimitry Andric 
1746122f3e6SDimitry Andric ARMConstantPoolConstant *
Create(const Constant * C,unsigned ID,ARMCP::ARMCPKind Kind,unsigned char PCAdj,ARMCP::ARMCPModifier Modifier,bool AddCurrentAddress)1756122f3e6SDimitry Andric ARMConstantPoolConstant::Create(const Constant *C, unsigned ID,
1766122f3e6SDimitry Andric                                 ARMCP::ARMCPKind Kind, unsigned char PCAdj,
1776122f3e6SDimitry Andric                                 ARMCP::ARMCPModifier Modifier,
1786122f3e6SDimitry Andric                                 bool AddCurrentAddress) {
1796122f3e6SDimitry Andric   return new ARMConstantPoolConstant(C, ID, Kind, PCAdj, Modifier,
1806122f3e6SDimitry Andric                                      AddCurrentAddress);
1816122f3e6SDimitry Andric }
1826122f3e6SDimitry Andric 
getGV() const1836122f3e6SDimitry Andric const GlobalValue *ARMConstantPoolConstant::getGV() const {
1846122f3e6SDimitry Andric   return dyn_cast_or_null<GlobalValue>(CVal);
1856122f3e6SDimitry Andric }
1866122f3e6SDimitry Andric 
getBlockAddress() const1876122f3e6SDimitry Andric const BlockAddress *ARMConstantPoolConstant::getBlockAddress() const {
1886122f3e6SDimitry Andric   return dyn_cast_or_null<BlockAddress>(CVal);
1896122f3e6SDimitry Andric }
1906122f3e6SDimitry Andric 
getExistingMachineCPValue(MachineConstantPool * CP,unsigned Alignment)1916122f3e6SDimitry Andric int ARMConstantPoolConstant::getExistingMachineCPValue(MachineConstantPool *CP,
1926122f3e6SDimitry Andric                                                        unsigned Alignment) {
1932cab237bSDimitry Andric   int index =
1942cab237bSDimitry Andric     getExistingMachineCPValueImpl<ARMConstantPoolConstant>(CP, Alignment);
1952cab237bSDimitry Andric   if (index != -1) {
1962cab237bSDimitry Andric     auto *CPV = static_cast<ARMConstantPoolValue*>(
1972cab237bSDimitry Andric         CP->getConstants()[index].Val.MachineCPVal);
1982cab237bSDimitry Andric     auto *Constant = cast<ARMConstantPoolConstant>(CPV);
1992cab237bSDimitry Andric     Constant->GVars.insert(GVars.begin(), GVars.end());
2002cab237bSDimitry Andric   }
2012cab237bSDimitry Andric   return index;
2026122f3e6SDimitry Andric }
2036122f3e6SDimitry Andric 
hasSameValue(ARMConstantPoolValue * ACPV)2046122f3e6SDimitry Andric bool ARMConstantPoolConstant::hasSameValue(ARMConstantPoolValue *ACPV) {
2056122f3e6SDimitry Andric   const ARMConstantPoolConstant *ACPC = dyn_cast<ARMConstantPoolConstant>(ACPV);
2066122f3e6SDimitry Andric   return ACPC && ACPC->CVal == CVal && ARMConstantPoolValue::hasSameValue(ACPV);
2076122f3e6SDimitry Andric }
2086122f3e6SDimitry Andric 
addSelectionDAGCSEId(FoldingSetNodeID & ID)2096122f3e6SDimitry Andric void ARMConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
2106122f3e6SDimitry Andric   ID.AddPointer(CVal);
2112cab237bSDimitry Andric   for (const auto *GV : GVars)
2122cab237bSDimitry Andric     ID.AddPointer(GV);
2136122f3e6SDimitry Andric   ARMConstantPoolValue::addSelectionDAGCSEId(ID);
2146122f3e6SDimitry Andric }
2156122f3e6SDimitry Andric 
print(raw_ostream & O) const2166122f3e6SDimitry Andric void ARMConstantPoolConstant::print(raw_ostream &O) const {
2176122f3e6SDimitry Andric   O << CVal->getName();
2186122f3e6SDimitry Andric   ARMConstantPoolValue::print(O);
2196122f3e6SDimitry Andric }
2206122f3e6SDimitry Andric 
2216122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
2226122f3e6SDimitry Andric // ARMConstantPoolSymbol
2236122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
2246122f3e6SDimitry Andric 
ARMConstantPoolSymbol(LLVMContext & C,StringRef s,unsigned id,unsigned char PCAdj,ARMCP::ARMCPModifier Modifier,bool AddCurrentAddress)225d88c1a5aSDimitry Andric ARMConstantPoolSymbol::ARMConstantPoolSymbol(LLVMContext &C, StringRef s,
226d88c1a5aSDimitry Andric                                              unsigned id, unsigned char PCAdj,
2276122f3e6SDimitry Andric                                              ARMCP::ARMCPModifier Modifier,
2286122f3e6SDimitry Andric                                              bool AddCurrentAddress)
2296122f3e6SDimitry Andric     : ARMConstantPoolValue(C, id, ARMCP::CPExtSymbol, PCAdj, Modifier,
2306122f3e6SDimitry Andric                            AddCurrentAddress),
231139f7f9bSDimitry Andric       S(s) {}
2326122f3e6SDimitry Andric 
Create(LLVMContext & C,StringRef s,unsigned ID,unsigned char PCAdj)233d88c1a5aSDimitry Andric ARMConstantPoolSymbol *ARMConstantPoolSymbol::Create(LLVMContext &C,
234d88c1a5aSDimitry Andric                                                      StringRef s, unsigned ID,
235d88c1a5aSDimitry Andric                                                      unsigned char PCAdj) {
2366122f3e6SDimitry Andric   return new ARMConstantPoolSymbol(C, s, ID, PCAdj, ARMCP::no_modifier, false);
2376122f3e6SDimitry Andric }
2386122f3e6SDimitry Andric 
getExistingMachineCPValue(MachineConstantPool * CP,unsigned Alignment)2396122f3e6SDimitry Andric int ARMConstantPoolSymbol::getExistingMachineCPValue(MachineConstantPool *CP,
2406122f3e6SDimitry Andric                                                      unsigned Alignment) {
241f785676fSDimitry Andric   return getExistingMachineCPValueImpl<ARMConstantPoolSymbol>(CP, Alignment);
2426122f3e6SDimitry Andric }
2436122f3e6SDimitry Andric 
hasSameValue(ARMConstantPoolValue * ACPV)2446122f3e6SDimitry Andric bool ARMConstantPoolSymbol::hasSameValue(ARMConstantPoolValue *ACPV) {
2456122f3e6SDimitry Andric   const ARMConstantPoolSymbol *ACPS = dyn_cast<ARMConstantPoolSymbol>(ACPV);
246139f7f9bSDimitry Andric   return ACPS && ACPS->S == S && ARMConstantPoolValue::hasSameValue(ACPV);
2476122f3e6SDimitry Andric }
2486122f3e6SDimitry Andric 
addSelectionDAGCSEId(FoldingSetNodeID & ID)2496122f3e6SDimitry Andric void ARMConstantPoolSymbol::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
250139f7f9bSDimitry Andric   ID.AddString(S);
2516122f3e6SDimitry Andric   ARMConstantPoolValue::addSelectionDAGCSEId(ID);
2526122f3e6SDimitry Andric }
2536122f3e6SDimitry Andric 
print(raw_ostream & O) const2546122f3e6SDimitry Andric void ARMConstantPoolSymbol::print(raw_ostream &O) const {
2556122f3e6SDimitry Andric   O << S;
2566122f3e6SDimitry Andric   ARMConstantPoolValue::print(O);
2576122f3e6SDimitry Andric }
2586122f3e6SDimitry Andric 
2596122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
2606122f3e6SDimitry Andric // ARMConstantPoolMBB
2616122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
2626122f3e6SDimitry Andric 
ARMConstantPoolMBB(LLVMContext & C,const MachineBasicBlock * mbb,unsigned id,unsigned char PCAdj,ARMCP::ARMCPModifier Modifier,bool AddCurrentAddress)2636122f3e6SDimitry Andric ARMConstantPoolMBB::ARMConstantPoolMBB(LLVMContext &C,
2646122f3e6SDimitry Andric                                        const MachineBasicBlock *mbb,
2656122f3e6SDimitry Andric                                        unsigned id, unsigned char PCAdj,
2666122f3e6SDimitry Andric                                        ARMCP::ARMCPModifier Modifier,
2676122f3e6SDimitry Andric                                        bool AddCurrentAddress)
2686122f3e6SDimitry Andric   : ARMConstantPoolValue(C, id, ARMCP::CPMachineBasicBlock, PCAdj,
2696122f3e6SDimitry Andric                          Modifier, AddCurrentAddress),
2706122f3e6SDimitry Andric     MBB(mbb) {}
2716122f3e6SDimitry Andric 
Create(LLVMContext & C,const MachineBasicBlock * mbb,unsigned ID,unsigned char PCAdj)2726122f3e6SDimitry Andric ARMConstantPoolMBB *ARMConstantPoolMBB::Create(LLVMContext &C,
2736122f3e6SDimitry Andric                                                const MachineBasicBlock *mbb,
2746122f3e6SDimitry Andric                                                unsigned ID,
2756122f3e6SDimitry Andric                                                unsigned char PCAdj) {
2766122f3e6SDimitry Andric   return new ARMConstantPoolMBB(C, mbb, ID, PCAdj, ARMCP::no_modifier, false);
2776122f3e6SDimitry Andric }
2786122f3e6SDimitry Andric 
getExistingMachineCPValue(MachineConstantPool * CP,unsigned Alignment)2796122f3e6SDimitry Andric int ARMConstantPoolMBB::getExistingMachineCPValue(MachineConstantPool *CP,
2806122f3e6SDimitry Andric                                                   unsigned Alignment) {
281f785676fSDimitry Andric   return getExistingMachineCPValueImpl<ARMConstantPoolMBB>(CP, Alignment);
2826122f3e6SDimitry Andric }
2836122f3e6SDimitry Andric 
hasSameValue(ARMConstantPoolValue * ACPV)2846122f3e6SDimitry Andric bool ARMConstantPoolMBB::hasSameValue(ARMConstantPoolValue *ACPV) {
2856122f3e6SDimitry Andric   const ARMConstantPoolMBB *ACPMBB = dyn_cast<ARMConstantPoolMBB>(ACPV);
2866122f3e6SDimitry Andric   return ACPMBB && ACPMBB->MBB == MBB &&
2876122f3e6SDimitry Andric     ARMConstantPoolValue::hasSameValue(ACPV);
2886122f3e6SDimitry Andric }
2896122f3e6SDimitry Andric 
addSelectionDAGCSEId(FoldingSetNodeID & ID)2906122f3e6SDimitry Andric void ARMConstantPoolMBB::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
2916122f3e6SDimitry Andric   ID.AddPointer(MBB);
2926122f3e6SDimitry Andric   ARMConstantPoolValue::addSelectionDAGCSEId(ID);
2936122f3e6SDimitry Andric }
2946122f3e6SDimitry Andric 
print(raw_ostream & O) const2956122f3e6SDimitry Andric void ARMConstantPoolMBB::print(raw_ostream &O) const {
2962cab237bSDimitry Andric   O << printMBBReference(*MBB);
2976122f3e6SDimitry Andric   ARMConstantPoolValue::print(O);
2986122f3e6SDimitry Andric }
299