[llvm-commits] [llvm] r157987 - in /llvm/trunk: include/llvm/Support/IntegersSubset.h include/llvm/Support/IntegersSubsetMapping.h unittests/Support/IntegersSubsetTest.cpp

Benjamin Kramer benny.kra at googlemail.com
Tue Jun 5 00:59:11 PDT 2012


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