From b28e3db88d053b94250562f837758dc8a92a0a0f Mon Sep 17 00:00:00 2001 From: Mehdi Amini Date: Wed, 12 Aug 2020 22:45:16 +0000 Subject: [PATCH] Merge OpFolderDialectInterface with DialectFoldInterface (NFC) Reviewed By: rriddle Differential Revision: https://reviews.llvm.org/D85823 --- mlir/docs/Canonicalization.md | 6 +++++- mlir/include/mlir/Interfaces/FoldInterfaces.h | 12 ++++++++++-- mlir/include/mlir/Transforms/FoldUtils.h | 21 ++------------------- mlir/lib/Transforms/Utils/FoldUtils.cpp | 6 +++--- mlir/test/lib/Dialect/Test/TestDialect.cpp | 6 +++--- 5 files changed, 23 insertions(+), 28 deletions(-) diff --git a/mlir/docs/Canonicalization.md b/mlir/docs/Canonicalization.md index 8434337..3e1c9d1 100644 --- a/mlir/docs/Canonicalization.md +++ b/mlir/docs/Canonicalization.md @@ -51,7 +51,7 @@ These transformations are applied to all levels of IR: * `constant-like` operations are uniqued and hoisted into the entry block of the first parent barrier region. This is a region that is either isolated from above, e.g. the entry block of a function, or one marked as a barrier - via the `shouldMaterializeInto` method on the `OpFolderDialectInterface`. + via the `shouldMaterializeInto` method on the `DialectFoldInterface`. ## Defining Canonicalizations @@ -170,6 +170,10 @@ generate new `Value`s. There are no specific restrictions on the form of the `Attribute` value returned, but it is important to ensure that the `Attribute` representation of a specific `Type` is consistent. +When the `fold` hook on an operation is not successful, the dialect can +provide a fallback by implementing the `DialectFoldInterface` and overriding +the fold hook. + #### Generating Constants from Attributes When a `fold` method returns an `Attribute` as the result, it signifies that diff --git a/mlir/include/mlir/Interfaces/FoldInterfaces.h b/mlir/include/mlir/Interfaces/FoldInterfaces.h index e1f1787..1399d9a 100644 --- a/mlir/include/mlir/Interfaces/FoldInterfaces.h +++ b/mlir/include/mlir/Interfaces/FoldInterfaces.h @@ -15,9 +15,10 @@ namespace mlir { class Attribute; class OpFoldResult; +class Region; -/// Define a fold interface to allow for dialects to opt-in specific -/// folding for operations they define. +/// Define a fold interface to allow for dialects to control specific aspects +/// of the folding behavior for operations they define. class DialectFoldInterface : public DialectInterface::Base { public: @@ -33,6 +34,13 @@ public: SmallVectorImpl &results) const { return failure(); } + + /// Registered hook to check if the given region, which is attached to an + /// operation that is *not* isolated from above, should be used when + /// materializing constants. The folder will generally materialize constants + /// into the top-level isolated region, this allows for materializing into a + /// lower level ancestor region if it is more profitable/correct. + virtual bool shouldMaterializeInto(Region *region) const { return false; } }; } // end namespace mlir diff --git a/mlir/include/mlir/Transforms/FoldUtils.h b/mlir/include/mlir/Transforms/FoldUtils.h index d427f0b..ad406cb 100644 --- a/mlir/include/mlir/Transforms/FoldUtils.h +++ b/mlir/include/mlir/Transforms/FoldUtils.h @@ -17,29 +17,12 @@ #include "mlir/IR/Builders.h" #include "mlir/IR/Dialect.h" #include "mlir/IR/DialectInterface.h" +#include "mlir/Interfaces/FoldInterfaces.h" namespace mlir { class Operation; class Value; -//===--------------------------------------------------------------------===// -// Operation Folding Interface -//===--------------------------------------------------------------------===// - -/// This class defines a dialect interface used to assist the operation folder. -/// It provides hooks for materializing and folding operations. -class OpFolderDialectInterface - : public DialectInterface::Base { -public: - OpFolderDialectInterface(Dialect *dialect) : Base(dialect) {} - - /// Registered hook to check if the given region, which is attached to an - /// operation that is *not* isolated from above, should be used when - /// materializing constants. The folder will generally materialize constants - /// into the top-level isolated region, this allows for materializing into a - /// lower level ancestor region if it is more profitable/correct. - virtual bool shouldMaterializeInto(Region *region) const { return false; } -}; //===--------------------------------------------------------------------===// // OperationFolder @@ -153,7 +136,7 @@ private: DenseMap> referencedDialects; /// A collection of dialect folder interfaces. - DialectInterfaceCollection interfaces; + DialectInterfaceCollection interfaces; }; } // end namespace mlir diff --git a/mlir/lib/Transforms/Utils/FoldUtils.cpp b/mlir/lib/Transforms/Utils/FoldUtils.cpp index a28e65d..074f71c 100644 --- a/mlir/lib/Transforms/Utils/FoldUtils.cpp +++ b/mlir/lib/Transforms/Utils/FoldUtils.cpp @@ -22,9 +22,9 @@ using namespace mlir; /// Given an operation, find the parent region that folded constants should be /// inserted into. -static Region *getInsertionRegion( - DialectInterfaceCollection &interfaces, - Block *insertionBlock) { +static Region * +getInsertionRegion(DialectInterfaceCollection &interfaces, + Block *insertionBlock) { while (Region *region = insertionBlock->getParent()) { // Insert in this region for any of the following scenarios: // * The parent is unregistered, or is known to be isolated from above. diff --git a/mlir/test/lib/Dialect/Test/TestDialect.cpp b/mlir/test/lib/Dialect/Test/TestDialect.cpp index c9cfdc5..c873a00 100644 --- a/mlir/test/lib/Dialect/Test/TestDialect.cpp +++ b/mlir/test/lib/Dialect/Test/TestDialect.cpp @@ -52,8 +52,8 @@ struct TestOpAsmInterface : public OpAsmDialectInterface { } }; -struct TestOpFolderDialectInterface : public OpFolderDialectInterface { - using OpFolderDialectInterface::OpFolderDialectInterface; +struct TestDialectFoldInterface : public DialectFoldInterface { + using DialectFoldInterface::DialectFoldInterface; /// Registered hook to check if the given region, which is attached to an /// operation that is *not* isolated from above, should be used when @@ -135,7 +135,7 @@ void TestDialect::initialize() { #define GET_OP_LIST #include "TestOps.cpp.inc" >(); - addInterfaces(); addTypes(); allowUnknownOperations(); -- 2.7.4