[Mlir-commits] [mlir] bacf1aa - Revert "[mlir] Add function for checking if a block is inside a loop"

Kiran Chandramohan llvmlistbot at llvm.org
Thu Feb 9 10:36:57 PST 2023


Author: Kiran Chandramohan
Date: 2023-02-09T18:36:28Z
New Revision: bacf1aa3c0b2c47eb37194a51e2b6edfd5b829f8

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

LOG: Revert "[mlir] Add function for checking if a block is inside a loop"

Reverting since the shared library builds are failing.

This reverts commit dcee187522c6e2e1a56ffc9b58bfe11c6ac44662.

Added: 
    

Modified: 
    mlir/include/mlir/Interfaces/LoopLikeInterface.td
    mlir/lib/Interfaces/LoopLikeInterface.cpp
    mlir/test/lib/Interfaces/CMakeLists.txt
    mlir/tools/mlir-opt/CMakeLists.txt
    mlir/tools/mlir-opt/mlir-opt.cpp

Removed: 
    mlir/test/Interfaces/LoopLikeInterface/test-block-loop.mlir
    mlir/test/lib/Interfaces/LoopLikeInterface/CMakeLists.txt
    mlir/test/lib/Interfaces/LoopLikeInterface/TestBlockInLoop.cpp


################################################################################
diff  --git a/mlir/include/mlir/Interfaces/LoopLikeInterface.td b/mlir/include/mlir/Interfaces/LoopLikeInterface.td
index d29a0e5ccf0ec..95ba4511c2cd2 100644
--- a/mlir/include/mlir/Interfaces/LoopLikeInterface.td
+++ b/mlir/include/mlir/Interfaces/LoopLikeInterface.td
@@ -97,14 +97,6 @@ def LoopLikeOpInterface : OpInterface<"LoopLikeOpInterface"> {
       }]
     >,
   ];
-
-  let extraClassDeclaration = [{
-    /// Returns if a block is inside a loop (within the current function). This
-    /// can be either because the block is nested inside a LoopLikeInterface or
-    /// because the block is nested inside a LoopLikeInterface or because
-    /// the control flow graph is cyclic
-    static bool blockIsInLoop(Block *block);
-  }];
 }
 
 #endif // MLIR_INTERFACES_LOOPLIKEINTERFACE

diff  --git a/mlir/lib/Interfaces/LoopLikeInterface.cpp b/mlir/lib/Interfaces/LoopLikeInterface.cpp
index 287ed412804db..40d505228cb0d 100644
--- a/mlir/lib/Interfaces/LoopLikeInterface.cpp
+++ b/mlir/lib/Interfaces/LoopLikeInterface.cpp
@@ -7,48 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "mlir/Interfaces/LoopLikeInterface.h"
-#include "mlir/Dialect/Func/IR/FuncOps.h"
-#include "llvm/ADT/DenseSet.h"
 
 using namespace mlir;
 
 /// Include the definitions of the loop-like interfaces.
 #include "mlir/Interfaces/LoopLikeInterface.cpp.inc"
-
-bool LoopLikeOpInterface::blockIsInLoop(Block *block) {
-  Operation *parent = block->getParentOp();
-
-  // The block could be inside a loop-like operation
-  if (isa<LoopLikeOpInterface>(parent) ||
-      parent->getParentOfType<LoopLikeOpInterface>())
-    return true;
-
-  // This block might be nested inside another block, which is in a loop
-  if (!isa<FunctionOpInterface>(parent)) {
-    if (blockIsInLoop(parent->getBlock())) {
-      return true;
-    }
-  }
-
-  // Or the block could be inside a control flow graph loop:
-  // A block is in a control flow graph loop if it can reach itself in a graph
-  // traversal
-  DenseSet<Block *> visited;
-  SmallVector<Block *> stack;
-  stack.push_back(block);
-  while (!stack.empty()) {
-    Block *current = stack.pop_back_val();
-    auto [it, inserted] = visited.insert(current);
-    if (!inserted) {
-      // loop detected
-      if (current == block)
-        return true;
-      continue;
-    }
-
-    stack.reserve(stack.size() + current->getNumSuccessors());
-    for (Block *successor : current->getSuccessors())
-      stack.push_back(successor);
-  }
-  return false;
-}

diff  --git a/mlir/test/Interfaces/LoopLikeInterface/test-block-loop.mlir b/mlir/test/Interfaces/LoopLikeInterface/test-block-loop.mlir
deleted file mode 100644
index 2d4a775f0e931..0000000000000
--- a/mlir/test/Interfaces/LoopLikeInterface/test-block-loop.mlir
+++ /dev/null
@@ -1,143 +0,0 @@
-// RUN: mlir-opt %s --mlir-disable-threading -test-block-is-in-loop 2>&1 | FileCheck %s
-
-module {
-  // Test function with only one bb
-  func.func @simple() {
-    func.return
-  }
-// CHECK: Block is not in a loop
-// CHECK-NEXT: ^bb0:
-
-  // Test simple loop bb0 -> bb0
-  func.func @loopForever() {
-  ^bb0:
-    cf.br ^bb1
-  ^bb1:
-    cf.br ^bb1
-  }
-// CHECK: Block is not in a loop
-// CHECK-NEXT: ^bb0:
-// CHECK: Block is in a loop
-// CHECK-NEXT: ^bb1:
-
-  // Test bb0 -> bb1 -> bb2 -> bb1
-  func.func @loopForever2() {
-  ^bb0:
-    cf.br ^bb1
-  ^bb1:
-    cf.br ^bb2
-  ^bb2:
-    cf.br ^bb1
-  }
-// CHECK: Block is not in a loop
-// CHECK-NEXT: ^bb0:
-// CHECK: Block is in a loop
-// CHECK-NEXT: ^bb1:
-// CHECK: Block is in a loop
-// CHECK-NEXT: ^bb2:
-
-  // Test conditional branch without loop
-  // bb0 -> bb1 -> {bb2, bb3}
-  func.func @noLoop(%arg0: i1) {
-    cf.br ^bb1
-  ^bb1:
-    cf.cond_br %arg0, ^bb2, ^bb3
-  ^bb2:
-    func.return
-  ^bb3:
-    func.return
-  }
-// CHECK: Block is not in a loop
-// CHECK-NEXT: ^bb0(%arg0: i1)
-// CHECK: Block is not in a loop
-// CHECK-NEXT: ^bb1:
-// CHECK: Block is not in a loop
-// CHECK-NEXT: ^bb2:
-// CHECK: Block is not in a loop
-// CHECK-NEXT: ^bb3:
-
-  // test multiple loops
-  // bb0 -> bb1 -> bb2 -> bb3 { -> bb2} -> bb4 { -> bb1 } -> bb5
-  func.func @multipleLoops(%arg0: i1, %arg1: i1) {
-    cf.br ^bb1
-  ^bb1:
-    cf.br ^bb2
-  ^bb2:
-    cf.br ^bb3
-  ^bb3:
-    cf.cond_br %arg0, ^bb4, ^bb2
-  ^bb4:
-    cf.cond_br %arg1, ^bb1, ^bb5
-  ^bb5:
-    return
-  }
-// CHECK: Block is not in a loop
-// CHECK-NEXT: ^bb0(%arg0: i1, %arg1: i1)
-// CHECK: Block is in a loop
-// CHECK-NEXT: ^bb1:
-// CHECK: Block is in a loop
-// CHECK-NEXT: ^bb2:
-// CHECK: Block is in a loop
-// CHECK-NEXT: ^bb3:
-// CHECK: Block is in a loop
-// CHECK-NEXT: ^bb4:
-// CHECK: Block is not in a loop
-// CHECK-NEXT: ^bb5:
-
-  // test derived from real Flang output
-  func.func @_QPblockTest0(%arg0: i1, %arg1: i1) {
-    cf.br ^bb1
-  ^bb1:  // 2 preds: ^bb0, ^bb4
-    cf.cond_br %arg0, ^bb2, ^bb5
-  ^bb2:  // pred: ^bb1
-    cf.cond_br %arg1, ^bb3, ^bb4
-  ^bb3:  // pred: ^bb2
-    return
-  ^bb4:  // pred: ^bb2
-    cf.br ^bb1
-  ^bb5:  // pred: ^bb1
-    return
-  }
-// CHECK: Block is not in a loop
-// CHECK-NEXT: ^bb0(%arg0: i1, %arg1: i1)
-// CHECK: Block is in a loop
-// CHECK-NEXT: ^bb1:
-// CHECK: Block is in a loop
-// CHECK-NEXT: ^bb2:
-// CHECK: Block is not in a loop
-// CHECK-NEXT: ^bb3:
-// CHECK: Block is in a loop
-// CHECK-NEXT: ^bb4:
-// CHECK: Block is not in a loop
-// CHECK-NEXT: ^bb5:
-
-// check nested blocks
-  func.func @check_alloc_in_loop(%counter : i64) {
-    cf.br ^bb1(%counter: i64)
-    ^bb1(%lv : i64):
-      %cm1 = arith.constant -1 : i64
-      %rem = arith.addi %lv, %cm1 : i64
-      %zero = arith.constant 0 : i64
-      %p = arith.cmpi eq, %rem, %zero : i64
-      cf.cond_br %p, ^bb3, ^bb2
-    ^bb2:
-      scf.execute_region -> () {
-        %c1 = arith.constant 1 : i64
-        scf.yield
-      }
-      cf.br ^bb1(%rem: i64)
-    ^bb3:
-      return
-  }
-// CHECK: Block is not in a loop
-// CHECK-NEXT: ^bb0(%arg0: i64):
-// CHECK: Block is in a loop
-// CHECK-NEXT: ^bb1(%0: i64)
-// CHECK: Block is in a loop
-// CHECK-NEXT: ^bb0:
-// CHECK-NEXT: %c1_i64
-// CHECK: Block is in a loop
-// CHECK-NEXT: ^bb2:
-// CHECK: Block is not in a loop
-// CHECK-NEXT: ^bb3:
-}

diff  --git a/mlir/test/lib/Interfaces/CMakeLists.txt b/mlir/test/lib/Interfaces/CMakeLists.txt
index 6a21ed10eec6f..4a0567ab46423 100644
--- a/mlir/test/lib/Interfaces/CMakeLists.txt
+++ b/mlir/test/lib/Interfaces/CMakeLists.txt
@@ -1,2 +1 @@
-add_subdirectory(LoopLikeInterface)
 add_subdirectory(TilingInterface)

diff  --git a/mlir/test/lib/Interfaces/LoopLikeInterface/CMakeLists.txt b/mlir/test/lib/Interfaces/LoopLikeInterface/CMakeLists.txt
deleted file mode 100644
index 05e006ebaa5b4..0000000000000
--- a/mlir/test/lib/Interfaces/LoopLikeInterface/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-add_mlir_library(MLIRLoopLikeInterfaceTestPasses
-  TestBlockInLoop.cpp
-
-  EXCLUDE_FROM_LIBMLIR
-
-  LINK_LIBS PUBLIC
-  MLIRPass
-  MLIRLoopLikeInterface
-  )

diff  --git a/mlir/test/lib/Interfaces/LoopLikeInterface/TestBlockInLoop.cpp b/mlir/test/lib/Interfaces/LoopLikeInterface/TestBlockInLoop.cpp
deleted file mode 100644
index d695195064a6a..0000000000000
--- a/mlir/test/lib/Interfaces/LoopLikeInterface/TestBlockInLoop.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-//===- TestBlockInLoop.cpp - Pass to test mlir::blockIsInLoop -------------===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-
-#include "mlir/Dialect/Func/IR/FuncOps.h"
-#include "mlir/IR/BuiltinOps.h"
-#include "mlir/Interfaces/LoopLikeInterface.h"
-#include "mlir/Pass/Pass.h"
-#include "llvm/Support/raw_ostream.h"
-
-using namespace mlir;
-
-namespace {
-/// This is a test pass that tests Blocks's isInLoop method by checking if each
-/// block in a function is in a loop and outputing if it is
-struct IsInLoopPass
-    : public PassWrapper<IsInLoopPass, OperationPass<func::FuncOp>> {
-  MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(IsInLoopPass)
-
-  StringRef getArgument() const final { return "test-block-is-in-loop"; }
-  StringRef getDescription() const final {
-    return "Test mlir::blockIsInLoop()";
-  }
-
-  void runOnOperation() override {
-    mlir::func::FuncOp func = getOperation();
-    func.walk([](mlir::Block *block) {
-      llvm::outs() << "Block is ";
-      if (LoopLikeOpInterface::blockIsInLoop(block))
-        llvm::outs() << "in a loop\n";
-      else
-        llvm::outs() << "not in a loop\n";
-      block->print(llvm::outs());
-      llvm::outs() << "\n";
-    });
-  }
-};
-
-} // namespace
-
-namespace mlir {
-void registerLoopLikeInterfaceTestPasses() { PassRegistration<IsInLoopPass>(); }
-} // namespace mlir

diff  --git a/mlir/tools/mlir-opt/CMakeLists.txt b/mlir/tools/mlir-opt/CMakeLists.txt
index fb7b4e77c5ec8..0c81891c80113 100644
--- a/mlir/tools/mlir-opt/CMakeLists.txt
+++ b/mlir/tools/mlir-opt/CMakeLists.txt
@@ -21,7 +21,6 @@ if(MLIR_INCLUDE_TESTS)
     MLIRFuncTestPasses
     MLIRGPUTestPasses
     MLIRLinalgTestPasses
-    MLIRLoopLikeInterfaceTestPasses
     MLIRMathTestPasses
     MLIRMemRefTestPasses
     MLIRNVGPUTestPasses

diff  --git a/mlir/tools/mlir-opt/mlir-opt.cpp b/mlir/tools/mlir-opt/mlir-opt.cpp
index 5a07004baf38f..33f16241b2e49 100644
--- a/mlir/tools/mlir-opt/mlir-opt.cpp
+++ b/mlir/tools/mlir-opt/mlir-opt.cpp
@@ -33,7 +33,6 @@ void registerConvertToTargetEnvPass();
 void registerCloneTestPasses();
 void registerPassManagerTestPass();
 void registerPrintSpirvAvailabilityPass();
-void registerLoopLikeInterfaceTestPasses();
 void registerShapeFunctionTestPasses();
 void registerSideEffectTestPasses();
 void registerSliceAnalysisTestPass();
@@ -141,7 +140,6 @@ void registerTestPasses() {
   registerConvertToTargetEnvPass();
   registerPassManagerTestPass();
   registerPrintSpirvAvailabilityPass();
-  registerLoopLikeInterfaceTestPasses();
   registerShapeFunctionTestPasses();
   registerSideEffectTestPasses();
   registerSliceAnalysisTestPass();


        


More information about the Mlir-commits mailing list