forked from OSchip/llvm-project
Fix DenseMap iterator constness.
This patch forbids implicit conversion of DenseMap::const_iterator to DenseMap::iterator which was possible because DenseMapIterator inherited (publicly) from DenseMapConstIterator. Conversion the other way around is now allowed as one may expect. The template DenseMapConstIterator is removed and the template parameter IsConst which specifies whether the iterator is constant is added to DenseMapIterator. Actually IsConst parameter is not necessary since the constness can be determined from KeyT but this is not relevant to the fix and can be addressed later. Patch by Victor Zverovich! llvm-svn: 86636
This commit is contained in:
parent
a71e9d61be
commit
b40d3f76a0
|
@ -14,8 +14,9 @@
|
||||||
#ifndef LLVM_ADT_DENSEMAP_H
|
#ifndef LLVM_ADT_DENSEMAP_H
|
||||||
#define LLVM_ADT_DENSEMAP_H
|
#define LLVM_ADT_DENSEMAP_H
|
||||||
|
|
||||||
#include "llvm/Support/PointerLikeTypeTraits.h"
|
|
||||||
#include "llvm/Support/MathExtras.h"
|
#include "llvm/Support/MathExtras.h"
|
||||||
|
#include "llvm/Support/PointerLikeTypeTraits.h"
|
||||||
|
#include "llvm/Support/type_traits.h"
|
||||||
#include "llvm/ADT/DenseMapInfo.h"
|
#include "llvm/ADT/DenseMapInfo.h"
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <new>
|
#include <new>
|
||||||
|
@ -27,12 +28,8 @@ namespace llvm {
|
||||||
|
|
||||||
template<typename KeyT, typename ValueT,
|
template<typename KeyT, typename ValueT,
|
||||||
typename KeyInfoT = DenseMapInfo<KeyT>,
|
typename KeyInfoT = DenseMapInfo<KeyT>,
|
||||||
typename ValueInfoT = DenseMapInfo<ValueT> >
|
typename ValueInfoT = DenseMapInfo<ValueT>, bool IsConst = false>
|
||||||
class DenseMapIterator;
|
class DenseMapIterator;
|
||||||
template<typename KeyT, typename ValueT,
|
|
||||||
typename KeyInfoT = DenseMapInfo<KeyT>,
|
|
||||||
typename ValueInfoT = DenseMapInfo<ValueT> >
|
|
||||||
class DenseMapConstIterator;
|
|
||||||
|
|
||||||
template<typename KeyT, typename ValueT,
|
template<typename KeyT, typename ValueT,
|
||||||
typename KeyInfoT = DenseMapInfo<KeyT>,
|
typename KeyInfoT = DenseMapInfo<KeyT>,
|
||||||
|
@ -73,7 +70,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef DenseMapIterator<KeyT, ValueT, KeyInfoT> iterator;
|
typedef DenseMapIterator<KeyT, ValueT, KeyInfoT> iterator;
|
||||||
typedef DenseMapConstIterator<KeyT, ValueT, KeyInfoT> const_iterator;
|
typedef DenseMapIterator<KeyT, ValueT,
|
||||||
|
KeyInfoT, ValueInfoT, true> const_iterator;
|
||||||
inline iterator begin() {
|
inline iterator begin() {
|
||||||
return iterator(Buckets, Buckets+NumBuckets);
|
return iterator(Buckets, Buckets+NumBuckets);
|
||||||
}
|
}
|
||||||
|
@ -426,32 +424,47 @@ private:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename KeyT, typename ValueT, typename KeyInfoT, typename ValueInfoT>
|
template<typename KeyT, typename ValueT,
|
||||||
class DenseMapIterator :
|
typename KeyInfoT, typename ValueInfoT, bool IsConst>
|
||||||
public std::iterator<std::forward_iterator_tag, std::pair<KeyT, ValueT>,
|
class DenseMapIterator {
|
||||||
ptrdiff_t> {
|
typedef std::pair<KeyT, ValueT> Bucket;
|
||||||
typedef std::pair<KeyT, ValueT> BucketT;
|
typedef DenseMapIterator<KeyT, ValueT,
|
||||||
protected:
|
KeyInfoT, ValueInfoT, true> ConstIterator;
|
||||||
const BucketT *Ptr, *End;
|
friend class DenseMapIterator<KeyT, ValueT, KeyInfoT, ValueInfoT, true>;
|
||||||
|
public:
|
||||||
|
typedef ptrdiff_t difference_type;
|
||||||
|
typedef typename conditional<IsConst, const Bucket, Bucket>::type value_type;
|
||||||
|
typedef value_type *pointer;
|
||||||
|
typedef value_type &reference;
|
||||||
|
typedef std::forward_iterator_tag iterator_category;
|
||||||
|
private:
|
||||||
|
pointer Ptr, End;
|
||||||
public:
|
public:
|
||||||
DenseMapIterator() : Ptr(0), End(0) {}
|
DenseMapIterator() : Ptr(0), End(0) {}
|
||||||
|
|
||||||
DenseMapIterator(const BucketT *Pos, const BucketT *E) : Ptr(Pos), End(E) {
|
DenseMapIterator(pointer Pos, pointer E) : Ptr(Pos), End(E) {
|
||||||
AdvancePastEmptyBuckets();
|
AdvancePastEmptyBuckets();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<KeyT, ValueT> &operator*() const {
|
// If IsConst is true this is a converting constructor from iterator to
|
||||||
return *const_cast<BucketT*>(Ptr);
|
// const_iterator and the default copy constructor is used.
|
||||||
|
// Otherwise this is a copy constructor for iterator.
|
||||||
|
DenseMapIterator(const DenseMapIterator<KeyT, ValueT,
|
||||||
|
KeyInfoT, ValueInfoT, false>& I)
|
||||||
|
: Ptr(I.Ptr), End(I.End) {}
|
||||||
|
|
||||||
|
reference operator*() const {
|
||||||
|
return *Ptr;
|
||||||
}
|
}
|
||||||
std::pair<KeyT, ValueT> *operator->() const {
|
pointer operator->() const {
|
||||||
return const_cast<BucketT*>(Ptr);
|
return Ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const DenseMapIterator &RHS) const {
|
bool operator==(const ConstIterator &RHS) const {
|
||||||
return Ptr == RHS.Ptr;
|
return Ptr == RHS.operator->();
|
||||||
}
|
}
|
||||||
bool operator!=(const DenseMapIterator &RHS) const {
|
bool operator!=(const ConstIterator &RHS) const {
|
||||||
return Ptr != RHS.Ptr;
|
return Ptr != RHS.operator->();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline DenseMapIterator& operator++() { // Preincrement
|
inline DenseMapIterator& operator++() { // Preincrement
|
||||||
|
@ -475,22 +488,6 @@ private:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename KeyT, typename ValueT, typename KeyInfoT, typename ValueInfoT>
|
|
||||||
class DenseMapConstIterator : public DenseMapIterator<KeyT, ValueT, KeyInfoT> {
|
|
||||||
public:
|
|
||||||
DenseMapConstIterator() : DenseMapIterator<KeyT, ValueT, KeyInfoT>() {}
|
|
||||||
DenseMapConstIterator(const std::pair<KeyT, ValueT> *Pos,
|
|
||||||
const std::pair<KeyT, ValueT> *E)
|
|
||||||
: DenseMapIterator<KeyT, ValueT, KeyInfoT>(Pos, E) {
|
|
||||||
}
|
|
||||||
const std::pair<KeyT, ValueT> &operator*() const {
|
|
||||||
return *this->Ptr;
|
|
||||||
}
|
|
||||||
const std::pair<KeyT, ValueT> *operator->() const {
|
|
||||||
return this->Ptr;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // end namespace llvm
|
} // end namespace llvm
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -153,7 +153,7 @@ public:
|
||||||
/// value. If an value is not in the map, it is returned as untracked,
|
/// value. If an value is not in the map, it is returned as untracked,
|
||||||
/// unlike the getOrInitValueState method.
|
/// unlike the getOrInitValueState method.
|
||||||
LatticeVal getLatticeState(Value *V) const {
|
LatticeVal getLatticeState(Value *V) const {
|
||||||
DenseMap<Value*, LatticeVal>::iterator I = ValueState.find(V);
|
DenseMap<Value*, LatticeVal>::const_iterator I = ValueState.find(V);
|
||||||
return I != ValueState.end() ? I->second : LatticeFunc->getUntrackedVal();
|
return I != ValueState.end() ? I->second : LatticeFunc->getUntrackedVal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,6 +96,12 @@ template <typename T> struct remove_pointer<T*volatile> { typedef T type; };
|
||||||
template <typename T> struct remove_pointer<T*const volatile> {
|
template <typename T> struct remove_pointer<T*const volatile> {
|
||||||
typedef T type; };
|
typedef T type; };
|
||||||
|
|
||||||
|
template <bool, typename T, typename F>
|
||||||
|
struct conditional { typedef T type; };
|
||||||
|
|
||||||
|
template <typename T, typename F>
|
||||||
|
struct conditional<false, T, F> { typedef F type; };
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -518,7 +518,7 @@ namespace {
|
||||||
/// getObject - Return the node corresponding to the memory object for the
|
/// getObject - Return the node corresponding to the memory object for the
|
||||||
/// specified global or allocation instruction.
|
/// specified global or allocation instruction.
|
||||||
unsigned getObject(Value *V) const {
|
unsigned getObject(Value *V) const {
|
||||||
DenseMap<Value*, unsigned>::iterator I = ObjectNodes.find(V);
|
DenseMap<Value*, unsigned>::const_iterator I = ObjectNodes.find(V);
|
||||||
assert(I != ObjectNodes.end() &&
|
assert(I != ObjectNodes.end() &&
|
||||||
"Value does not have an object in the points-to graph!");
|
"Value does not have an object in the points-to graph!");
|
||||||
return I->second;
|
return I->second;
|
||||||
|
@ -527,7 +527,7 @@ namespace {
|
||||||
/// getReturnNode - Return the node representing the return value for the
|
/// getReturnNode - Return the node representing the return value for the
|
||||||
/// specified function.
|
/// specified function.
|
||||||
unsigned getReturnNode(Function *F) const {
|
unsigned getReturnNode(Function *F) const {
|
||||||
DenseMap<Function*, unsigned>::iterator I = ReturnNodes.find(F);
|
DenseMap<Function*, unsigned>::const_iterator I = ReturnNodes.find(F);
|
||||||
assert(I != ReturnNodes.end() && "Function does not return a value!");
|
assert(I != ReturnNodes.end() && "Function does not return a value!");
|
||||||
return I->second;
|
return I->second;
|
||||||
}
|
}
|
||||||
|
@ -535,7 +535,7 @@ namespace {
|
||||||
/// getVarargNode - Return the node representing the variable arguments
|
/// getVarargNode - Return the node representing the variable arguments
|
||||||
/// formal for the specified function.
|
/// formal for the specified function.
|
||||||
unsigned getVarargNode(Function *F) const {
|
unsigned getVarargNode(Function *F) const {
|
||||||
DenseMap<Function*, unsigned>::iterator I = VarargNodes.find(F);
|
DenseMap<Function*, unsigned>::const_iterator I = VarargNodes.find(F);
|
||||||
assert(I != VarargNodes.end() && "Function does not take var args!");
|
assert(I != VarargNodes.end() && "Function does not take var args!");
|
||||||
return I->second;
|
return I->second;
|
||||||
}
|
}
|
||||||
|
|
|
@ -497,7 +497,7 @@ ComputeCallSiteTable(SmallVectorImpl<CallSiteEntry> &CallSites,
|
||||||
SawPotentiallyThrowing = false;
|
SawPotentiallyThrowing = false;
|
||||||
|
|
||||||
// Beginning of a new try-range?
|
// Beginning of a new try-range?
|
||||||
RangeMapType::iterator L = PadMap.find(BeginLabel);
|
RangeMapType::const_iterator L = PadMap.find(BeginLabel);
|
||||||
if (L == PadMap.end())
|
if (L == PadMap.end())
|
||||||
// Nope, it was just some random label.
|
// Nope, it was just some random label.
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -366,10 +366,10 @@ PreAllocSplitting::IsAvailableInStack(MachineBasicBlock *DefMBB,
|
||||||
if (!DefMBB)
|
if (!DefMBB)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
DenseMap<unsigned, int>::iterator I = IntervalSSMap.find(Reg);
|
DenseMap<unsigned, int>::const_iterator I = IntervalSSMap.find(Reg);
|
||||||
if (I == IntervalSSMap.end())
|
if (I == IntervalSSMap.end())
|
||||||
return false;
|
return false;
|
||||||
DenseMap<SlotIndex, SlotIndex>::iterator
|
DenseMap<SlotIndex, SlotIndex>::const_iterator
|
||||||
II = Def2SpillMap.find(DefIndex);
|
II = Def2SpillMap.find(DefIndex);
|
||||||
if (II == Def2SpillMap.end())
|
if (II == Def2SpillMap.end())
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -201,7 +201,7 @@ void SlotIndexes::dump() const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (MBB2IdxMap::iterator itr = mbb2IdxMap.begin();
|
for (MBB2IdxMap::const_iterator itr = mbb2IdxMap.begin();
|
||||||
itr != mbb2IdxMap.end(); ++itr) {
|
itr != mbb2IdxMap.end(); ++itr) {
|
||||||
errs() << "MBB " << itr->first->getNumber() << " (" << itr->first << ") - ["
|
errs() << "MBB " << itr->first->getNumber() << " (" << itr->first << ") - ["
|
||||||
<< itr->second.first << ", " << itr->second.second << "]\n";
|
<< itr->second.first << ", " << itr->second.second << "]\n";
|
||||||
|
|
|
@ -364,7 +364,7 @@ bool MSP430DAGToDAGISel::IsLegalAndProfitableToFold(SDNode *N, SDNode *U,
|
||||||
/// TokenFactor by PreprocessForRMW. Query the map Store => Load1 (created
|
/// TokenFactor by PreprocessForRMW. Query the map Store => Load1 (created
|
||||||
/// during preprocessing) to determine whether it's legal to introduce such
|
/// during preprocessing) to determine whether it's legal to introduce such
|
||||||
/// "cycle" for a moment.
|
/// "cycle" for a moment.
|
||||||
DenseMap<SDNode*, SDNode*>::iterator I = RMWStores.find(Root);
|
DenseMap<SDNode*, SDNode*>::const_iterator I = RMWStores.find(Root);
|
||||||
if (I != RMWStores.end() && I->second == N)
|
if (I != RMWStores.end() && I->second == N)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
|
@ -2170,7 +2170,7 @@ X86InstrInfo::foldMemoryOperandImpl(MachineFunction &MF,
|
||||||
// If table selected...
|
// If table selected...
|
||||||
if (OpcodeTablePtr) {
|
if (OpcodeTablePtr) {
|
||||||
// Find the Opcode to fuse
|
// Find the Opcode to fuse
|
||||||
DenseMap<unsigned*, std::pair<unsigned,unsigned> >::iterator I =
|
DenseMap<unsigned*, std::pair<unsigned,unsigned> >::const_iterator I =
|
||||||
OpcodeTablePtr->find((unsigned*)MI->getOpcode());
|
OpcodeTablePtr->find((unsigned*)MI->getOpcode());
|
||||||
if (I != OpcodeTablePtr->end()) {
|
if (I != OpcodeTablePtr->end()) {
|
||||||
unsigned Opcode = I->second.first;
|
unsigned Opcode = I->second.first;
|
||||||
|
@ -2402,7 +2402,7 @@ bool X86InstrInfo::canFoldMemoryOperand(const MachineInstr *MI,
|
||||||
|
|
||||||
if (OpcodeTablePtr) {
|
if (OpcodeTablePtr) {
|
||||||
// Find the Opcode to fuse
|
// Find the Opcode to fuse
|
||||||
DenseMap<unsigned*, std::pair<unsigned,unsigned> >::iterator I =
|
DenseMap<unsigned*, std::pair<unsigned,unsigned> >::const_iterator I =
|
||||||
OpcodeTablePtr->find((unsigned*)Opc);
|
OpcodeTablePtr->find((unsigned*)Opc);
|
||||||
if (I != OpcodeTablePtr->end())
|
if (I != OpcodeTablePtr->end())
|
||||||
return true;
|
return true;
|
||||||
|
@ -2413,7 +2413,7 @@ bool X86InstrInfo::canFoldMemoryOperand(const MachineInstr *MI,
|
||||||
bool X86InstrInfo::unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI,
|
bool X86InstrInfo::unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI,
|
||||||
unsigned Reg, bool UnfoldLoad, bool UnfoldStore,
|
unsigned Reg, bool UnfoldLoad, bool UnfoldStore,
|
||||||
SmallVectorImpl<MachineInstr*> &NewMIs) const {
|
SmallVectorImpl<MachineInstr*> &NewMIs) const {
|
||||||
DenseMap<unsigned*, std::pair<unsigned,unsigned> >::iterator I =
|
DenseMap<unsigned*, std::pair<unsigned,unsigned> >::const_iterator I =
|
||||||
MemOp2RegOpTable.find((unsigned*)MI->getOpcode());
|
MemOp2RegOpTable.find((unsigned*)MI->getOpcode());
|
||||||
if (I == MemOp2RegOpTable.end())
|
if (I == MemOp2RegOpTable.end())
|
||||||
return false;
|
return false;
|
||||||
|
@ -2530,7 +2530,7 @@ X86InstrInfo::unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N,
|
||||||
if (!N->isMachineOpcode())
|
if (!N->isMachineOpcode())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
DenseMap<unsigned*, std::pair<unsigned,unsigned> >::iterator I =
|
DenseMap<unsigned*, std::pair<unsigned,unsigned> >::const_iterator I =
|
||||||
MemOp2RegOpTable.find((unsigned*)N->getMachineOpcode());
|
MemOp2RegOpTable.find((unsigned*)N->getMachineOpcode());
|
||||||
if (I == MemOp2RegOpTable.end())
|
if (I == MemOp2RegOpTable.end())
|
||||||
return false;
|
return false;
|
||||||
|
@ -2623,7 +2623,7 @@ X86InstrInfo::unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N,
|
||||||
unsigned X86InstrInfo::getOpcodeAfterMemoryUnfold(unsigned Opc,
|
unsigned X86InstrInfo::getOpcodeAfterMemoryUnfold(unsigned Opc,
|
||||||
bool UnfoldLoad, bool UnfoldStore,
|
bool UnfoldLoad, bool UnfoldStore,
|
||||||
unsigned *LoadRegIndex) const {
|
unsigned *LoadRegIndex) const {
|
||||||
DenseMap<unsigned*, std::pair<unsigned,unsigned> >::iterator I =
|
DenseMap<unsigned*, std::pair<unsigned,unsigned> >::const_iterator I =
|
||||||
MemOp2RegOpTable.find((unsigned*)Opc);
|
MemOp2RegOpTable.find((unsigned*)Opc);
|
||||||
if (I == MemOp2RegOpTable.end())
|
if (I == MemOp2RegOpTable.end())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -1049,7 +1049,7 @@ void ABCD::InequalityGraph::printHeader(raw_ostream &OS, Function &F) const {
|
||||||
|
|
||||||
/// Prints the body of the dot file
|
/// Prints the body of the dot file
|
||||||
void ABCD::InequalityGraph::printBody(raw_ostream &OS) const {
|
void ABCD::InequalityGraph::printBody(raw_ostream &OS) const {
|
||||||
DenseMap<Value *, SmallPtrSet<Edge *, 16> >::iterator begin =
|
DenseMap<Value *, SmallPtrSet<Edge *, 16> >::const_iterator begin =
|
||||||
graph.begin(), end = graph.end();
|
graph.begin(), end = graph.end();
|
||||||
|
|
||||||
for (; begin != end ; ++begin) {
|
for (; begin != end ; ++begin) {
|
||||||
|
|
|
@ -624,7 +624,7 @@ uint32_t ValueTable::lookup_or_add(Value *V) {
|
||||||
/// lookup - Returns the value number of the specified value. Fails if
|
/// lookup - Returns the value number of the specified value. Fails if
|
||||||
/// the value has not yet been numbered.
|
/// the value has not yet been numbered.
|
||||||
uint32_t ValueTable::lookup(Value *V) const {
|
uint32_t ValueTable::lookup(Value *V) const {
|
||||||
DenseMap<Value*, uint32_t>::iterator VI = valueNumbering.find(V);
|
DenseMap<Value*, uint32_t>::const_iterator VI = valueNumbering.find(V);
|
||||||
assert(VI != valueNumbering.end() && "Value not numbered?");
|
assert(VI != valueNumbering.end() && "Value not numbered?");
|
||||||
return VI->second;
|
return VI->second;
|
||||||
}
|
}
|
||||||
|
@ -644,7 +644,7 @@ void ValueTable::erase(Value *V) {
|
||||||
/// verifyRemoved - Verify that the value is removed from all internal data
|
/// verifyRemoved - Verify that the value is removed from all internal data
|
||||||
/// structures.
|
/// structures.
|
||||||
void ValueTable::verifyRemoved(const Value *V) const {
|
void ValueTable::verifyRemoved(const Value *V) const {
|
||||||
for (DenseMap<Value*, uint32_t>::iterator
|
for (DenseMap<Value*, uint32_t>::const_iterator
|
||||||
I = valueNumbering.begin(), E = valueNumbering.end(); I != E; ++I) {
|
I = valueNumbering.begin(), E = valueNumbering.end(); I != E; ++I) {
|
||||||
assert(I->first != V && "Inst still occurs in value numbering map!");
|
assert(I->first != V && "Inst still occurs in value numbering map!");
|
||||||
}
|
}
|
||||||
|
@ -2011,12 +2011,12 @@ void GVN::verifyRemoved(const Instruction *Inst) const {
|
||||||
|
|
||||||
// Walk through the value number scope to make sure the instruction isn't
|
// Walk through the value number scope to make sure the instruction isn't
|
||||||
// ferreted away in it.
|
// ferreted away in it.
|
||||||
for (DenseMap<BasicBlock*, ValueNumberScope*>::iterator
|
for (DenseMap<BasicBlock*, ValueNumberScope*>::const_iterator
|
||||||
I = localAvail.begin(), E = localAvail.end(); I != E; ++I) {
|
I = localAvail.begin(), E = localAvail.end(); I != E; ++I) {
|
||||||
const ValueNumberScope *VNS = I->second;
|
const ValueNumberScope *VNS = I->second;
|
||||||
|
|
||||||
while (VNS) {
|
while (VNS) {
|
||||||
for (DenseMap<uint32_t, Value*>::iterator
|
for (DenseMap<uint32_t, Value*>::const_iterator
|
||||||
II = VNS->table.begin(), IE = VNS->table.end(); II != IE; ++II) {
|
II = VNS->table.begin(), IE = VNS->table.end(); II != IE; ++II) {
|
||||||
assert(II->second != Inst && "Inst still in value numbering scope!");
|
assert(II->second != Inst && "Inst still in value numbering scope!");
|
||||||
}
|
}
|
||||||
|
|
|
@ -507,7 +507,7 @@ void ValueTable::erase(Value *V) {
|
||||||
/// verifyRemoved - Verify that the value is removed from all internal data
|
/// verifyRemoved - Verify that the value is removed from all internal data
|
||||||
/// structures.
|
/// structures.
|
||||||
void ValueTable::verifyRemoved(const Value *V) const {
|
void ValueTable::verifyRemoved(const Value *V) const {
|
||||||
for (DenseMap<Value*, uint32_t>::iterator
|
for (DenseMap<Value*, uint32_t>::const_iterator
|
||||||
I = valueNumbering.begin(), E = valueNumbering.end(); I != E; ++I) {
|
I = valueNumbering.begin(), E = valueNumbering.end(); I != E; ++I) {
|
||||||
assert(I->first != V && "Inst still occurs in value numbering map!");
|
assert(I->first != V && "Inst still occurs in value numbering map!");
|
||||||
}
|
}
|
||||||
|
|
|
@ -341,11 +341,11 @@ MDNode *MetadataContextImpl::getMD(unsigned MDKind, const Instruction *Inst) {
|
||||||
/// getMDs - Get the metadata attached to an Instruction.
|
/// getMDs - Get the metadata attached to an Instruction.
|
||||||
void MetadataContextImpl::
|
void MetadataContextImpl::
|
||||||
getMDs(const Instruction *Inst, SmallVectorImpl<MDPairTy> &MDs) const {
|
getMDs(const Instruction *Inst, SmallVectorImpl<MDPairTy> &MDs) const {
|
||||||
MDStoreTy::iterator I = MetadataStore.find(Inst);
|
MDStoreTy::const_iterator I = MetadataStore.find(Inst);
|
||||||
if (I == MetadataStore.end())
|
if (I == MetadataStore.end())
|
||||||
return;
|
return;
|
||||||
MDs.resize(I->second.size());
|
MDs.resize(I->second.size());
|
||||||
for (MDMapTy::iterator MI = I->second.begin(), ME = I->second.end();
|
for (MDMapTy::const_iterator MI = I->second.begin(), ME = I->second.end();
|
||||||
MI != ME; ++MI)
|
MI != ME; ++MI)
|
||||||
// MD kinds are numbered from 1.
|
// MD kinds are numbered from 1.
|
||||||
MDs[MI->first - 1] = std::make_pair(MI->first, MI->second);
|
MDs[MI->first - 1] = std::make_pair(MI->first, MI->second);
|
||||||
|
|
|
@ -164,4 +164,16 @@ TEST_F(DenseMapTest, IterationTest) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// const_iterator test
|
||||||
|
TEST_F(DenseMapTest, ConstIteratorTest) {
|
||||||
|
// Check conversion from iterator to const_iterator.
|
||||||
|
DenseMap<uint32_t, uint32_t>::iterator it = uintMap.begin();
|
||||||
|
DenseMap<uint32_t, uint32_t>::const_iterator cit(it);
|
||||||
|
EXPECT_TRUE(it == cit);
|
||||||
|
|
||||||
|
// Check copying of const_iterators.
|
||||||
|
DenseMap<uint32_t, uint32_t>::const_iterator cit2(cit);
|
||||||
|
EXPECT_TRUE(cit == cit2);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue