mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-21 18:24:23 +00:00
Added unittests for IntegersSubset and IntegersSubsetMapping.
- Fixed IntegersSubsetGeneric copy/assignment behaviour. - Fixed IntegersSubsetGeneric::getSize/getSingleValue methods. - Fixed IntegersSubsetGeneric::verify method. Also IntegersSubset.h and IntegersSubsetMapping.h headers was fixed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157887 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
//===-- llvm/ConstantRangesSet.h - The constant set of ranges ---*- C++ -*-===//
|
||||
//===-- llvm/IntegersSubset.h - The subset of integers ----------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
@ -9,10 +9,9 @@
|
||||
//
|
||||
/// @file
|
||||
/// This file contains class that implements constant set of ranges:
|
||||
/// [<Low0,High0>,...,<LowN,HighN>]. Mainly, this set is used by SwitchInst and
|
||||
/// represents case value that may contain multiple ranges for a single
|
||||
/// successor.
|
||||
///
|
||||
/// [<Low0,High0>,...,<LowN,HighN>]. Initially, this class was created for
|
||||
/// SwitchInst and was used for case value representation that may contain
|
||||
/// multiple ranges for a single successor.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
@ -280,7 +279,9 @@ public:
|
||||
typedef std::list<IntTy> FlatCollectionTy;
|
||||
typedef std::pair<IntTy*, IntTy*> RangeLinkTy;
|
||||
typedef SmallVector<RangeLinkTy, 64> RangeLinksTy;
|
||||
typedef typename RangeLinksTy::iterator RangeLinksConstIt;
|
||||
typedef typename RangeLinksTy::const_iterator RangeLinksConstIt;
|
||||
|
||||
typedef IntegersSubsetGeneric<IntTy> self;
|
||||
|
||||
protected:
|
||||
|
||||
@ -304,6 +305,26 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
IntegersSubsetGeneric(const self& RHS) {
|
||||
*this = RHS;
|
||||
}
|
||||
|
||||
self& operator=(const self& RHS) {
|
||||
FlatCollection.clear();
|
||||
RangeLinks.clear();
|
||||
for (RangeLinksConstIt i = RHS.RangeLinks.begin(), e = RHS.RangeLinks.end();
|
||||
i != e; ++i) {
|
||||
RangeLinkTy RangeLink;
|
||||
FlatCollection.push_back(*(i->first));
|
||||
RangeLink.first = &FlatCollection.back();
|
||||
if (i->first != i->second)
|
||||
FlatCollection.push_back(*(i->second));
|
||||
RangeLink.second = &FlatCollection.back();
|
||||
RangeLinks.push_back(RangeLink);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
typedef IntRange<IntTy> Range;
|
||||
|
||||
/// Checks is the given constant satisfies this case. Returns
|
||||
@ -314,8 +335,8 @@ public:
|
||||
if (RangeLinks[i].first == RangeLinks[i].second) {
|
||||
if (*RangeLinks[i].first == CheckingVal)
|
||||
return true;
|
||||
} else if (*RangeLinks[i].first >= CheckingVal &&
|
||||
*RangeLinks[i].second <= CheckingVal)
|
||||
} else if (*RangeLinks[i].first <= CheckingVal &&
|
||||
*RangeLinks[i].second >= CheckingVal)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -357,7 +378,7 @@ public:
|
||||
for (unsigned i = 0, e = getNumItems(); i != e; ++i) {
|
||||
const APInt &Low = getItem(i).getLow();
|
||||
const APInt &High = getItem(i).getHigh();
|
||||
const APInt &S = High - Low;
|
||||
APInt S = High - Low + 1;
|
||||
sz += S;
|
||||
}
|
||||
return sz.getZExtValue();
|
||||
@ -372,12 +393,12 @@ public:
|
||||
for (unsigned i = 0, e = getNumItems(); i != e; ++i) {
|
||||
const APInt &Low = getItem(i).getLow();
|
||||
const APInt &High = getItem(i).getHigh();
|
||||
const APInt& S = High - Low;
|
||||
APInt S = High - Low + 1;
|
||||
APInt oldSz = sz;
|
||||
sz += S;
|
||||
if (oldSz.uge(i) && sz.ult(i)) {
|
||||
if (sz.ugt(idx)) {
|
||||
APInt Res = Low;
|
||||
APInt Offset(oldSz.getBitWidth(), i);
|
||||
APInt Offset(oldSz.getBitWidth(), idx);
|
||||
Offset -= oldSz;
|
||||
Res += Offset;
|
||||
return Res;
|
||||
|
@ -1,4 +1,4 @@
|
||||
//===- CRSBuilder.h - ConstantRangesSet Builder -----------------*- C++ -*-===//
|
||||
//===- IntegersSubsetMapping.h - Mapping subset ==> Successor ---*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
@ -8,11 +8,12 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
/// @file
|
||||
/// CRSBuilder allows to build and parse ConstantRangesSet objects.
|
||||
/// There is such features like add/remove range, or combine
|
||||
/// Two ConstantRangesSet object with neighboring ranges merging.
|
||||
/// Set IsReadonly=true if you want to operate with "const ConstantInt" and
|
||||
/// "const ConstantRangesSet" objects.
|
||||
/// IntegersSubsetMapping is mapping from A to B, where
|
||||
/// Items in A is subsets of integers,
|
||||
/// Items in B some pointers (Successors).
|
||||
/// If user which to add another subset for successor that is already
|
||||
/// exists in mapping, IntegersSubsetMapping merges existing subset with
|
||||
/// added one.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
@ -55,6 +56,7 @@ protected:
|
||||
typedef std::list<RangeTy> RangesCollection;
|
||||
typedef typename RangesCollection::iterator RangesCollectionIt;
|
||||
|
||||
// TODO: Change unclean CRS prefixes to SubsetMap for example.
|
||||
typedef std::map<SuccessorClass*, RangesCollection > CRSMap;
|
||||
typedef typename CRSMap::iterator CRSMapIt;
|
||||
|
||||
@ -112,7 +114,7 @@ public:
|
||||
sort();
|
||||
for (CaseItemIt i = Items.begin(), j = i+1, e = Items.end();
|
||||
j != e; i = j++) {
|
||||
if (isIntersected(j, i) && j->second != i->second) {
|
||||
if (isIntersected(i, j) && i->second != j->second) {
|
||||
errItem = j;
|
||||
return false;
|
||||
}
|
||||
@ -173,7 +175,7 @@ public:
|
||||
}
|
||||
|
||||
/// Adds all ranges and values from given ranges set to the current
|
||||
/// CRSBuilder object.
|
||||
/// mapping.
|
||||
void add(const IntegersSubset &CRS, SuccessorClass *S = 0) {
|
||||
for (unsigned i = 0, e = CRS.getNumItems(); i < e; ++i) {
|
||||
RangeTy R = CRS.getItem(i);
|
||||
|
Reference in New Issue
Block a user