1 //===- BufferAliasAnalysis.h - Buffer alias analysis for MLIR ---*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef MLIR_ANALYSIS_BUFFERALIASANALYSIS_H
10 #define MLIR_ANALYSIS_BUFFERALIASANALYSIS_H
11 
12 #include "mlir/IR/Operation.h"
13 #include "llvm/ADT/SmallPtrSet.h"
14 
15 namespace mlir {
16 
17 /// A straight-forward alias analysis which ensures that all aliases of all
18 /// values will be determined. This is a requirement for the BufferPlacement
19 /// class since you need to determine safe positions to place alloc and
20 /// deallocs.
21 class BufferAliasAnalysis {
22 public:
23   using ValueSetT = SmallPtrSet<Value, 16>;
24   using ValueMapT = llvm::DenseMap<Value, ValueSetT>;
25 
26 public:
27   /// Constructs a new alias analysis using the op provided.
28   BufferAliasAnalysis(Operation *op);
29 
30   /// Find all immediate aliases this value could potentially have.
find(Value value)31   ValueMapT::const_iterator find(Value value) const {
32     return aliases.find(value);
33   }
34 
35   /// Returns the begin iterator to iterate over all aliases.
begin()36   ValueMapT::const_iterator begin() const { return aliases.begin(); }
37 
38   /// Returns the end iterator that can be used in combination with find.
end()39   ValueMapT::const_iterator end() const { return aliases.end(); }
40 
41   /// Find all immediate and indirect aliases this value could potentially
42   /// have. Note that the resulting set will also contain the value provided as
43   /// it is an alias of itself.
44   ValueSetT resolve(Value value) const;
45 
46   /// Removes the given values from all alias sets.
47   void remove(const SmallPtrSetImpl<Value> &aliasValues);
48 
49 private:
50   /// This function constructs a mapping from values to its immediate aliases.
51   void build(Operation *op);
52 
53   /// Maps values to all immediate aliases this value can have.
54   ValueMapT aliases;
55 };
56 
57 } // namespace mlir
58 
59 #endif // MLIR_ANALYSIS_BUFFERALIASANALYSIS_H
60