[llvm-commits] [llvm] r157987 - in /llvm/trunk: include/llvm/Support/IntegersSubset.h include/llvm/Support/IntegersSubsetMapping.h unittests/Support/IntegersSubsetTest.cpp
Stepan Dyatkovskiy
stpworld at narod.ru
Tue Jun 5 01:08:07 PDT 2012
Hmm... Yes I need iterator stability. In 157989 I added exclude
operation, that invokes insert/erase operations in the loop. Initially I
try to use std::vector, but I got very unclean implementation, since I
was need to collect all remove/add requests and purge them before
finishing. I'll try to move it to SmallVector a little bit later.
-Stepan.
Benjamin Kramer wrote:
> On 05.06.2012, at 09:46, Stepan Dyatkovskiy<stpworld at narod.ru> wrote:
>
>> Author: dyatkovskiy
>> Date: Tue Jun 5 02:43:08 2012
>> New Revision: 157987
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=157987&view=rev
>> Log:
>> IntegersSubsetMapping:
>> Changed type of Items collection: from std::vector to std::list.
>> Also some small fixes made in IntegersSubset.h, IntegersSubsetMapping.h and IntegersSubsetTest.cpp.
>
> Do you depend on the iterator stability/splicing of std::list? It's a
> very inefficient class that calls malloc for every object and adds at
> least two pointers per element. A (Small)vector is a better choice in
> most cases.
>
>>
>>
>> Modified:
>> llvm/trunk/include/llvm/Support/IntegersSubset.h
>> llvm/trunk/include/llvm/Support/IntegersSubsetMapping.h
>> llvm/trunk/unittests/Support/IntegersSubsetTest.cpp
>>
>> Modified: llvm/trunk/include/llvm/Support/IntegersSubset.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/IntegersSubset.h?rev=157987&r1=157986&r2=157987&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Support/IntegersSubset.h (original)
>> +++ llvm/trunk/include/llvm/Support/IntegersSubset.h Tue Jun 5 02:43:08 2012
>> @@ -293,7 +293,7 @@
>> public:
>>
>> template<class RangesCollectionTy>
>> - IntegersSubsetGeneric(const RangesCollectionTy& Links) {
>> + explicit IntegersSubsetGeneric(const RangesCollectionTy& Links) {
>> assert(Links.size()&& "Empty ranges are not allowed.");
>> for (typename RangesCollectionTy::const_iterator i = Links.begin(),
>> e = Links.end(); i != e; ++i) {
>> @@ -459,9 +459,8 @@
>> IntegersSubset(Constant *C) : ParentTy(rangesFromConstant(C)),
>> Holder(C) {}
>>
>> - // implicit
>> template<class RangesCollectionTy>
>> - IntegersSubset(const RangesCollectionTy& Src) : ParentTy(Src) {
>> + explicit IntegersSubset(const RangesCollectionTy& Src) : ParentTy(Src) {
>> std::vector<Constant*> Elts;
>> Elts.reserve(Src.size());
>> for (typename RangesCollectionTy::const_iterator i = Src.begin(),
>>
>> Modified: llvm/trunk/include/llvm/Support/IntegersSubsetMapping.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/IntegersSubsetMapping.h?rev=157987&r1=157986&r2=157987&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Support/IntegersSubsetMapping.h (original)
>> +++ llvm/trunk/include/llvm/Support/IntegersSubsetMapping.h Tue Jun 5 02:43:08 2012
>> @@ -49,7 +49,7 @@
>>
>> protected:
>>
>> - typedef std::vector<Cluster> CaseItems;
>> + typedef std::list<Cluster> CaseItems;
>> typedef typename CaseItems::iterator CaseItemIt;
>> typedef typename CaseItems::const_iterator CaseItemConstIt;
>>
>> @@ -87,11 +87,16 @@
>>
>> void sort() {
>> if (!Sorted) {
>> - std::sort(Items.begin(), Items.end(), ClustersCmp());
>> + std::vector<Cluster> clustersVector;
>> + clustersVector.reserve(Items.size());
>> + clustersVector.insert(clustersVector.begin(), Items.begin(), Items.end());
>> + std::sort(clustersVector.begin(), clustersVector.end(), ClustersCmp());
>> + Items.clear();
>> + Items.insert(Items.begin(), clustersVector.begin(), clustersVector.end());
>
> Std::list has a sort() method for efficient sorting.
>
> - Ben
>
>> Sorted = true;
>> }
>> }
>> -
>> +
>> public:
>>
>> // Don't public CaseItems itself. Don't allow edit the Items directly.
>> @@ -104,7 +109,6 @@
>> typedef std::list<Case> Cases;
>>
>> IntegersSubsetMapping() {
>> - Items.reserve(32);
>> Sorted = false;
>> }
>>
>> @@ -112,7 +116,7 @@
>> if (Items.empty())
>> return true;
>> sort();
>> - for (CaseItemIt i = Items.begin(), j = i+1, e = Items.end();
>> + for (CaseItemIt j = Items.begin(), i = j++, e = Items.end();
>> j != e; i = j++) {
>> if (isIntersected(i, j)&& i->second != j->second) {
>> errItem = j;
>> @@ -132,8 +136,8 @@
>> const IntTy *High =&OldItems.begin()->first.getHigh();
>> unsigned Weight = 1;
>> SuccessorClass *Successor = OldItems.begin()->second;
>> - for (CaseItemIt i = OldItems.begin(), j = i+1, e = OldItems.end();
>> - j != e; i = j++) {
>> + for (CaseItemIt j = OldItems.begin(), i = j++, e = OldItems.end();
>> + j != e; i = j++) {
>> if (isJoinable(i, j)) {
>> const IntTy *CurHigh =&j->first.getHigh();
>> ++Weight;
>> @@ -176,7 +180,7 @@
>>
>> /// Adds all ranges and values from given ranges set to the current
>> /// mapping.
>> - void add(const IntegersSubset&CRS, SuccessorClass *S = 0) {
>> + void add(const IntegersSubsetTy&CRS, SuccessorClass *S = 0) {
>> for (unsigned i = 0, e = CRS.getNumItems(); i< e; ++i) {
>> RangeTy R = CRS.getItem(i);
>> add(R, S);
>> @@ -197,7 +201,7 @@
>>
>> /// Builds the finalized case objects ignoring successor values, as though
>> /// all ranges belongs to the same successor.
>> - IntegersSubset getCase() {
>> + IntegersSubsetTy getCase() {
>> RangesCollection Ranges;
>> for (RangeIterator i = this->begin(); i != this->end(); ++i)
>> Ranges.push_back(i->first);
>>
>> Modified: llvm/trunk/unittests/Support/IntegersSubsetTest.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/IntegersSubsetTest.cpp?rev=157987&r1=157986&r2=157987&view=diff
>> ==============================================================================
>> --- llvm/trunk/unittests/Support/IntegersSubsetTest.cpp (original)
>> +++ llvm/trunk/unittests/Support/IntegersSubsetTest.cpp Tue Jun 5 02:43:08 2012
>> @@ -22,6 +22,7 @@
>> class Int : public APInt {
>> public:
>> Int(uint64_t V) : APInt(64, V) {}
>> + Int(const APInt& Src) : APInt(Src) {}
>> bool operator< (const APInt& RHS) const { return ult(RHS); }
>> bool operator> (const APInt& RHS) const { return ugt(RHS); }
>> bool operator<= (const APInt& RHS) const { return ule(RHS); }
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list