/// AddNE - Create a new RangeSet with the additional constraint that the
  ///  value be less than V.
  RangeSet AddLT(BasicValueFactory &BV, Factory &F, const llvm::APSInt &V) {
    PrimRangeSet newRanges = F.GetEmptySet();

    for (iterator i = begin(), e = end() ; i != e ; ++i) {
      if (i->Includes(V) && i->From() < V)
        newRanges = F.Add(newRanges, Range(i->From(), BV.Sub1(V)));
      else if (i->To() < V)
        newRanges = F.Add(newRanges, *i);
    }
    
    return newRanges;
  }
 /// AddNE - Create a new RangeSet with the additional constraint that the
 ///  value be not be equal to V.
 RangeSet AddNE(BasicValueFactory &BV, Factory &F, const llvm::APSInt &V) {
   PrimRangeSet newRanges = ranges;
   
   // FIXME: We can perhaps enhance ImmutableSet to do this search for us
   // in log(N) time using the sorted property of the internal AVL tree.
   for (iterator i = begin(), e = end(); i != e; ++i) {
     if (i->Includes(V)) {
       // Remove the old range.
       newRanges = F.Remove(newRanges, *i);
       // Split the old range into possibly one or two ranges.
       if (V != i->From())
         newRanges = F.Add(newRanges, Range(i->From(), BV.Sub1(V)));
       if (V != i->To())
         newRanges = F.Add(newRanges, Range(BV.Add1(V), i->To()));
       // All of the ranges are non-overlapping, so we can stop.        
       break;
     }
   }
   
   return newRanges;
 }