//===- LocalAliasAnalysis.cpp - Local stateless alias Analysis for MLIR ---===// // // 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/Analysis/AliasAnalysis/LocalAliasAnalysis.h" #include "mlir/Analysis/AliasAnalysis.h" #include "mlir/IR/Attributes.h" #include "mlir/IR/Block.h" #include "mlir/IR/Matchers.h" #include "mlir/IR/OpDefinition.h" #include "mlir/IR/Operation.h" #include "mlir/IR/Region.h" #include "mlir/IR/Value.h" #include "mlir/IR/ValueRange.h" #include "mlir/Interfaces/ControlFlowInterfaces.h" #include "mlir/Interfaces/FunctionInterfaces.h" #include "mlir/Interfaces/SideEffectInterfaces.h" #include "mlir/Interfaces/ViewLikeInterface.h" #include "mlir/Support/LLVM.h" #include "llvm/Support/Casting.h" #include <cassert> #include <optional> #include <utility> usingnamespacemlir; //===----------------------------------------------------------------------===// // Underlying Address Computation //===----------------------------------------------------------------------===// /// The maximum depth that will be searched when trying to find an underlying /// value. static constexpr unsigned maxUnderlyingValueSearchDepth = …; /// Given a value, collect all of the underlying values being addressed. static void collectUnderlyingAddressValues(Value value, unsigned maxDepth, DenseSet<Value> &visited, SmallVectorImpl<Value> &output); /// Given a successor (`region`) of a RegionBranchOpInterface, collect all of /// the underlying values being addressed by one of the successor inputs. If the /// provided `region` is null, as per `RegionBranchOpInterface` this represents /// the parent operation. static void collectUnderlyingAddressValues(RegionBranchOpInterface branch, Region *region, Value inputValue, unsigned inputIndex, unsigned maxDepth, DenseSet<Value> &visited, SmallVectorImpl<Value> &output) { … } /// Given a result, collect all of the underlying values being addressed. static void collectUnderlyingAddressValues(OpResult result, unsigned maxDepth, DenseSet<Value> &visited, SmallVectorImpl<Value> &output) { … } /// Given a block argument, collect all of the underlying values being /// addressed. static void collectUnderlyingAddressValues(BlockArgument arg, unsigned maxDepth, DenseSet<Value> &visited, SmallVectorImpl<Value> &output) { … } /// Given a value, collect all of the underlying values being addressed. static void collectUnderlyingAddressValues(Value value, unsigned maxDepth, DenseSet<Value> &visited, SmallVectorImpl<Value> &output) { … } /// Given a value, collect all of the underlying values being addressed. static void collectUnderlyingAddressValues(Value value, SmallVectorImpl<Value> &output) { … } //===----------------------------------------------------------------------===// // LocalAliasAnalysis: alias //===----------------------------------------------------------------------===// /// Given a value, try to get an allocation effect attached to it. If /// successful, `allocEffect` is populated with the effect. If an effect was /// found, `allocScopeOp` is also specified if a parent operation of `value` /// could be identified that bounds the scope of the allocated value; i.e. if /// non-null it specifies the parent operation that the allocation does not /// escape. If no scope is found, `allocScopeOp` is set to nullptr. static LogicalResult getAllocEffectFor(Value value, std::optional<MemoryEffects::EffectInstance> &effect, Operation *&allocScopeOp) { … } /// Given the two values, return their aliasing behavior. AliasResult LocalAliasAnalysis::aliasImpl(Value lhs, Value rhs) { … } /// Given the two values, return their aliasing behavior. AliasResult LocalAliasAnalysis::alias(Value lhs, Value rhs) { … } //===----------------------------------------------------------------------===// // LocalAliasAnalysis: getModRef //===----------------------------------------------------------------------===// ModRefResult LocalAliasAnalysis::getModRef(Operation *op, Value location) { … }