39#ifndef LLVM_ANALYSIS_DEPENDENCEANALYSIS_H
40#define LLVM_ANALYSIS_DEPENDENCEANALYSIS_H
79 :
Src(Source),
Dst(Destination), Assumptions(
A) {}
96 enum :
unsigned char {
122 bool isOutput()
const;
154 virtual unsigned getDirection(
unsigned Level,
bool SameSD =
false)
const {
186 virtual bool isScalar(
unsigned Level,
bool SameSD =
false)
const;
210 void dumpImp(
raw_ostream &OS,
bool IsSameSD =
false)
const;
217 const Dependence *NextPredecessor =
nullptr, *NextSuccessor =
nullptr;
233 bool PossiblyLoopIndependent,
unsigned Levels);
256 assert(0 < Level && Level <= Levels &&
"Level out of range");
257 return DV[Level - 1];
260 Level <=
static_cast<unsigned>(Levels) + SameSDLevels &&
261 "isSameSD level out of range");
262 return DVSameSD[Level - Levels - 1];
268 unsigned getDirection(
unsigned Level,
bool SameSD =
false)
const override;
272 const SCEV *getDistance(
unsigned Level,
bool SameSD =
false)
const override;
276 bool isDirectionNegative()
const override;
289 bool inSameSDLoops(
unsigned Level)
const override;
294 bool isScalar(
unsigned Level,
bool SameSD =
false)
const override;
297 unsigned short Levels;
298 unsigned short SameSDLevels;
299 bool LoopIndependent;
300 std::unique_ptr<DVEntry[]> DV;
301 std::unique_ptr<DVEntry[]> DVSameSD;
309 : AA(AA), SE(SE), LI(LI), F(F) {}
313 FunctionAnalysisManager::Invalidator &Inv);
322 LLVM_ABI std::unique_ptr<Dependence>
324 bool UnderRuntimeAssumptions =
false);
340 enum ClassificationKind { ZIV, SIV, RDIV, MIV, NonLinear } Classification;
341 SmallBitVector
Loops;
344 struct CoefficientInfo {
345 const SCEV *SrcCoeff;
346 const SCEV *DstCoeff;
347 const SCEV *MaxIterIndex;
351 const SCEV *Upper[8];
352 const SCEV *Lower[8];
353 unsigned char Direction;
354 unsigned char DirSet;
361 bool haveSameSD(
const Loop *SrcLoop,
const Loop *DstLoop)
const;
425 void establishNestingLevels(
const Instruction *Src,
const Instruction *Dst);
427 unsigned CommonLevels, SrcLevels, MaxLevels, SameSDLevels;
431 unsigned mapSrcLoop(
const Loop *SrcLoop)
const;
435 unsigned mapDstLoop(
const Loop *DstLoop)
const;
439 bool isLoopInvariant(
const SCEV *Expression,
const Loop *LoopNest)
const;
443 void collectCommonLoops(
const SCEV *Expression,
const Loop *LoopNest,
444 SmallBitVector &
Loops)
const;
448 bool checkSrcSubscript(
const SCEV *Src,
const Loop *LoopNest,
449 SmallBitVector &
Loops);
453 bool checkDstSubscript(
const SCEV *Dst,
const Loop *LoopNest,
454 SmallBitVector &
Loops);
461 const SCEV *collectUpperBound(
const Loop *l,
Type *
T)
const;
466 std::optional<APInt> collectNonNegativeConstantUpperBound(
const Loop *L,
472 Subscript::ClassificationKind
473 classifyPair(
const SCEV *Src,
const Loop *SrcLoopNest,
const SCEV *Dst,
474 const Loop *DstLoopNest, SmallBitVector &
Loops);
480 bool testZIV(
const SCEV *Src,
const SCEV *Dst, FullDependence &Result)
const;
491 bool testSIV(
const SCEV *Src,
const SCEV *Dst,
unsigned &Level,
492 FullDependence &Result,
bool UnderRuntimeAssumptions);
502 bool testRDIV(
const SCEV *Src,
const SCEV *Dst, FullDependence &Result)
const;
507 bool testMIV(
const SCEV *Src,
const SCEV *Dst,
const SmallBitVector &
Loops,
508 FullDependence &Result)
const;
518 bool strongSIVtest(
const SCEVAddRecExpr *Src,
const SCEVAddRecExpr *Dst,
519 unsigned Level, FullDependence &Result,
520 bool UnderRuntimeAssumptions);
530 bool weakCrossingSIVtest(
const SCEVAddRecExpr *Src,
const SCEVAddRecExpr *Dst,
531 unsigned Level, FullDependence &Result)
const;
541 bool exactSIVtest(
const SCEVAddRecExpr *Src,
const SCEVAddRecExpr *Dst,
542 unsigned Level, FullDependence &Result)
const;
546 bool weakZeroSIVtestImpl(
const SCEVAddRecExpr *AR,
const SCEV *Const,
547 unsigned Level, FullDependence &Result)
const;
557 bool weakZeroSrcSIVtest(
const SCEV *SrcConst,
const SCEVAddRecExpr *Dst,
558 unsigned Level, FullDependence &Result)
const;
568 bool weakZeroDstSIVtest(
const SCEVAddRecExpr *Src,
const SCEV *DstConst,
569 unsigned Level, FullDependence &Result)
const;
578 bool exactRDIVtest(
const SCEVAddRecExpr *Src,
const SCEVAddRecExpr *Dst,
579 FullDependence &Result)
const;
585 bool exactTestImpl(
const SCEVAddRecExpr *Src,
const SCEVAddRecExpr *Dst,
586 FullDependence &Result,
587 std::optional<unsigned> Level)
const;
594 bool gcdMIVtest(
const SCEV *Src,
const SCEV *Dst,
595 FullDependence &Result)
const;
600 bool banerjeeMIVtest(
const SCEV *Src,
const SCEV *Dst,
601 const SmallBitVector &
Loops,
602 FullDependence &Result)
const;
607 const SCEV *collectCoeffInfo(
const SCEV *Subscript,
bool SrcFlag,
626 const SCEV *accumulateCoefficientsGCD(
const SCEV *Expr,
const Loop *CurLoop,
627 const SCEV *&CurLoopCoeff,
628 APInt &RunningGCD)
const;
646 const SmallBitVector &
Loops,
const SCEV *Delta,
647 const FullDependence &Result)
const;
651 bool testBounds(
unsigned char DirKind,
unsigned Level,
676 bool tryDelinearize(Instruction *Src, Instruction *Dst,
677 SmallVectorImpl<Subscript> &Pair);
682 bool tryDelinearizeFixedSize(Instruction *Src, Instruction *Dst,
683 const SCEV *SrcAccessFn,
const SCEV *DstAccessFn,
684 SmallVectorImpl<const SCEV *> &SrcSubscripts,
685 SmallVectorImpl<const SCEV *> &DstSubscripts);
691 tryDelinearizeParametricSize(Instruction *Src, Instruction *Dst,
692 const SCEV *SrcAccessFn,
const SCEV *DstAccessFn,
693 SmallVectorImpl<const SCEV *> &SrcSubscripts,
694 SmallVectorImpl<const SCEV *> &DstSubscripts);
698 bool checkSubscript(
const SCEV *Expr,
const Loop *LoopNest,
699 SmallBitVector &
Loops,
bool IsSrc);
717 : OS(OS), NormalizeResults(NormalizeResults) {}
723 bool NormalizeResults;
739 std::unique_ptr<DependenceInfo> info;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static bool runOnFunction(Function &F, bool PostInlining)
This header defines various interfaces for pass management in LLVM.
static bool isInput(const ArrayRef< StringRef > &Prefixes, StringRef Arg)
FunctionAnalysisManager FAM
This file implements the SmallBitVector class.
Represent the analysis usage information of a pass.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
void getAnalysisUsage(AnalysisUsage &) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
DependenceInfo & getDI() const
DependenceAnalysisWrapperPass()
void releaseMemory() override
releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memo...
AnalysisPass to compute dependence information in a function.
LLVM_ABI Result run(Function &F, FunctionAnalysisManager &FAM)
DependenceInfo - This class is the main dependence-analysis driver.
LLVM_ABI bool invalidate(Function &F, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &Inv)
Handle transitive invalidation when the cached analysis results go away.
Function * getFunction() const
DependenceInfo(Function *F, AAResults *AA, ScalarEvolution *SE, LoopInfo *LI)
LLVM_ABI std::unique_ptr< Dependence > depends(Instruction *Src, Instruction *Dst, bool UnderRuntimeAssumptions=false)
depends - Tests for a dependence between the Src and Dst instructions.
Instruction * getDst() const
getDst - Returns the destination instruction for this dependence.
Dependence & operator=(Dependence &&)=default
bool isOrdered() const
isOrdered - Returns true if dependence is Output, Flow, or Anti
void setNextSuccessor(const Dependence *succ)
setNextSuccessor - Sets the value of the NextSuccessor field.
friend class DependenceInfo
Dependence(Instruction *Source, Instruction *Destination, const SCEVUnionPredicate &A)
Dependence(Dependence &&)=default
bool isUnordered() const
isUnordered - Returns true if dependence is Input
SCEVUnionPredicate getRuntimeAssumptions() const
getRuntimeAssumptions - Returns the runtime assumptions under which this Dependence relation is valid...
virtual bool isConfused() const
isConfused - Returns true if this dependence is confused (the compiler understands nothing and makes ...
virtual unsigned getSameSDLevels() const
getSameSDLevels - Returns the number of separate SameSD loops surrounding the source and destination ...
virtual const SCEV * getDistance(unsigned Level, bool SameSD=false) const
getDistance - Returns the distance (or NULL) associated with a particular common or SameSD level.
virtual void negate(ScalarEvolution &SE)
Negate the dependence by swapping the source and destination, and reversing the direction and distanc...
virtual unsigned getLevels() const
getLevels - Returns the number of common loops surrounding the source and destination of the dependen...
const Dependence * getNextPredecessor() const
getNextPredecessor - Returns the value of the NextPredecessor field.
virtual unsigned getDirection(unsigned Level, bool SameSD=false) const
getDirection - Returns the direction associated with a particular common or SameSD level.
bool isFlow() const
isFlow - Returns true if this is a flow (aka true) dependence.
virtual ~Dependence()=default
virtual bool normalize(ScalarEvolution *SE)
If the direction vector is negative, normalize the direction vector to make it non-negative.
bool isAnti() const
isAnti - Returns true if this is an anti dependence.
const Dependence * getNextSuccessor() const
getNextSuccessor - Returns the value of the NextSuccessor field.
virtual bool isDirectionNegative() const
Check if the direction vector is negative.
Instruction * getSrc() const
getSrc - Returns the source instruction for this dependence.
virtual bool isLoopIndependent() const
isLoopIndependent - Returns true if this is a loop-independent dependence.
bool isOutput() const
isOutput - Returns true if this is an output dependence.
void setNextPredecessor(const Dependence *pred)
setNextPredecessor - Sets the value of the NextPredecessor field.
virtual bool inSameSDLoops(unsigned Level) const
inSameSDLoops - Returns true if this level is an SameSD level, i.e., performed across two separate lo...
FullDependence(Instruction *Source, Instruction *Destination, const SCEVUnionPredicate &Assumes, bool PossiblyLoopIndependent, unsigned Levels)
bool isConfused() const override
isConfused - Returns true if this dependence is confused (the compiler understands nothing and makes ...
friend class DependenceInfo
DVEntry getDVEntry(unsigned Level, bool IsSameSD) const
getDVEntry - Returns the DV entry associated with a regular or a SameSD level.
bool isLoopIndependent() const override
isLoopIndependent - Returns true if this is a loop-independent dependence.
unsigned getSameSDLevels() const override
getSameSDLevels - Returns the number of separate SameSD loops surrounding the source and destination ...
unsigned getLevels() const override
getLevels - Returns the number of common loops surrounding the source and destination of the dependen...
FunctionPass class - This class is used to implement most global optimizations.
Represents a single loop in the control flow graph.
A Module instance is used to store all the information related to an LLVM module.
A set of analyses that are preserved following a run of a transformation pass.
This class represents a constant integer value.
This class represents a composition of other SCEV predicates, and is the class that most clients will...
This class represents an analyzed expression in the program.
The main scalar evolution driver.
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 dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
MutableArrayRef(T &OneElt) -> MutableArrayRef< T >
ArrayRef(const T &OneElt) -> ArrayRef< T >
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI FunctionPass * createDependenceAnalysisWrapperPass()
createDependenceAnalysisPass - This creates an instance of the DependenceAnalysis wrapper pass.
A CRTP mix-in that provides informational APIs needed for analysis passes.
A special type used by analysis passes to provide an address that identifies that particular analysis...
DependenceAnalysisPrinterPass(raw_ostream &OS, bool NormalizeResults=false)
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM)
Dependence::DVEntry - Each level in the distance/direction vector has a direction (or perhaps a union...
A CRTP mix-in for passes that should not be skipped.