[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