[Mlir-commits] [mlir] [MLIR][NFC] Stop depending on func.func in affine LoopUtils (PR #82079)
Alexey Z.
llvmlistbot at llvm.org
Fri Feb 16 16:35:36 PST 2024
https://github.com/last5bits created https://github.com/llvm/llvm-project/pull/82079
Instead, use a more general `FunctionOpInterface`, which makes it possible to use affine LoopUtils routines in downstream dialects that have their own function-like ops.
>From 108131839c816a248988a84f8d09d181be00e21e Mon Sep 17 00:00:00 2001
From: Alexey Zhikhartsev <alexey.zhikhar at gmail.com>
Date: Fri, 16 Feb 2024 19:17:21 -0500
Subject: [PATCH] [MLIR][NFC] Stop depending on func.func in affine LoopUtils
Instead, use a more general `FunctionOpInterface`, which makes it
possible to use affine LoopUtils routines in downstream dialects that
have their own function-like ops.
---
mlir/include/mlir/Dialect/Affine/LoopUtils.h | 9 +++++----
mlir/lib/Dialect/Affine/Utils/LoopUtils.cpp | 21 +++++++++++---------
2 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/mlir/include/mlir/Dialect/Affine/LoopUtils.h b/mlir/include/mlir/Dialect/Affine/LoopUtils.h
index 723a262f24acc5..393d6c817ca642 100644
--- a/mlir/include/mlir/Dialect/Affine/LoopUtils.h
+++ b/mlir/include/mlir/Dialect/Affine/LoopUtils.h
@@ -23,6 +23,7 @@
namespace mlir {
class AffineMap;
+class FunctionOpInterface;
class LoopLikeOpInterface;
class OpBuilder;
class Value;
@@ -89,7 +90,7 @@ LogicalResult promoteIfSingleIteration(AffineForOp forOp);
/// Promotes all single iteration AffineForOp's in the Function, i.e., moves
/// their body into the containing Block.
-void promoteSingleIterationLoops(func::FuncOp f);
+void promoteSingleIterationLoops(FunctionOpInterface f);
/// Skew the operations in an affine.for's body with the specified
/// operation-wise shifts. The shifts are with respect to the original execution
@@ -102,7 +103,7 @@ LogicalResult affineForOpBodySkew(AffineForOp forOp, ArrayRef<uint64_t> shifts,
/// Identify valid and profitable bands of loops to tile. This is currently just
/// a temporary placeholder to test the mechanics of tiled code generation.
/// Returns all maximal outermost perfect loop nests to tile.
-void getTileableBands(func::FuncOp f,
+void getTileableBands(FunctionOpInterface f,
std::vector<SmallVector<AffineForOp, 6>> *bands);
/// Tiles the specified band of perfectly nested loops creating tile-space loops
@@ -272,8 +273,8 @@ LogicalResult coalesceLoops(MutableArrayRef<AffineForOp> loops);
void mapLoopToProcessorIds(scf::ForOp forOp, ArrayRef<Value> processorId,
ArrayRef<Value> numProcessors);
-/// Gathers all AffineForOps in 'func.func' grouped by loop depth.
-void gatherLoops(func::FuncOp func,
+/// Gathers all AffineForOps in `func` grouped by loop depth.
+void gatherLoops(FunctionOpInterface func,
std::vector<SmallVector<AffineForOp, 2>> &depthToLoops);
/// Creates an AffineForOp while ensuring that the lower and upper bounds are
diff --git a/mlir/lib/Dialect/Affine/Utils/LoopUtils.cpp b/mlir/lib/Dialect/Affine/Utils/LoopUtils.cpp
index 3794ef2dabe1e0..856fe332bd49a3 100644
--- a/mlir/lib/Dialect/Affine/Utils/LoopUtils.cpp
+++ b/mlir/lib/Dialect/Affine/Utils/LoopUtils.cpp
@@ -142,7 +142,8 @@ LogicalResult mlir::affine::promoteIfSingleIteration(AffineForOp forOp) {
auto *parentBlock = forOp->getBlock();
if (!iv.use_empty()) {
if (forOp.hasConstantLowerBound()) {
- OpBuilder topBuilder(forOp->getParentOfType<func::FuncOp>().getBody());
+ OpBuilder topBuilder(
+ forOp->getParentOfType<FunctionOpInterface>().getFunctionBody());
auto constOp = topBuilder.create<arith::ConstantIndexOp>(
forOp.getLoc(), forOp.getConstantLowerBound());
iv.replaceAllUsesWith(constOp);
@@ -879,10 +880,10 @@ void mlir::affine::getPerfectlyNestedLoops(
/// a temporary placeholder to test the mechanics of tiled code generation.
/// Returns all maximal outermost perfect loop nests to tile.
void mlir::affine::getTileableBands(
- func::FuncOp f, std::vector<SmallVector<AffineForOp, 6>> *bands) {
+ FunctionOpInterface f, std::vector<SmallVector<AffineForOp, 6>> *bands) {
// Get maximal perfect nest of 'affine.for' insts starting from root
// (inclusive).
- for (AffineForOp forOp : f.getOps<AffineForOp>()) {
+ for (AffineForOp forOp : f.getFunctionBody().getOps<AffineForOp>()) {
SmallVector<AffineForOp, 6> band;
getPerfectlyNestedLoops(band, forOp);
bands->push_back(band);
@@ -1977,8 +1978,8 @@ static LogicalResult generateCopy(
*nBegin = begin;
*nEnd = end;
- func::FuncOp f = begin->getParentOfType<func::FuncOp>();
- OpBuilder topBuilder(f.getBody());
+ FunctionOpInterface f = begin->getParentOfType<FunctionOpInterface>();
+ OpBuilder topBuilder(f.getFunctionBody());
Value zeroIndex = topBuilder.create<arith::ConstantIndexOp>(f.getLoc(), 0);
*sizeInBytes = 0;
@@ -1997,8 +1998,9 @@ static LogicalResult generateCopy(
OpBuilder &b = region.isWrite() ? epilogue : prologue;
// Builder to create constants at the top level.
- auto func = copyPlacementBlock->getParent()->getParentOfType<func::FuncOp>();
- OpBuilder top(func.getBody());
+ auto func =
+ copyPlacementBlock->getParent()->getParentOfType<FunctionOpInterface>();
+ OpBuilder top(func.getFunctionBody());
auto loc = region.loc;
auto memref = region.memref;
@@ -2542,9 +2544,10 @@ gatherLoopsInBlock(Block *block, unsigned currLoopDepth,
}
}
-/// Gathers all AffineForOps in 'func.func' grouped by loop depth.
+/// Gathers all AffineForOps in `func` grouped by loop depth.
void mlir::affine::gatherLoops(
- func::FuncOp func, std::vector<SmallVector<AffineForOp, 2>> &depthToLoops) {
+ FunctionOpInterface func,
+ std::vector<SmallVector<AffineForOp, 2>> &depthToLoops) {
for (auto &block : func)
gatherLoopsInBlock(&block, /*currLoopDepth=*/0, depthToLoops);
More information about the Mlir-commits
mailing list