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 {
354 const SCEV *Iterations;
358 const SCEV *Iterations;
359 const SCEV *Upper[8];
360 const SCEV *Lower[8];
361 unsigned char Direction;
362 unsigned char DirSet;
369 bool haveSameSD(
const Loop *SrcLoop,
const Loop *DstLoop)
const;
433 void establishNestingLevels(
const Instruction *Src,
const Instruction *Dst);
435 unsigned CommonLevels, SrcLevels, MaxLevels, SameSDLevels;
439 unsigned mapSrcLoop(
const Loop *SrcLoop)
const;
443 unsigned mapDstLoop(
const Loop *DstLoop)
const;
447 bool isLoopInvariant(
const SCEV *Expression,
const Loop *LoopNest)
const;
451 void collectCommonLoops(
const SCEV *Expression,
const Loop *LoopNest,
452 SmallBitVector &
Loops)
const;
456 bool checkSrcSubscript(
const SCEV *Src,
const Loop *LoopNest,
457 SmallBitVector &
Loops);
461 bool checkDstSubscript(
const SCEV *Dst,
const Loop *LoopNest,
462 SmallBitVector &
Loops);
469 const SCEV *collectUpperBound(
const Loop *l,
Type *
T)
const;
474 const SCEVConstant *collectConstantUpperBound(
const Loop *l,
Type *
T)
const;
479 Subscript::ClassificationKind
480 classifyPair(
const SCEV *Src,
const Loop *SrcLoopNest,
const SCEV *Dst,
481 const Loop *DstLoopNest, SmallBitVector &
Loops);
487 bool testZIV(
const SCEV *Src,
const SCEV *Dst, FullDependence &Result)
const;
498 bool testSIV(
const SCEV *Src,
const SCEV *Dst,
unsigned &Level,
499 FullDependence &Result,
bool UnderRuntimeAssumptions);
509 bool testRDIV(
const SCEV *Src,
const SCEV *Dst, FullDependence &Result)
const;
514 bool testMIV(
const SCEV *Src,
const SCEV *Dst,
const SmallBitVector &
Loops,
515 FullDependence &Result)
const;
525 bool strongSIVtest(
const SCEVAddRecExpr *Src,
const SCEVAddRecExpr *Dst,
526 unsigned Level, FullDependence &Result,
527 bool UnderRuntimeAssumptions);
537 bool weakCrossingSIVtest(
const SCEV *SrcCoeff,
const SCEV *SrcConst,
538 const SCEV *DstConst,
const Loop *CurrentSrcLoop,
539 const Loop *CurrentDstLoop,
unsigned Level,
540 FullDependence &Result)
const;
550 bool exactSIVtest(
const SCEVAddRecExpr *Src,
const SCEVAddRecExpr *Dst,
551 unsigned Level, FullDependence &Result)
const;
561 bool weakZeroSrcSIVtest(
const SCEV *SrcConst,
const SCEVAddRecExpr *Dst,
562 unsigned Level, FullDependence &Result)
const;
572 bool weakZeroDstSIVtest(
const SCEVAddRecExpr *Src,
const SCEV *DstConst,
573 unsigned Level, FullDependence &Result)
const;
582 bool exactRDIVtest(
const SCEV *SrcCoeff,
const SCEV *DstCoeff,
583 const SCEV *SrcConst,
const SCEV *DstConst,
584 const Loop *SrcLoop,
const Loop *DstLoop,
585 FullDependence &Result)
const;
595 bool symbolicRDIVtest(
const SCEVAddRecExpr *Src,
596 const SCEVAddRecExpr *Dst)
const;
603 bool gcdMIVtest(
const SCEV *Src,
const SCEV *Dst,
604 FullDependence &Result)
const;
609 bool banerjeeMIVtest(
const SCEV *Src,
const SCEV *Dst,
610 const SmallBitVector &
Loops,
611 FullDependence &Result)
const;
616 CoefficientInfo *collectCoeffInfo(
const SCEV *Subscript,
bool SrcFlag,
617 const SCEV *&Constant)
const;
634 bool accumulateCoefficientsGCD(
const SCEV *Expr,
const Loop *CurLoop,
635 const SCEV *&CurLoopCoeff,
636 APInt &RunningGCD)
const;
639 const SCEV *getPositivePart(
const SCEV *
X)
const;
642 const SCEV *getNegativePart(
const SCEV *
X)
const;
647 const SCEV *getLowerBound(BoundInfo *Bound)
const;
652 const SCEV *getUpperBound(BoundInfo *Bound)
const;
659 unsigned exploreDirections(
unsigned Level, CoefficientInfo *
A,
660 CoefficientInfo *
B, BoundInfo *Bound,
661 const SmallBitVector &
Loops,
662 unsigned &DepthExpanded,
const SCEV *Delta)
const;
665 bool testBounds(
unsigned char DirKind,
unsigned Level, BoundInfo *Bound,
666 const SCEV *Delta)
const;
670 void findBoundsALL(CoefficientInfo *
A, CoefficientInfo *
B, BoundInfo *Bound,
675 void findBoundsLT(CoefficientInfo *
A, CoefficientInfo *
B, BoundInfo *Bound,
680 void findBoundsGT(CoefficientInfo *
A, CoefficientInfo *
B, BoundInfo *Bound,
685 void findBoundsEQ(CoefficientInfo *
A, CoefficientInfo *
B, BoundInfo *Bound,
690 bool tryDelinearize(Instruction *Src, Instruction *Dst,
691 SmallVectorImpl<Subscript> &Pair);
696 bool tryDelinearizeFixedSize(Instruction *Src, Instruction *Dst,
697 const SCEV *SrcAccessFn,
const SCEV *DstAccessFn,
698 SmallVectorImpl<const SCEV *> &SrcSubscripts,
699 SmallVectorImpl<const SCEV *> &DstSubscripts);
705 tryDelinearizeParametricSize(Instruction *Src, Instruction *Dst,
706 const SCEV *SrcAccessFn,
const SCEV *DstAccessFn,
707 SmallVectorImpl<const SCEV *> &SrcSubscripts,
708 SmallVectorImpl<const SCEV *> &DstSubscripts);
712 bool checkSubscript(
const SCEV *Expr,
const Loop *LoopNest,
713 SmallBitVector &
Loops,
bool IsSrc);
731 : OS(OS), NormalizeResults(NormalizeResults) {}
739 bool NormalizeResults;
755 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 GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
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.
ArrayRef - 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)
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 to automatically provide informational APIs needed for passes.