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;
158 virtual unsigned getDirection(
unsigned Level,
bool SameSD =
false)
const {
190 virtual bool isScalar(
unsigned Level,
bool SameSD =
false)
const;
214 void dumpImp(
raw_ostream &OS,
bool IsSameSD =
false)
const;
221 const Dependence *NextPredecessor =
nullptr, *NextSuccessor =
nullptr;
237 bool PossiblyLoopIndependent,
unsigned Levels);
260 assert(0 < Level && Level <= Levels &&
"Level out of range");
261 return DV[Level - 1];
264 Level <=
static_cast<unsigned>(Levels) + SameSDLevels &&
265 "isSameSD level out of range");
266 return DVSameSD[Level - Levels - 1];
272 unsigned getDirection(
unsigned Level,
bool SameSD =
false)
const override;
276 const SCEV *getDistance(
unsigned Level,
bool SameSD =
false)
const override;
280 bool isDirectionNegative()
const override;
293 bool inSameSDLoops(
unsigned Level)
const override;
298 bool isScalar(
unsigned Level,
bool SameSD =
false)
const override;
301 unsigned short Levels;
302 unsigned short SameSDLevels;
303 bool LoopIndependent;
304 std::unique_ptr<DVEntry[]> DV;
305 std::unique_ptr<DVEntry[]> DVSameSD;
313 : AA(AA), SE(SE), LI(LI), F(F) {}
317 FunctionAnalysisManager::Invalidator &Inv);
326 LLVM_ABI std::unique_ptr<Dependence>
328 bool UnderRuntimeAssumptions =
false);
344 enum ClassificationKind { ZIV, SIV, RDIV, MIV, NonLinear } Classification;
345 SmallBitVector
Loops;
346 SmallBitVector GroupLoops;
347 SmallBitVector Group;
350 struct CoefficientInfo {
351 const SCEV *SrcCoeff;
352 const SCEV *DstCoeff;
353 const SCEV *MaxIterIndex;
357 const SCEV *Upper[8];
358 const SCEV *Lower[8];
359 unsigned char Direction;
360 unsigned char DirSet;
367 bool haveSameSD(
const Loop *SrcLoop,
const Loop *DstLoop)
const;
431 void establishNestingLevels(
const Instruction *Src,
const Instruction *Dst);
433 unsigned CommonLevels, SrcLevels, MaxLevels, SameSDLevels;
437 unsigned mapSrcLoop(
const Loop *SrcLoop)
const;
441 unsigned mapDstLoop(
const Loop *DstLoop)
const;
445 bool isLoopInvariant(
const SCEV *Expression,
const Loop *LoopNest)
const;
449 void collectCommonLoops(
const SCEV *Expression,
const Loop *LoopNest,
450 SmallBitVector &
Loops)
const;
454 bool checkSrcSubscript(
const SCEV *Src,
const Loop *LoopNest,
455 SmallBitVector &
Loops);
459 bool checkDstSubscript(
const SCEV *Dst,
const Loop *LoopNest,
460 SmallBitVector &
Loops);
467 const SCEV *collectUpperBound(
const Loop *l,
Type *
T)
const;
472 std::optional<APInt> collectNonNegativeConstantUpperBound(
const Loop *L,
478 Subscript::ClassificationKind
479 classifyPair(
const SCEV *Src,
const Loop *SrcLoopNest,
const SCEV *Dst,
480 const Loop *DstLoopNest, SmallBitVector &
Loops);
486 bool testZIV(
const SCEV *Src,
const SCEV *Dst, FullDependence &Result)
const;
497 bool testSIV(
const SCEV *Src,
const SCEV *Dst,
unsigned &Level,
498 FullDependence &Result,
bool UnderRuntimeAssumptions);
508 bool testRDIV(
const SCEV *Src,
const SCEV *Dst, FullDependence &Result)
const;
513 bool testMIV(
const SCEV *Src,
const SCEV *Dst,
const SmallBitVector &
Loops,
514 FullDependence &Result)
const;
524 bool strongSIVtest(
const SCEVAddRecExpr *Src,
const SCEVAddRecExpr *Dst,
525 unsigned Level, FullDependence &Result,
526 bool UnderRuntimeAssumptions);
536 bool weakCrossingSIVtest(
const SCEVAddRecExpr *Src,
const SCEVAddRecExpr *Dst,
537 unsigned Level, FullDependence &Result)
const;
547 bool exactSIVtest(
const SCEVAddRecExpr *Src,
const SCEVAddRecExpr *Dst,
548 unsigned Level, FullDependence &Result)
const;
552 bool weakZeroSIVtestImpl(
const SCEVAddRecExpr *AR,
const SCEV *Const,
553 unsigned Level, FullDependence &Result)
const;
563 bool weakZeroSrcSIVtest(
const SCEV *SrcConst,
const SCEVAddRecExpr *Dst,
564 unsigned Level, FullDependence &Result)
const;
574 bool weakZeroDstSIVtest(
const SCEVAddRecExpr *Src,
const SCEV *DstConst,
575 unsigned Level, FullDependence &Result)
const;
584 bool exactRDIVtest(
const SCEVAddRecExpr *Src,
const SCEVAddRecExpr *Dst,
585 FullDependence &Result)
const;
591 bool exactTestImpl(
const SCEVAddRecExpr *Src,
const SCEVAddRecExpr *Dst,
592 FullDependence &Result,
593 std::optional<unsigned> Level)
const;
600 bool gcdMIVtest(
const SCEV *Src,
const SCEV *Dst,
601 FullDependence &Result)
const;
606 bool banerjeeMIVtest(
const SCEV *Src,
const SCEV *Dst,
607 const SmallBitVector &
Loops,
608 FullDependence &Result)
const;
613 const SCEV *collectCoeffInfo(
const SCEV *Subscript,
bool SrcFlag,
632 const SCEV *accumulateCoefficientsGCD(
const SCEV *Expr,
const Loop *CurLoop,
633 const SCEV *&CurLoopCoeff,
634 APInt &RunningGCD)
const;
652 const SmallBitVector &
Loops,
const SCEV *Delta,
653 const FullDependence &Result)
const;
657 bool testBounds(
unsigned char DirKind,
unsigned Level,
682 bool tryDelinearize(Instruction *Src, Instruction *Dst,
683 SmallVectorImpl<Subscript> &Pair);
688 bool tryDelinearizeFixedSize(Instruction *Src, Instruction *Dst,
689 const SCEV *SrcAccessFn,
const SCEV *DstAccessFn,
690 SmallVectorImpl<const SCEV *> &SrcSubscripts,
691 SmallVectorImpl<const SCEV *> &DstSubscripts);
697 tryDelinearizeParametricSize(Instruction *Src, Instruction *Dst,
698 const SCEV *SrcAccessFn,
const SCEV *DstAccessFn,
699 SmallVectorImpl<const SCEV *> &SrcSubscripts,
700 SmallVectorImpl<const SCEV *> &DstSubscripts);
704 bool checkSubscript(
const SCEV *Expr,
const Loop *LoopNest,
705 SmallBitVector &
Loops,
bool IsSrc);
723 : OS(OS), NormalizeResults(NormalizeResults) {}
729 bool NormalizeResults;
745 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...
DVEntry getDVEntry(unsigned Level, bool IsSameSD) const
getDVEntry - Returns the DV entry associated with a regular or a SameSD level
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.