[Mlir-commits] [mlir] [MLIR] Use make_isa_range instead of dyn_cast/continue (NFC). (PR #223974)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Wed Sep 16 03:45:54 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-mlir-affine

Author: Florian Hahn (fhahn)

<details>
<summary>Changes</summary>

Simplify loops using dyn_cast + early continue using make_isa_range, added in https://github.com/llvm/llvm-project/pull/223414.

Aided by Opus 5.

---
Full diff: https://github.com/llvm/llvm-project/pull/223974.diff


14 Files Affected:

- (modified) mlir/lib/Conversion/ConvertToEmitC/ConvertToEmitCPass.cpp (+6-10) 
- (modified) mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp (+8-12) 
- (modified) mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp (+3-5) 
- (modified) mlir/lib/Conversion/VectorToGPU/VectorToGPU.cpp (+2-4) 
- (modified) mlir/lib/Conversion/XeVMToLLVM/XeVMToLLVM.cpp (+1-5) 
- (modified) mlir/lib/Dialect/Affine/Transforms/LoopFusion.cpp (+4-5) 
- (modified) mlir/lib/Dialect/Affine/Utils/Utils.cpp (+7-10) 
- (modified) mlir/lib/Dialect/LLVMIR/Transforms/InlinerInterfaceImpl.cpp (+2-4) 
- (modified) mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp (+2-4) 
- (modified) mlir/lib/Dialect/XeGPU/Transforms/XeGPULayoutImpl.cpp (+1-4) 
- (modified) mlir/lib/Pass/PassStatistics.cpp (+4-6) 
- (modified) mlir/lib/Target/SMTLIB/ExportSMTLIB.cpp (+2-5) 
- (modified) mlir/lib/Transforms/Utils/RegionUtils.cpp (+4-8) 
- (modified) mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp (+2-4) 


``````````diff
diff --git a/mlir/lib/Conversion/ConvertToEmitC/ConvertToEmitCPass.cpp b/mlir/lib/Conversion/ConvertToEmitC/ConvertToEmitCPass.cpp
index ca66af051a4e8..23072580acd96 100644
--- a/mlir/lib/Conversion/ConvertToEmitC/ConvertToEmitCPass.cpp
+++ b/mlir/lib/Conversion/ConvertToEmitC/ConvertToEmitCPass.cpp
@@ -80,12 +80,10 @@ class LoadDependentDialectExtension : public DialectExtensionBase {
   void apply(MLIRContext *context,
              MutableArrayRef<Dialect *> dialects) const final {
     LLVM_DEBUG(llvm::dbgs() << "Convert to EmitC extension load\n");
-    for (Dialect *dialect : dialects) {
-      auto *iface = dyn_cast<ConvertToEmitCPatternInterface>(dialect);
-      if (!iface)
-        continue;
+    for (ConvertToEmitCPatternInterface *iface :
+         llvm::make_isa_range<ConvertToEmitCPatternInterface>(dialects)) {
       LLVM_DEBUG(llvm::dbgs() << "Convert to EmitC found dialect interface for "
-                              << dialect->getNamespace() << "\n");
+                              << iface->getDialect()->getNamespace() << "\n");
     }
   }
 
@@ -212,12 +210,10 @@ LogicalResult ConvertToEmitCPassInterface::visitInterfaces(
   } else {
     // Normal mode: Populate all patterns from all dialects that implement the
     // interface.
-    for (Dialect *dialect : context->getLoadedDialects()) {
-      auto *iface = dyn_cast<ConvertToEmitCPatternInterface>(dialect);
-      if (!iface)
-        continue;
+    std::vector<Dialect *> dialects = context->getLoadedDialects();
+    for (ConvertToEmitCPatternInterface *iface :
+         llvm::make_isa_range<ConvertToEmitCPatternInterface>(dialects))
       visitor(iface);
-    }
   }
   return success();
 }
diff --git a/mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp b/mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp
index dbeca5736ec62..02d0f67a37703 100644
--- a/mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp
+++ b/mlir/lib/Conversion/ConvertToLLVM/ConvertToLLVMPass.cpp
@@ -81,12 +81,10 @@ class LoadDependentDialectExtension : public DialectExtensionBase {
   void apply(MLIRContext *context,
              MutableArrayRef<Dialect *> dialects) const final {
     LDBG() << "Convert to LLVM extension load";
-    for (Dialect *dialect : dialects) {
-      auto *iface = dyn_cast<ConvertToLLVMPatternInterface>(dialect);
-      if (!iface)
-        continue;
+    for (ConvertToLLVMPatternInterface *iface :
+         llvm::make_isa_range<ConvertToLLVMPatternInterface>(dialects)) {
       LDBG() << "Convert to LLVM found dialect interface for "
-             << dialect->getNamespace();
+             << iface->getDialect()->getNamespace();
       iface->loadDependentDialects(context);
     }
   }
@@ -273,14 +271,12 @@ LogicalResult ConvertToLLVMPassInterface::visitInterfaces(
   } else {
     // Normal mode: Populate all patterns from all dialects that implement the
     // interface.
-    for (Dialect *dialect : context->getLoadedDialects()) {
-      // First time we encounter this dialect: if it implements the interface,
-      // let's populate patterns !
-      auto *iface = dyn_cast<ConvertToLLVMPatternInterface>(dialect);
-      if (!iface)
-        continue;
+    // First time we encounter this dialect: if it implements the interface,
+    // let's populate patterns !
+    std::vector<Dialect *> dialects = context->getLoadedDialects();
+    for (ConvertToLLVMPatternInterface *iface :
+         llvm::make_isa_range<ConvertToLLVMPatternInterface>(dialects))
       visitor(iface);
-    }
   }
   return success();
 }
diff --git a/mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp b/mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp
index 201a0bc84aeb2..6d5b10c3002e0 100644
--- a/mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp
+++ b/mlir/lib/Conversion/GPUCommon/GPUToLLVMConversion.cpp
@@ -549,12 +549,10 @@ void GpuToLLVMConversionPass::runOnOperation() {
 
   // Populate all patterns from all dialects that implement the
   // `ConvertToLLVMPatternInterface` interface.
-  for (Dialect *dialect : context->getLoadedDialects()) {
-    auto *iface = dyn_cast<ConvertToLLVMPatternInterface>(dialect);
-    if (!iface)
-      continue;
+  std::vector<Dialect *> dialects = context->getLoadedDialects();
+  for (ConvertToLLVMPatternInterface *iface :
+       llvm::make_isa_range<ConvertToLLVMPatternInterface>(dialects))
     iface->populateConvertToLLVMConversionPatterns(target, converter, patterns);
-  }
 
   // Preserve GPU modules and binaries. Modules are preserved as they can be
   // converted later by `gpu-module-to-binary`.
diff --git a/mlir/lib/Conversion/VectorToGPU/VectorToGPU.cpp b/mlir/lib/Conversion/VectorToGPU/VectorToGPU.cpp
index 1e83935ffa594..687a21541e4cb 100644
--- a/mlir/lib/Conversion/VectorToGPU/VectorToGPU.cpp
+++ b/mlir/lib/Conversion/VectorToGPU/VectorToGPU.cpp
@@ -554,10 +554,8 @@ static const char *inferFragType(Operation *op) {
       return inferFragType(userOp);
   }
 
-  for (Operation *users : op->getUsers()) {
-    auto contract = dyn_cast<vector::ContractionOp>(users);
-    if (!contract)
-      continue;
+  for (vector::ContractionOp contract :
+       llvm::make_isa_range<vector::ContractionOp>(op->getUsers())) {
     assert(op->getNumResults() == 1);
     if (contract.getLhs() == op->getResult(0))
       return "AOp";
diff --git a/mlir/lib/Conversion/XeVMToLLVM/XeVMToLLVM.cpp b/mlir/lib/Conversion/XeVMToLLVM/XeVMToLLVM.cpp
index d9cb0e2eed3e7..e60a498b4388c 100644
--- a/mlir/lib/Conversion/XeVMToLLVM/XeVMToLLVM.cpp
+++ b/mlir/lib/Conversion/XeVMToLLVM/XeVMToLLVM.cpp
@@ -351,11 +351,7 @@ buildCacheControlPayloads(ArrayRef<Attribute> attrs) {
   SmallVector<std::string> payloads;
   llvm::StringMap<bool> seen;
 
-  for (Attribute a : attrs) {
-    auto arr = dyn_cast<ArrayAttr>(a);
-    if (!arr)
-      continue;
-
+  for (ArrayAttr arr : llvm::make_isa_range<ArrayAttr>(attrs)) {
     auto vals = arr.getValue();
     assert(vals.size() == 3 &&
            "Expected exactly 3 integer values (Token, CacheLevel, "
diff --git a/mlir/lib/Dialect/Affine/Transforms/LoopFusion.cpp b/mlir/lib/Dialect/Affine/Transforms/LoopFusion.cpp
index 1ec5fbfef50c3..a7381e53d9335 100644
--- a/mlir/lib/Dialect/Affine/Transforms/LoopFusion.cpp
+++ b/mlir/lib/Dialect/Affine/Transforms/LoopFusion.cpp
@@ -1395,13 +1395,12 @@ struct GreedyFusion {
     // Search for siblings which load the same memref block argument.
     Block *block = dstNode->op->getBlock();
     for (unsigned i = 0, e = block->getNumArguments(); i != e; ++i) {
-      for (Operation *user : block->getArgument(i).getUsers()) {
-        auto loadOp = dyn_cast<AffineReadOpInterface>(user);
-        if (!loadOp)
-          continue;
+      for (AffineReadOpInterface loadOp :
+           llvm::make_isa_range<AffineReadOpInterface>(
+               block->getArgument(i).getUsers())) {
         // Gather loops surrounding 'use'.
         SmallVector<AffineForOp, 4> loops;
-        getAffineForIVs(*user, &loops);
+        getAffineForIVs(*loadOp.getOperation(), &loops);
         // Skip 'use' if it is not within a loop nest.
         // Find the surrounding affine.for nested immediately within the
         // block.
diff --git a/mlir/lib/Dialect/Affine/Utils/Utils.cpp b/mlir/lib/Dialect/Affine/Utils/Utils.cpp
index e2ad3151a934c..cec5cb726dcc8 100644
--- a/mlir/lib/Dialect/Affine/Utils/Utils.cpp
+++ b/mlir/lib/Dialect/Affine/Utils/Utils.cpp
@@ -842,10 +842,9 @@ static void forwardStoreToLoad(
   // to replace the load, if any.
   Operation *lastWriteStoreOp = nullptr;
 
-  for (auto *user : loadOp.getMemRef().getUsers()) {
-    auto storeOp = dyn_cast<AffineWriteOpInterface>(user);
-    if (!storeOp)
-      continue;
+  for (AffineWriteOpInterface storeOp :
+       llvm::make_isa_range<AffineWriteOpInterface>(
+           loadOp.getMemRef().getUsers())) {
     MemRefAccess srcAccess(storeOp);
     MemRefAccess destAccess(loadOp);
 
@@ -916,12 +915,10 @@ static void findUnusedStore(AffineWriteOpInterface writeA,
                             PostDominanceInfo &postDominanceInfo,
                             llvm::function_ref<bool(Value, Value)> mayAlias) {
 
-  for (Operation *user : writeA.getMemRef().getUsers()) {
-    // Only consider writing operations.
-    auto writeB = dyn_cast<AffineWriteOpInterface>(user);
-    if (!writeB)
-      continue;
-
+  // Only consider writing operations.
+  for (AffineWriteOpInterface writeB :
+       llvm::make_isa_range<AffineWriteOpInterface>(
+           writeA.getMemRef().getUsers())) {
     // The operations must be distinct.
     if (writeB == writeA)
       continue;
diff --git a/mlir/lib/Dialect/LLVMIR/Transforms/InlinerInterfaceImpl.cpp b/mlir/lib/Dialect/LLVMIR/Transforms/InlinerInterfaceImpl.cpp
index 9409141f6e45a..12a3ff75bc33b 100644
--- a/mlir/lib/Dialect/LLVMIR/Transforms/InlinerInterfaceImpl.cpp
+++ b/mlir/lib/Dialect/LLVMIR/Transforms/InlinerInterfaceImpl.cpp
@@ -280,10 +280,8 @@ static void createNewAliasScopesFromNoAliasParameter(
   SetVector<LLVM::SSACopyOp> ssaCopies;
   SetVector<LLVM::SSACopyOp> noAliasParams;
   for (Value argument : cast<LLVM::CallOp>(call).getArgOperands()) {
-    for (Operation *user : argument.getUsers()) {
-      auto ssaCopy = llvm::dyn_cast<LLVM::SSACopyOp>(user);
-      if (!ssaCopy)
-        continue;
+    for (LLVM::SSACopyOp ssaCopy :
+         llvm::make_isa_range<LLVM::SSACopyOp>(argument.getUsers())) {
       ssaCopies.insert(ssaCopy);
 
       if (!ssaCopy->hasDiscardableAttr(LLVM::LLVMDialect::getNoAliasAttrName()))
diff --git a/mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp b/mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp
index c42509540c6b5..71f6157b6ed3f 100644
--- a/mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp
+++ b/mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp
@@ -1925,10 +1925,8 @@ PackGreedilyOp::apply(transform::TransformRewriter &rewriter,
                       transform::TransformResults &transformResults,
                       transform::TransformState &state) {
   SmallVector<Operation *> results;
-  for (Operation *op : state.getPayloadOps(getTarget())) {
-    auto linalgOp = dyn_cast<LinalgOp>(op);
-    if (!linalgOp)
-      continue;
+  for (LinalgOp linalgOp :
+       llvm::make_isa_range<LinalgOp>(state.getPayloadOps(getTarget()))) {
     // linalgOp will be replaced and the insertion point may be invalidated if
     // we set it before -> set it after.
     rewriter.setInsertionPointAfter(linalgOp);
diff --git a/mlir/lib/Dialect/XeGPU/Transforms/XeGPULayoutImpl.cpp b/mlir/lib/Dialect/XeGPU/Transforms/XeGPULayoutImpl.cpp
index f696020b2de12..9ec8c4c677091 100644
--- a/mlir/lib/Dialect/XeGPU/Transforms/XeGPULayoutImpl.cpp
+++ b/mlir/lib/Dialect/XeGPU/Transforms/XeGPULayoutImpl.cpp
@@ -2889,10 +2889,7 @@ static xegpu::DistributeLayoutAttr getLoopCarriedLayoutForYieldOperand(
   if (it == mapping.end())
     return nullptr;
   xegpu::DistributeLayoutAttr iterArgLayout;
-  for (Value input : it->second) {
-    auto arg = dyn_cast<BlockArgument>(input);
-    if (!arg)
-      continue;
+  for (BlockArgument arg : llvm::make_isa_range<BlockArgument>(it->second)) {
     xegpu::DistributeLayoutAttr layout = xegpu::getDistributeLayoutAttr(arg);
     assert((!iterArgLayout || !layout || iterArgLayout.isEqualTo(layout)) &&
            "region inputs fed by one terminator operand disagree on layout");
diff --git a/mlir/lib/Pass/PassStatistics.cpp b/mlir/lib/Pass/PassStatistics.cpp
index 01191aa824440..cedcc059fbd6b 100644
--- a/mlir/lib/Pass/PassStatistics.cpp
+++ b/mlir/lib/Pass/PassStatistics.cpp
@@ -219,15 +219,13 @@ void OpPassManager::mergeStatisticsInto(OpPassManager &other) {
 /// Prepare the statistics of passes within the given pass manager for
 /// consumption(e.g. dumping).
 static void prepareStatistics(OpPassManager &pm) {
-  for (Pass &pass : pm.getPasses()) {
-    OpToOpPassAdaptor *adaptor = dyn_cast<OpToOpPassAdaptor>(&pass);
-    if (!adaptor)
-      continue;
-    MutableArrayRef<OpPassManager> nestedPms = adaptor->getPassManagers();
+  for (OpToOpPassAdaptor &adaptor :
+       llvm::make_isa_range<OpToOpPassAdaptor>(pm.getPasses())) {
+    MutableArrayRef<OpPassManager> nestedPms = adaptor.getPassManagers();
 
     // Merge the statistics from the async pass managers into the main nested
     // pass managers.  Prepare recursively before merging.
-    for (auto &asyncPM : adaptor->getParallelPassManagers()) {
+    for (auto &asyncPM : adaptor.getParallelPassManagers()) {
       for (unsigned i = 0, e = asyncPM.size(); i != e; ++i) {
         prepareStatistics(asyncPM[i]);
         asyncPM[i].mergeStatisticsInto(nestedPms[i]);
diff --git a/mlir/lib/Target/SMTLIB/ExportSMTLIB.cpp b/mlir/lib/Target/SMTLIB/ExportSMTLIB.cpp
index 2c2c9ee27c3f6..4e2a44888ab3d 100644
--- a/mlir/lib/Target/SMTLIB/ExportSMTLIB.cpp
+++ b/mlir/lib/Target/SMTLIB/ExportSMTLIB.cpp
@@ -636,11 +636,8 @@ static LogicalResult emit(SolverOp solver, const SMTEmissionOptions &options,
       return op->emitError()
              << "solver must not contain any non-SMT operations";
 
-    for (Type resTy : op->getResultTypes()) {
-      auto sortTy = dyn_cast<SortType>(resTy);
-      if (!sortTy)
-        continue;
-
+    for (SortType sortTy :
+         llvm::make_isa_range<SortType>(op->getResultTypes())) {
       unsigned arity = sortTy.getSortParams().size();
       if (declaredSorts.contains(sortTy.getIdentifier())) {
         if (declaredSorts[sortTy.getIdentifier()] != arity)
diff --git a/mlir/lib/Transforms/Utils/RegionUtils.cpp b/mlir/lib/Transforms/Utils/RegionUtils.cpp
index 349a03f897441..35dc5eb6c4ef4 100644
--- a/mlir/lib/Transforms/Utils/RegionUtils.cpp
+++ b/mlir/lib/Transforms/Utils/RegionUtils.cpp
@@ -1280,10 +1280,8 @@ static bool blockArgsDominateInsertionPoint(
 
   for (Operation *op : slice) {
     // Check direct operands.
-    for (Value operand : op->getOperands()) {
-      auto arg = dyn_cast<BlockArgument>(operand);
-      if (!arg)
-        continue;
+    for (BlockArgument arg :
+         llvm::make_isa_range<BlockArgument>(op->getOperands())) {
       if (!argDominates(arg, op))
         return false;
     }
@@ -1293,10 +1291,8 @@ static bool blockArgsDominateInsertionPoint(
     for (Region &region : op->getRegions()) {
       SetVector<Value> capturedValues;
       getUsedValuesDefinedAbove(region, region, capturedValues);
-      for (Value val : capturedValues) {
-        auto arg = dyn_cast<BlockArgument>(val);
-        if (!arg)
-          continue;
+      for (BlockArgument arg :
+           llvm::make_isa_range<BlockArgument>(capturedValues)) {
         if (!argDominates(arg, op))
           return false;
       }
diff --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
index 2b195ce7e31cf..3990791f87f24 100644
--- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
@@ -3145,10 +3145,8 @@ void OpEmitter::buildParamList(SmallVectorImpl<MethodParameter> &paramList,
   // Check if parameters besides default valued one are enough to distinguish
   // between builders with wrapped and unwrapped arguments.
   bool hasBuilderAmbiguity = true;
-  for (const auto &arg : op.getArgs()) {
-    auto *namedAttr = dyn_cast<NamedAttribute *>(arg);
-    if (!namedAttr)
-      continue;
+  for (NamedAttribute *namedAttr :
+       llvm::make_isa_range<NamedAttribute *>(op.getArgs())) {
     Attribute attr = namedAttr->attr;
     if (attr.hasDefaultValue() || attr.isDerivedAttr())
       continue;

``````````

</details>


https://github.com/llvm/llvm-project/pull/223974


More information about the Mlir-commits mailing list