[clang-tools-extra] [mlir][memref]: Add expand/collapse rewrite pattern to MemRef::CopyOp (PR #67808)
https://github.com/AviadCo updated https://github.com/llvm/llvm-project/pull/67808 >From a760c42f0c8b75361f822e1efcbdae30151b2180 Mon Sep 17 00:00:00 2001 From: Aviad Cohen Date: Fri, 29 Sep 2023 15:32:18 +0300 Subject: [PATCH] [mlir][memref]: Add expand/collapse rewrite pattern to MemRef::CopyOp This pattern is useful to adjust the memref copy ranks. --- .../MemRef/Transforms/ExpandCollapseCopyOps.h | 45 .../Dialect/MemRef/Transforms/CMakeLists.txt | 1 + .../Transforms/ExpandCollapseCopyOps.cpp | 238 ++ .../Transforms/expand-collapse-copy-ops.mlir | 141 +++ mlir/test/lib/Dialect/MemRef/CMakeLists.txt | 1 + .../MemRef/TestExpandCollapseCopyOps.cpp | 66 + mlir/tools/mlir-opt/mlir-opt.cpp | 2 + 7 files changed, 494 insertions(+) create mode 100644 mlir/include/mlir/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.h create mode 100644 mlir/lib/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.cpp create mode 100644 mlir/test/Transforms/expand-collapse-copy-ops.mlir create mode 100644 mlir/test/lib/Dialect/MemRef/TestExpandCollapseCopyOps.cpp diff --git a/mlir/include/mlir/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.h b/mlir/include/mlir/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.h new file mode 100644 index 000..27a69ab93e42c74 --- /dev/null +++ b/mlir/include/mlir/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.h @@ -0,0 +1,45 @@ +//===-- ExpandCollapseCopyOps.h - Expand/Collapse MemRef copy ranks --===// +// +// 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 +// +//===--===// +// +// Patterns for expand collapse MemRef copies. +// +//===--===// + +#ifndef MLIR_DIALECT_MEMREF_TRANSFORMS_EXPAND_COLLAPSE_COPY_OPS_H_ +#define MLIR_DIALECT_MEMREF_TRANSFORMS_EXPAND_COLLAPSE_COPY_OPS_H_ + +#include "mlir/Dialect/MemRef/IR/MemRef.h" + +#include + +namespace mlir { +class MLIRContext; +class RewritePatternSet; + +namespace memref { + +typedef std::function ExpandCollapseFuncCB; +inline bool expandCollapseAny([[maybe_unused]] memref::CopyOp copyOp) { + return true; +} + +/// ExpandCollapseCopyOpConverter is a rewrite pattern that checks +/// if a `memref::CopyOp` should be expanded/collapsed into `minRank` +/// `maxRank` ranks. A selective callback may be provided to distinguish +/// which operations should be expanded/collapsed. +/// In some cases (i.e. the source/target are strided in whole dims), +/// it will not be possible to expanded/collapsed the `memref::CopyOp`. + +void populateExpandCollapseCopyOpsPatterns( +RewritePatternSet &patterns, unsigned minRank = 1, unsigned maxRank = 1, +ExpandCollapseFuncCB funcCB = expandCollapseAny); + +} // namespace memref +} // namespace mlir + +#endif // MLIR_DIALECT_MEMREF_TRANSFORMS_EXPAND_COLLAPSE_COPY_OPS_H_ diff --git a/mlir/lib/Dialect/MemRef/Transforms/CMakeLists.txt b/mlir/lib/Dialect/MemRef/Transforms/CMakeLists.txt index b16c281c93640ea..924feca4cad3012 100644 --- a/mlir/lib/Dialect/MemRef/Transforms/CMakeLists.txt +++ b/mlir/lib/Dialect/MemRef/Transforms/CMakeLists.txt @@ -2,6 +2,7 @@ add_mlir_dialect_library(MLIRMemRefTransforms AllocationOpInterfaceImpl.cpp BufferizableOpInterfaceImpl.cpp ComposeSubView.cpp + ExpandCollapseCopyOps.cpp ExpandOps.cpp ExpandRealloc.cpp ExpandStridedMetadata.cpp diff --git a/mlir/lib/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.cpp b/mlir/lib/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.cpp new file mode 100644 index 000..7905254e71e19fc --- /dev/null +++ b/mlir/lib/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.cpp @@ -0,0 +1,238 @@ +//===- ExpandCollapseCopyOps.cpp - Expand/Collapse rank of source/target copies +//-===// +// +// 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 file contains rewrite patterns (transformations) to expand/collapse +// MemRef copies. This is useful in architecture which have limitations on +// dimensions of the copy operation. +// +//===--===// + +#include "mlir/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.h" +#include "mlir/Dialect/Utils/ReshapeOpsUtils.h" +#include "mlir/IR/BuiltinAttributes.h" +#include "mlir/IR/OpDefinition.h" +#include "mlir/IR/PatternMatch.h" +#include "mlir/Transforms/DialectConversion.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" + +#include + +#define DEBUG_TYPE "expand-collapse-copy-ops" +
[clang] [mlir][memref]: Add expand/collapse rewrite pattern to MemRef::CopyOp (PR #67808)
https://github.com/AviadCo updated https://github.com/llvm/llvm-project/pull/67808 >From a760c42f0c8b75361f822e1efcbdae30151b2180 Mon Sep 17 00:00:00 2001 From: Aviad Cohen Date: Fri, 29 Sep 2023 15:32:18 +0300 Subject: [PATCH] [mlir][memref]: Add expand/collapse rewrite pattern to MemRef::CopyOp This pattern is useful to adjust the memref copy ranks. --- .../MemRef/Transforms/ExpandCollapseCopyOps.h | 45 .../Dialect/MemRef/Transforms/CMakeLists.txt | 1 + .../Transforms/ExpandCollapseCopyOps.cpp | 238 ++ .../Transforms/expand-collapse-copy-ops.mlir | 141 +++ mlir/test/lib/Dialect/MemRef/CMakeLists.txt | 1 + .../MemRef/TestExpandCollapseCopyOps.cpp | 66 + mlir/tools/mlir-opt/mlir-opt.cpp | 2 + 7 files changed, 494 insertions(+) create mode 100644 mlir/include/mlir/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.h create mode 100644 mlir/lib/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.cpp create mode 100644 mlir/test/Transforms/expand-collapse-copy-ops.mlir create mode 100644 mlir/test/lib/Dialect/MemRef/TestExpandCollapseCopyOps.cpp diff --git a/mlir/include/mlir/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.h b/mlir/include/mlir/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.h new file mode 100644 index 000..27a69ab93e42c74 --- /dev/null +++ b/mlir/include/mlir/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.h @@ -0,0 +1,45 @@ +//===-- ExpandCollapseCopyOps.h - Expand/Collapse MemRef copy ranks --===// +// +// 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 +// +//===--===// +// +// Patterns for expand collapse MemRef copies. +// +//===--===// + +#ifndef MLIR_DIALECT_MEMREF_TRANSFORMS_EXPAND_COLLAPSE_COPY_OPS_H_ +#define MLIR_DIALECT_MEMREF_TRANSFORMS_EXPAND_COLLAPSE_COPY_OPS_H_ + +#include "mlir/Dialect/MemRef/IR/MemRef.h" + +#include + +namespace mlir { +class MLIRContext; +class RewritePatternSet; + +namespace memref { + +typedef std::function ExpandCollapseFuncCB; +inline bool expandCollapseAny([[maybe_unused]] memref::CopyOp copyOp) { + return true; +} + +/// ExpandCollapseCopyOpConverter is a rewrite pattern that checks +/// if a `memref::CopyOp` should be expanded/collapsed into `minRank` +/// `maxRank` ranks. A selective callback may be provided to distinguish +/// which operations should be expanded/collapsed. +/// In some cases (i.e. the source/target are strided in whole dims), +/// it will not be possible to expanded/collapsed the `memref::CopyOp`. + +void populateExpandCollapseCopyOpsPatterns( +RewritePatternSet &patterns, unsigned minRank = 1, unsigned maxRank = 1, +ExpandCollapseFuncCB funcCB = expandCollapseAny); + +} // namespace memref +} // namespace mlir + +#endif // MLIR_DIALECT_MEMREF_TRANSFORMS_EXPAND_COLLAPSE_COPY_OPS_H_ diff --git a/mlir/lib/Dialect/MemRef/Transforms/CMakeLists.txt b/mlir/lib/Dialect/MemRef/Transforms/CMakeLists.txt index b16c281c93640ea..924feca4cad3012 100644 --- a/mlir/lib/Dialect/MemRef/Transforms/CMakeLists.txt +++ b/mlir/lib/Dialect/MemRef/Transforms/CMakeLists.txt @@ -2,6 +2,7 @@ add_mlir_dialect_library(MLIRMemRefTransforms AllocationOpInterfaceImpl.cpp BufferizableOpInterfaceImpl.cpp ComposeSubView.cpp + ExpandCollapseCopyOps.cpp ExpandOps.cpp ExpandRealloc.cpp ExpandStridedMetadata.cpp diff --git a/mlir/lib/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.cpp b/mlir/lib/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.cpp new file mode 100644 index 000..7905254e71e19fc --- /dev/null +++ b/mlir/lib/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.cpp @@ -0,0 +1,238 @@ +//===- ExpandCollapseCopyOps.cpp - Expand/Collapse rank of source/target copies +//-===// +// +// 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 file contains rewrite patterns (transformations) to expand/collapse +// MemRef copies. This is useful in architecture which have limitations on +// dimensions of the copy operation. +// +//===--===// + +#include "mlir/Dialect/MemRef/Transforms/ExpandCollapseCopyOps.h" +#include "mlir/Dialect/Utils/ReshapeOpsUtils.h" +#include "mlir/IR/BuiltinAttributes.h" +#include "mlir/IR/OpDefinition.h" +#include "mlir/IR/PatternMatch.h" +#include "mlir/Transforms/DialectConversion.h" +#include "mlir/Transforms/GreedyPatternRewriteDriver.h" + +#include + +#define DEBUG_TYPE "expand-collapse-copy-ops" +