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/Dominance.h"
17#include "mlir/IR/SymbolTable.h"
18#include "mlir/IR/Value.h"
19#include "llvm/ADT/DenseMap.h"
20#include "llvm/ADT/PointerUnion.h"
21#include "llvm/ADT/SmallVector.h"
34 AliasAnalysis() =
default;
37 explicit AliasAnalysis(AliasAnalysisRecursiveEffectsCache &cache);
39 AliasAnalysis(AliasAnalysis &&other)
noexcept;
43 AliasAnalysis(
const AliasAnalysis &) =
delete;
44 AliasAnalysis &operator=(
const AliasAnalysis &) =
delete;
45 AliasAnalysis &operator=(AliasAnalysis &&) =
delete;
80 ENUM_CLASS(Attribute, Target, Pointer, IntentIn, CrayPointer, CrayPointee);
148 using SourceUnion = llvm::PointerUnion<mlir::SymbolRefAttr, mlir::Value>;
192 bool operator==(
const PathStep &o)
const {
196 bool operator!=(
const PathStep &o)
const {
return !(*
this == o); }
226 return llvm::any_of(steps, [](
const PathStep &s) {
235 bool operator!=(
const AccessPath &o)
const {
return !(*
this == o); }
237 void print(llvm::raw_ostream &os)
const;
314 void print(llvm::raw_ostream &os)
const;
338 bool isDummyArgument()
const;
340 bool isBoxData()
const;
365 mlir::Type getType()
const;
368 friend llvm::raw_ostream &operator<<(llvm::raw_ostream &os,
376 mlir::AliasResult
alias(mlir::Value lhs, mlir::Value rhs);
379 mlir::ModRefResult
getModRef(mlir::Operation *op, mlir::Value location);
385 mlir::ModRefResult
getModRef(mlir::Region ®ion, mlir::Value location);
405 bool getLastInstantiationPoint =
false,
406 bool collectScopedOrigins =
true);
419 return getSourceCache.size();
424 std::size_t getSourceCacheMissesForTesting()
const {
425 return sourceCacheMisses;
443 friend class AliasAnalysisRecursiveEffectsCache;
449 bool getLastInstantiationPoint,
450 bool collectScopedOrigins);
453 void clearSourceCache() { getSourceCache.clear(); }
468 mlir::Value getDeclarationScope(mlir::Operation *declareOp);
472 static bool isRecordWithPointerComponent(mlir::Type ty);
477 const mlir::SymbolTable *getNearestSymbolTable(mlir::Operation *from);
482 bool symbolMayHaveTargetAttr(mlir::SymbolRefAttr symbol,
483 mlir::Operation *from);
487 bool isCallToFortranUserProcedure(mlir::Operation *op);
492 mlir::ModRefResult getCallModRef(mlir::Operation *op, mlir::Value var);
507 llvm::DenseMap<mlir::Operation *, mlir::SymbolTable> symTabMap;
522 llvm::DenseMap<mlir::Operation *, std::unique_ptr<mlir::DominanceInfo>>
524 llvm::DenseMap<mlir::Operation *, llvm::SmallVector<mlir::Operation *, 16>>
530 llvm::DenseMap<mlir::Operation *, bool> multiScopeCache;
537 llvm::DenseMap<std::pair<mlir::Value, unsigned>,
Source> getSourceCache;
540 bool sourceCacheEnabled =
false;
544 std::size_t sourceCacheHits = 0;
545 std::size_t sourceCacheMisses = 0;
548 AliasAnalysisRecursiveEffectsCache *cache =
nullptr;
553class AliasAnalysisRecursiveEffectsCache {
555 AliasAnalysisRecursiveEffectsCache() =
default;
556 ~AliasAnalysisRecursiveEffectsCache() {
561 AliasAnalysisRecursiveEffectsCache(
562 const AliasAnalysisRecursiveEffectsCache &) =
delete;
563 AliasAnalysisRecursiveEffectsCache &
564 operator=(
const AliasAnalysisRecursiveEffectsCache &) =
delete;
565 AliasAnalysisRecursiveEffectsCache(AliasAnalysisRecursiveEffectsCache &&) =
567 AliasAnalysisRecursiveEffectsCache &
568 operator=(AliasAnalysisRecursiveEffectsCache &&) =
delete;
580 std::size_t getSummaryCacheMissesForTesting()
const {
return summaryMisses; }
583 friend struct AliasAnalysis;
591 bool isFortranUserProcedure;
595 bool hasUnknownWrite =
false;
596 bool hasUnknownRead =
false;
597 llvm::SmallVector<mlir::Value, 16> writeLocations;
598 llvm::SmallVector<mlir::Value, 16> readLocations;
599 llvm::SmallVector<CallInfo, 4> calls;
605 void buildSummary(mlir::Operation *op, Summary &out);
606 void buildSummary(mlir::Region ®ion, Summary &out);
608 mlir::ModRefResult getModRefFromSummary(mlir::Operation *op,
609 mlir::Value location);
612 AliasAnalysis *aa =
nullptr;
613 llvm::DenseMap<mlir::Operation *, Summary> summaries;
616 std::size_t summaryHits = 0;
617 std::size_t summaryMisses = 0;
622 return lhs.u == rhs.u && lhs.isData == rhs.isData;
626 return !(lhs == rhs);
629inline llvm::raw_ostream &operator<<(llvm::raw_ostream &os,
Definition AliasAnalysis.h:553
std::size_t getSummaryCacheHitsForTesting() const
Definition AliasAnalysis.h:579
std::size_t getSummaryCacheSizeForTesting() const
Testing only: number of op summaries currently held.
Definition AliasAnalysis.h:575
void clear()
Definition AliasAnalysis.h:572
Definition AbstractConverter.h:37
Definition AliasAnalysis.h:210
mlir::Operation * storageDecl
Definition AliasAnalysis.h:222
bool hasPointerDeref() const
Return true if any step is a PointerDeref.
Definition AliasAnalysis.h:225
bool isApproximate
Definition AliasAnalysis.h:216
Definition AliasAnalysis.h:173
mlir::StringAttr component
Definition AliasAnalysis.h:187
mlir::Type recordType
Definition AliasAnalysis.h:190
Kind
Definition AliasAnalysis.h:174
@ Component
Named component access, e.g. xfield.
Definition AliasAnalysis.h:176
@ AllocDeref
Loading an ALLOCATABLE box (fir.load of !fir.box<!fir.heap<...>>).
Definition AliasAnalysis.h:181
@ PointerDeref
Definition AliasAnalysis.h:179
Definition AliasAnalysis.h:271
mlir::Value scope
Definition AliasAnalysis.h:275
AccessPath accessPath
Definition AliasAnalysis.h:280
bool isData
Definition AliasAnalysis.h:289
mlir::Value declValue
Result SSA value of the [hl]fir.declare op.
Definition AliasAnalysis.h:277
bool approximateSource
Whether the path is approximate at the moment of the snapshot.
Definition AliasAnalysis.h:286
Attributes attributes
Definition AliasAnalysis.h:284
Definition AliasAnalysis.h:151
mlir::Operation * instantiationPoint
Definition AliasAnalysis.h:164
SourceUnion u
Source definition of a value.
Definition AliasAnalysis.h:153
bool isData
Whether the source was reached following data or box reference.
Definition AliasAnalysis.h:167
Definition AliasAnalysis.h:147
bool isCrayPointer() const
Return true, if CrayPointer attribute is set.
Definition AliasAnalysis.cpp:485
bool isCapturedInInternalProcedure
Source object is used in an internal procedure via host association.
Definition AliasAnalysis.h:306
bool isFortranUserVariable() const
Is this source a variable from the Fortran source?
Definition AliasAnalysis.cpp:506
Attributes attributes
Attributes of the memory source object, e.g. Target.
Definition AliasAnalysis.h:299
bool isPointer() const
Return true, if Pointer attribute is set.
Definition AliasAnalysis.cpp:466
llvm::SmallVector< ScopedOrigin, 4 > scopedOrigins
Definition AliasAnalysis.h:311
SourceKind kind
Kind of the memory source.
Definition AliasAnalysis.h:295
bool isCrayPointee() const
Return true, if CrayPointee attribute is set.
Definition AliasAnalysis.cpp:481
void print(llvm::raw_ostream &os) const
Print information about the memory source to os.
Definition AliasAnalysis.cpp:423
bool mayBePtrDummyArgOrHostAssoc() const
mayBeDummyArgOrHostAssoc and the address of a pointer?
Definition AliasAnalysis.cpp:522
bool isTargetOrPointer() const
Return true, if Target or Pointer attribute is set.
Definition AliasAnalysis.cpp:457
bool mayBeDummyArgOrHostAssoc() const
Definition AliasAnalysis.cpp:517
AccessPath accessPath
The structured access path from the root variable.
Definition AliasAnalysis.h:304
bool approximateSource
Definition AliasAnalysis.h:302
bool mayBeActualArgWithPtr(const mlir::Value *val) const
Definition AliasAnalysis.cpp:537
mlir::Type valueType
Value type of the source definition.
Definition AliasAnalysis.h:297
bool isCrayPointerOrPointee() const
Return true, if CrayPointer or CrayPointee attribute is set.
Definition AliasAnalysis.cpp:489
bool isDeclaredAllocatable() const
Definition AliasAnalysis.cpp:470
bool isTarget() const
Return true, if Target attribute is set.
Definition AliasAnalysis.cpp:462
bool mayBeActualArg() const
The address of an actual argument of the current function?
Definition AliasAnalysis.cpp:533
std::size_t getSourceCacheSizeForTesting() const
Testing only: number of entries currently held in the getSource() cache.
Definition AliasAnalysis.h:418
void enableSourceCache()
Definition AliasAnalysis.cpp:1609
fir::AliasAnalysis::Source getSource(mlir::Value, bool getLastInstantiationPoint=false, bool collectScopedOrigins=true)
Definition AliasAnalysis.cpp:1616
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:789
void disableSourceCache()
Disable getSource() memoization and drop any cached entries.
Definition AliasAnalysis.cpp:1611
static bool isPointerReference(mlir::Type ty)
Definition AliasAnalysis.cpp:449
ENUM_CLASS(SourceKind, Null, Allocate, Global, Argument, HostAssoc, Indirect, Unknown)
std::size_t getSourceCacheHitsForTesting() const
Testing only: cumulative getSource() cache hits / misses on this instance.
Definition AliasAnalysis.h:423
ENUM_CLASS(Attribute, Target, Pointer, IntentIn, CrayPointer, CrayPointee)
Attributes of the memory source object.
bool functionHasMultipleScopes(mlir::Value v)
Definition AliasAnalysis.cpp:2369
mlir::ModRefResult getModRef(mlir::Operation *op, mlir::Value location)
Return the modify-reference behavior of op on location.