[Mlir-commits] [mlir] [MLIR][SCF] Handle commuted indices in parallel loop fusion (PR #219665)

Federico Bruzzone llvmlistbot at llvm.org
Sat Aug 29 08:24:01 PDT 2026


================
@@ -145,6 +145,18 @@ static bool valsAreEquivalent(Value val1, Value val2,
     return false;
   if (!isMemoryEffectFree(val1DefOp) || !isMemoryEffectFree(val2DefOp))
     return false;
+
+  // Handle commuted integer additions.
+  if (auto addOp1 = dyn_cast<arith::AddIOp>(val1DefOp)) {
+    if (auto addOp2 = dyn_cast<arith::AddIOp>(val2DefOp);
+        addOp2 &&
+        val1DefOp->getAttrDictionary() == val2DefOp->getAttrDictionary() &&
+        val1.getType() == val2.getType() &&
+        valsAreEquivalent(addOp1.getLhs(), addOp2.getRhs(), loopsIVsMap) &&
+        valsAreEquivalent(addOp1.getRhs(), addOp2.getLhs(), loopsIVsMap))
+      return true;
+  }
+
   return OperationEquivalence::isEquivalentTo(
----------------
FedericoBruzzone wrote:

Something like:
```c++
auto checkCommutativeEquivalent =
      [&](ValueRange lhs, ValueRange rhs) -> LogicalResult {
    if (lhs.size() != 2 || rhs.size() != 2)
      return failure();
    if (valsAreEquivalent(lhs[0], rhs[0], loopsIVsMap) &&
        valsAreEquivalent(lhs[1], rhs[1], loopsIVsMap))
      return success();
    return success(valsAreEquivalent(lhs[0], rhs[1], loopsIVsMap) &&
                   valsAreEquivalent(lhs[1], rhs[0], loopsIVsMap));
  };
  ```

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


More information about the Mlir-commits mailing list