Introduce hyper-rectangular sets for analysis.

- introduce hyper-rectangular set representation and API sketch for
  analysis/code generation
- implement the 'intersect' and 'project out' operations.

The represention is lighter weight, and operations and other queries on it are
much faster on such domains when compared to general polyhedral domains.

PiperOrigin-RevId: 210245882
diff --git a/lib/Analysis/AffineStructures.cpp b/lib/Analysis/AffineStructures.cpp
index 295c76a..782257e 100644
--- a/lib/Analysis/AffineStructures.cpp
+++ b/lib/Analysis/AffineStructures.cpp
@@ -40,13 +40,17 @@
   // TODO(bondhugula)
 }
 
+// Universal set.
+MutableIntegerSet::MutableIntegerSet(unsigned numDims, unsigned numSymbols)
+    : numDims(numDims), numSymbols(numSymbols) {}
+
 AffineValueMap::AffineValueMap(const AffineApplyOp &op)
     : map(op.getAffineMap()) {
   // TODO: pull operands and results in.
 }
 
 bool AffineValueMap::isMultipleOf(unsigned idx, int64_t factor) const {
-  /* Check if the (first result expr) % factor becomes 0. */
+  // Check if the (first result expr) % factor becomes 0.
   if (auto *expr = dyn_cast<AffineConstantExpr>(AffineBinaryOpExpr::get(
           AffineExpr::Kind::Mod, map.getResult(idx),
           AffineConstantExpr::get(factor, context), context)))
@@ -54,6 +58,7 @@
 
   // TODO(bondhugula): use FlatAffineConstraints to complete this.
   assert(0 && "isMultipleOf implementation incomplete");
+  return false;
 }
 
 AffineValueMap::~AffineValueMap() {}