[llvm-branch-commits] [mlir] 5a72ea0 - [MLIR] Add method mlir::isPerfectNestRoot

Uday Bondhugula via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Fri Nov 5 03:30:27 PDT 2021


Author: Uday Bondhugula
Date: 2021-09-23T08:20:06+05:30
New Revision: 5a72ea079cde160b044ec7241928bb9520a5ae75

URL: https://github.com/llvm/llvm-project/commit/5a72ea079cde160b044ec7241928bb9520a5ae75
DIFF: https://github.com/llvm/llvm-project/commit/5a72ea079cde160b044ec7241928bb9520a5ae75.diff

LOG: [MLIR] Add method mlir::isPerfectNestRoot

Add method to check if an affine.for op is the root of a nest that is
nested perfectly all the way.

Added: 
    

Modified: 
    mlir/include/mlir/Transforms/LoopUtils.h
    mlir/lib/Transforms/Utils/LoopUtils.cpp

Removed: 
    


################################################################################
diff  --git a/mlir/include/mlir/Transforms/LoopUtils.h b/mlir/include/mlir/Transforms/LoopUtils.h
index 8c851215e3c08..fe89a86c4d2e8 100644
--- a/mlir/include/mlir/Transforms/LoopUtils.h
+++ b/mlir/include/mlir/Transforms/LoopUtils.h
@@ -57,6 +57,9 @@ LogicalResult loopUnrollUpToFactor(AffineForOp forOp, uint64_t unrollFactor);
 /// in it from outermost to innermost.
 bool LLVM_ATTRIBUTE_UNUSED isPerfectlyNested(ArrayRef<AffineForOp> loops);
 
+/// Returns true if the nest rooted at `loop` is a perfectly nested loop nest.
+bool isPerfectNestRoot(AffineForOp loop);
+
 /// Get perfectly nested sequence of loops starting at root of loop nest
 /// (the first op being another AffineFor, and the second op - a terminator).
 /// A loop is perfectly nested iff: the first op in the loop's body is another

diff  --git a/mlir/lib/Transforms/Utils/LoopUtils.cpp b/mlir/lib/Transforms/Utils/LoopUtils.cpp
index 4427001be2204..41a6aa692ee7c 100644
--- a/mlir/lib/Transforms/Utils/LoopUtils.cpp
+++ b/mlir/lib/Transforms/Utils/LoopUtils.cpp
@@ -1543,6 +1543,24 @@ mlir::isPerfectlyNested(ArrayRef<AffineForOp> loops) {
   return true;
 }
 
+/// Returns true if no other affine for op's are nested within `forOp`.
+static bool isInnermostAffineForOp(AffineForOp forOp) {
+  // Only for the innermost affine.for op's.
+  bool isInnermost = true;
+  forOp.walk([&](AffineForOp thisForOp) {
+    isInnermost = (thisForOp == forOp);
+    return WalkResult::interrupt();
+  });
+  return isInnermost;
+}
+
+/// Returns true if the nest rooted at `loop` is a perfectly nested loop nest.
+bool mlir::isPerfectNestRoot(AffineForOp loop) {
+  SmallVector<AffineForOp, 4> nest;
+  getPerfectlyNestedLoops(nest, loop);
+  return isInnermostAffineForOp(nest.back());
+}
+
 // input[i] should move from position i -> permMap[i]. Returns the position in
 // `input` that becomes the new outermost loop.
 unsigned mlir::permuteLoops(MutableArrayRef<AffineForOp> input,


        


More information about the llvm-branch-commits mailing list