RangeSet AddGT(BasicValueFactory &BV, Factory &F, const llvm::APSInt &V) { PrimRangeSet newRanges = F.GetEmptySet(); for (PrimRangeSet::iterator i = begin(), e = end(); i != e; ++i) { if (i->Includes(V) && i->To() > V) newRanges = F.Add(newRanges, Range(BV.Add1(V), i->To())); else if (i->From() > V) newRanges = F.Add(newRanges, *i); } return newRanges; }
RangeSet AddGE(BasicValueFactory &BV, Factory &F, const llvm::APSInt &V) { PrimRangeSet newRanges = F.GetEmptySet(); for (PrimRangeSet::iterator i = begin(), e = end(); i != e; ++i) { // Strictly we should test for includes *V - 1, but no harm is // done by this formulation if (i->Includes(V)) newRanges = F.Add(newRanges, Range(V, i->To())); else if (i->From() >= V) newRanges = F.Add(newRanges, *i); } return newRanges; }
void RangeSet::IntersectInRange(BasicValueFactory &BV, Factory &F, const llvm::APSInt &Lower, const llvm::APSInt &Upper, PrimRangeSet &newRanges, PrimRangeSet::iterator &i, PrimRangeSet::iterator &e) const { // There are six cases for each range R in the set: // 1. R is entirely before the intersection range. // 2. R is entirely after the intersection range. // 3. R contains the entire intersection range. // 4. R starts before the intersection range and ends in the middle. // 5. R starts in the middle of the intersection range and ends after it. // 6. R is entirely contained in the intersection range. // These correspond to each of the conditions below. for (/* i = begin(), e = end() */; i != e; ++i) { if (i->To() < Lower) { continue; } if (i->From() > Upper) { break; } if (i->Includes(Lower)) { if (i->Includes(Upper)) { newRanges = F.add(newRanges, Range(BV.getValue(Lower), BV.getValue(Upper))); break; } else newRanges = F.add(newRanges, Range(BV.getValue(Lower), i->To())); } else { if (i->Includes(Upper)) { newRanges = F.add(newRanges, Range(i->From(), BV.getValue(Upper))); break; } else newRanges = F.add(newRanges, *i); } } }