[Mlir-commits] [mlir] faab8c1 - [mlir] Rename BufferAliasAnalysis to BufferViewFlowAnalysis

Tres Popp llvmlistbot at llvm.org
Fri May 7 07:13:04 PDT 2021


Author: Tres Popp
Date: 2021-05-07T16:12:54+02:00
New Revision: faab8c140ab2480d978ccc3ea11cbc3b279736b6

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

LOG: [mlir] Rename BufferAliasAnalysis to BufferViewFlowAnalysis

This it to make more clear the difference between this and
an AliasAnalysis.

For example, given a sequence of subviews that create values
A -> B -> C -> d:
BufferViewFlowAnalysis::resolve(B) => {B, C, D}
AliasAnalysis::resolve(B) => {A, B, C, D}

Differential Revision: https://reviews.llvm.org/D100838

Added: 
    mlir/include/mlir/Analysis/BufferViewFlowAnalysis.h
    mlir/lib/Analysis/BufferViewFlowAnalysis.cpp

Modified: 
    mlir/include/mlir/Transforms/BufferUtils.h
    mlir/include/mlir/Transforms/Bufferize.h
    mlir/lib/Analysis/CMakeLists.txt
    mlir/lib/Transforms/BufferDeallocation.cpp
    mlir/lib/Transforms/BufferOptimizations.cpp

Removed: 
    mlir/include/mlir/Analysis/BufferAliasAnalysis.h
    mlir/lib/Analysis/BufferAliasAnalysis.cpp


################################################################################
diff  --git a/mlir/include/mlir/Analysis/BufferAliasAnalysis.h b/mlir/include/mlir/Analysis/BufferAliasAnalysis.h
deleted file mode 100644
index 4c9d717671d36..0000000000000
--- a/mlir/include/mlir/Analysis/BufferAliasAnalysis.h
+++ /dev/null
@@ -1,59 +0,0 @@
-//===- BufferAliasAnalysis.h - Buffer alias analysis for MLIR ---*- C++ -*-===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef MLIR_ANALYSIS_BUFFERALIASANALYSIS_H
-#define MLIR_ANALYSIS_BUFFERALIASANALYSIS_H
-
-#include "mlir/IR/Operation.h"
-#include "llvm/ADT/SmallPtrSet.h"
-
-namespace mlir {
-
-/// A straight-forward alias analysis which ensures that all aliases of all
-/// values will be determined. This is a requirement for the BufferPlacement
-/// class since you need to determine safe positions to place alloc and
-/// deallocs.
-class BufferAliasAnalysis {
-public:
-  using ValueSetT = SmallPtrSet<Value, 16>;
-  using ValueMapT = llvm::DenseMap<Value, ValueSetT>;
-
-public:
-  /// Constructs a new alias analysis using the op provided.
-  BufferAliasAnalysis(Operation *op);
-
-  /// Find all immediate aliases this value could potentially have.
-  ValueMapT::const_iterator find(Value value) const {
-    return aliases.find(value);
-  }
-
-  /// Returns the begin iterator to iterate over all aliases.
-  ValueMapT::const_iterator begin() const { return aliases.begin(); }
-
-  /// Returns the end iterator that can be used in combination with find.
-  ValueMapT::const_iterator end() const { return aliases.end(); }
-
-  /// Find all immediate and indirect aliases this value could potentially
-  /// have. Note that the resulting set will also contain the value provided as
-  /// it is an alias of itself.
-  ValueSetT resolve(Value value) const;
-
-  /// Removes the given values from all alias sets.
-  void remove(const SmallPtrSetImpl<Value> &aliasValues);
-
-private:
-  /// This function constructs a mapping from values to its immediate aliases.
-  void build(Operation *op);
-
-  /// Maps values to all immediate aliases this value can have.
-  ValueMapT aliases;
-};
-
-} // namespace mlir
-
-#endif // MLIR_ANALYSIS_BUFFERALIASANALYSIS_H

diff  --git a/mlir/include/mlir/Analysis/BufferViewFlowAnalysis.h b/mlir/include/mlir/Analysis/BufferViewFlowAnalysis.h
new file mode 100644
index 0000000000000..69561bf8e2aba
--- /dev/null
+++ b/mlir/include/mlir/Analysis/BufferViewFlowAnalysis.h
@@ -0,0 +1,71 @@
+//===- BufferViewFlowAnalysis.h - Buffer dependency analysis ---*- C++ -*-====//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_ANALYSIS_BUFFERVIEWFLOWANALYSIS_H
+#define MLIR_ANALYSIS_BUFFERVIEWFLOWANALYSIS_H
+
+#include "mlir/IR/Operation.h"
+#include "llvm/ADT/SmallPtrSet.h"
+
+namespace mlir {
+
+/// A straight-forward alias analysis which ensures that all dependencies of all
+/// values will be determined. This is a requirement for the BufferPlacement
+/// class since you need to determine safe positions to place alloc and
+/// deallocs. This alias analysis only finds aliases that might have been
+/// created on top of the specified view. To find all aliases, resolve the
+/// intial alloc/argument value.
+class BufferViewFlowAnalysis {
+public:
+  using ValueSetT = SmallPtrSet<Value, 16>;
+  using ValueMapT = llvm::DenseMap<Value, ValueSetT>;
+
+  /// Constructs a new alias analysis using the op provided.
+  BufferViewFlowAnalysis(Operation *op);
+
+  /// Find all immediate dependencies this value could potentially have.
+  ValueMapT::const_iterator find(Value value) const {
+    return dependencies.find(value);
+  }
+
+  /// Returns the begin iterator to iterate over all dependencies.
+  ValueMapT::const_iterator begin() const { return dependencies.begin(); }
+
+  /// Returns the end iterator that can be used in combination with find.
+  ValueMapT::const_iterator end() const { return dependencies.end(); }
+
+  /// Find all immediate and indirect views upong this value. This will find all
+  /// dependencies on this value that can potentially be later in the execution
+  /// of the program, but will not return values that this alias might have been
+  /// created from (such as if `value is created by a subview, this will not
+  /// return the parent view if there is no cyclic behavior). Note that the
+  /// resulting set will also contain the value provided as it is an alias of
+  /// itself.
+  ///
+  /// A = *
+  /// B = subview(A)
+  /// C = B
+  ///
+  /// Results in resolve(B) returning {B, C}
+  ValueSetT resolve(Value value) const;
+
+  /// Removes the given values from all alias sets.
+  void remove(const SmallPtrSetImpl<Value> &aliasValues);
+
+private:
+  /// This function constructs a mapping from values to its immediate
+  /// dependencies.
+  void build(Operation *op);
+
+  /// Maps values to all immediate dependencies this value can have.
+  ValueMapT dependencies;
+};
+
+} // namespace mlir
+
+#endif // MLIR_ANALYSIS_BUFFERVIEWFLOWANALYSIS_H

diff  --git a/mlir/include/mlir/Transforms/BufferUtils.h b/mlir/include/mlir/Transforms/BufferUtils.h
index e432fb8f53f55..f73c97d75a1e8 100644
--- a/mlir/include/mlir/Transforms/BufferUtils.h
+++ b/mlir/include/mlir/Transforms/BufferUtils.h
@@ -14,7 +14,7 @@
 #ifndef MLIR_TRANSFORMS_BUFFERUTILS_H
 #define MLIR_TRANSFORMS_BUFFERUTILS_H
 
-#include "mlir/Analysis/BufferAliasAnalysis.h"
+#include "mlir/Analysis/BufferViewFlowAnalysis.h"
 #include "mlir/Analysis/Liveness.h"
 #include "mlir/Dialect/StandardOps/IR/Ops.h"
 #include "mlir/IR/Builders.h"
@@ -71,7 +71,7 @@ class BufferPlacementAllocs {
 /// The base class for all BufferPlacement transformations.
 class BufferPlacementTransformationBase {
 public:
-  using ValueSetT = BufferAliasAnalysis::ValueSetT;
+  using ValueSetT = BufferViewFlowAnalysis::ValueSetT;
 
   /// Finds a common dominator for the given value while taking the positions
   /// of the values in the value set into account. It supports dominator and
@@ -106,7 +106,7 @@ class BufferPlacementTransformationBase {
 
 protected:
   /// Alias information that can be updated during the insertion of copies.
-  BufferAliasAnalysis aliases;
+  BufferViewFlowAnalysis aliases;
 
   /// Stores all internally managed allocations.
   BufferPlacementAllocs allocs;

diff  --git a/mlir/include/mlir/Transforms/Bufferize.h b/mlir/include/mlir/Transforms/Bufferize.h
index 22155f7de1d4f..12434edd32455 100644
--- a/mlir/include/mlir/Transforms/Bufferize.h
+++ b/mlir/include/mlir/Transforms/Bufferize.h
@@ -23,7 +23,7 @@
 #ifndef MLIR_TRANSFORMS_BUFFERIZE_H
 #define MLIR_TRANSFORMS_BUFFERIZE_H
 
-#include "mlir/Analysis/BufferAliasAnalysis.h"
+#include "mlir/Analysis/BufferViewFlowAnalysis.h"
 #include "mlir/Analysis/Liveness.h"
 #include "mlir/Dialect/StandardOps/IR/Ops.h"
 #include "mlir/IR/Builders.h"

diff  --git a/mlir/lib/Analysis/BufferAliasAnalysis.cpp b/mlir/lib/Analysis/BufferViewFlowAnalysis.cpp
similarity index 59%
rename from mlir/lib/Analysis/BufferAliasAnalysis.cpp
rename to mlir/lib/Analysis/BufferViewFlowAnalysis.cpp
index 4aac77ae49edb..994542e9a2da6 100644
--- a/mlir/lib/Analysis/BufferAliasAnalysis.cpp
+++ b/mlir/lib/Analysis/BufferViewFlowAnalysis.cpp
@@ -1,4 +1,4 @@
-//===- BufferAliasAnalysis.cpp - Buffer alias analysis for MLIR -*- C++ -*-===//
+//======- BufferViewFlowAnalysis.cpp - Buffer alias analysis -*- C++ -*-======//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "mlir/Analysis/BufferAliasAnalysis.h"
+#include "mlir/Analysis/BufferViewFlowAnalysis.h"
 
 #include "mlir/Interfaces/ControlFlowInterfaces.h"
 #include "mlir/Interfaces/ViewLikeInterface.h"
@@ -15,21 +15,21 @@
 using namespace mlir;
 
 /// Constructs a new alias analysis using the op provided.
-BufferAliasAnalysis::BufferAliasAnalysis(Operation *op) { build(op); }
+BufferViewFlowAnalysis::BufferViewFlowAnalysis(Operation *op) { build(op); }
 
-/// Find all immediate and indirect aliases this value could potentially
-/// have. Note that the resulting set will also contain the value provided as
-/// it is an alias of itself.
-BufferAliasAnalysis::ValueSetT
-BufferAliasAnalysis::resolve(Value rootValue) const {
+/// Find all immediate and indirect dependent buffers this value could
+/// potentially have. Note that the resulting set will also contain the value
+/// provided as it is a dependent alias of itself.
+BufferViewFlowAnalysis::ValueSetT
+BufferViewFlowAnalysis::resolve(Value rootValue) const {
   ValueSetT result;
   SmallVector<Value, 8> queue;
   queue.push_back(rootValue);
   while (!queue.empty()) {
     Value currentValue = queue.pop_back_val();
     if (result.insert(currentValue).second) {
-      auto it = aliases.find(currentValue);
-      if (it != aliases.end()) {
+      auto it = dependencies.find(currentValue);
+      if (it != dependencies.end()) {
         for (Value aliasValue : it->second)
           queue.push_back(aliasValue);
       }
@@ -39,29 +39,30 @@ BufferAliasAnalysis::resolve(Value rootValue) const {
 }
 
 /// Removes the given values from all alias sets.
-void BufferAliasAnalysis::remove(const SmallPtrSetImpl<Value> &aliasValues) {
-  for (auto &entry : aliases)
+void BufferViewFlowAnalysis::remove(const SmallPtrSetImpl<Value> &aliasValues) {
+  for (auto &entry : dependencies)
     llvm::set_subtract(entry.second, aliasValues);
 }
 
-/// This function constructs a mapping from values to its immediate aliases.
-/// It iterates over all blocks, gets their predecessors, determines the
-/// values that will be passed to the corresponding block arguments and
-/// inserts them into the underlying map. Furthermore, it wires successor
-/// regions and branch-like return operations from nested regions.
-void BufferAliasAnalysis::build(Operation *op) {
-  // Registers all aliases of the given values.
-  auto registerAliases = [&](auto values, auto aliases) {
-    for (auto entry : llvm::zip(values, aliases))
-      this->aliases[std::get<0>(entry)].insert(std::get<1>(entry));
+/// This function constructs a mapping from values to its immediate
+/// dependencies. It iterates over all blocks, gets their predecessors,
+/// determines the values that will be passed to the corresponding block
+/// arguments and inserts them into the underlying map. Furthermore, it wires
+/// successor regions and branch-like return operations from nested regions.
+void BufferViewFlowAnalysis::build(Operation *op) {
+  // Registers all dependencies of the given values.
+  auto registerDependencies = [&](auto values, auto dependencies) {
+    for (auto entry : llvm::zip(values, dependencies))
+      this->dependencies[std::get<0>(entry)].insert(std::get<1>(entry));
   };
 
-  // Add additional aliases created by view changes to the alias list.
+  // Add additional dependencies created by view changes to the alias list.
   op->walk([&](ViewLikeOpInterface viewInterface) {
-    aliases[viewInterface.getViewSource()].insert(viewInterface->getResult(0));
+    dependencies[viewInterface.getViewSource()].insert(
+        viewInterface->getResult(0));
   });
 
-  // Query all branch interfaces to link block argument aliases.
+  // Query all branch interfaces to link block argument dependencies.
   op->walk([&](BranchOpInterface branchInterface) {
     Block *parentBlock = branchInterface->getBlock();
     for (auto it = parentBlock->succ_begin(), e = parentBlock->succ_end();
@@ -71,8 +72,8 @@ void BufferAliasAnalysis::build(Operation *op) {
           branchInterface.getSuccessorOperands(it.getIndex());
       if (!successorOperands.hasValue())
         continue;
-      // Build the actual mapping of values to their immediate aliases.
-      registerAliases(successorOperands.getValue(), (*it)->getArguments());
+      // Build the actual mapping of values to their immediate dependencies.
+      registerDependencies(successorOperands.getValue(), (*it)->getArguments());
     }
   });
 
@@ -86,9 +87,10 @@ void BufferAliasAnalysis::build(Operation *op) {
       // successor inputs.
       assert(entrySuccessor.getSuccessor() &&
              "Invalid entry region without an attached successor region");
-      registerAliases(regionInterface.getSuccessorEntryOperands(
-                          entrySuccessor.getSuccessor()->getRegionNumber()),
-                      entrySuccessor.getSuccessorInputs());
+      registerDependencies(
+          regionInterface.getSuccessorEntryOperands(
+              entrySuccessor.getSuccessor()->getRegionNumber()),
+          entrySuccessor.getSuccessorInputs());
     }
 
     // Wire flow between regions and from region exits.
@@ -104,8 +106,8 @@ void BufferAliasAnalysis::build(Operation *op) {
         for (Block &block : region) {
           for (Operation &operation : block) {
             if (operation.hasTrait<OpTrait::ReturnLike>())
-              registerAliases(operation.getOperands(),
-                              successorRegion.getSuccessorInputs());
+              registerDependencies(operation.getOperands(),
+                                   successorRegion.getSuccessorInputs());
           }
         }
       }

diff  --git a/mlir/lib/Analysis/CMakeLists.txt b/mlir/lib/Analysis/CMakeLists.txt
index d0546628d0732..c996794b5c681 100644
--- a/mlir/lib/Analysis/CMakeLists.txt
+++ b/mlir/lib/Analysis/CMakeLists.txt
@@ -2,7 +2,7 @@ set(LLVM_OPTIONAL_SOURCES
   AliasAnalysis.cpp
   AffineAnalysis.cpp
   AffineStructures.cpp
-  BufferAliasAnalysis.cpp
+  BufferViewFlowAnalysis.cpp
   CallGraph.cpp
   DataFlowAnalysis.cpp
   LinearTransform.cpp
@@ -19,7 +19,7 @@ set(LLVM_OPTIONAL_SOURCES
 
 add_mlir_library(MLIRAnalysis
   AliasAnalysis.cpp
-  BufferAliasAnalysis.cpp
+  BufferViewFlowAnalysis.cpp
   CallGraph.cpp
   DataFlowAnalysis.cpp
   Liveness.cpp

diff  --git a/mlir/lib/Transforms/BufferDeallocation.cpp b/mlir/lib/Transforms/BufferDeallocation.cpp
index 3ba744d8e6efb..d1bf839037e07 100644
--- a/mlir/lib/Transforms/BufferDeallocation.cpp
+++ b/mlir/lib/Transforms/BufferDeallocation.cpp
@@ -15,7 +15,7 @@
 // liveness analysis does not pay attention to aliases, which can occur due to
 // branches (and their associated block arguments) in general. For this purpose,
 // BufferDeallocation firstly finds all possible aliases for a single value
-// (using the BufferAliasAnalysis class). Consider the following example:
+// (using the BufferViewFlowAnalysis class). Consider the following example:
 //
 // ^bb0(%arg0):
 //   cond_br %cond, ^bb1, ^bb2
@@ -30,7 +30,7 @@
 // We should place the dealloc for %new_value in exit. However, we have to free
 // the buffer in the same block, because it cannot be freed in the post
 // dominator. However, this requires a new clone buffer for %arg1 that will
-// contain the actual contents. Using the class BufferAliasAnalysis, we
+// contain the actual contents. Using the class BufferViewFlowAnalysis, we
 // will find out that %new_value has a potential alias %arg1. In order to find
 // the dealloc position we have to find all potential aliases, iterate over
 // their uses and find the common post-dominator block (note that additional

diff  --git a/mlir/lib/Transforms/BufferOptimizations.cpp b/mlir/lib/Transforms/BufferOptimizations.cpp
index b681c860de050..7d5b84db668bf 100644
--- a/mlir/lib/Transforms/BufferOptimizations.cpp
+++ b/mlir/lib/Transforms/BufferOptimizations.cpp
@@ -58,7 +58,7 @@ static bool defaultIsSmallAlloc(Value alloc, unsigned maximumSizeInBytes,
 /// Checks whether the given aliases leave the allocation scope.
 static bool
 leavesAllocationScope(Region *parentRegion,
-                      const BufferAliasAnalysis::ValueSetT &aliases) {
+                      const BufferViewFlowAnalysis::ValueSetT &aliases) {
   for (Value alias : aliases) {
     for (auto *use : alias.getUsers()) {
       // If there is at least one alias that leaves the parent region, we know
@@ -74,7 +74,7 @@ leavesAllocationScope(Region *parentRegion,
 
 /// Checks, if an automated allocation scope for a given alloc value exists.
 static bool hasAllocationScope(Value alloc,
-                               const BufferAliasAnalysis &aliasAnalysis) {
+                               const BufferViewFlowAnalysis &aliasAnalysis) {
   Region *region = alloc.getParentRegion();
   do {
     if (Operation *parentOp = region->getParentOp()) {


        


More information about the Mlir-commits mailing list