#define LLVM_SUPPORT_CONSTANT_RANGE_H
#include "llvm/ADT/APInt.h"
-#include "llvm/Support/DataTypes.h"
+#include "llvm/System/DataTypes.h"
namespace llvm {
/// makeICmpRegion - Produce the smallest range that contains all values that
/// might satisfy the comparison specified by Pred when compared to any value
/// contained within Other.
+ ///
+ /// Solves for range X in 'for all x in X, there exists a y in Y such that
+ /// icmp op x, y is true'. Every value that might make the comparison true
+ /// is included in the resulting range.
static ConstantRange makeICmpRegion(unsigned Pred,
const ConstantRange &Other);
ConstantRange subtract(const APInt &CI) const;
/// intersectWith - Return the range that results from the intersection of
- /// this range with another range. The resultant range is pruned as much as
- /// possible, but there may be cases where elements are included that are in
- /// one of the sets but not the other. For example: [100, 8) intersect [3,
- /// 120) yields [3, 120)
- ///
- ConstantRange intersectWith(const ConstantRange &CR) const;
-
- /// maximalIntersectWith - Return the range that results from the intersection
- /// of this range with another range. The resultant range is guaranteed to
+ /// this range with another range. The resultant range is guaranteed to
/// include all elements contained in both input ranges, and to have the
/// smallest possible set size that does so. Because there may be two
- /// intersections with the same set size, A.maximalIntersectWith(B) might not
- /// be equal to B.maximalIntersectWith(A).
+ /// intersections with the same set size, A.intersectWith(B) might not
+ /// be equal to B.intersectWith(A).
///
- ConstantRange maximalIntersectWith(const ConstantRange &CR) const;
+ ConstantRange intersectWith(const ConstantRange &CR) const;
/// unionWith - Return the range that results from the union of this range
/// with another range. The resultant range is guaranteed to include the
/// truncated to the specified type.
ConstantRange truncate(uint32_t BitWidth) const;
+ /// zextOrTrunc - make this range have the bit width given by \p BitWidth. The
+ /// value is zero extended, truncated, or left alone to make it that width.
+ ConstantRange zextOrTrunc(uint32_t BitWidth) const;
+
+ /// sextOrTrunc - make this range have the bit width given by \p BitWidth. The
+ /// value is sign extended, truncated, or left alone to make it that width.
+ ConstantRange sextOrTrunc(uint32_t BitWidth) const;
+
/// add - Return a new range representing the possible values resulting
/// from an addition of a value in this range and a value in Other.
ConstantRange add(const ConstantRange &Other) const;
/// TODO: This isn't fully implemented yet.
ConstantRange udiv(const ConstantRange &Other) const;
+ /// shl - Return a new range representing the possible values resulting
+ /// from a left shift of a value in this range by the Amount value.
+ ConstantRange shl(const ConstantRange &Amount) const;
+
+ /// ashr - Return a new range representing the possible values resulting from
+ /// an arithmetic right shift of a value in this range by the Amount value.
+ ConstantRange ashr(const ConstantRange &Amount) const;
+
+ /// shr - Return a new range representing the possible values resulting
+ /// from a logical right shift of a value in this range by the Amount value.
+ ConstantRange lshr(const ConstantRange &Amount) const;
+
/// print - Print out the bounds to a stream...
///
void print(raw_ostream &OS) const;
return OS;
}
-std::ostream &operator<<(std::ostream &OS, const ConstantRange &CR);
-
} // End llvm namespace
#endif