summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorEric Christopher <echristo@apple.com>2012-07-02 23:22:21 +0000
committerEric Christopher <echristo@apple.com>2012-07-02 23:22:21 +0000
commitc723eb1aef817d47feec620933ee1ec6005cdd14 (patch)
tree01b6b0506dc61ab43904a7b71b5a499ba8376c1e /include
parent3aaefc12bbc365294582af63ce23dd76636e95b0 (diff)
downloadllvm-c723eb1aef817d47feec620933ee1ec6005cdd14.tar.gz
llvm-c723eb1aef817d47feec620933ee1ec6005cdd14.tar.bz2
llvm-c723eb1aef817d47feec620933ee1ec6005cdd14.tar.xz
Revert "IntRange:" as it appears to be breaking self hosting.
This reverts commit b2833d9dcba88c6f0520cad760619200adc0442c. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159618 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/llvm/Support/IntegersSubset.h36
-rw-r--r--include/llvm/Support/IntegersSubsetMapping.h223
2 files changed, 43 insertions, 216 deletions
diff --git a/include/llvm/Support/IntegersSubset.h b/include/llvm/Support/IntegersSubset.h
index 4d76fab2d0..bb9e76925e 100644
--- a/include/llvm/Support/IntegersSubset.h
+++ b/include/llvm/Support/IntegersSubset.h
@@ -182,12 +182,7 @@ protected:
IntType Low;
IntType High;
bool IsEmpty : 1;
- enum Type {
- SINGLE_NUMBER,
- RANGE,
- UNKNOWN
- };
- Type RangeType;
+ bool IsSingleNumber : 1;
public:
typedef IntRange<IntType> self;
@@ -196,30 +191,15 @@ public:
IntRange() : IsEmpty(true) {}
IntRange(const self &RHS) :
Low(RHS.Low), High(RHS.High),
- IsEmpty(RHS.IsEmpty), RangeType(RHS.RangeType) {}
+ IsEmpty(RHS.IsEmpty), IsSingleNumber(RHS.IsSingleNumber) {}
IntRange(const IntType &C) :
- Low(C), High(C), IsEmpty(false), RangeType(SINGLE_NUMBER) {}
+ Low(C), High(C), IsEmpty(false), IsSingleNumber(true) {}
IntRange(const IntType &L, const IntType &H) : Low(L), High(H),
- IsEmpty(false), RangeType(UNKNOWN) {}
+ IsEmpty(false), IsSingleNumber(Low == High) {}
bool isEmpty() const { return IsEmpty; }
- bool isSingleNumber() const {
- switch (RangeType) {
- case SINGLE_NUMBER:
- return true;
- case RANGE:
- return false;
- case UNKNOWN:
- if (Low == High) {
- const_cast<Type&>(RangeType) = SINGLE_NUMBER;
- return true;
- }
- const_cast<Type&>(RangeType) = RANGE;
- return false;
- }
- llvm_unreachable("Unknown state?!");
- }
+ bool isSingleNumber() const { return IsSingleNumber; }
const IntType& getLow() const {
assert(!IsEmpty && "Range is empty.");
@@ -233,13 +213,13 @@ public:
bool operator<(const self &RHS) const {
assert(!IsEmpty && "Left range is empty.");
assert(!RHS.IsEmpty && "Right range is empty.");
- if (Low < RHS.Low)
- return true;
if (Low == RHS.Low) {
if (High > RHS.High)
return true;
return false;
}
+ if (Low < RHS.Low)
+ return true;
return false;
}
@@ -532,7 +512,7 @@ public:
e = Src.end(); i != e; ++i) {
const Range &R = *i;
std::vector<Constant*> r;
- if (!R.isSingleNumber()) {
+ if (R.isSingleNumber()) {
r.reserve(2);
// FIXME: Since currently we have ConstantInt based numbers
// use hack-conversion of IntItem to ConstantInt
diff --git a/include/llvm/Support/IntegersSubsetMapping.h b/include/llvm/Support/IntegersSubsetMapping.h
index 915c777e5d..87d0755c51 100644
--- a/include/llvm/Support/IntegersSubsetMapping.h
+++ b/include/llvm/Support/IntegersSubsetMapping.h
@@ -58,16 +58,22 @@ public:
protected:
- typedef std::map<RangeEx, SuccessorClass*> CaseItems;
+ typedef std::list<Cluster> CaseItems;
typedef typename CaseItems::iterator CaseItemIt;
typedef typename CaseItems::const_iterator CaseItemConstIt;
// TODO: Change unclean CRS prefixes to SubsetMap for example.
typedef std::map<SuccessorClass*, RangesCollection > CRSMap;
typedef typename CRSMap::iterator CRSMapIt;
+
+ struct ClustersCmp {
+ bool operator()(const Cluster &C1, const Cluster &C2) {
+ return C1.first < C2.first;
+ }
+ };
CaseItems Items;
- bool SingleNumbersOnly;
+ bool Sorted;
bool isIntersected(CaseItemIt& LItem, CaseItemIt& RItem) {
return LItem->first.getHigh() >= RItem->first.getLow();
@@ -85,6 +91,18 @@ protected:
return LItem->first.getHigh() >= RLow;
}
+ void sort() {
+ if (!Sorted) {
+ 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;
+ }
+ }
+
enum DiffProcessState {
L_OPENED,
INTERSECT_OPENED,
@@ -195,7 +213,7 @@ protected:
}
}
- void onLROpen(const IntTy &Pt,
+ void onRLOpen(const IntTy &Pt,
SuccessorClass *LS,
SuccessorClass *RS) {
switch (State) {
@@ -211,7 +229,7 @@ protected:
OpenPt = Pt;
}
- void onLRClose(const IntTy &Pt) {
+ void onRLClose(const IntTy &Pt) {
switch (State) {
case INTERSECT_OPENED:
if (IntersectionMapping)
@@ -227,48 +245,6 @@ protected:
bool isLOpened() { return State == L_OPENED; }
bool isROpened() { return State == R_OPENED; }
};
-
- void diff_single_numbers(self *LExclude, self *Intersection, self *RExclude,
- const self& RHS) {
-
- CaseItemConstIt L = Items.begin(), R = RHS.Items.begin();
- CaseItemConstIt el = Items.end(), er = RHS.Items.end();
- while (L != el && R != er) {
- const Cluster &LCluster = *L;
- const RangeEx &LRange = LCluster.first;
- const Cluster &RCluster = *R;
- const RangeEx &RRange = RCluster.first;
-
- if (LRange.getLow() < RRange.getLow()) {
- if (LExclude)
- LExclude->add(LRange.getLow(), LCluster.second);
- ++L;
- } else if (LRange.getLow() > RRange.getLow()) {
- if (RExclude)
- RExclude->add(RRange.getLow(), RCluster.second);
- ++R;
- } else {
- if (Intersection)
- Intersection->add(LRange.getLow(), LCluster.second);
- ++L;
- ++R;
- }
- }
-
- if (L != Items.end()) {
- if (LExclude)
- do {
- LExclude->add(L->first, L->second);
- ++L;
- } while (L != Items.end());
- } else if (R != RHS.Items.end()) {
- if (RExclude)
- do {
- RExclude->add(R->first, R->second);
- ++R;
- } while (R != RHS.Items.end());
- }
- }
public:
@@ -280,18 +256,15 @@ public:
typedef std::pair<SuccessorClass*, IntegersSubsetTy> Case;
typedef std::list<Case> Cases;
- typedef typename Cases::iterator CasesIt;
-
- IntegersSubsetMapping() : SingleNumbersOnly(true) {}
- bool verify() {
- RangeIterator DummyErrItem;
- return verify(DummyErrItem);
+ IntegersSubsetMapping() {
+ Sorted = false;
}
bool verify(RangeIterator& errItem) {
if (Items.empty())
return true;
+ sort();
for (CaseItemIt j = Items.begin(), i = j++, e = Items.end();
j != e; i = j++) {
if (isIntersected(i, j) && i->second != j->second) {
@@ -302,36 +275,10 @@ public:
return true;
}
- bool isOverlapped(self &RHS) {
- if (Items.empty() || RHS.empty())
- return true;
-
- for (CaseItemIt L = Items.begin(), R = RHS.Items.begin(),
- el = Items.end(), er = RHS.Items.end(); L != el && R != er;) {
-
- const RangeTy &LRange = L->first;
- const RangeTy &RRange = R->first;
-
- if (LRange.getLow() > RRange.getLow()) {
- if (RRange.isSingleNumber() || LRange.getLow() > RRange.getHigh())
- ++R;
- else
- return true;
- } else if (LRange.getLow() < RRange.getLow()) {
- if (LRange.isSingleNumber() || LRange.getHigh() < RRange.getLow())
- ++L;
- else
- return true;
- } else // iRange.getLow() == jRange.getLow()
- return true;
- }
- return false;
- }
-
-
void optimize() {
if (Items.size() < 2)
return;
+ sort();
CaseItems OldItems = Items;
Items.clear();
const IntTy *Low = &OldItems.begin()->first.getLow();
@@ -356,6 +303,8 @@ public:
}
RangeEx R(*Low, *High, Weight);
add(R, Successor);
+ // We recollected the Items, but we kept it sorted.
+ Sorted = true;
}
/// Adds a constant value.
@@ -374,10 +323,8 @@ public:
add(REx, S);
}
void add(const RangeEx &R, SuccessorClass *S = 0) {
- //Items.push_back(std::make_pair(R, S));
- Items.insert(std::make_pair(R, S));
- if (!R.isSingleNumber())
- SingleNumbersOnly = false;
+ Items.push_back(std::make_pair(R, S));
+ Sorted = false;
}
/// Adds all ranges and values from given ranges set to the current
@@ -390,17 +337,9 @@ public:
}
void add(self& RHS) {
- //Items.insert(Items.begin(), RHS.Items.begin(), RHS.Items.end());
- Items.insert(RHS.Items.begin(), RHS.Items.end());
- if (!RHS.SingleNumbersOnly)
- SingleNumbersOnly = false;
+ Items.insert(Items.end(), RHS.Items.begin(), RHS.Items.end());
}
- void add(self& RHS, SuccessorClass *S) {
- for (CaseItemIt i = RHS.Items.begin(), e = RHS.Items.end(); i != e; ++i)
- add(i->first, S);
- }
-
void add(const RangesCollection& RHS, SuccessorClass *S = 0) {
for (RangesCollectionConstIt i = RHS.begin(), e = RHS.end(); i != e; ++i)
add(*i, S);
@@ -409,34 +348,6 @@ public:
/// Removes items from set.
void removeItem(RangeIterator i) { Items.erase(i); }
- /// Moves whole case from current mapping to the NewMapping object.
- void detachCase(self& NewMapping, SuccessorClass *Succ) {
- for (CaseItemIt i = Items.begin(); i != Items.end();)
- if (i->second == Succ) {
- NewMapping.add(i->first, i->second);
- Items.erase(i++);
- } else
- ++i;
- }
-
- /// Removes all clusters for given successor.
- void removeCase(SuccessorClass *Succ) {
- for (CaseItemIt i = Items.begin(); i != Items.end();)
- if (i->second == Succ) {
- Items.erase(i++);
- } else
- ++i;
- }
-
- /// Find successor that satisfies given value.
- SuccessorClass *findSuccessor(const IntTy& Val) {
- for (CaseItemIt i = Items.begin(); i != Items.end(); ++i) {
- if (i->first.isInRange(Val))
- return i->second;
- }
- return 0;
- }
-
/// Calculates the difference between this mapping and RHS.
/// THIS without RHS is placed into LExclude,
/// RHS without THIS is placed into RExclude,
@@ -444,16 +355,10 @@ public:
void diff(self *LExclude, self *Intersection, self *RExclude,
const self& RHS) {
- if (SingleNumbersOnly && RHS.SingleNumbersOnly) {
- diff_single_numbers(LExclude, Intersection, RExclude, RHS);
- return;
- }
-
DiffStateMachine Machine(LExclude, Intersection, RExclude);
CaseItemConstIt L = Items.begin(), R = RHS.Items.begin();
- CaseItemConstIt el = Items.end(), er = RHS.Items.end();
- while (L != el && R != er) {
+ while (L != Items.end() && R != RHS.Items.end()) {
const Cluster &LCluster = *L;
const RangeEx &LRange = LCluster.first;
const Cluster &RCluster = *R;
@@ -472,36 +377,7 @@ public:
++R;
continue;
}
-
- if (LRange.isSingleNumber() && RRange.isSingleNumber()) {
- Machine.onLROpen(LRange.getLow(), LCluster.second, RCluster.second);
- Machine.onLRClose(LRange.getLow());
- ++L;
- ++R;
- continue;
- }
- if (LRange.isSingleNumber()) {
- Machine.onLOpen(LRange.getLow(), LCluster.second);
- Machine.onLClose(LRange.getLow());
- ++L;
- while(L != Items.end() && L->first.getHigh() < RRange.getHigh()) {
- Machine.onLOpen(LRange.getLow(), LCluster.second);
- Machine.onLClose(LRange.getLow());
- ++L;
- }
- continue;
- } else if (RRange.isSingleNumber()) {
- Machine.onROpen(R->first.getLow(), R->second);
- Machine.onRClose(R->first.getHigh());
- ++R;
- while(R != RHS.Items.end() && R->first.getHigh() < LRange.getHigh()) {
- Machine.onROpen(R->first.getLow(), R->second);
- Machine.onRClose(R->first.getHigh());
- ++R;
- }
- continue;
- } else
if (LRange.getLow() < RRange.getLow()) {
// May be opened in previous iteration.
if (!Machine.isLOpened())
@@ -514,7 +390,7 @@ public:
Machine.onLOpen(LRange.getLow(), LCluster.second);
}
else
- Machine.onLROpen(LRange.getLow(), LCluster.second, RCluster.second);
+ Machine.onRLOpen(LRange.getLow(), LCluster.second, RCluster.second);
if (LRange.getHigh() < RRange.getHigh()) {
Machine.onLClose(LRange.getHigh());
@@ -535,7 +411,7 @@ public:
}
}
else {
- Machine.onLRClose(LRange.getHigh());
+ Machine.onRLClose(LRange.getHigh());
++L;
++R;
}
@@ -565,20 +441,7 @@ public:
}
/// Builds the finalized case objects.
- void getCases(Cases& TheCases, bool PreventMerging = false) {
- //FIXME: PreventMerging is a temporary parameter.
- //Currently a set of passes is still knows nothing about
- //switches with case ranges, and if these passes meet switch
- //with complex case that crashs the application.
- if (PreventMerging) {
- for (RangeIterator i = this->begin(); i != this->end(); ++i) {
- RangesCollection SingleRange;
- SingleRange.push_back(i->first);
- TheCases.push_back(std::make_pair(i->second,
- IntegersSubsetTy(SingleRange)));
- }
- return;
- }
+ void getCases(Cases& TheCases) {
CRSMap TheCRSMap;
for (RangeIterator i = this->begin(); i != this->end(); ++i)
TheCRSMap[i->second].push_back(i->first);
@@ -595,22 +458,6 @@ public:
return IntegersSubsetTy(Ranges);
}
- /// Returns pointer to value of case if it is single-numbered or 0
- /// in another case.
- const IntTy* getCaseSingleNumber(SuccessorClass *Succ) {
- const IntTy* Res = 0;
- for (CaseItemIt i = Items.begin(); i != Items.end(); ++i)
- if (i->second == Succ) {
- if (!i->first.isSingleNumber())
- return 0;
- if (Res)
- return 0;
- else
- Res = &(i->first.getLow());
- }
- return Res;
- }
-
/// Returns true if there is no ranges and values inside.
bool empty() const { return Items.empty(); }