summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2014-02-26 16:58:35 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2014-02-26 16:58:35 +0000
commite3561972d45633cee705084ce1e26c4ecbbe8d43 (patch)
treec4799fe481e9096cd9f2ccfd65a86db37b4ebb76
parent3c4c95e522ab2efca47df170d38bc2c19aa173ad (diff)
downloadllvm-e3561972d45633cee705084ce1e26c4ecbbe8d43.tar.gz
llvm-e3561972d45633cee705084ce1e26c4ecbbe8d43.tar.bz2
llvm-e3561972d45633cee705084ce1e26c4ecbbe8d43.tar.xz
Use a sorted array to store the information about a few address spaces.
We don't have any test with more than 6 address spaces, so a DenseMap is probably not the correct answer. An unsorted array would also be OK, but we have to sort it for printing anyway. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202275 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/IR/DataLayout.h9
-rw-r--r--lib/IR/DataLayout.cpp68
2 files changed, 44 insertions, 33 deletions
diff --git a/include/llvm/IR/DataLayout.h b/include/llvm/IR/DataLayout.h
index 8a162430f7..e26dd026bd 100644
--- a/include/llvm/IR/DataLayout.h
+++ b/include/llvm/IR/DataLayout.h
@@ -115,7 +115,14 @@ private:
/// pointers vs. 64-bit pointers by extending LayoutAlignment, but for now,
/// we don't.
SmallVector<LayoutAlignElem, 16> Alignments;
- DenseMap<unsigned, PointerAlignElem> Pointers;
+ typedef SmallVector<PointerAlignElem, 8> PointersTy;
+ PointersTy Pointers;
+
+ PointersTy::const_iterator findPoiterLowerBound(uint32_t AddressSpace) const {
+ return const_cast<DataLayout *>(this)->findPoiterLowerBound(AddressSpace);
+ }
+
+ PointersTy::iterator findPoiterLowerBound(uint32_t AddressSpace);
/// InvalidAlignmentElem - This member is a signal that a requested alignment
/// type and bit width were not found in the SmallVector.
diff --git a/lib/IR/DataLayout.cpp b/lib/IR/DataLayout.cpp
index ed7c12fc9d..7089b7b85f 100644
--- a/lib/IR/DataLayout.cpp
+++ b/lib/IR/DataLayout.cpp
@@ -374,18 +374,29 @@ DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
pref_align, bit_width));
}
+static bool comparePointerAlignElem(const PointerAlignElem &A,
+ uint32_t AddressSpace) {
+ return A.AddressSpace < AddressSpace;
+}
+
+DataLayout::PointersTy::iterator
+DataLayout::findPoiterLowerBound(uint32_t AddressSpace) {
+ return std::lower_bound(Pointers.begin(), Pointers.end(), AddressSpace,
+ comparePointerAlignElem);
+}
+
void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
unsigned PrefAlign,
uint32_t TypeByteWidth) {
assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
- DenseMap<unsigned,PointerAlignElem>::iterator val = Pointers.find(AddrSpace);
- if (val == Pointers.end()) {
- Pointers[AddrSpace] =
- PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign, TypeByteWidth);
+ PointersTy::iterator I = findPoiterLowerBound(AddrSpace);
+ if (I == Pointers.end() || I->AddressSpace != AddrSpace) {
+ Pointers.insert(I, PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign,
+ TypeByteWidth));
} else {
- val->second.ABIAlign = ABIAlign;
- val->second.PrefAlign = PrefAlign;
- val->second.TypeByteWidth = TypeByteWidth;
+ I->ABIAlign = ABIAlign;
+ I->PrefAlign = PrefAlign;
+ I->TypeByteWidth = TypeByteWidth;
}
}
@@ -529,19 +540,9 @@ std::string DataLayout::getStringRepresentation() const {
break;
}
- SmallVector<unsigned, 8> addrSpaces;
- // Lets get all of the known address spaces and sort them
- // into increasing order so that we can emit the string
- // in a cleaner format.
- for (DenseMap<unsigned, PointerAlignElem>::const_iterator
- pib = Pointers.begin(), pie = Pointers.end();
- pib != pie; ++pib) {
- addrSpaces.push_back(pib->first);
- }
- std::sort(addrSpaces.begin(), addrSpaces.end());
- for (SmallVectorImpl<unsigned>::iterator asb = addrSpaces.begin(),
- ase = addrSpaces.end(); asb != ase; ++asb) {
- const PointerAlignElem &PI = Pointers.find(*asb)->second;
+ for (PointersTy::const_iterator I = Pointers.begin(), E = Pointers.end();
+ I != E; ++I) {
+ const PointerAlignElem &PI = *I;
// Skip default.
if (PI.AddressSpace == 0 && PI.ABIAlign == 8 && PI.PrefAlign == 8 &&
@@ -586,27 +587,30 @@ std::string DataLayout::getStringRepresentation() const {
}
unsigned DataLayout::getPointerABIAlignment(unsigned AS) const {
- DenseMap<unsigned, PointerAlignElem>::const_iterator val = Pointers.find(AS);
- if (val == Pointers.end()) {
- val = Pointers.find(0);
+ PointersTy::const_iterator I = findPoiterLowerBound(AS);
+ if (I == Pointers.end() || I->AddressSpace != AS) {
+ I = findPoiterLowerBound(0);
+ assert(I->AddressSpace == 0);
}
- return val->second.ABIAlign;
+ return I->ABIAlign;
}
unsigned DataLayout::getPointerPrefAlignment(unsigned AS) const {
- DenseMap<unsigned, PointerAlignElem>::const_iterator val = Pointers.find(AS);
- if (val == Pointers.end()) {
- val = Pointers.find(0);
+ PointersTy::const_iterator I = findPoiterLowerBound(AS);
+ if (I == Pointers.end() || I->AddressSpace != AS) {
+ I = findPoiterLowerBound(0);
+ assert(I->AddressSpace == 0);
}
- return val->second.PrefAlign;
+ return I->PrefAlign;
}
unsigned DataLayout::getPointerSize(unsigned AS) const {
- DenseMap<unsigned, PointerAlignElem>::const_iterator val = Pointers.find(AS);
- if (val == Pointers.end()) {
- val = Pointers.find(0);
+ PointersTy::const_iterator I = findPoiterLowerBound(AS);
+ if (I == Pointers.end() || I->AddressSpace != AS) {
+ I = findPoiterLowerBound(0);
+ assert(I->AddressSpace == 0);
}
- return val->second.TypeByteWidth;
+ return I->TypeByteWidth;
}
unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {