14#ifndef LLVM_ANALYSIS_LOOPCACHEANALYSIS_H
15#define LLVM_ANALYSIS_LOOPCACHEANALYSIS_H
63 return Subscripts[SubNum];
66 assert(!Subscripts.empty() &&
"Expecting non-empty container");
67 return Subscripts.front();
70 assert(!Subscripts.empty() &&
"Expecting non-empty container");
71 return Subscripts.back();
106 bool isLoopInvariant(
const Loop &L)
const;
113 bool isConsecutive(
const Loop &L,
const SCEV *&Stride,
unsigned CLS)
const;
120 int getSubscriptIndex(
const Loop &L)
const;
123 const SCEV *getLastCoefficient()
const;
127 bool isCoeffForLoopZeroOrInvariant(
const SCEV &Subscript,
128 const Loop &L)
const;
132 bool isSimpleAddRecurrence(
const SCEV &Subscript,
const Loop &L)
const;
140 bool IsValid =
false;
146 const SCEV *BasePointer =
nullptr;
190 using LoopTripCountTy = std::pair<const Loop *, unsigned>;
191 using LoopCacheCostTy = std::pair<const Loop *, CacheCostTy>;
201 std::optional<unsigned> TRT = std::nullopt);
207 LLVM_ABI static std::unique_ptr<CacheCost>
209 std::optional<unsigned> TRT = std::nullopt);
215 return LCC.first == &L;
217 return (
IT != LoopCosts.end()) ? (*IT).second : -1;
226 void calculateCacheFootprint();
249 const Loop &L)
const;
252 void sortLoopCosts() {
254 [](
const LoopCacheCostTy &
A,
const LoopCacheCostTy &
B) {
255 return A.second >
B.second;
264 SmallVector<LoopTripCountTy, 3> TripCounts;
267 SmallVector<LoopCacheCostTy, 3> LoopCosts;
271 std::optional<unsigned> TRT;
275 TargetTransformInfo &TTI;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static cl::opt< ITMode > IT(cl::desc("IT block support"), cl::Hidden, cl::init(DefaultIT), cl::values(clEnumValN(DefaultIT, "arm-default-it", "Generate any type of IT block"), clEnumValN(RestrictedIT, "arm-restrict-it", "Disallow complex IT blocks")))
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This header defines various interfaces for pass management in LLVM.
This file defines an InstructionCost class that is used when calculating the cost of an instruction,...
This header provides classes for managing per-loop analyses.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
CacheCost represents the estimated cost of a inner loop as the number of cache lines used by the memo...
LLVM_ABI CacheCost(const LoopVectorTy &Loops, const LoopInfo &LI, ScalarEvolution &SE, TargetTransformInfo &TTI, AAResults &AA, DependenceInfo &DI, std::optional< unsigned > TRT=std::nullopt)
Construct a CacheCost object for the loop nest described by Loops.
friend LLVM_ABI raw_ostream & operator<<(raw_ostream &OS, const CacheCost &CC)
ArrayRef< LoopCacheCostTy > getLoopCosts() const
Return the estimated ordered loop costs.
static LLVM_ABI std::unique_ptr< CacheCost > getCacheCost(Loop &Root, LoopStandardAnalysisResults &AR, DependenceInfo &DI, std::optional< unsigned > TRT=std::nullopt)
Create a CacheCost for the loop nest rooted by Root.
CacheCostTy getLoopCost(const Loop &L) const
Return the estimated cost of loop L if the given loop is part of the loop nest associated with this o...
DependenceInfo - This class is the main dependence-analysis driver.
Represents a memory reference as a base pointer and a set of indexing operations.
const SCEV * getBasePointer() const
LLVM_ABI CacheCostTy computeRefCost(const Loop &L, unsigned CLS) const
Compute the cost of the reference w.r.t.
const SCEV * getSubscript(unsigned SubNum) const
const SCEV * getFirstSubscript() const
LLVM_ABI std::optional< bool > hasSpacialReuse(const IndexedReference &Other, unsigned CLS, AAResults &AA) const
Return true/false if the current object and the indexed reference Other are/aren't in the same cache ...
LLVM_ABI std::optional< bool > hasTemporalReuse(const IndexedReference &Other, unsigned MaxDistance, const Loop &L, DependenceInfo &DI, AAResults &AA) const
Return true if the current object and the indexed reference Other have distance smaller than MaxDista...
LLVM_ABI IndexedReference(Instruction &StoreOrLoadInst, const LoopInfo &LI, ScalarEvolution &SE)
Construct an indexed reference given a StoreOrLoadInst instruction.
const SCEV * getLastSubscript() const
friend LLVM_ABI raw_ostream & operator<<(raw_ostream &OS, const IndexedReference &R)
size_t getNumSubscripts() const
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
LoopCachePrinterPass(raw_ostream &OS)
LLVM_ABI PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
Represents a single loop in the control flow graph.
A set of analyses that are preserved following a run of a transformation pass.
This class represents an analyzed expression in the program.
The main scalar evolution driver.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class implements an extremely fast bulk output stream that can only output to a stream.
Abstract Attribute helper functions.
This is an optimization pass for GlobalISel generic memory operations.
void stable_sort(R &&Range)
InstructionCost CacheCostTy
SmallVector< std::unique_ptr< IndexedReference >, 8 > ReferenceGroupTy
A reference group represents a set of memory references that exhibit temporal or spacial reuse.
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
SmallVector< Loop *, 8 > LoopVectorTy
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
LLVM_ABI void delinearize(ScalarEvolution &SE, const SCEV *Expr, SmallVectorImpl< const SCEV * > &Subscripts, SmallVectorImpl< const SCEV * > &Sizes, const SCEV *ElementSize)
Split this SCEVAddRecExpr into two vectors of SCEVs representing the subscripts and sizes of an array...
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
SmallVector< ReferenceGroupTy, 8 > ReferenceGroupsTy
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...
A CRTP mix-in for passes that should not be skipped.