[PATCH] D80305: [mlir] Add folding for shape.any
Theodore Popp via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 4 08:12:15 PDT 2020
tpopp updated this revision to Diff 268477.
tpopp marked 5 inline comments as done.
tpopp added a comment.
Herald added a project: MLIR.
Explain commutativity of any.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D80305/new/
https://reviews.llvm.org/D80305
Files:
mlir/include/mlir/Dialect/Shape/IR/ShapeOps.td
mlir/lib/Dialect/Shape/IR/Shape.cpp
mlir/test/Dialect/Shape/canonicalize.mlir
Index: mlir/test/Dialect/Shape/canonicalize.mlir
===================================================================
--- mlir/test/Dialect/Shape/canonicalize.mlir
+++ mlir/test/Dialect/Shape/canonicalize.mlir
@@ -245,3 +245,25 @@
"consume.witness"(%2) : (!shape.witness) -> ()
return
}
+
+// -----
+// any can be replaced with a constant input if it has one.
+// CHECK-LABEL: func @f
+func @f(%arg0 : !shape.shape) -> !shape.shape {
+ // CHECK-NEXT: %[[CS:.*]] = shape.const_shape
+ // CHECK-NEXT: return %[[CS]]
+ %0 = shape.const_shape [2, 3, 4]
+ %1 = shape.any %0, %arg0
+ return %1 : !shape.shape
+}
+
+
+// -----
+// Folding of any with partially constant operands is not yet implemented.
+// CHECK-LABEL: func @f
+func @f(%arg0 : !shape.shape, %arg1 : !shape.shape) -> !shape.shape {
+ // CHECK-NEXT: shape.any
+ // CHECK-NEXT: return %[[CS]]
+ %1 = shape.any %arg0, %arg1
+ return %1 : !shape.shape
+}
Index: mlir/lib/Dialect/Shape/IR/Shape.cpp
===================================================================
--- mlir/lib/Dialect/Shape/IR/Shape.cpp
+++ mlir/lib/Dialect/Shape/IR/Shape.cpp
@@ -101,6 +101,16 @@
// AnyOp
//===----------------------------------------------------------------------===//
+// TODO: Canonicalization should be implemented for shapes that can be
+// determined through mixtures of the known dimensions of the inputs.
+OpFoldResult AnyOp::fold(ArrayRef<Attribute> operands) {
+ // Only the last operand is checked because AnyOp is commutative.
+ if (operands.back())
+ return operands.back();
+
+ return nullptr;
+}
+
LogicalResult
AnyOp::inferReturnTypes(MLIRContext *context, Optional<Location> location,
ValueRange operands, DictionaryAttr attributes,
Index: mlir/include/mlir/Dialect/Shape/IR/ShapeOps.td
===================================================================
--- mlir/include/mlir/Dialect/Shape/IR/ShapeOps.td
+++ mlir/include/mlir/Dialect/Shape/IR/ShapeOps.td
@@ -450,7 +450,7 @@
//TODO: Move the code below and witnesses to a different file.
def Shape_AnyOp : Shape_Op<"any",
- [NoSideEffect, DeclareOpInterfaceMethods<InferTypeOpInterface>]> {
+ [Commutative, NoSideEffect, DeclareOpInterfaceMethods<InferTypeOpInterface>]> {
let summary = "Return any combination of the input shapes.";
let description = [{
This operation takes multiple input shapes and returns some combination of
@@ -470,6 +470,8 @@
let results = (outs Shape_ShapeType:$result);
let assemblyFormat = "$inputs attr-dict";
+
+ let hasFolder = 1;
}
def Shape_AssumingAllOp : Shape_Op<"assuming_all", [Commutative, NoSideEffect]> {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D80305.268477.patch
Type: text/x-patch
Size: 2643 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200604/93c627cf/attachment.bin>
More information about the llvm-commits
mailing list