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 {
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;
287 bool inSameSDLoops(
unsigned Level)
const override;
292 bool isScalar(
unsigned Level,
bool SameSD =
false)
const override;
295 unsigned short Levels;
296 unsigned short SameSDLevels;
297 bool LoopIndependent;
298 std::unique_ptr<DVEntry[]> DV;
299 std::unique_ptr<DVEntry[]> DVSameSD;
307 : AA(AA), SE(SE), LI(LI), F(F) {}
311 FunctionAnalysisManager::Invalidator &Inv);
320 LLVM_ABI std::unique_ptr<Dependence>
322 bool UnderRuntimeAssumptions =
false);
338 enum ClassificationKind { ZIV, SIV, RDIV, MIV, NonLinear } Classification;
339 SmallBitVector
Loops;
340 SmallBitVector GroupLoops;
341 SmallBitVector Group;
344 struct CoefficientInfo {
348 const SCEV *Iterations;
352 const SCEV *Iterations;
353 const SCEV *Upper[8];
354 const SCEV *Lower[8];
355 unsigned char Direction;
356 unsigned char DirSet;
363 bool haveSameSD(
const Loop *SrcLoop,
const Loop *DstLoop)
const;
427 void establishNestingLevels(
const Instruction *Src,
const Instruction *Dst);
429 unsigned CommonLevels, SrcLevels, MaxLevels, SameSDLevels;
433 unsigned mapSrcLoop(
const Loop *SrcLoop)
const;
437 unsigned mapDstLoop(
const Loop *DstLoop)
const;
441 bool isLoopInvariant(
const SCEV *Expression,
const Loop *LoopNest)
const;
445 void collectCommonLoops(
const SCEV *Expression,
const Loop *LoopNest,
446 SmallBitVector &
Loops)
const;
450 bool checkSrcSubscript(
const SCEV *Src,
const Loop *LoopNest,
451 SmallBitVector &
Loops);
455 bool checkDstSubscript(
const SCEV *Dst,
const Loop *LoopNest,
456 SmallBitVector &
Loops);
463 const SCEV *collectUpperBound(
const Loop *l,
Type *
T)
const;
468 const SCEVConstant *collectConstantUpperBound(
const Loop *l,
Type *
T)
const;
473 Subscript::ClassificationKind
474 classifyPair(
const SCEV *Src,
const Loop *SrcLoopNest,
const SCEV *Dst,
475 const Loop *DstLoopNest, SmallBitVector &
Loops);
481 bool testZIV(
const SCEV *Src,
const SCEV *Dst, FullDependence &Result)
const;
492 bool testSIV(
const SCEV *Src,
const SCEV *Dst,
unsigned &Level,
493 FullDependence &Result,
bool UnderRuntimeAssumptions);
503 bool testRDIV(
const SCEV *Src,
const SCEV *Dst, FullDependence &Result)
const;
508 bool testMIV(
const SCEV *Src,
const SCEV *Dst,
const SmallBitVector &
Loops,
509 FullDependence &Result)
const;
519 bool strongSIVtest(
const SCEVAddRecExpr *Src,
const SCEVAddRecExpr *Dst,
520 unsigned Level, FullDependence &Result,
521 bool UnderRuntimeAssumptions);
531 bool weakCrossingSIVtest(
const SCEV *SrcCoeff,
const SCEV *SrcConst,
532 const SCEV *DstConst,
const Loop *CurrentSrcLoop,
533 const Loop *CurrentDstLoop,
unsigned Level,
534 FullDependence &Result)
const;
544 bool exactSIVtest(
const SCEVAddRecExpr *Src,
const SCEVAddRecExpr *Dst,
545 unsigned Level, FullDependence &Result)
const;
555 bool weakZeroSrcSIVtest(
const SCEV *SrcConst,
const SCEVAddRecExpr *Dst,
556 unsigned Level, FullDependence &Result)
const;
566 bool weakZeroDstSIVtest(
const SCEVAddRecExpr *Src,
const SCEV *DstConst,
567 unsigned Level, FullDependence &Result)
const;
576 bool exactRDIVtest(
const SCEV *SrcCoeff,
const SCEV *DstCoeff,
577 const SCEV *SrcConst,
const SCEV *DstConst,
578 const Loop *SrcLoop,
const Loop *DstLoop,
579 FullDependence &Result)
const;
589 bool symbolicRDIVtest(
const SCEVAddRecExpr *Src,
590 const SCEVAddRecExpr *Dst)
const;
597 bool gcdMIVtest(
const SCEV *Src,
const SCEV *Dst,
598 FullDependence &Result)
const;
603 bool banerjeeMIVtest(
const SCEV *Src,
const SCEV *Dst,
604 const SmallBitVector &
Loops,
605 FullDependence &Result)
const;
610 CoefficientInfo *collectCoeffInfo(
const SCEV *Subscript,
bool SrcFlag,
611 const SCEV *&Constant)
const;
628 bool accumulateCoefficientsGCD(
const SCEV *Expr,
const Loop *CurLoop,
629 const SCEV *&CurLoopCoeff,
630 APInt &RunningGCD)
const;
633 const SCEV *getPositivePart(
const SCEV *
X)
const;
636 const SCEV *getNegativePart(
const SCEV *
X)
const;
641 const SCEV *getLowerBound(BoundInfo *Bound)
const;
646 const SCEV *getUpperBound(BoundInfo *Bound)
const;
653 unsigned exploreDirections(
unsigned Level, CoefficientInfo *
A,
654 CoefficientInfo *
B, BoundInfo *Bound,
655 const SmallBitVector &
Loops,
656 unsigned &DepthExpanded,
const SCEV *Delta)
const;
659 bool testBounds(
unsigned char DirKind,
unsigned Level, BoundInfo *Bound,
660 const SCEV *Delta)
const;
664 void findBoundsALL(CoefficientInfo *
A, CoefficientInfo *
B, BoundInfo *Bound,
669 void findBoundsLT(CoefficientInfo *
A, CoefficientInfo *
B, BoundInfo *Bound,
674 void findBoundsGT(CoefficientInfo *
A, CoefficientInfo *
B, BoundInfo *Bound,
679 void findBoundsEQ(CoefficientInfo *
A, CoefficientInfo *
B, BoundInfo *Bound,
684 bool tryDelinearize(Instruction *Src, Instruction *Dst,
685 SmallVectorImpl<Subscript> &Pair);
690 bool tryDelinearizeFixedSize(Instruction *Src, Instruction *Dst,
691 const SCEV *SrcAccessFn,
const SCEV *DstAccessFn,
692 SmallVectorImpl<const SCEV *> &SrcSubscripts,
693 SmallVectorImpl<const SCEV *> &DstSubscripts);
699 tryDelinearizeParametricSize(Instruction *Src, Instruction *Dst,
700 const SCEV *SrcAccessFn,
const SCEV *DstAccessFn,
701 SmallVectorImpl<const SCEV *> &SrcSubscripts,
702 SmallVectorImpl<const SCEV *> &DstSubscripts);
706 bool checkSubscript(
const SCEV *Expr,
const Loop *LoopNest,
707 SmallBitVector &
Loops,
bool IsSrc);
725 : OS(OS), NormalizeResults(NormalizeResults) {}
733 bool NormalizeResults;
749 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 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.