Finish parser/printer support for AffineMapOp, implement operand iterators on
VariadicOperands, tidy up some code in the asmprinter, fill out more
verification logic in for LoadOp.

PiperOrigin-RevId: 206443020
diff --git a/lib/IR/AsmPrinter.cpp b/lib/IR/AsmPrinter.cpp
index 28149fc..a3ea465 100644
--- a/lib/IR/AsmPrinter.cpp
+++ b/lib/IR/AsmPrinter.cpp
@@ -93,29 +93,25 @@
 
 // TODO Support visiting other types/instructions when implemented.
 void ModuleState::visitType(const Type *type) {
-  if (type->getKind() == Type::Kind::Function) {
+  if (auto *funcType = dyn_cast<FunctionType>(type)) {
     // Visit input and result types for functions.
-    auto *funcType = cast<FunctionType>(type);
-    for (auto *input : funcType->getInputs()) {
+    for (auto *input : funcType->getInputs())
       visitType(input);
-    }
-    for (auto *result : funcType->getResults()) {
+    for (auto *result : funcType->getResults())
       visitType(result);
-    }
-  } else if (type->getKind() == Type::Kind::MemRef) {
+  } else if (auto *memref = dyn_cast<MemRefType>(type)) {
     // Visit affine maps in memref type.
-    auto *memref = cast<MemRefType>(type);
-    for (AffineMap *map : memref->getAffineMaps()) {
+    for (auto *map : memref->getAffineMaps()) {
       recordAffineMapReference(map);
     }
   }
 }
 
 void ModuleState::visitAttribute(const Attribute *attr) {
-  if (isa<AffineMapAttr>(attr)) {
-    recordAffineMapReference(cast<AffineMapAttr>(attr)->getValue());
-  } else if (isa<ArrayAttr>(attr)) {
-    for (auto elt : cast<ArrayAttr>(attr)->getValue()) {
+  if (auto *mapAttr = dyn_cast<AffineMapAttr>(attr)) {
+    recordAffineMapReference(mapAttr->getValue());
+  } else if (auto *array = dyn_cast<ArrayAttr>(attr)) {
+    for (auto elt : array->getValue()) {
       visitAttribute(elt);
     }
   }
@@ -535,7 +531,7 @@
     ModulePrinter::printAttribute(attr);
   }
   void printAffineMap(const AffineMap *map) {
-    return ModulePrinter::printAffineMap(map);
+    return ModulePrinter::printAffineMapReference(map);
   }
   void printAffineExpr(const AffineExpr *expr) {
     return ModulePrinter::printAffineExpr(expr);