Complete affine expr parsing support

- check for non-affine expressions
- handle negative numbers and negation of id's, expressions
- functions to check if a map is pure affine or semi-affine
- simplify/clean up affine map parsing code
- report more errors messages, more accurate error messages

PiperOrigin-RevId: 203773633
diff --git a/lib/IR/AffineMap.cpp b/lib/IR/AffineMap.cpp
index cba3094..ccfd108 100644
--- a/lib/IR/AffineMap.cpp
+++ b/lib/IR/AffineMap.cpp
@@ -16,6 +16,7 @@
 // =============================================================================
 
 #include "mlir/IR/AffineMap.h"
+#include "mlir/IR/AffineExpr.h"
 #include "llvm/ADT/StringRef.h"
 
 using namespace mlir;
@@ -24,3 +25,15 @@
                      AffineExpr *const *results)
     : numDims(numDims), numSymbols(numSymbols), numResults(numResults),
       results(results) {}
+
+AffineExpr *AffineAddExpr::simplify(AffineExpr *lhs, AffineExpr *rhs,
+                                    MLIRContext *context) {
+  AffineConstantExpr *l, *r;
+  if ((l = dyn_cast<AffineConstantExpr>(lhs)) &&
+      (r = dyn_cast<AffineConstantExpr>(rhs)))
+    return AffineConstantExpr::get(l->getValue() + r->getValue(), context);
+  return nullptr;
+  // TODO(someone): implement more simplification.
+}
+
+// TODO(bondhugula): implement simplify for remaining affine binary op expr's