Revert r255115 until we figure out how to fix the bot failures.
llvm-svn: 255117
This commit is contained in:
@@ -87,10 +87,11 @@ Value *llvm::stripIntegerCast(Value *V) {
|
||||
return V;
|
||||
}
|
||||
|
||||
const SCEV *llvm::replaceSymbolicStrideSCEV(PredicatedScalarEvolution &PSE,
|
||||
const SCEV *llvm::replaceSymbolicStrideSCEV(ScalarEvolution *SE,
|
||||
const ValueToValueMap &PtrToStride,
|
||||
SCEVUnionPredicate &Preds,
|
||||
Value *Ptr, Value *OrigPtr) {
|
||||
const SCEV *OrigSCEV = PSE.getSCEV(Ptr);
|
||||
const SCEV *OrigSCEV = SE->getSCEV(Ptr);
|
||||
|
||||
// If there is an entry in the map return the SCEV of the pointer with the
|
||||
// symbolic stride replaced by one.
|
||||
@@ -107,17 +108,16 @@ const SCEV *llvm::replaceSymbolicStrideSCEV(PredicatedScalarEvolution &PSE,
|
||||
ValueToValueMap RewriteMap;
|
||||
RewriteMap[StrideVal] = One;
|
||||
|
||||
ScalarEvolution *SE = PSE.getSE();
|
||||
const auto *U = cast<SCEVUnknown>(SE->getSCEV(StrideVal));
|
||||
const auto *CT =
|
||||
static_cast<const SCEVConstant *>(SE->getOne(StrideVal->getType()));
|
||||
|
||||
PSE.addPredicate(*SE->getEqualPredicate(U, CT));
|
||||
auto *Expr = PSE.getSCEV(Ptr);
|
||||
Preds.add(SE->getEqualPredicate(U, CT));
|
||||
|
||||
DEBUG(dbgs() << "LAA: Replacing SCEV: " << *OrigSCEV << " by: " << *Expr
|
||||
const SCEV *ByOne = SE->rewriteUsingPredicate(OrigSCEV, Preds);
|
||||
DEBUG(dbgs() << "LAA: Replacing SCEV: " << *OrigSCEV << " by: " << *ByOne
|
||||
<< "\n");
|
||||
return Expr;
|
||||
return ByOne;
|
||||
}
|
||||
|
||||
// Otherwise, just return the SCEV of the original pointer.
|
||||
@@ -127,12 +127,11 @@ const SCEV *llvm::replaceSymbolicStrideSCEV(PredicatedScalarEvolution &PSE,
|
||||
void RuntimePointerChecking::insert(Loop *Lp, Value *Ptr, bool WritePtr,
|
||||
unsigned DepSetId, unsigned ASId,
|
||||
const ValueToValueMap &Strides,
|
||||
PredicatedScalarEvolution &PSE) {
|
||||
SCEVUnionPredicate &Preds) {
|
||||
// Get the stride replaced scev.
|
||||
const SCEV *Sc = replaceSymbolicStrideSCEV(PSE, Strides, Ptr);
|
||||
const SCEV *Sc = replaceSymbolicStrideSCEV(SE, Strides, Preds, Ptr);
|
||||
const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(Sc);
|
||||
assert(AR && "Invalid addrec expression");
|
||||
ScalarEvolution *SE = PSE.getSE();
|
||||
const SCEV *Ex = SE->getBackedgeTakenCount(Lp);
|
||||
|
||||
const SCEV *ScStart = AR->getStart();
|
||||
@@ -424,10 +423,9 @@ public:
|
||||
typedef SmallPtrSet<MemAccessInfo, 8> MemAccessInfoSet;
|
||||
|
||||
AccessAnalysis(const DataLayout &Dl, AliasAnalysis *AA, LoopInfo *LI,
|
||||
MemoryDepChecker::DepCandidates &DA,
|
||||
PredicatedScalarEvolution &PSE)
|
||||
MemoryDepChecker::DepCandidates &DA, SCEVUnionPredicate &Preds)
|
||||
: DL(Dl), AST(*AA), LI(LI), DepCands(DA), IsRTCheckAnalysisNeeded(false),
|
||||
PSE(PSE) {}
|
||||
Preds(Preds) {}
|
||||
|
||||
/// \brief Register a load and whether it is only read from.
|
||||
void addLoad(MemoryLocation &Loc, bool IsReadOnly) {
|
||||
@@ -514,16 +512,16 @@ private:
|
||||
bool IsRTCheckAnalysisNeeded;
|
||||
|
||||
/// The SCEV predicate containing all the SCEV-related assumptions.
|
||||
PredicatedScalarEvolution &PSE;
|
||||
SCEVUnionPredicate &Preds;
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
/// \brief Check whether a pointer can participate in a runtime bounds check.
|
||||
static bool hasComputableBounds(PredicatedScalarEvolution &PSE,
|
||||
static bool hasComputableBounds(ScalarEvolution *SE,
|
||||
const ValueToValueMap &Strides, Value *Ptr,
|
||||
Loop *L) {
|
||||
const SCEV *PtrScev = replaceSymbolicStrideSCEV(PSE, Strides, Ptr);
|
||||
Loop *L, SCEVUnionPredicate &Preds) {
|
||||
const SCEV *PtrScev = replaceSymbolicStrideSCEV(SE, Strides, Preds, Ptr);
|
||||
const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(PtrScev);
|
||||
if (!AR)
|
||||
return false;
|
||||
@@ -566,11 +564,11 @@ bool AccessAnalysis::canCheckPtrAtRT(RuntimePointerChecking &RtCheck,
|
||||
else
|
||||
++NumReadPtrChecks;
|
||||
|
||||
if (hasComputableBounds(PSE, StridesMap, Ptr, TheLoop) &&
|
||||
if (hasComputableBounds(SE, StridesMap, Ptr, TheLoop, Preds) &&
|
||||
// When we run after a failing dependency check we have to make sure
|
||||
// we don't have wrapping pointers.
|
||||
(!ShouldCheckStride ||
|
||||
isStridedPtr(PSE, Ptr, TheLoop, StridesMap) == 1)) {
|
||||
isStridedPtr(SE, Ptr, TheLoop, StridesMap, Preds) == 1)) {
|
||||
// The id of the dependence set.
|
||||
unsigned DepId;
|
||||
|
||||
@@ -584,7 +582,7 @@ bool AccessAnalysis::canCheckPtrAtRT(RuntimePointerChecking &RtCheck,
|
||||
// Each access has its own dependence set.
|
||||
DepId = RunningDepId++;
|
||||
|
||||
RtCheck.insert(TheLoop, Ptr, IsWrite, DepId, ASId, StridesMap, PSE);
|
||||
RtCheck.insert(TheLoop, Ptr, IsWrite, DepId, ASId, StridesMap, Preds);
|
||||
|
||||
DEBUG(dbgs() << "LAA: Found a runtime check ptr:" << *Ptr << '\n');
|
||||
} else {
|
||||
@@ -819,8 +817,9 @@ static bool isNoWrapAddRec(Value *Ptr, const SCEVAddRecExpr *AR,
|
||||
}
|
||||
|
||||
/// \brief Check whether the access through \p Ptr has a constant stride.
|
||||
int llvm::isStridedPtr(PredicatedScalarEvolution &PSE, Value *Ptr,
|
||||
const Loop *Lp, const ValueToValueMap &StridesMap) {
|
||||
int llvm::isStridedPtr(ScalarEvolution *SE, Value *Ptr, const Loop *Lp,
|
||||
const ValueToValueMap &StridesMap,
|
||||
SCEVUnionPredicate &Preds) {
|
||||
Type *Ty = Ptr->getType();
|
||||
assert(Ty->isPointerTy() && "Unexpected non-ptr");
|
||||
|
||||
@@ -832,7 +831,7 @@ int llvm::isStridedPtr(PredicatedScalarEvolution &PSE, Value *Ptr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
const SCEV *PtrScev = replaceSymbolicStrideSCEV(PSE, StridesMap, Ptr);
|
||||
const SCEV *PtrScev = replaceSymbolicStrideSCEV(SE, StridesMap, Preds, Ptr);
|
||||
|
||||
const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(PtrScev);
|
||||
if (!AR) {
|
||||
@@ -855,16 +854,16 @@ int llvm::isStridedPtr(PredicatedScalarEvolution &PSE, Value *Ptr,
|
||||
// to access the pointer value "0" which is undefined behavior in address
|
||||
// space 0, therefore we can also vectorize this case.
|
||||
bool IsInBoundsGEP = isInBoundsGep(Ptr);
|
||||
bool IsNoWrapAddRec = isNoWrapAddRec(Ptr, AR, PSE.getSE(), Lp);
|
||||
bool IsNoWrapAddRec = isNoWrapAddRec(Ptr, AR, SE, Lp);
|
||||
bool IsInAddressSpaceZero = PtrTy->getAddressSpace() == 0;
|
||||
if (!IsNoWrapAddRec && !IsInBoundsGEP && !IsInAddressSpaceZero) {
|
||||
DEBUG(dbgs() << "LAA: Bad stride - Pointer may wrap in the address space "
|
||||
<< *Ptr << " SCEV: " << *PtrScev << "\n");
|
||||
<< *Ptr << " SCEV: " << *PtrScev << "\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Check the step is constant.
|
||||
const SCEV *Step = AR->getStepRecurrence(*PSE.getSE());
|
||||
const SCEV *Step = AR->getStepRecurrence(*SE);
|
||||
|
||||
// Calculate the pointer stride and check if it is constant.
|
||||
const SCEVConstant *C = dyn_cast<SCEVConstant>(Step);
|
||||
@@ -1047,11 +1046,11 @@ MemoryDepChecker::isDependent(const MemAccessInfo &A, unsigned AIdx,
|
||||
BPtr->getType()->getPointerAddressSpace())
|
||||
return Dependence::Unknown;
|
||||
|
||||
const SCEV *AScev = replaceSymbolicStrideSCEV(PSE, Strides, APtr);
|
||||
const SCEV *BScev = replaceSymbolicStrideSCEV(PSE, Strides, BPtr);
|
||||
const SCEV *AScev = replaceSymbolicStrideSCEV(SE, Strides, Preds, APtr);
|
||||
const SCEV *BScev = replaceSymbolicStrideSCEV(SE, Strides, Preds, BPtr);
|
||||
|
||||
int StrideAPtr = isStridedPtr(PSE, APtr, InnermostLoop, Strides);
|
||||
int StrideBPtr = isStridedPtr(PSE, BPtr, InnermostLoop, Strides);
|
||||
int StrideAPtr = isStridedPtr(SE, APtr, InnermostLoop, Strides, Preds);
|
||||
int StrideBPtr = isStridedPtr(SE, BPtr, InnermostLoop, Strides, Preds);
|
||||
|
||||
const SCEV *Src = AScev;
|
||||
const SCEV *Sink = BScev;
|
||||
@@ -1068,10 +1067,10 @@ MemoryDepChecker::isDependent(const MemAccessInfo &A, unsigned AIdx,
|
||||
std::swap(StrideAPtr, StrideBPtr);
|
||||
}
|
||||
|
||||
const SCEV *Dist = PSE.getSE()->getMinusSCEV(Sink, Src);
|
||||
const SCEV *Dist = SE->getMinusSCEV(Sink, Src);
|
||||
|
||||
DEBUG(dbgs() << "LAA: Src Scev: " << *Src << "Sink Scev: " << *Sink
|
||||
<< "(Induction step: " << StrideAPtr << ")\n");
|
||||
<< "(Induction step: " << StrideAPtr << ")\n");
|
||||
DEBUG(dbgs() << "LAA: Distance for " << *InstMap[AIdx] << " to "
|
||||
<< *InstMap[BIdx] << ": " << *Dist << "\n");
|
||||
|
||||
@@ -1344,10 +1343,10 @@ bool LoopAccessInfo::canAnalyzeLoop() {
|
||||
}
|
||||
|
||||
// ScalarEvolution needs to be able to find the exit count.
|
||||
const SCEV *ExitCount = PSE.getSE()->getBackedgeTakenCount(TheLoop);
|
||||
if (ExitCount == PSE.getSE()->getCouldNotCompute()) {
|
||||
emitAnalysis(LoopAccessReport()
|
||||
<< "could not determine number of loop iterations");
|
||||
const SCEV *ExitCount = SE->getBackedgeTakenCount(TheLoop);
|
||||
if (ExitCount == SE->getCouldNotCompute()) {
|
||||
emitAnalysis(LoopAccessReport() <<
|
||||
"could not determine number of loop iterations");
|
||||
DEBUG(dbgs() << "LAA: SCEV could not compute the loop exit count.\n");
|
||||
return false;
|
||||
}
|
||||
@@ -1448,7 +1447,7 @@ void LoopAccessInfo::analyzeLoop(const ValueToValueMap &Strides) {
|
||||
|
||||
MemoryDepChecker::DepCandidates DependentAccesses;
|
||||
AccessAnalysis Accesses(TheLoop->getHeader()->getModule()->getDataLayout(),
|
||||
AA, LI, DependentAccesses, PSE);
|
||||
AA, LI, DependentAccesses, Preds);
|
||||
|
||||
// Holds the analyzed pointers. We don't want to call GetUnderlyingObjects
|
||||
// multiple times on the same object. If the ptr is accessed twice, once
|
||||
@@ -1499,7 +1498,8 @@ void LoopAccessInfo::analyzeLoop(const ValueToValueMap &Strides) {
|
||||
// read a few words, modify, and write a few words, and some of the
|
||||
// words may be written to the same address.
|
||||
bool IsReadOnlyPtr = false;
|
||||
if (Seen.insert(Ptr).second || !isStridedPtr(PSE, Ptr, TheLoop, Strides)) {
|
||||
if (Seen.insert(Ptr).second ||
|
||||
!isStridedPtr(SE, Ptr, TheLoop, Strides, Preds)) {
|
||||
++NumReads;
|
||||
IsReadOnlyPtr = true;
|
||||
}
|
||||
@@ -1529,7 +1529,7 @@ void LoopAccessInfo::analyzeLoop(const ValueToValueMap &Strides) {
|
||||
// Find pointers with computable bounds. We are going to use this information
|
||||
// to place a runtime bound check.
|
||||
bool CanDoRTIfNeeded =
|
||||
Accesses.canCheckPtrAtRT(PtrRtChecking, PSE.getSE(), TheLoop, Strides);
|
||||
Accesses.canCheckPtrAtRT(PtrRtChecking, SE, TheLoop, Strides);
|
||||
if (!CanDoRTIfNeeded) {
|
||||
emitAnalysis(LoopAccessReport() << "cannot identify array bounds");
|
||||
DEBUG(dbgs() << "LAA: We can't vectorize because we can't find "
|
||||
@@ -1556,7 +1556,6 @@ void LoopAccessInfo::analyzeLoop(const ValueToValueMap &Strides) {
|
||||
PtrRtChecking.reset();
|
||||
PtrRtChecking.Need = true;
|
||||
|
||||
auto *SE = PSE.getSE();
|
||||
CanDoRTIfNeeded =
|
||||
Accesses.canCheckPtrAtRT(PtrRtChecking, SE, TheLoop, Strides, true);
|
||||
|
||||
@@ -1599,7 +1598,7 @@ void LoopAccessInfo::emitAnalysis(LoopAccessReport &Message) {
|
||||
}
|
||||
|
||||
bool LoopAccessInfo::isUniform(Value *V) const {
|
||||
return (PSE.getSE()->isLoopInvariant(PSE.getSE()->getSCEV(V), TheLoop));
|
||||
return (SE->isLoopInvariant(SE->getSCEV(V), TheLoop));
|
||||
}
|
||||
|
||||
// FIXME: this function is currently a duplicate of the one in
|
||||
@@ -1680,7 +1679,7 @@ std::pair<Instruction *, Instruction *> LoopAccessInfo::addRuntimeChecks(
|
||||
Instruction *Loc,
|
||||
const SmallVectorImpl<RuntimePointerChecking::PointerCheck> &PointerChecks)
|
||||
const {
|
||||
auto *SE = PSE.getSE();
|
||||
|
||||
SCEVExpander Exp(*SE, DL, "induction");
|
||||
auto ExpandedChecks =
|
||||
expandBounds(PointerChecks, TheLoop, Loc, SE, Exp, PtrRtChecking);
|
||||
@@ -1750,7 +1749,7 @@ LoopAccessInfo::LoopAccessInfo(Loop *L, ScalarEvolution *SE,
|
||||
const TargetLibraryInfo *TLI, AliasAnalysis *AA,
|
||||
DominatorTree *DT, LoopInfo *LI,
|
||||
const ValueToValueMap &Strides)
|
||||
: PSE(*SE), PtrRtChecking(SE), DepChecker(PSE, L), TheLoop(L), DL(DL),
|
||||
: PtrRtChecking(SE), DepChecker(SE, L, Preds), TheLoop(L), SE(SE), DL(DL),
|
||||
TLI(TLI), AA(AA), DT(DT), LI(LI), NumLoads(0), NumStores(0),
|
||||
MaxSafeDepDistBytes(-1U), CanVecMem(false),
|
||||
StoreToLoopInvariantAddress(false) {
|
||||
@@ -1787,7 +1786,7 @@ void LoopAccessInfo::print(raw_ostream &OS, unsigned Depth) const {
|
||||
<< "found in loop.\n";
|
||||
|
||||
OS.indent(Depth) << "SCEV assumptions:\n";
|
||||
PSE.getUnionPredicate().print(OS, Depth);
|
||||
Preds.print(OS, Depth);
|
||||
}
|
||||
|
||||
const LoopAccessInfo &
|
||||
|
||||
Reference in New Issue
Block a user