[Mlir-commits] [mlir] [mlir][memref] Add a new `ReifyResultShapes` pass (PR #145927)

Fabian Mora llvmlistbot at llvm.org
Fri Jun 27 16:23:40 PDT 2025


================
@@ -0,0 +1,148 @@
+//===- ReifyResultShapes.cpp - Reify result shapes ------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This transform reifies result shapes of `ReifyRankedShapedTypeOpInterface`
+// operations with ranked `memref` and `tensor` results.
+//
+//===----------------------------------------------------------------------===//
+
+#include "mlir/Dialect/MemRef/Transforms/Passes.h"
+
+#include "mlir/Dialect/Affine/IR/AffineOps.h"
+#include "mlir/Dialect/MemRef/IR/MemRef.h"
+#include "mlir/Dialect/MemRef/Transforms/Transforms.h"
+#include "mlir/Dialect/Tensor/IR/Tensor.h"
+#include "mlir/Interfaces/InferTypeOpInterface.h"
+#include "llvm/Support/InterleavedRange.h"
+
+#define DEBUG_TYPE "reify-result-shapes"
+#define DBGS() (llvm::dbgs() << "[" DEBUG_TYPE << "]: ")
+
+namespace mlir {
+namespace memref {
+#define GEN_PASS_DEF_REIFYRESULTSHAPESPASS
+#include "mlir/Dialect/MemRef/Transforms/Passes.h.inc"
+} // namespace memref
+} // namespace mlir
+
+using namespace mlir;
+
+LogicalResult
+mlir::memref::reifyOpResultShapes(RewriterBase &rewriter,
+                                  ReifyRankedShapedTypeOpInterface op) {
+  LLVM_DEBUG({ DBGS() << " reifying op: " << op << "\n"; });
+  // Get the reified out shapes.
+  ReifiedRankedShapedTypeDims reifiedResultShapes;
+  if (failed(mlir::reifyResultShapes(rewriter, op, reifiedResultShapes)) ||
----------------
fabianmcg wrote:

To me the interface description establishes an implicit contract allowing this:
```
    Interface to compute the shape of the result of an operation when
    the result is a ranked shape type, i.e. `RankedTensorType` or
    `MemRefType`.
```
Because, what would it mean for `reifyResultShapes` to return a shape that the op verifier will reject? The interface would produce inconsistent results with itself, rendering the interface implementation erroneous (IMO the verifier has higher precedence).

>From my POV  the interface solves this issue with the return of the `LogicalResult`, because then either the `reifyResultShapes` method should return failure or produce a shape that the verifier should accept. And if that's not the case then  such an operation shouldn't implement the reify interface.

Nonetheless, I do see the argument for making the implicit contract explicit. So how about adding something along the lines of the following method to the interface?
```
    InterfaceMethod<
      /*desc=*/[{
        Reify the  shape of the result of an operation (typically in terms of the
        shape of its operands).
      }],
      /*retTy=*/"::llvm::LogicalResult",
      /*methodName=*/"resifyOpResult",
      /*args=*/(ins "::mlir::OpBuilder &":$builder,
        "unsigned":$resultNum)
    >
```

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


More information about the Mlir-commits mailing list