|
LLVM
4.0.0
|
#include "llvm/Analysis/LoopAccessAnalysis.h"#include "llvm/ADT/APInt.h"#include "llvm/ADT/DenseMap.h"#include "llvm/ADT/DepthFirstIterator.h"#include "llvm/ADT/EquivalenceClasses.h"#include "llvm/ADT/PointerIntPair.h"#include "llvm/ADT/STLExtras.h"#include "llvm/ADT/SetVector.h"#include "llvm/ADT/SmallPtrSet.h"#include "llvm/ADT/SmallSet.h"#include "llvm/ADT/SmallVector.h"#include "llvm/ADT/iterator_range.h"#include "llvm/Analysis/AliasAnalysis.h"#include "llvm/Analysis/AliasSetTracker.h"#include "llvm/Analysis/LoopAnalysisManager.h"#include "llvm/Analysis/LoopInfo.h"#include "llvm/Analysis/MemoryLocation.h"#include "llvm/Analysis/OptimizationDiagnosticInfo.h"#include "llvm/Analysis/ScalarEvolution.h"#include "llvm/Analysis/ScalarEvolutionExpander.h"#include "llvm/Analysis/ScalarEvolutionExpressions.h"#include "llvm/Analysis/TargetLibraryInfo.h"#include "llvm/Analysis/ValueTracking.h"#include "llvm/Analysis/VectorUtils.h"#include "llvm/IR/BasicBlock.h"#include "llvm/IR/Constants.h"#include "llvm/IR/DataLayout.h"#include "llvm/IR/DebugLoc.h"#include "llvm/IR/DerivedTypes.h"#include "llvm/IR/DiagnosticInfo.h"#include "llvm/IR/Dominators.h"#include "llvm/IR/Function.h"#include "llvm/IR/IRBuilder.h"#include "llvm/IR/InstrTypes.h"#include "llvm/IR/Instruction.h"#include "llvm/IR/Instructions.h"#include "llvm/IR/Operator.h"#include "llvm/IR/PassManager.h"#include "llvm/IR/Type.h"#include "llvm/IR/Value.h"#include "llvm/IR/ValueHandle.h"#include "llvm/Pass.h"#include "llvm/Support/Casting.h"#include "llvm/Support/CommandLine.h"#include "llvm/Support/Debug.h"#include "llvm/Support/ErrorHandling.h"#include "llvm/Support/raw_ostream.h"#include <algorithm>#include <cassert>#include <cstdint>#include <cstdlib>#include <iterator>#include <utility>#include <vector>Go to the source code of this file.
Namespaces | |
| llvm | |
| Compute iterated dominance frontiers using a linear time algorithm. | |
Macros | |
| #define | DEBUG_TYPE "loop-accesses" |
| #define | LAA_NAME "loop-accesses" |
Functions | |
| static const SCEV * | getMinFromExprs (const SCEV *I, const SCEV *J, ScalarEvolution *SE) |
Compare I and J and return the minimum. More... | |
| static bool | hasComputableBounds (PredicatedScalarEvolution &PSE, const ValueToValueMap &Strides, Value *Ptr, Loop *L) |
| Check whether a pointer can participate in a runtime bounds check. More... | |
| static bool | isNoWrap (PredicatedScalarEvolution &PSE, const ValueToValueMap &Strides, Value *Ptr, Loop *L) |
| Check whether a pointer address cannot wrap. More... | |
| static bool | isInBoundsGep (Value *Ptr) |
| static bool | isNoWrapAddRec (Value *Ptr, const SCEVAddRecExpr *AR, PredicatedScalarEvolution &PSE, const Loop *L) |
Return true if an AddRec pointer Ptr is unsigned non-wrapping, i.e. More... | |
| static Value * | getPointerOperand (Value *I) |
| Take the pointer operand from the Load/Store instruction. More... | |
| static unsigned | getAddressSpaceOperand (Value *I) |
| Take the address space operand from the Load/Store instruction. More... | |
| static bool | areStridedAccessesIndependent (uint64_t Distance, uint64_t Stride, uint64_t TypeByteSize) |
Check the dependence for two accesses with the same stride Stride. More... | |
| static Instruction * | getFirstInst (Instruction *FirstInst, Value *V, Instruction *Loc) |
| static PointerBounds | expandBounds (const RuntimePointerChecking::CheckingPtrGroup *CG, Loop *TheLoop, Instruction *Loc, SCEVExpander &Exp, ScalarEvolution *SE, const RuntimePointerChecking &PtrRtChecking) |
Expand code for the lower and upper bound of the pointer group CG in TheLoop. More... | |
| static SmallVector< std::pair < PointerBounds, PointerBounds >, 4 > | expandBounds (const SmallVectorImpl< RuntimePointerChecking::PointerCheck > &PointerChecks, Loop *L, Instruction *Loc, ScalarEvolution *SE, SCEVExpander &Exp, const RuntimePointerChecking &PtrRtChecking) |
| Turns a collection of checks into a collection of expanded upper and lower bounds for both pointers in the check. More... | |
| Pass * | llvm::createLAAPass () |
Variables | |
| static cl::opt< unsigned, true > | VectorizationFactor ("force-vector-width", cl::Hidden, cl::desc("Sets the SIMD width. Zero is autoselect."), cl::location(VectorizerParams::VectorizationFactor)) |
| static cl::opt< unsigned, true > | VectorizationInterleave ("force-vector-interleave", cl::Hidden, cl::desc("Sets the vectorization interleave count. ""Zero is autoselect."), cl::location(VectorizerParams::VectorizationInterleave)) |
| static cl::opt< unsigned, true > | RuntimeMemoryCheckThreshold ("runtime-memory-check-threshold", cl::Hidden, cl::desc("When performing memory disambiguation checks at runtime do not ""generate more than this number of comparisons (default = 8)."), cl::location(VectorizerParams::RuntimeMemoryCheckThreshold), cl::init(8)) |
| static cl::opt< unsigned > | MemoryCheckMergeThreshold ("memory-check-merge-threshold", cl::Hidden, cl::desc("Maximum number of comparisons done when trying to merge ""runtime memory checks. (default = 100)"), cl::init(100)) |
| The maximum iterations used to merge memory checks. More... | |
| static cl::opt< unsigned > | MaxDependences ("max-dependences", cl::Hidden, cl::desc("Maximum number of dependences collected by ""loop-access analysis (default = 100)"), cl::init(100)) |
| We collect dependences up to this threshold. More... | |
| static cl::opt< bool > | EnableMemAccessVersioning ("enable-mem-access-versioning", cl::init(true), cl::Hidden, cl::desc("Enable symbolic stride memory access versioning")) |
| This enables versioning on the strides of symbolically striding memory accesses in code like the following. More... | |
| static cl::opt< bool > | EnableForwardingConflictDetection ("store-to-load-forwarding-conflict-detection", cl::Hidden, cl::desc("Enable conflict detection in loop-access analysis"), cl::init(true)) |
| Enable store-to-load forwarding conflict detection. More... | |
| static const char | laa_name [] = "Loop Access Analysis" |
| #define DEBUG_TYPE "loop-accesses" |
Definition at line 72 of file LoopAccessAnalysis.cpp.
| #define LAA_NAME "loop-accesses" |
Definition at line 2112 of file LoopAccessAnalysis.cpp.
|
static |
Check the dependence for two accesses with the same stride Stride.
Distance is the positive distance and TypeByteSize is type size in bytes.
Definition at line 1213 of file LoopAccessAnalysis.cpp.
References assert().
|
static |
Expand code for the lower and upper bound of the pointer group CG in TheLoop.
Definition at line 1867 of file LoopAccessAnalysis.cpp.
References llvm::LoopBase< N, M >::contains(), llvm::dbgs(), DEBUG, llvm::dyn_cast(), llvm::WebAssembly::End, llvm::SCEVExpander::expandCodeFor(), llvm::Value::getContext(), llvm::Type::getInt8PtrTy(), llvm::Type::getPointerAddressSpace(), llvm::ScalarEvolution::getSCEV(), llvm::Value::getType(), llvm::RuntimePointerChecking::CheckingPtrGroup::High, llvm::ScalarEvolution::isLoopInvariant(), llvm::RuntimePointerChecking::CheckingPtrGroup::Low, llvm::RuntimePointerChecking::CheckingPtrGroup::Members, llvm::RuntimePointerChecking::Pointers, and Ptr.
Referenced by llvm::LoopAccessInfo::addRuntimeChecks(), and expandBounds().
|
static |
Turns a collection of checks into a collection of expanded upper and lower bounds for both pointers in the check.
Definition at line 1901 of file LoopAccessAnalysis.cpp.
References Check(), expandBounds(), and llvm::transform().
Take the address space operand from the Load/Store instruction.
Returns -1 if this is not a valid Load/Store instruction.
Definition at line 1053 of file LoopAccessAnalysis.cpp.
References L.
Referenced by llvm::isConsecutiveAccess().
|
static |
Definition at line 1842 of file LoopAccessAnalysis.cpp.
References llvm::Instruction::getParent().
Referenced by llvm::LoopAccessInfo::addRuntimeChecks().
Compare I and J and return the minimum.
Return nullptr in case we couldn't find an answer.
Definition at line 288 of file LoopAccessAnalysis.cpp.
References C, llvm::dyn_cast(), llvm::ScalarEvolution::getMinusSCEV(), llvm::SCEVConstant::getValue(), I, and llvm::ConstantInt::isNegative().
Referenced by llvm::RuntimePointerChecking::CheckingPtrGroup::addPointer().
Take the pointer operand from the Load/Store instruction.
Returns NULL if this is not a valid Load/Store instruction.
Definition at line 1043 of file LoopAccessAnalysis.cpp.
References SI.
Referenced by llvm::isConsecutiveAccess().
|
static |
Check whether a pointer can participate in a runtime bounds check.
Definition at line 620 of file LoopAccessAnalysis.cpp.
References llvm::dyn_cast(), llvm::PredicatedScalarEvolution::getSE(), llvm::SCEVAddRecExpr::isAffine(), llvm::ScalarEvolution::isLoopInvariant(), and llvm::replaceSymbolicStrideSCEV().
Definition at line 879 of file LoopAccessAnalysis.cpp.
References GEP.
Referenced by llvm::getPtrStride().
|
static |
Check whether a pointer address cannot wrap.
Definition at line 637 of file LoopAccessAnalysis.cpp.
References llvm::getPtrStride(), llvm::PredicatedScalarEvolution::getSCEV(), llvm::PredicatedScalarEvolution::getSE(), and llvm::ScalarEvolution::isLoopInvariant().
|
static |
Return true if an AddRec pointer Ptr is unsigned non-wrapping, i.e.
monotonically increasing/decreasing.
Definition at line 887 of file LoopAccessAnalysis.cpp.
References llvm::dyn_cast(), llvm::SCEV::FlagNSW, GEP, llvm::SCEVNAryExpr::getNoWrapFlags(), llvm::PredicatedScalarEvolution::getSCEV(), llvm::make_range(), llvm::SCEV::NoWrapMask, and Ptr.
Referenced by llvm::getPtrStride().
|
static |
Enable store-to-load forwarding conflict detection.
This option can be disabled for correctness testing.
|
static |
This enables versioning on the strides of symbolically striding memory accesses in code like the following.
for (i = 0; i < N; ++i) A[i * Stride1] += B[i * Stride2] ...
Will be roughly translated to if (Stride1 == 1 && Stride2 == 1) { for (i = 0; i < N; i+=4) A[i:i+3] += ... } else ...
Definition at line 2111 of file LoopAccessAnalysis.cpp.
|
static |
We collect dependences up to this threshold.
Referenced by llvm::MemoryDepChecker::areDepsSafe().
|
static |
The maximum iterations used to merge memory checks.
|
static |
|
static |
Referenced by llvm::LoopVectorizePass::processLoop().
1.8.6