[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