[Cleanup] Replace llvm::zip with llvm::zip_equal. (#11579)

diff --git a/compiler/src/iree/compiler/Bindings/Native/Transforms/WrapEntryPoints.cpp b/compiler/src/iree/compiler/Bindings/Native/Transforms/WrapEntryPoints.cpp
index 1a01ba7..74cc902 100644
--- a/compiler/src/iree/compiler/Bindings/Native/Transforms/WrapEntryPoints.cpp
+++ b/compiler/src/iree/compiler/Bindings/Native/Transforms/WrapEntryPoints.cpp
@@ -130,7 +130,7 @@
         auto barrierOp = entryBuilder.create<IREE::HAL::TensorBarrierOp>(
             importOp.getLoc(), tensorArgs, waitFence);
         for (auto [argIndex, readyArg] :
-             llvm::zip(tensorArgIndices, barrierOp.getResults())) {
+             llvm::zip_equal(tensorArgIndices, barrierOp.getResults())) {
           entryArgs[argIndex] = readyArg;
         }
       }
diff --git a/compiler/src/iree/compiler/Bindings/TFLite/Transforms/WrapEntryPoints.cpp b/compiler/src/iree/compiler/Bindings/TFLite/Transforms/WrapEntryPoints.cpp
index 61f5bd1..4c4af1d 100644
--- a/compiler/src/iree/compiler/Bindings/TFLite/Transforms/WrapEntryPoints.cpp
+++ b/compiler/src/iree/compiler/Bindings/TFLite/Transforms/WrapEntryPoints.cpp
@@ -159,8 +159,8 @@
     }
 
     SmallVector<DynamicDims> inputDynamicDims;
-    for (auto input :
-         llvm::zip(funcOp.getArguments(), inputNames, funcType.getInputs())) {
+    for (auto input : llvm::zip_equal(funcOp.getArguments(), inputNames,
+                                      funcType.getInputs())) {
       auto argLoc = std::get<0>(input).getLoc();
       auto name = (namePrefix + "_" + std::get<1>(input) + "_shape").str();
       auto type = std::get<2>(input);
@@ -170,7 +170,7 @@
           createDynamicDimGlobals(argLoc, name, tensorType, moduleBuilder));
     }
     SmallVector<DynamicDims> outputDynamicDims;
-    for (auto output : llvm::zip(outputNames, funcType.getResults())) {
+    for (auto output : llvm::zip_equal(outputNames, funcType.getResults())) {
       auto name = (namePrefix + "_" + std::get<0>(output) + "_shape").str();
       auto type = std::get<1>(output);
       auto tensorType = type.dyn_cast<TensorType>();
@@ -220,7 +220,7 @@
         recalculateBuilder.getFunctionType(/*inputs=*/TypeRange{},
                                            /*outputs=*/TypeRange{}));
     for (auto inputValueDims :
-         llvm::zip(entryBlock.getArguments(), inputDynamicDims)) {
+         llvm::zip_equal(entryBlock.getArguments(), inputDynamicDims)) {
       auto inputValue = std::get<0>(inputValueDims);
       auto inputDynamicDims = std::get<1>(inputValueDims);
       auto inputPlaceholder =
@@ -248,7 +248,7 @@
       // We do this per exit-site so that if the function has multiple code
       // paths that may return different shape sizes we capture them all.
       for (auto outputValueDims :
-           llvm::zip(returnOp.getOperands(), outputDynamicDims)) {
+           llvm::zip_equal(returnOp.getOperands(), outputDynamicDims)) {
         auto outputValue = std::get<0>(outputValueDims);
         auto outputDynamicDims = std::get<1>(outputValueDims);
         SmallVector<Value> dynamicDims;
@@ -515,7 +515,8 @@
     auto *entryBlock = wrapperFuncOp.addEntryBlock();
     auto entryBuilder = OpBuilder::atBlockBegin(entryBlock);
     SmallVector<Value> callOperands;
-    for (auto input : llvm::zip(entryBlock->getArguments(), inputDynamicDims)) {
+    for (auto input :
+         llvm::zip_equal(entryBlock->getArguments(), inputDynamicDims)) {
       auto arg = std::get<0>(input);
       auto inputDynamicDims = std::get<1>(input);
       SmallVector<Value> dynamicDims;
@@ -531,7 +532,8 @@
     auto callOp = entryBuilder.create<mlir::func::CallOp>(
         entryFuncOp.getLoc(), entryFuncOp, callOperands);
     SmallVector<Value> callResults;
-    for (auto output : llvm::zip(callOp.getResults(), outputDynamicDims)) {
+    for (auto output :
+         llvm::zip_equal(callOp.getResults(), outputDynamicDims)) {
       auto result = std::get<0>(output);
       auto outputDynamicDims = std::get<1>(output);
       SmallVector<Value> dynamicDims;
@@ -544,7 +546,8 @@
       callResults.push_back(entryBuilder.create<IREE::HAL::TensorExportOp>(
           result.getLoc(), bufferType, result, outputDynamicDims.tensorType,
           dynamicDims, /*target_storage=*/nullptr));
-      for (auto it : llvm::zip(dynamicDims, outputDynamicDims.globalOps)) {
+      for (auto it :
+           llvm::zip_equal(dynamicDims, outputDynamicDims.globalOps)) {
         auto dynamicDim = std::get<0>(it);
         auto globalOp = std::get<1>(it);
         entryBuilder.create<IREE::Util::GlobalStoreOp>(
diff --git a/compiler/src/iree/compiler/Dialect/Flow/Conversion/TensorToFlow/Patterns.cpp b/compiler/src/iree/compiler/Dialect/Flow/Conversion/TensorToFlow/Patterns.cpp
index f956568..ca705c1 100644
--- a/compiler/src/iree/compiler/Dialect/Flow/Conversion/TensorToFlow/Patterns.cpp
+++ b/compiler/src/iree/compiler/Dialect/Flow/Conversion/TensorToFlow/Patterns.cpp
@@ -170,8 +170,8 @@
       return failure();
     }
     SmallVector<Value> outputDynamicShapes;
-    for (auto shape :
-         llvm::zip(reshapeOp.getResultType().getShape(), outputShape[0])) {
+    for (auto shape : llvm::zip_equal(reshapeOp.getResultType().getShape(),
+                                      outputShape[0])) {
       if (std::get<0>(shape) != ShapedType::kDynamic) continue;
       outputDynamicShapes.push_back(std::get<1>(shape));
     }
diff --git a/compiler/src/iree/compiler/Dialect/Flow/IR/FlowOps.cpp b/compiler/src/iree/compiler/Dialect/Flow/IR/FlowOps.cpp
index 80772f0..b948164 100644
--- a/compiler/src/iree/compiler/Dialect/Flow/IR/FlowOps.cpp
+++ b/compiler/src/iree/compiler/Dialect/Flow/IR/FlowOps.cpp
@@ -47,7 +47,7 @@
 static void createArgs(ArrayRef<OpAsmParser::UnresolvedOperand> operands,
                        ArrayRef<Type> types,
                        SmallVector<OpAsmParser::Argument> &args) {
-  for (auto argAndType : llvm::zip(operands, types)) {
+  for (auto argAndType : llvm::zip_equal(operands, types)) {
     auto &arg = args.emplace_back();
     arg.ssaName = std::get<0>(argAndType);
     arg.type = std::get<1>(argAndType);
@@ -68,8 +68,8 @@
              << workgroupCount.getNumArguments()
              << " arguments but dispatch provides " << workload.size();
     }
-    for (auto it : llvm::enumerate(llvm::zip(workgroupCount.getArgumentTypes(),
-                                             workload.getTypes()))) {
+    for (auto it : llvm::enumerate(llvm::zip_equal(
+             workgroupCount.getArgumentTypes(), workload.getTypes()))) {
       auto expectedType = std::get<0>(it.value());
       auto actualType = std::get<1>(it.value());
       if (expectedType != actualType) {
@@ -164,7 +164,7 @@
                              ShapedType::kDynamic);
   auto targetType = dispatchType;
   if (staticSizes != targetType.getShape() ||
-      llvm::any_of(llvm::zip(dynamicSizes, dispatchTypeDims),
+      llvm::any_of(llvm::zip_equal(dynamicSizes, dispatchTypeDims),
                    [](std::tuple<Value, Value> en) {
                      return std::get<0>(en) != std::get<1>(en);
                    })) {
@@ -211,7 +211,7 @@
 
   // Verify the return types match.
   for (auto returnOp : body.getOps<IREE::Flow::ReturnOp>()) {
-    for (auto it : llvm::zip(returnTypes, returnOp.getOperandTypes())) {
+    for (auto it : llvm::zip_equal(returnTypes, returnOp.getOperandTypes())) {
       if (std::get<0>(it) != std::get<1>(it)) {
         return returnOp.emitOpError()
                << "operands do not match expected region return types";
@@ -288,7 +288,8 @@
   // Verify terminator.
   auto term = dyn_cast<Flow::ReturnOp>(getBody().front().getTerminator());
   if (!term) return emitOpError() << "expected 'flow.return' terminator";
-  for (const auto &it : llvm::zip(getResultTypes(), term->getOperandTypes()))
+  for (const auto &it :
+       llvm::zip_equal(getResultTypes(), term->getOperandTypes()))
     if (std::get<0>(it) != std::get<1>(it))
       return term->emitOpError()
              << "operand types do not match with parent results";
@@ -860,7 +861,8 @@
            << "workload operands and workgroup count args mismatch ("
            << workload.size() << " vs " << region.getNumArguments() << ")";
   }
-  for (auto it : llvm::enumerate(llvm::zip(workload, region.getArguments()))) {
+  for (auto it :
+       llvm::enumerate(llvm::zip_equal(workload, region.getArguments()))) {
     auto workloadValue = std::get<0>(it.value());
     auto capturedArg = std::get<1>(it.value());
     if (workloadValue.getType() != capturedArg.getType()) {
diff --git a/compiler/src/iree/compiler/Dialect/Flow/Transforms/ConvertLinalgTensorOps.cpp b/compiler/src/iree/compiler/Dialect/Flow/Transforms/ConvertLinalgTensorOps.cpp
index b37fbc8..a684176 100644
--- a/compiler/src/iree/compiler/Dialect/Flow/Transforms/ConvertLinalgTensorOps.cpp
+++ b/compiler/src/iree/compiler/Dialect/Flow/Transforms/ConvertLinalgTensorOps.cpp
@@ -49,8 +49,8 @@
       return failure();
     }
     SmallVector<Value> outputDynamicShapes;
-    for (auto shape :
-         llvm::zip(reshapeOp.getResultType().getShape(), outputShape[0])) {
+    for (auto shape : llvm::zip_equal(reshapeOp.getResultType().getShape(),
+                                      outputShape[0])) {
       if (std::get<0>(shape) != ShapedType::kDynamic) continue;
       outputDynamicShapes.push_back(std::get<1>(shape));
     }
diff --git a/compiler/src/iree/compiler/Dialect/Flow/Transforms/DeduplicateExecutables.cpp b/compiler/src/iree/compiler/Dialect/Flow/Transforms/DeduplicateExecutables.cpp
index bf0ce6e..5ec9d45 100644
--- a/compiler/src/iree/compiler/Dialect/Flow/Transforms/DeduplicateExecutables.cpp
+++ b/compiler/src/iree/compiler/Dialect/Flow/Transforms/DeduplicateExecutables.cpp
@@ -77,8 +77,8 @@
             if (lhsBlock.getNumArguments() != rhsBlock.getNumArguments()) {
               return false;
             }
-            for (auto argPair :
-                 llvm::zip(lhsBlock.getArguments(), rhsBlock.getArguments())) {
+            for (auto argPair : llvm::zip_equal(lhsBlock.getArguments(),
+                                                rhsBlock.getArguments())) {
               auto &lhsArg = std::get<0>(argPair);
               auto &rhsArg = std::get<1>(argPair);
               if (lhsArg.getType() != rhsArg.getType()) return false;
@@ -103,11 +103,14 @@
     llvm::ReversePostOrderTraversal<Block *> traversal(&b);
     rhsBlocks.insert(traversal.begin(), traversal.end());
   }
-  for (auto blockPair : llvm::zip(lhsBlocks, rhsBlocks)) {
+  if (lhsBlocks.size() != rhsBlocks.size()) return false;
+  for (auto blockPair : llvm::zip_equal(lhsBlocks, rhsBlocks)) {
     auto &lhsBlock = std::get<0>(blockPair);
     auto &rhsBlock = std::get<1>(blockPair);
-    for (auto opPair :
-         llvm::zip(lhsBlock->getOperations(), rhsBlock->getOperations())) {
+    auto &lhsOperations = lhsBlock->getOperations();
+    auto &rhsOperations = rhsBlock->getOperations();
+    if (lhsOperations.size() != rhsOperations.size()) return false;
+    for (auto opPair : llvm::zip_equal(lhsOperations, rhsOperations)) {
       auto &lhsOp = std::get<0>(opPair);
       auto &rhsOp = std::get<1>(opPair);
       if (!isStructurallyEquivalentTo(lhsOp, rhsOp, mapping)) {
@@ -145,7 +148,7 @@
   // If the op references blocks (such as a branch) then we expect to have them
   // in the mapping already from the parent region to do the lhs->rhs mapping.
   for (auto successorPair :
-       llvm::zip(lhs.getSuccessors(), rhs.getSuccessors())) {
+       llvm::zip_equal(lhs.getSuccessors(), rhs.getSuccessors())) {
     auto *lhsSuccessor = std::get<0>(successorPair);
     auto *rhsSuccessor = std::get<1>(successorPair);
     if (rhsSuccessor != parentMapping.lookup(lhsSuccessor)) return false;
@@ -155,7 +158,7 @@
   // For many ops if the result types don't match it's a good (cheap) indicator
   // that the operands won't match either so this still allows a somewhat-early
   // exit prior to the full traversal.
-  for (auto resultPair : llvm::zip(lhs.getResults(), rhs.getResults())) {
+  for (auto resultPair : llvm::zip_equal(lhs.getResults(), rhs.getResults())) {
     auto &lhsValue = std::get<0>(resultPair);
     auto &rhsValue = std::get<1>(resultPair);
     if (lhsValue.getType() != rhsValue.getType()) return false;
@@ -164,7 +167,8 @@
 
   // Check operands using the lhs->rhs mapping; since this op is only consuming
   // these values they should already be defined in the mapping.
-  for (auto operandPair : llvm::zip(lhs.getOperands(), rhs.getOperands())) {
+  for (auto operandPair :
+       llvm::zip_equal(lhs.getOperands(), rhs.getOperands())) {
     auto &lhsValue = std::get<0>(operandPair);
     auto &rhsValue = std::get<1>(operandPair);
     if (lhsValue.getType() != rhsValue.getType()) return false;
@@ -172,7 +176,7 @@
   }
 
   // Recurse into regions.
-  for (auto regionPair : llvm::zip(lhs.getRegions(), rhs.getRegions())) {
+  for (auto regionPair : llvm::zip_equal(lhs.getRegions(), rhs.getRegions())) {
     auto &lhsRegion = std::get<0>(regionPair);
     auto &rhsRegion = std::get<1>(regionPair);
 
@@ -238,7 +242,7 @@
         duplicateExecutableOps.push_back(duplicateExecutableOp);
 
         // Record entry point reference replacements.
-        for (auto exportOpPair : llvm::zip(
+        for (auto exportOpPair : llvm::zip_equal(
                  duplicateExecutableOp.getBlock().getOps<ExecutableExportOp>(),
                  referenceExecutableOp.getBlock()
                      .getOps<ExecutableExportOp>())) {
diff --git a/compiler/src/iree/compiler/Dialect/Flow/Transforms/ExpandTensorShapes.cpp b/compiler/src/iree/compiler/Dialect/Flow/Transforms/ExpandTensorShapes.cpp
index 3f4110b..6bc35c9 100644
--- a/compiler/src/iree/compiler/Dialect/Flow/Transforms/ExpandTensorShapes.cpp
+++ b/compiler/src/iree/compiler/Dialect/Flow/Transforms/ExpandTensorShapes.cpp
@@ -298,8 +298,8 @@
   auto &expandedGlobal = globalMap[op.getGlobal()];
   builder.create<IREE::Util::GlobalStoreOp>(op.getLoc(), expandedValue.tensor,
                                             expandedGlobal.tensorOp.getName());
-  for (auto it :
-       llvm::zip(expandedValue.dynamicDims, expandedGlobal.dynamicDimOps)) {
+  for (auto it : llvm::zip_equal(expandedValue.dynamicDims,
+                                 expandedGlobal.dynamicDimOps)) {
     builder.create<IREE::Util::GlobalStoreOp>(op.getLoc(), std::get<0>(it),
                                               std::get<1>(it).getName());
   }
@@ -458,7 +458,8 @@
       op.getLoc(), op.getCondition(), op.getTrueValue(), op.getFalseValue());
 
   SmallVector<Value> selectedDims;
-  for (auto it : llvm::zip(trueValue.dynamicDims, falseValue.dynamicDims)) {
+  for (auto it :
+       llvm::zip_equal(trueValue.dynamicDims, falseValue.dynamicDims)) {
     selectedDims.push_back(
         builder
             .create<arith::SelectOp>(op.getLoc(), op.getCondition(),
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Conversion/ConversionTarget.cpp b/compiler/src/iree/compiler/Dialect/HAL/Conversion/ConversionTarget.cpp
index 13906b2..8850714 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Conversion/ConversionTarget.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Conversion/ConversionTarget.cpp
@@ -50,7 +50,7 @@
   OperationState state{srcOp->getLoc(), dstOpName};
   state.addAttributes(srcOp->getAttrs());
 
-  for (auto srcDstOperand : llvm::zip(srcOp->getOperands(), operands)) {
+  for (auto srcDstOperand : llvm::zip_equal(srcOp->getOperands(), operands)) {
     auto dstOperand = std::get<1>(srcDstOperand);
 
     // Check that any type that should have been mapped to buffer view was.
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Conversion/StreamToHAL/Patterns.cpp b/compiler/src/iree/compiler/Dialect/HAL/Conversion/StreamToHAL/Patterns.cpp
index 7891fe2..8a04ad4 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Conversion/StreamToHAL/Patterns.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Conversion/StreamToHAL/Patterns.cpp
@@ -298,7 +298,8 @@
     auto bufferType = rewriter.getType<IREE::HAL::BufferType>();
 
     SmallVector<Value> results;
-    for (auto it : llvm::zip(allocOp.getResults(), allocOp.getStorageSizes())) {
+    for (auto it :
+         llvm::zip_equal(allocOp.getResults(), allocOp.getStorageSizes())) {
       auto resourceResult = std::get<0>(it);
       auto resourceType =
           resourceResult.getType().cast<IREE::Stream::ResourceType>();
diff --git a/compiler/src/iree/compiler/Dialect/HAL/IR/HALOpFolders.cpp b/compiler/src/iree/compiler/Dialect/HAL/IR/HALOpFolders.cpp
index e4941eb..c96cb75 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/IR/HALOpFolders.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/IR/HALOpFolders.cpp
@@ -691,8 +691,8 @@
     SmallVector<Type> resultTypes;
     SetVector<Attribute> resultKeys;
     int i = 0;
-    for (auto [resultKey, resultType] :
-         llvm::zip(blockOp.getKeys().getValue(), blockOp.getResultTypes())) {
+    for (auto [resultKey, resultType] : llvm::zip_equal(
+             blockOp.getKeys().getValue(), blockOp.getResultTypes())) {
       if (resultKeys.insert(resultKey)) {
         resultIndices.set(i);
         resultTypes.push_back(resultType);
diff --git a/compiler/src/iree/compiler/Dialect/HAL/IR/HALOps.cpp b/compiler/src/iree/compiler/Dialect/HAL/IR/HALOps.cpp
index b17a6b9..122cb56 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/IR/HALOps.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/IR/HALOps.cpp
@@ -95,22 +95,23 @@
                                        TypeRange bufferTypes,
                                        ValueRange bufferOffsets,
                                        ValueRange bufferLengths) {
-  llvm::interleaveComma(
-      llvm::zip(ordinals, buffers, bufferTypes, bufferOffsets, bufferLengths),
-      p, [&](std::tuple<Value, Value, Type, Value, Value> it) {
-        p.printNewline();
-        p << "  ";
-        p.printOperand(std::get<0>(it));
-        p << " = (";
-        p.printOperand(std::get<1>(it));
-        p << " : ";
-        p.printType(std::get<2>(it));
-        p << ")[";
-        p.printOperand(std::get<3>(it));
-        p << ", ";
-        p.printOperand(std::get<4>(it));
-        p << "]";
-      });
+  llvm::interleaveComma(llvm::zip_equal(ordinals, buffers, bufferTypes,
+                                        bufferOffsets, bufferLengths),
+                        p,
+                        [&](std::tuple<Value, Value, Type, Value, Value> it) {
+                          p.printNewline();
+                          p << "  ";
+                          p.printOperand(std::get<0>(it));
+                          p << " = (";
+                          p.printOperand(std::get<1>(it));
+                          p << " : ";
+                          p.printType(std::get<2>(it));
+                          p << ")[";
+                          p.printOperand(std::get<3>(it));
+                          p << ", ";
+                          p.printOperand(std::get<4>(it));
+                          p << "]";
+                        });
   p.printNewline();
 }
 
@@ -140,7 +141,7 @@
                               << expectedTypes.size() << ")";
     }
     for (auto pair :
-         llvm::enumerate(llvm::zip(op.getOperands(), expectedTypes))) {
+         llvm::enumerate(llvm::zip_equal(op.getOperands(), expectedTypes))) {
       auto operand = std::get<0>(pair.value());
       auto expectedType = std::get<1>(pair.value());
       if (operand.getType() != expectedType) {
@@ -582,7 +583,7 @@
   p << "\n";
   p.getStream().indent(4);
   interleave(
-      llvm::zip(getConditions(), getConditionRegions()),
+      llvm::zip_equal(getConditions(), getConditionRegions()),
       [&](std::tuple<Attribute, Region &> it) {
         auto &conditionAttr = std::get<0>(it);
         auto &conditionRegion = std::get<1>(it);
diff --git a/compiler/src/iree/compiler/Dialect/HAL/IR/HALTypes.cpp b/compiler/src/iree/compiler/Dialect/HAL/IR/HALTypes.cpp
index 3c20b2d..c66cdb1 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/IR/HALTypes.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/IR/HALTypes.cpp
@@ -549,7 +549,7 @@
 void ExecutableObjectsAttr::print(AsmPrinter &p) const {
   auto &os = p.getStream();
   os << "<{";
-  llvm::interleaveComma(llvm::zip(getTargets(), getTargetObjects()), os,
+  llvm::interleaveComma(llvm::zip_equal(getTargets(), getTargetObjects()), os,
                         [&](std::tuple<Attribute, Attribute> keyValue) {
                           p.printAttribute(std::get<0>(keyValue));
                           os << " = ";
@@ -562,7 +562,7 @@
     IREE::HAL::ExecutableTargetAttr specificTargetAttr) {
   SmallVector<Attribute> allObjectAttrs;
   for (auto [targetAttr, objectsAttr] :
-       llvm::zip(getTargets(), getTargetObjects())) {
+       llvm::zip_equal(getTargets(), getTargetObjects())) {
     auto genericTargetAttr = targetAttr.cast<IREE::HAL::ExecutableTargetAttr>();
     if (genericTargetAttr.isGenericOf(specificTargetAttr)) {
       auto objectsArrayAttr = objectsAttr.cast<ArrayAttr>();
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Target/CUDA/CUDATarget.cpp b/compiler/src/iree/compiler/Dialect/HAL/Target/CUDA/CUDATarget.cpp
index 3d9febf..b58e086 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Target/CUDA/CUDATarget.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Target/CUDA/CUDATarget.cpp
@@ -300,8 +300,8 @@
       }
 
       for (auto [exportOp, workgroupSize] :
-           llvm::zip(variantOp.getOps<IREE::HAL::ExecutableExportOp>(),
-                     workgroupSizes)) {
+           llvm::zip_equal(variantOp.getOps<IREE::HAL::ExecutableExportOp>(),
+                           workgroupSizes)) {
         auto *llvmFunc = llvmModule->getFunction(exportOp.getName());
         if (llvmFunc->isDeclaration()) continue;
 
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/DumpExecutableBenchmarks.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/DumpExecutableBenchmarks.cpp
index 58be32d..07de799 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/DumpExecutableBenchmarks.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/DumpExecutableBenchmarks.cpp
@@ -84,7 +84,8 @@
       }
 
       SmallVector<Binding> bindings;
-      for (auto it : llvm::zip(bindingAttrs, dispatchOp.getResourceLengths())) {
+      for (auto it :
+           llvm::zip_equal(bindingAttrs, dispatchOp.getResourceLengths())) {
         auto bindingAttr =
             std::get<0>(it).cast<IREE::HAL::InterfaceBindingAttr>();
         APInt resourceLength;
diff --git a/compiler/src/iree/compiler/Dialect/HAL/Transforms/InlineDeviceSwitches.cpp b/compiler/src/iree/compiler/Dialect/HAL/Transforms/InlineDeviceSwitches.cpp
index e7c433c..727a7cd 100644
--- a/compiler/src/iree/compiler/Dialect/HAL/Transforms/InlineDeviceSwitches.cpp
+++ b/compiler/src/iree/compiler/Dialect/HAL/Transforms/InlineDeviceSwitches.cpp
@@ -96,8 +96,8 @@
 
   funcBuilder.setInsertionPoint(beforeBlock, beforeBlock->end());
   for (auto condition :
-       llvm::enumerate(llvm::zip(switchOp.getConditions().getValue(),
-                                 switchOp.getConditionRegions()))) {
+       llvm::enumerate(llvm::zip_equal(switchOp.getConditions().getValue(),
+                                       switchOp.getConditionRegions()))) {
     auto conditionAttr =
         std::get<0>(condition.value()).cast<IREE::HAL::MatchAttrInterface>();
     auto &conditionRegion = std::get<1>(condition.value());
diff --git a/compiler/src/iree/compiler/Dialect/Stream/Conversion/FlowToStream/Patterns.cpp b/compiler/src/iree/compiler/Dialect/Stream/Conversion/FlowToStream/Patterns.cpp
index 3b51b03..b435f65 100644
--- a/compiler/src/iree/compiler/Dialect/Stream/Conversion/FlowToStream/Patterns.cpp
+++ b/compiler/src/iree/compiler/Dialect/Stream/Conversion/FlowToStream/Patterns.cpp
@@ -229,7 +229,7 @@
       IREE::Flow::TensorTraceOp op, OpAdaptor adaptor,
       ConversionPatternRewriter &rewriter) const override {
     SmallVector<Value> exportedTensors;
-    for (auto it : llvm::zip(op.getOperands(), adaptor.getOperands())) {
+    for (auto it : llvm::zip_equal(op.getOperands(), adaptor.getOperands())) {
       auto tensorOperand = std::get<0>(it);
       auto resourceOperand = std::get<1>(it);
       auto source =
@@ -273,7 +273,7 @@
     SmallVector<Value> dispatchOperandLengths;
     SmallVector<Value> operandSizes;
     for (auto oldNewOperand :
-         llvm::zip(op.getArguments(), adaptor.getArguments())) {
+         llvm::zip_equal(op.getArguments(), adaptor.getArguments())) {
       auto oldOperand = std::get<0>(oldNewOperand);
       auto newOperand = std::get<1>(oldNewOperand);
       if (oldOperand.getType().isa<ShapedType>()) {
diff --git a/compiler/src/iree/compiler/Dialect/Stream/IR/StreamOpFolders.cpp b/compiler/src/iree/compiler/Dialect/Stream/IR/StreamOpFolders.cpp
index 3528272..3b75830 100644
--- a/compiler/src/iree/compiler/Dialect/Stream/IR/StreamOpFolders.cpp
+++ b/compiler/src/iree/compiler/Dialect/Stream/IR/StreamOpFolders.cpp
@@ -638,7 +638,7 @@
 
     // See if the sorted order is different than how they are stored in the op.
     bool orderChanged = false;
-    for (auto it : llvm::zip(slices, op.getPackedOffsets())) {
+    for (auto it : llvm::zip_equal(slices, op.getPackedOffsets())) {
       if (std::get<0>(it).packedOffset != std::get<1>(it)) {
         orderChanged = true;
         break;
@@ -2650,8 +2650,9 @@
     SmallVector<std::pair<Value, unsigned>> replacements;
     SmallVector<Value> newOperands;
     SmallVector<Value> newOperandSizes;
-    for (auto it : llvm::zip(op.getResourceOperands(),
-                             op.getResourceOperandSizes(), op.getResults())) {
+    for (auto it :
+         llvm::zip_equal(op.getResourceOperands(), op.getResourceOperandSizes(),
+                         op.getResults())) {
       auto operand = std::get<0>(it);
       auto operandSize = std::get<1>(it);
       auto result = std::get<2>(it);
diff --git a/compiler/src/iree/compiler/Dialect/Stream/IR/StreamOps.cpp b/compiler/src/iree/compiler/Dialect/Stream/IR/StreamOps.cpp
index 728b912..49d718a 100644
--- a/compiler/src/iree/compiler/Dialect/Stream/IR/StreamOps.cpp
+++ b/compiler/src/iree/compiler/Dialect/Stream/IR/StreamOps.cpp
@@ -43,7 +43,7 @@
 static void createArgs(ArrayRef<OpAsmParser::UnresolvedOperand> operands,
                        ArrayRef<Type> types,
                        SmallVector<OpAsmParser::Argument> &args) {
-  for (auto argAndType : llvm::zip(operands, types)) {
+  for (auto argAndType : llvm::zip_equal(operands, types)) {
     auto &arg = args.emplace_back();
     arg.ssaName = std::get<0>(argAndType);
     arg.type = std::get<1>(argAndType);
@@ -64,8 +64,8 @@
              << workgroupCount.getNumArguments()
              << " arguments but dispatch provides " << workload.size();
     }
-    for (auto it : llvm::enumerate(llvm::zip(workgroupCount.getArgumentTypes(),
-                                             workload.getTypes()))) {
+    for (auto it : llvm::enumerate(llvm::zip_equal(
+             workgroupCount.getArgumentTypes(), workload.getTypes()))) {
       auto expectedType = std::get<0>(it.value());
       auto actualType = std::get<1>(it.value());
       if (expectedType != actualType) {
@@ -170,7 +170,7 @@
       return yieldOp.emitOpError()
              << "yield result count mismatch with parent op";
     }
-    for (auto it : llvm::zip(results, yieldOp.getResourceOperands())) {
+    for (auto it : llvm::zip_equal(results, yieldOp.getResourceOperands())) {
       auto outerValue = std::get<0>(it);
       auto innerValue = std::get<1>(it);
       if (outerValue.getType() != innerValue.getType()) {
@@ -179,7 +179,8 @@
                << " but got " << innerValue.getType();
       }
     }
-    for (auto it : llvm::zip(resultSizes, yieldOp.getResourceOperandSizes())) {
+    for (auto it :
+         llvm::zip_equal(resultSizes, yieldOp.getResourceOperandSizes())) {
       auto outerSize = std::get<0>(it);
       auto innerSize = std::get<1>(it);
       if (outerSize != innerSize) {
@@ -340,7 +341,7 @@
                                 Region &body) {
   p << "(";
   llvm::interleaveComma(
-      llvm::zip(operands, body.getArguments()), p, [&](auto it) {
+      llvm::zip_equal(operands, body.getArguments()), p, [&](auto it) {
         auto operand = std::get<0>(it);
         auto arg = std::get<1>(it);
         p << operand;
@@ -421,7 +422,7 @@
                                         ValueRange operandSizes, Region &body) {
   p << "(";
   llvm::interleaveComma(
-      llvm::zip(operands, body.getArguments()), p, [&](auto it) {
+      llvm::zip_equal(operands, body.getArguments()), p, [&](auto it) {
         auto operand = std::get<0>(it);
         auto arg = std::get<1>(it);
         p << operand;
@@ -573,7 +574,7 @@
 
   // Verify the return types match.
   for (auto returnOp : body.getOps<IREE::Stream::ReturnOp>()) {
-    for (auto it : llvm::zip(returnTypes, returnOp.getOperandTypes())) {
+    for (auto it : llvm::zip_equal(returnTypes, returnOp.getOperandTypes())) {
       if (std::get<0>(it) != std::get<1>(it)) {
         return returnOp.emitOpError()
                << "operands do not match expected region return types";
@@ -1692,8 +1693,8 @@
     }
   }
   for (auto [i, result, resultSize] :
-       llvm::zip(llvm::seq<unsigned>(0, getResults().size()), getResults(),
-                 getResultSizes())) {
+       llvm::zip_equal(llvm::seq<unsigned>(0, getResults().size()),
+                       getResults(), getResultSizes())) {
     if (getTiedResultOperandIndex(i).has_value()) {
       // Already covered above.
       continue;
@@ -1778,9 +1779,9 @@
 static void getExecutionAsyncAccessRanges(
     Op op, SmallVectorImpl<AsyncAccessRange> &ranges) {
   unsigned tiedOperandBase = op.getTiedOperandsIndexAndLength().first;
-  for (auto [i, operand, operandSize] :
-       llvm::zip(llvm::seq<unsigned>(0, op.getResourceOperands().size()),
-                 op.getResourceOperands(), op.getResourceOperandSizes())) {
+  for (auto [i, operand, operandSize] : llvm::zip_equal(
+           llvm::seq<unsigned>(0, op.getResourceOperands().size()),
+           op.getResourceOperands(), op.getResourceOperandSizes())) {
     if (!operand.getType().template isa<IREE::Stream::ResourceType>()) continue;
     ResourceAccessBitfield access = ResourceAccessBitfield::Read;
     auto tiedResults = op.getOperandTiedResults(tiedOperandBase + i);
@@ -1793,8 +1794,8 @@
     }
   }
   for (auto [i, result, resultSize] :
-       llvm::zip(llvm::seq<unsigned>(0, op.getResults().size()),
-                 op.getResults(), op.getResultSizes())) {
+       llvm::zip_equal(llvm::seq<unsigned>(0, op.getResults().size()),
+                       op.getResults(), op.getResultSizes())) {
     if (op.getTiedResultOperandIndex(i).has_value()) {
       // Already covered above.
       continue;
diff --git a/compiler/src/iree/compiler/Dialect/Stream/Transforms/ConvertToStream.cpp b/compiler/src/iree/compiler/Dialect/Stream/Transforms/ConvertToStream.cpp
index ca3b68d..d5f8737 100644
--- a/compiler/src/iree/compiler/Dialect/Stream/Transforms/ConvertToStream.cpp
+++ b/compiler/src/iree/compiler/Dialect/Stream/Transforms/ConvertToStream.cpp
@@ -142,7 +142,7 @@
     SmallVector<Value> newOperands;
     newOperands.reserve(op->getNumOperands());
     rewriter.setInsertionPoint(op);
-    for (auto it : llvm::zip(op->getOperands(), operands)) {
+    for (auto it : llvm::zip_equal(op->getOperands(), operands)) {
       auto oldOperand = std::get<0>(it);
       auto newOperand = std::get<1>(it);
       if (!newOperand.getType().isa<IREE::Stream::ResourceType>() &&
diff --git a/compiler/src/iree/compiler/Dialect/Stream/Transforms/FuseDispatchBindings.cpp b/compiler/src/iree/compiler/Dialect/Stream/Transforms/FuseDispatchBindings.cpp
index b62c107..7ece758 100644
--- a/compiler/src/iree/compiler/Dialect/Stream/Transforms/FuseDispatchBindings.cpp
+++ b/compiler/src/iree/compiler/Dialect/Stream/Transforms/FuseDispatchBindings.cpp
@@ -86,7 +86,7 @@
   for (auto dispatchOp : dispatchOps) {
     llvm::EquivalenceClasses<unsigned> ec;
     DenseMap<Value, unsigned> leaders;
-    for (auto it : llvm::enumerate(llvm::zip(
+    for (auto it : llvm::enumerate(llvm::zip_equal(
              dispatchOp.getResources(), dispatchOp.getResourceAccesses()))) {
       auto resource = std::get<0>(it.value());
 
diff --git a/compiler/src/iree/compiler/Dialect/Stream/Transforms/PackAllocations.cpp b/compiler/src/iree/compiler/Dialect/Stream/Transforms/PackAllocations.cpp
index 28f0bfe..82c7293 100644
--- a/compiler/src/iree/compiler/Dialect/Stream/Transforms/PackAllocations.cpp
+++ b/compiler/src/iree/compiler/Dialect/Stream/Transforms/PackAllocations.cpp
@@ -92,8 +92,9 @@
       auto slabSize = packOp.getTotalLength();
 
       // Replace all resources with subviews into the new slab.
-      for (auto it : llvm::zip(allocOp.getResults(), packOp.getPackedOffsets(),
-                               allocOp.getStorageSizes())) {
+      for (auto it :
+           llvm::zip_equal(allocOp.getResults(), packOp.getPackedOffsets(),
+                           allocOp.getStorageSizes())) {
         auto originalValue = std::get<0>(it);
         auto subviewOffset = std::get<1>(it);
         auto subviewLength = std::get<2>(it);
diff --git a/compiler/src/iree/compiler/Dialect/Stream/Transforms/PackConstants.cpp b/compiler/src/iree/compiler/Dialect/Stream/Transforms/PackConstants.cpp
index 3ce2073..315590d 100644
--- a/compiler/src/iree/compiler/Dialect/Stream/Transforms/PackConstants.cpp
+++ b/compiler/src/iree/compiler/Dialect/Stream/Transforms/PackConstants.cpp
@@ -278,7 +278,7 @@
   SmallVector<Copy> copies;
   SmallVector<Value> capturedResources;
   SmallVector<Value> capturedResourceSizes;
-  for (auto it : llvm::zip(storageResources, storageBuffers)) {
+  for (auto it : llvm::zip_equal(storageResources, storageBuffers)) {
     auto &storageResource = std::get<0>(it);
     auto storageBuffer = std::get<1>(it);
 
@@ -366,7 +366,7 @@
   SmallVector<Type> resultTypes;
   Value ok;
   auto zero = indexSet.get(0);
-  for (auto it : llvm::zip(storageResources, storageBuffers)) {
+  for (auto it : llvm::zip_equal(storageResources, storageBuffers)) {
     auto &storageResource = std::get<0>(it);
     auto storageBuffer = std::get<1>(it);
     auto tryMapOp = builder.create<IREE::Stream::ResourceTryMapOp>(
@@ -415,7 +415,7 @@
   // Use the result of either the direct mapping or the staging upload.
   UploadResult uploadResult;
   uploadResult.timepoint = ifTimepoint;
-  for (auto it : llvm::zip(storageResources, ifResources)) {
+  for (auto it : llvm::zip_equal(storageResources, ifResources)) {
     auto &storageResource = std::get<0>(it);
     auto ifResource = std::get<1>(it);
     uploadResult.allocations.push_back({
@@ -434,8 +434,8 @@
   SmallVector<ConstantSlice> slices;
   slices.reserve(constantsOp.getResults().size());
   for (auto [result, resultSize, value] :
-       llvm::zip(constantsOp.getResults(), constantsOp.getResultSizes(),
-                 constantsOp.getValues())) {
+       llvm::zip_equal(constantsOp.getResults(), constantsOp.getResultSizes(),
+                       constantsOp.getValues())) {
     auto resourceType = result.getType().cast<IREE::Stream::ResourceType>();
     if (resourceType.getLifetime() != lifetime) continue;
     slices.push_back(ConstantSlice{
@@ -480,7 +480,7 @@
   }
 
   // Build subviews for all packed spans back into storage buffers.
-  for (auto it : llvm::zip(storageResources, uploadResult.allocations)) {
+  for (auto it : llvm::zip_equal(storageResources, uploadResult.allocations)) {
     auto &storageResource = std::get<0>(it);
     auto &allocatedStorage = std::get<1>(it);
     for (auto &span : storageResource.spans) {
diff --git a/compiler/src/iree/compiler/Dialect/Stream/Transforms/PropagateTimepoints.cpp b/compiler/src/iree/compiler/Dialect/Stream/Transforms/PropagateTimepoints.cpp
index 7c91b76..b118c5d 100644
--- a/compiler/src/iree/compiler/Dialect/Stream/Transforms/PropagateTimepoints.cpp
+++ b/compiler/src/iree/compiler/Dialect/Stream/Transforms/PropagateTimepoints.cpp
@@ -529,8 +529,8 @@
   if (op.getAwaitTimepoint()) {
     newTimepoints.insert(op.getAwaitTimepoint());
   }
-  for (auto it :
-       llvm::zip(op.getResourceOperands(), op.getResourceOperandSizes())) {
+  for (auto it : llvm::zip_equal(op.getResourceOperands(),
+                                 op.getResourceOperandSizes())) {
     auto operand = std::get<0>(it);
     auto operandSize = std::get<1>(it);
     auto timepointOperand =
diff --git a/compiler/src/iree/compiler/Dialect/Stream/Transforms/ScheduleConcurrency.cpp b/compiler/src/iree/compiler/Dialect/Stream/Transforms/ScheduleConcurrency.cpp
index 57852b5..35a0ab4 100644
--- a/compiler/src/iree/compiler/Dialect/Stream/Transforms/ScheduleConcurrency.cpp
+++ b/compiler/src/iree/compiler/Dialect/Stream/Transforms/ScheduleConcurrency.cpp
@@ -110,14 +110,15 @@
     auto &entryBlock = concurrentOp.getBody().emplaceBlock();
     SmallVector<Location> operandLocs(operandTypes.size(),
                                       concurrentOp.getLoc());
-    for (auto args : llvm::zip(
+    for (auto args : llvm::zip_equal(
              operands, entryBlock.addArguments(operandTypes, operandLocs))) {
       mapping.map(std::get<0>(args), std::get<1>(args));
     }
     builder = OpBuilder::atBlockBegin(&entryBlock);
 
     // Remap results for escaping outputs.
-    for (auto results : llvm::zip(partition->outs, concurrentOp.getResults())) {
+    for (auto results :
+         llvm::zip_equal(partition->outs, concurrentOp.getResults())) {
       parentMapping.map(std::get<0>(results), std::get<1>(results));
     }
   }
@@ -236,8 +237,8 @@
     // We must do this per block as we'll be updating dominated block values.
     for (auto &partitionBuilder : partitionBuilders) {
       for (auto resultPair :
-           llvm::zip(partitionBuilder.partition->outs,
-                     partitionBuilder.concurrentOp.getResults())) {
+           llvm::zip_equal(partitionBuilder.partition->outs,
+                           partitionBuilder.concurrentOp.getResults())) {
         auto oldResult = std::get<0>(resultPair);
         auto newResult = std::get<1>(resultPair);
         oldResult.replaceAllUsesWith(newResult);
diff --git a/compiler/src/iree/compiler/Dialect/Stream/Transforms/ScheduleExecution.cpp b/compiler/src/iree/compiler/Dialect/Stream/Transforms/ScheduleExecution.cpp
index 55eb54f..83f7b94 100644
--- a/compiler/src/iree/compiler/Dialect/Stream/Transforms/ScheduleExecution.cpp
+++ b/compiler/src/iree/compiler/Dialect/Stream/Transforms/ScheduleExecution.cpp
@@ -111,14 +111,15 @@
     // Add entry block and arguments.
     auto &entryBlock = executeOp.getBody().emplaceBlock();
     SmallVector<Location> operandLocs(operandTypes.size(), executeOp.getLoc());
-    for (auto args : llvm::zip(
+    for (auto args : llvm::zip_equal(
              operands, entryBlock.addArguments(operandTypes, operandLocs))) {
       mapping.map(std::get<0>(args), std::get<1>(args));
     }
     builder = OpBuilder::atBlockBegin(&entryBlock);
 
     // Remap results for escaping outputs.
-    for (auto results : llvm::zip(partition->outs, executeOp.getResults())) {
+    for (auto results :
+         llvm::zip_equal(partition->outs, executeOp.getResults())) {
       parentMapping.map(std::get<0>(results), std::get<1>(results));
     }
   }
@@ -278,9 +279,9 @@
 
         OpBuilder builder(executeOp);
         builder.setInsertionPointAfter(executeOp);
-        for (auto it :
-             llvm::zip(partitionBuilder.partition->outs, executeOp.getResults(),
-                       executeOp.getResultSizes())) {
+        for (auto it : llvm::zip_equal(partitionBuilder.partition->outs,
+                                       executeOp.getResults(),
+                                       executeOp.getResultSizes())) {
           auto oldResult = std::get<0>(it);
           auto newResult = std::get<1>(it);
           auto newResultSize = std::get<2>(it);
diff --git a/compiler/src/iree/compiler/Dialect/Stream/Transforms/SpecializeDispatches.cpp b/compiler/src/iree/compiler/Dialect/Stream/Transforms/SpecializeDispatches.cpp
index 8ec34b9..0776b9f 100644
--- a/compiler/src/iree/compiler/Dialect/Stream/Transforms/SpecializeDispatches.cpp
+++ b/compiler/src/iree/compiler/Dialect/Stream/Transforms/SpecializeDispatches.cpp
@@ -187,7 +187,7 @@
   // TODO(benvanik): invert this loop so that we preserve argument order.
 
   // Replace the arguments with lookups into the lookup table tensors.
-  for (auto it : llvm::zip(constantTable.sets, tableTensors)) {
+  for (auto it : llvm::zip_equal(constantTable.sets, tableTensors)) {
     auto &set = std::get<0>(it);
     auto tableTensor = std::get<1>(it);
     for (auto operandValues : llvm::enumerate(set.values)) {
diff --git a/compiler/src/iree/compiler/Dialect/Util/IR/ClosureOpUtils.cpp b/compiler/src/iree/compiler/Dialect/Util/IR/ClosureOpUtils.cpp
index 2ef3907..9d004bc 100644
--- a/compiler/src/iree/compiler/Dialect/Util/IR/ClosureOpUtils.cpp
+++ b/compiler/src/iree/compiler/Dialect/Util/IR/ClosureOpUtils.cpp
@@ -299,13 +299,13 @@
   newResults.set_subtract(newClosureResults);
   assert(oldResults.size() == newResults.size() &&
          "expected non-closure results to match");
-  for (auto oldNewResult : llvm::zip(oldResults, newResults)) {
+  for (auto oldNewResult : llvm::zip_equal(oldResults, newResults)) {
     std::get<0>(oldNewResult).replaceAllUsesWith(std::get<1>(oldNewResult));
   }
 
   // Replace original uses of the closure results.
   for (auto oldNewResult :
-       llvm::zip(preservedResults, newOp.getClosureResults())) {
+       llvm::zip_equal(preservedResults, newOp.getClosureResults())) {
     std::get<0>(oldNewResult).replaceAllUsesWith(std::get<1>(oldNewResult));
   }
 
diff --git a/compiler/src/iree/compiler/Dialect/Util/IR/UtilOpFolders.cpp b/compiler/src/iree/compiler/Dialect/Util/IR/UtilOpFolders.cpp
index ab3192e..51882f2 100644
--- a/compiler/src/iree/compiler/Dialect/Util/IR/UtilOpFolders.cpp
+++ b/compiler/src/iree/compiler/Dialect/Util/IR/UtilOpFolders.cpp
@@ -190,7 +190,7 @@
     lengths.reserve(op.getLengths().size());
     int64_t constantMin = INT64_MAX;
     int64_t constantMax = INT64_MIN;
-    for (auto range : llvm::zip(op.getOffsets(), op.getLengths())) {
+    for (auto range : llvm::zip_equal(op.getOffsets(), op.getLengths())) {
       auto offset = std::get<0>(range);
       auto length = std::get<1>(range);
       APInt rangeOffset, rangeLength;
@@ -280,7 +280,7 @@
     // preserved.
     using Range = std::tuple<Value, Value>;
     SetVector<Range> ranges;
-    for (auto range : llvm::zip(op.getOffsets(), op.getLengths())) {
+    for (auto range : llvm::zip_equal(op.getOffsets(), op.getLengths())) {
       ranges.insert(range);
     }
     if (ranges.size() == op.getOffsets().size()) return failure();
diff --git a/compiler/src/iree/compiler/Dialect/Util/IR/UtilOps.cpp b/compiler/src/iree/compiler/Dialect/Util/IR/UtilOps.cpp
index a1769e3..d3036d6 100644
--- a/compiler/src/iree/compiler/Dialect/Util/IR/UtilOps.cpp
+++ b/compiler/src/iree/compiler/Dialect/Util/IR/UtilOps.cpp
@@ -206,7 +206,7 @@
 
 void printRangeList(OpAsmPrinter &p, Operation *op, OperandRange offsets,
                     OperandRange lengths) {
-  llvm::interleaveComma(llvm::zip(offsets, lengths), p, [&](auto it) {
+  llvm::interleaveComma(llvm::zip_equal(offsets, lengths), p, [&](auto it) {
     auto offset = std::get<0>(it);
     auto length = std::get<1>(it);
     p << "[";
diff --git a/compiler/src/iree/compiler/Dialect/Util/Transforms/IPO.cpp b/compiler/src/iree/compiler/Dialect/Util/Transforms/IPO.cpp
index 52cc4ea..5647fa6 100644
--- a/compiler/src/iree/compiler/Dialect/Util/Transforms/IPO.cpp
+++ b/compiler/src/iree/compiler/Dialect/Util/Transforms/IPO.cpp
@@ -550,7 +550,7 @@
 
   // Remap live old results -> new results.
   for (auto [oldValue, newValue] :
-       llvm::zip(newResults, newCallOp.getResults())) {
+       llvm::zip_equal(newResults, newCallOp.getResults())) {
     oldValue.replaceAllUsesWith(newValue);
   }
 
diff --git a/compiler/src/iree/compiler/Dialect/VM/Conversion/StandardToVM/ConvertStandardToVM.cpp b/compiler/src/iree/compiler/Dialect/VM/Conversion/StandardToVM/ConvertStandardToVM.cpp
index c159e65..26c9eaa 100644
--- a/compiler/src/iree/compiler/Dialect/VM/Conversion/StandardToVM/ConvertStandardToVM.cpp
+++ b/compiler/src/iree/compiler/Dialect/VM/Conversion/StandardToVM/ConvertStandardToVM.cpp
@@ -383,7 +383,7 @@
     // Marshal arguments to import types.
     SmallVector<Value> importArgs;
     for (auto [operand, importType] :
-         llvm::zip(operands, importSignature.getInputs())) {
+         llvm::zip_equal(operands, importSignature.getInputs())) {
       importArgs.push_back(castToImportType(operand, importType, rewriter));
     }
 
@@ -394,7 +394,7 @@
     // Marshal results from import types.
     SmallVector<Value> callResults;
     for (auto [importResult, resultType] :
-         llvm::zip(newOp.getResults(), resultTypes)) {
+         llvm::zip_equal(newOp.getResults(), resultTypes)) {
       callResults.push_back(
           castFromImportType(importResult, resultType, rewriter));
     }
diff --git a/compiler/src/iree/compiler/Dialect/VM/Conversion/VMToEmitC/ConvertVMToEmitC.cpp b/compiler/src/iree/compiler/Dialect/VM/Conversion/VMToEmitC/ConvertVMToEmitC.cpp
index b3dfffb..4ef4a9a 100644
--- a/compiler/src/iree/compiler/Dialect/VM/Conversion/VMToEmitC/ConvertVMToEmitC.cpp
+++ b/compiler/src/iree/compiler/Dialect/VM/Conversion/VMToEmitC/ConvertVMToEmitC.cpp
@@ -2964,7 +2964,8 @@
       destDispatch = rewriter.createBlock(dest);
 
       BlockAndValueMapping refMapping;
-      for (auto pair : llvm::zip(op.getOperands(), dest->getArguments())) {
+      for (auto pair :
+           llvm::zip_equal(op.getOperands(), dest->getArguments())) {
         Value operand = std::get<0>(pair);
         BlockArgument blockArg = std::get<1>(pair);
 
diff --git a/compiler/src/iree/compiler/Dialect/VM/IR/VMOps.cpp b/compiler/src/iree/compiler/Dialect/VM/IR/VMOps.cpp
index 98e660d..f2e5a06 100644
--- a/compiler/src/iree/compiler/Dialect/VM/IR/VMOps.cpp
+++ b/compiler/src/iree/compiler/Dialect/VM/IR/VMOps.cpp
@@ -1187,7 +1187,7 @@
   p << ' ' << op->getAttr("callee") << '(';
   int operand = 0;
   llvm::interleaveComma(
-      llvm::zip(getSegmentSizes(), getSegmentTypes()), p,
+      llvm::zip_equal(getSegmentSizes(), getSegmentTypes()), p,
       [&](std::tuple<APInt, Attribute> segmentSizeType) {
         int segmentSize = std::get<0>(segmentSizeType).getSExtValue();
         Type segmentType =
@@ -1225,7 +1225,7 @@
                           });
   p << " : (";
   llvm::interleaveComma(
-      llvm::zip(getSegmentSizes(), getSegmentTypes()), p,
+      llvm::zip_equal(getSegmentSizes(), getSegmentTypes()), p,
       [&](std::tuple<APInt, Attribute> segmentSizeType) {
         int segmentSize = std::get<0>(segmentSizeType).getSExtValue();
         Type segmentType =
diff --git a/compiler/src/iree/compiler/Dialect/VM/Target/C/TranslateToCpp.cpp b/compiler/src/iree/compiler/Dialect/VM/Target/C/TranslateToCpp.cpp
index 7e4c691..5ef44f9 100644
--- a/compiler/src/iree/compiler/Dialect/VM/Target/C/TranslateToCpp.cpp
+++ b/compiler/src/iree/compiler/Dialect/VM/Target/C/TranslateToCpp.cpp
@@ -93,7 +93,7 @@
   Block &successor = *branchOp.getSuccessor();
 
   for (auto pair :
-       llvm::zip(branchOp.getOperands(), successor.getArguments())) {
+       llvm::zip_equal(branchOp.getOperands(), successor.getArguments())) {
     Value &operand = std::get<0>(pair);
     BlockArgument &argument = std::get<1>(pair);
     os << emitter.getOrCreateName(argument) << " = "
@@ -117,7 +117,7 @@
      << ") {\n";
 
   // If condition is true.
-  for (auto pair : llvm::zip(condBranchOp.getTrueOperands(),
+  for (auto pair : llvm::zip_equal(condBranchOp.getTrueOperands(),
                              trueSuccessor.getArguments())) {
     Value &operand = std::get<0>(pair);
     BlockArgument &argument = std::get<1>(pair);
@@ -132,7 +132,7 @@
   os << emitter.getOrCreateName(trueSuccessor) << ";\n";
   os << "} else {\n";
   // If condition is false.
-  for (auto pair : llvm::zip(condBranchOp.getFalseOperands(),
+  for (auto pair : llvm::zip_equal(condBranchOp.getFalseOperands(),
                              falseSuccessor.getArguments())) {
     Value &operand = std::get<0>(pair);
     BlockArgument &argument = std::get<1>(pair);
@@ -265,7 +265,7 @@
     }
   }
 
-  for (auto pair : llvm::zip(iterArgs, operands)) {
+  for (auto pair : llvm::zip_equal(iterArgs, operands)) {
     if (failed(emitter.emitType(forOp.getLoc(), std::get<0>(pair).getType())))
       return failure();
     os << " " << emitter.getOrCreateName(std::get<0>(pair)) << " = ";
@@ -306,7 +306,7 @@
 
   Operation *yieldOp = forRegion.getBlocks().front().getTerminator();
   // Copy yield operands into iterArgs at the end of a loop iteration.
-  for (auto pair : llvm::zip(iterArgs, yieldOp->getOperands())) {
+  for (auto pair : llvm::zip_equal(iterArgs, yieldOp->getOperands())) {
     BlockArgument iterArg = std::get<0>(pair);
     Value operand = std::get<1>(pair);
     os << emitter.getOrCreateName(iterArg) << " = "
@@ -316,7 +316,7 @@
   os.unindent() << "}";
 
   // Copy iterArgs into results after the for loop.
-  for (auto pair : llvm::zip(results, iterArgs)) {
+  for (auto pair : llvm::zip_equal(results, iterArgs)) {
     OpResult result = std::get<0>(pair);
     BlockArgument iterArg = std::get<1>(pair);
     os << "\n"
@@ -382,7 +382,7 @@
   }
 
   if (failed(interleaveWithError(
-          llvm::zip(parentOp.getResults(), yieldOp.getOperands()),
+          llvm::zip_equal(parentOp.getResults(), yieldOp.getOperands()),
           [&](auto pair) -> LogicalResult {
             auto result = std::get<0>(pair);
             auto operand = std::get<1>(pair);
diff --git a/compiler/src/iree/compiler/Dialect/VMVX/Transforms/MaterializeConstants.cpp b/compiler/src/iree/compiler/Dialect/VMVX/Transforms/MaterializeConstants.cpp
index 96224eb..e6e28f5 100644
--- a/compiler/src/iree/compiler/Dialect/VMVX/Transforms/MaterializeConstants.cpp
+++ b/compiler/src/iree/compiler/Dialect/VMVX/Transforms/MaterializeConstants.cpp
@@ -112,7 +112,7 @@
     Value elementSizeI32 = setterBuilder.create<arith::ConstantIntOp>(
         buffer.getLoc(), sizeof(uint32_t), 32);
     for (auto [ordinalGlobalOp, valueGlobalOp] :
-         llvm::zip(ordinalGlobalOps, valueGlobalOps)) {
+         llvm::zip_equal(ordinalGlobalOps, valueGlobalOps)) {
       Value loadedOrdinal = setterBuilder.create<IREE::Util::GlobalLoadOp>(
           ordinalGlobalOp.getLoc(), ordinalGlobalOp);
       Value bufferOffset = setterBuilder.create<arith::MulIOp>(
diff --git a/compiler/src/iree/compiler/InputConversion/MHLO/BroadcastingToLinalgPatterns.cpp b/compiler/src/iree/compiler/InputConversion/MHLO/BroadcastingToLinalgPatterns.cpp
index 5b002cf..28917b7 100644
--- a/compiler/src/iree/compiler/InputConversion/MHLO/BroadcastingToLinalgPatterns.cpp
+++ b/compiler/src/iree/compiler/InputConversion/MHLO/BroadcastingToLinalgPatterns.cpp
@@ -570,7 +570,8 @@
     if (!lhsType.hasStaticShape() || !rhsType.hasStaticShape())
       return rewriter.notifyMatchFailure(op, "not static shapes");
 
-    for (auto extents : llvm::zip(lhsType.getShape(), rhsType.getShape())) {
+    for (auto extents :
+         llvm::zip_equal(lhsType.getShape(), rhsType.getShape())) {
       auto lhs_extent = std::get<0>(extents);
       auto rhs_extent = std::get<1>(extents);
       if (lhs_extent != rhs_extent) {
diff --git a/compiler/src/iree/compiler/InputConversion/MHLO/MHLOToMHLOPreprocessing.cpp b/compiler/src/iree/compiler/InputConversion/MHLO/MHLOToMHLOPreprocessing.cpp
index 1e31584..62200e7 100644
--- a/compiler/src/iree/compiler/InputConversion/MHLO/MHLOToMHLOPreprocessing.cpp
+++ b/compiler/src/iree/compiler/InputConversion/MHLO/MHLOToMHLOPreprocessing.cpp
@@ -1054,9 +1054,9 @@
       operands.push_back(operand);
     }
 
-    if (llvm::all_of(llvm::zip(operands, op->getOperands()), [](auto pair) {
-          return std::get<0>(pair) == std::get<1>(pair);
-        }))
+    if (llvm::all_of(
+            llvm::zip_equal(operands, op->getOperands()),
+            [](auto pair) { return std::get<0>(pair) == std::get<1>(pair); }))
       return failure();
 
     rewriter.replaceOpWithNewOp<Op>(op, op->getResultTypes(), operands,
diff --git a/compiler/src/iree/compiler/Modules/HAL/Inline/Conversion/StreamToHALInline/Patterns.cpp b/compiler/src/iree/compiler/Modules/HAL/Inline/Conversion/StreamToHALInline/Patterns.cpp
index f893502..a457146 100644
--- a/compiler/src/iree/compiler/Modules/HAL/Inline/Conversion/StreamToHALInline/Patterns.cpp
+++ b/compiler/src/iree/compiler/Modules/HAL/Inline/Conversion/StreamToHALInline/Patterns.cpp
@@ -72,7 +72,7 @@
 
     SmallVector<Value> results;
     for (auto [resourceResult, storageSize] :
-         llvm::zip(allocOp.getResults(), allocOp.getStorageSizes())) {
+         llvm::zip_equal(allocOp.getResults(), allocOp.getStorageSizes())) {
       auto allocateOp = rewriter.create<IREE::HAL::Inline::BufferAllocateOp>(
           allocOp.getLoc(), deviceBufferType, hostBufferType, minAlignment,
           storageSize);
@@ -434,8 +434,8 @@
     SmallVector<Value> bindingBuffers;
     SmallVector<Value> bindingOffsets;
     for (auto [resource, resourceSize, resourceOffset] :
-         llvm::zip(adaptor.getResources(), adaptor.getResourceSizes(),
-                   adaptor.getResourceOffsets())) {
+         llvm::zip_equal(adaptor.getResources(), adaptor.getResourceSizes(),
+                         adaptor.getResourceOffsets())) {
       auto storage = getResourceStorage(loc, resource, resourceSize, rewriter);
       bindingBuffers.push_back(storage.buffer);
       bindingOffsets.push_back(resourceOffset);
diff --git a/compiler/src/iree/compiler/Modules/HAL/Loader/Conversion/HALLoaderToVM/Patterns.cpp b/compiler/src/iree/compiler/Modules/HAL/Loader/Conversion/HALLoaderToVM/Patterns.cpp
index 684c217..a6247b1 100644
--- a/compiler/src/iree/compiler/Modules/HAL/Loader/Conversion/HALLoaderToVM/Patterns.cpp
+++ b/compiler/src/iree/compiler/Modules/HAL/Loader/Conversion/HALLoaderToVM/Patterns.cpp
@@ -104,9 +104,9 @@
         static_cast<int16_t>(adaptor.getBindingBuffers().size()),
     };
     callOperands.append(pushConstants.begin(), pushConstants.end());
-    for (auto it :
-         llvm::zip(adaptor.getBindingBuffers(), adaptor.getBindingOffsets(),
-                   adaptor.getBindingLengths())) {
+    for (auto it : llvm::zip_equal(adaptor.getBindingBuffers(),
+                                   adaptor.getBindingOffsets(),
+                                   adaptor.getBindingLengths())) {
       callOperands.push_back(std::get<0>(it));
       callOperands.push_back(
           castToImportType(std::get<1>(it), rewriter.getI64Type(), rewriter));
diff --git a/compiler/src/iree/compiler/Modules/HAL/Loader/IR/HALLoaderOps.cpp b/compiler/src/iree/compiler/Modules/HAL/Loader/IR/HALLoaderOps.cpp
index 1071ce3..033fc39 100644
--- a/compiler/src/iree/compiler/Modules/HAL/Loader/IR/HALLoaderOps.cpp
+++ b/compiler/src/iree/compiler/Modules/HAL/Loader/IR/HALLoaderOps.cpp
@@ -65,7 +65,7 @@
                                   ValueRange bufferOffsets,
                                   ValueRange bufferLengths) {
   llvm::interleaveComma(
-      llvm::zip(buffers, bufferTypes, bufferOffsets, bufferLengths), p,
+      llvm::zip_equal(buffers, bufferTypes, bufferOffsets, bufferLengths), p,
       [&](std::tuple<Value, Type, Value, Value> it) {
         p.printNewline();
         p << "  ";
@@ -165,7 +165,7 @@
     SmallVector<Value> bindingOffsets;
     SmallVector<Value> bindingLengths;
     for (auto [bindingBuffer, bindingOffset] :
-         llvm::zip(op.getBindingBuffers(), op.getBindingOffsets())) {
+         llvm::zip_equal(op.getBindingBuffers(), op.getBindingOffsets())) {
       auto subspanOp =
           IREE::Util::BufferSubspanOp::findSubspanOp(bindingBuffer);
       if (!subspanOp) {