IntegersSubsetMapping:
authorStepan Dyatkovskiy <stpworld@narod.ru>
Tue, 5 Jun 2012 07:43:08 +0000 (07:43 +0000)
committerStepan Dyatkovskiy <stpworld@narod.ru>
Tue, 5 Jun 2012 07:43:08 +0000 (07:43 +0000)
Changed type of Items collection: from std::vector to std::list.
Also some small fixes made in IntegersSubset.h, IntegersSubsetMapping.h and IntegersSubsetTest.cpp.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157987 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/IntegersSubset.h
include/llvm/Support/IntegersSubsetMapping.h
unittests/Support/IntegersSubsetTest.cpp

index add0c902a9e285ec9b218469e9b0c1d9e2a9cf4d..2ceeea5b665dfc236d88c8e95ffa43c15d205a8d 100644 (file)
@@ -293,7 +293,7 @@ protected:
 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 @@ public:
   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(),
index d3d11f03ba11a8163d087ef9d74645ba8c45490f..bb02c156f3a4ce16266b9ca33bc8b8984be9dded 100644 (file)
@@ -49,7 +49,7 @@ public:
 
 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 @@ protected:
   
   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());
       Sorted = true;
     }
   }
-  
+
 public:
   
   // Don't public CaseItems itself. Don't allow edit the Items directly. 
@@ -104,7 +109,6 @@ public:
   typedef std::list<Case> Cases;
   
   IntegersSubsetMapping() {
-    Items.reserve(32);
     Sorted = false;
   }
   
@@ -112,7 +116,7 @@ public:
     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 @@ public:
     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 @@ public:
   
   /// 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 @@ public:
   
   /// 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);
index 5de1f7c2213c0af21c844a5193e181781bfa1565..836f29a2696c21c7d6a86c99fd28306e678f1581 100644 (file)
@@ -22,6 +22,7 @@ namespace {
   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); }