9#ifndef FORTRAN_OPTIMIZER_ANALYSIS_ALIASANALYSIS_H
10#define FORTRAN_OPTIMIZER_ANALYSIS_ALIASANALYSIS_H
12#include "flang/Common/enum-class.h"
13#include "flang/Common/enum-set.h"
14#include "mlir/Analysis/AliasAnalysis.h"
15#include "mlir/IR/BuiltinAttributes.h"
16#include "mlir/IR/SymbolTable.h"
17#include "mlir/IR/Value.h"
18#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/PointerUnion.h"
20#include "llvm/ADT/SmallVector.h"
52 ENUM_CLASS(Attribute, Target, Pointer, IntentIn, CrayPointer, CrayPointee);
120 using SourceUnion = llvm::PointerUnion<mlir::SymbolRefAttr, mlir::Value>;
161 bool operator==(
const PathStep &o)
const {
164 bool operator!=(
const PathStep &o)
const {
return !(*
this == o); }
188 return llvm::any_of(steps, [](
const PathStep &s) {
193 void print(llvm::raw_ostream &os)
const;
213 void print(llvm::raw_ostream &os)
const;
233 bool isDummyArgument()
const;
235 bool isBoxData()
const;
260 mlir::Type getType()
const;
263 friend llvm::raw_ostream &operator<<(llvm::raw_ostream &os,
267 mlir::AliasResult
alias(Source lhsSrc, Source rhsSrc, mlir::Value lhs,
271 mlir::AliasResult
alias(mlir::Value lhs, mlir::Value rhs);
274 mlir::ModRefResult
getModRef(mlir::Operation *op, mlir::Value location);
280 mlir::ModRefResult
getModRef(mlir::Region ®ion, mlir::Value location);
287 bool getLastInstantiationPoint =
false);
296 static bool isRecordWithPointerComponent(mlir::Type ty);
301 const mlir::SymbolTable *getNearestSymbolTable(mlir::Operation *from);
306 bool symbolMayHaveTargetAttr(mlir::SymbolRefAttr symbol,
307 mlir::Operation *from);
311 bool isCallToFortranUserProcedure(mlir::Operation *op);
316 mlir::ModRefResult getCallModRef(mlir::Operation *op, mlir::Value var);
331 llvm::DenseMap<mlir::Operation *, mlir::SymbolTable> symTabMap;
338inline bool operator!=(
const AliasAnalysis::Source::SourceOrigin &lhs,
339 const AliasAnalysis::Source::SourceOrigin &rhs) {
340 return !(lhs == rhs);
343inline llvm::raw_ostream &operator<<(llvm::raw_ostream &os,
Definition AbstractConverter.h:37
Definition AliasAnalysis.h:178
bool hasPointerDeref() const
Return true if any step is a PointerDeref.
Definition AliasAnalysis.h:187
bool isApproximate
Definition AliasAnalysis.h:184
Definition AliasAnalysis.h:145
mlir::StringAttr component
Definition AliasAnalysis.h:159
Kind
Definition AliasAnalysis.h:146
@ Component
Named component access, e.g. xfield.
Definition AliasAnalysis.h:148
@ AllocDeref
Loading an ALLOCATABLE box (fir.load of !fir.box<!fir.heap<...>>).
Definition AliasAnalysis.h:153
@ PointerDeref
Definition AliasAnalysis.h:151
Definition AliasAnalysis.h:123
mlir::Operation * instantiationPoint
Definition AliasAnalysis.h:136
SourceUnion u
Source definition of a value.
Definition AliasAnalysis.h:125
bool isData
Whether the source was reached following data or box reference.
Definition AliasAnalysis.h:139
Definition AliasAnalysis.h:119
bool isCrayPointer() const
Return true, if CrayPointer attribute is set.
Definition AliasAnalysis.cpp:227
bool isCapturedInInternalProcedure
Source object is used in an internal procedure via host association.
Definition AliasAnalysis.h:210
bool isFortranUserVariable() const
Is this source a variable from the Fortran source?
Definition AliasAnalysis.cpp:248
Attributes attributes
Attributes of the memory source object, e.g. Target.
Definition AliasAnalysis.h:203
bool isPointer() const
Return true, if Pointer attribute is set.
Definition AliasAnalysis.cpp:219
SourceKind kind
Kind of the memory source.
Definition AliasAnalysis.h:199
bool isCrayPointee() const
Return true, if CrayPointee attribute is set.
Definition AliasAnalysis.cpp:223
void print(llvm::raw_ostream &os) const
Print information about the memory source to os.
Definition AliasAnalysis.cpp:176
bool mayBePtrDummyArgOrHostAssoc() const
mayBeDummyArgOrHostAssoc and the address of a pointer?
Definition AliasAnalysis.cpp:263
bool isTargetOrPointer() const
Return true, if Target or Pointer attribute is set.
Definition AliasAnalysis.cpp:210
bool mayBeDummyArgOrHostAssoc() const
Definition AliasAnalysis.cpp:259
AccessPath accessPath
The structured access path from the root variable.
Definition AliasAnalysis.h:208
bool approximateSource
Definition AliasAnalysis.h:206
bool mayBeActualArgWithPtr(const mlir::Value *val) const
Definition AliasAnalysis.cpp:278
mlir::Type valueType
Value type of the source definition.
Definition AliasAnalysis.h:201
bool isCrayPointerOrPointee() const
Return true, if CrayPointer or CrayPointee attribute is set.
Definition AliasAnalysis.cpp:231
bool isTarget() const
Return true, if Target attribute is set.
Definition AliasAnalysis.cpp:215
bool mayBeActualArg() const
The address of an actual argument of the current function?
Definition AliasAnalysis.cpp:274
Definition AliasAnalysis.h:27
mlir::AliasResult alias(Source lhsSrc, Source rhsSrc, mlir::Value lhs, mlir::Value rhs)
Given the values and their sources, return their aliasing behavior.
Definition AliasAnalysis.cpp:385
static bool isPointerReference(mlir::Type ty)
Definition AliasAnalysis.cpp:202
ENUM_CLASS(Attribute, Target, Pointer, IntentIn, CrayPointer, CrayPointee)
Attributes of the memory source object.
ENUM_CLASS(SourceKind, Allocate, Global, Argument, HostAssoc, Indirect, Unknown)
Kind of the memory source referenced by a value.
fir::AliasAnalysis::Source getSource(mlir::Value, bool getLastInstantiationPoint=false)
Definition AliasAnalysis.cpp:808
mlir::ModRefResult getModRef(mlir::Operation *op, mlir::Value location)
Return the modify-reference behavior of op on location.