3664 lines · cpp
1//===-- DependenceAnalysis.cpp - DA Implementation --------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// DependenceAnalysis is an LLVM pass that analyses dependences between memory10// accesses. Currently, it is an (incomplete) implementation of the approach11// described in12//13// Practical Dependence Testing14// Goff, Kennedy, Tseng15// PLDI 199116//17// There's a single entry point that analyzes the dependence between a pair18// of memory references in a function, returning either NULL, for no dependence,19// or a more-or-less detailed description of the dependence between them.20//21// Since Clang linearizes some array subscripts, the dependence22// analysis is using SCEV->delinearize to recover the representation of multiple23// subscripts, and thus avoid the more expensive and less precise MIV tests. The24// delinearization is controlled by the flag -da-delinearize.25//26// We should pay some careful attention to the possibility of integer overflow27// in the implementation of the various tests. This could happen with Add,28// Subtract, or Multiply, with both APInt's and SCEV's.29//30// Some non-linear subscript pairs can be handled by the GCD test31// (and perhaps other tests).32// Should explore how often these things occur.33//34// Finally, it seems like certain test cases expose weaknesses in the SCEV35// simplification, especially in the handling of sign and zero extensions.36// It could be useful to spend time exploring these.37//38// Please note that this is work in progress and the interface is subject to39// change.40//41//===----------------------------------------------------------------------===//42// //43// In memory of Ken Kennedy, 1945 - 2007 //44// //45//===----------------------------------------------------------------------===//46 47#include "llvm/Analysis/DependenceAnalysis.h"48#include "llvm/ADT/Statistic.h"49#include "llvm/Analysis/AliasAnalysis.h"50#include "llvm/Analysis/Delinearization.h"51#include "llvm/Analysis/LoopInfo.h"52#include "llvm/Analysis/ScalarEvolution.h"53#include "llvm/Analysis/ScalarEvolutionExpressions.h"54#include "llvm/Analysis/ValueTracking.h"55#include "llvm/IR/InstIterator.h"56#include "llvm/IR/Module.h"57#include "llvm/InitializePasses.h"58#include "llvm/Support/CommandLine.h"59#include "llvm/Support/Debug.h"60#include "llvm/Support/ErrorHandling.h"61#include "llvm/Support/raw_ostream.h"62 63using namespace llvm;64 65#define DEBUG_TYPE "da"66 67//===----------------------------------------------------------------------===//68// statistics69 70STATISTIC(TotalArrayPairs, "Array pairs tested");71STATISTIC(NonlinearSubscriptPairs, "Nonlinear subscript pairs");72STATISTIC(ZIVapplications, "ZIV applications");73STATISTIC(ZIVindependence, "ZIV independence");74STATISTIC(StrongSIVapplications, "Strong SIV applications");75STATISTIC(StrongSIVsuccesses, "Strong SIV successes");76STATISTIC(StrongSIVindependence, "Strong SIV independence");77STATISTIC(WeakCrossingSIVapplications, "Weak-Crossing SIV applications");78STATISTIC(WeakCrossingSIVsuccesses, "Weak-Crossing SIV successes");79STATISTIC(WeakCrossingSIVindependence, "Weak-Crossing SIV independence");80STATISTIC(ExactSIVapplications, "Exact SIV applications");81STATISTIC(ExactSIVsuccesses, "Exact SIV successes");82STATISTIC(ExactSIVindependence, "Exact SIV independence");83STATISTIC(WeakZeroSIVapplications, "Weak-Zero SIV applications");84STATISTIC(WeakZeroSIVsuccesses, "Weak-Zero SIV successes");85STATISTIC(WeakZeroSIVindependence, "Weak-Zero SIV independence");86STATISTIC(ExactRDIVapplications, "Exact RDIV applications");87STATISTIC(ExactRDIVindependence, "Exact RDIV independence");88STATISTIC(SymbolicRDIVapplications, "Symbolic RDIV applications");89STATISTIC(SymbolicRDIVindependence, "Symbolic RDIV independence");90STATISTIC(GCDapplications, "GCD applications");91STATISTIC(GCDsuccesses, "GCD successes");92STATISTIC(GCDindependence, "GCD independence");93STATISTIC(BanerjeeApplications, "Banerjee applications");94STATISTIC(BanerjeeIndependence, "Banerjee independence");95STATISTIC(BanerjeeSuccesses, "Banerjee successes");96STATISTIC(SameSDLoopsCount, "Loops with Same iteration Space and Depth");97 98static cl::opt<bool>99 Delinearize("da-delinearize", cl::init(true), cl::Hidden,100 cl::desc("Try to delinearize array references."));101static cl::opt<bool> DisableDelinearizationChecks(102 "da-disable-delinearization-checks", cl::Hidden,103 cl::desc(104 "Disable checks that try to statically verify validity of "105 "delinearized subscripts. Enabling this option may result in incorrect "106 "dependence vectors for languages that allow the subscript of one "107 "dimension to underflow or overflow into another dimension."));108 109static cl::opt<unsigned> MIVMaxLevelThreshold(110 "da-miv-max-level-threshold", cl::init(7), cl::Hidden,111 cl::desc("Maximum depth allowed for the recursive algorithm used to "112 "explore MIV direction vectors."));113 114namespace {115 116/// Types of dependence test routines.117enum class DependenceTestType {118 All,119 StrongSIV,120 WeakCrossingSIV,121 ExactSIV,122 WeakZeroSIV,123 ExactRDIV,124 SymbolicRDIV,125 GCDMIV,126 BanerjeeMIV,127};128 129} // anonymous namespace130 131static cl::opt<DependenceTestType> EnableDependenceTest(132 "da-enable-dependence-test", cl::init(DependenceTestType::All),133 cl::ReallyHidden,134 cl::desc("Run only specified dependence test routine and disable others. "135 "The purpose is mainly to exclude the influence of other "136 "dependence test routines in regression tests. If set to All, all "137 "dependence test routines are enabled."),138 cl::values(clEnumValN(DependenceTestType::All, "all",139 "Enable all dependence test routines."),140 clEnumValN(DependenceTestType::StrongSIV, "strong-siv",141 "Enable only Strong SIV test."),142 clEnumValN(DependenceTestType::WeakCrossingSIV,143 "weak-crossing-siv",144 "Enable only Weak-Crossing SIV test."),145 clEnumValN(DependenceTestType::ExactSIV, "exact-siv",146 "Enable only Exact SIV test."),147 clEnumValN(DependenceTestType::WeakZeroSIV, "weak-zero-siv",148 "Enable only Weak-Zero SIV test."),149 clEnumValN(DependenceTestType::ExactRDIV, "exact-rdiv",150 "Enable only Exact RDIV test."),151 clEnumValN(DependenceTestType::SymbolicRDIV, "symbolic-rdiv",152 "Enable only Symbolic RDIV test."),153 clEnumValN(DependenceTestType::GCDMIV, "gcd-miv",154 "Enable only GCD MIV test."),155 clEnumValN(DependenceTestType::BanerjeeMIV, "banerjee-miv",156 "Enable only Banerjee MIV test.")));157 158// TODO: This flag is disabled by default because it is still under development.159// Enable it or delete this flag when the feature is ready.160static cl::opt<bool> EnableMonotonicityCheck(161 "da-enable-monotonicity-check", cl::init(false), cl::Hidden,162 cl::desc("Check if the subscripts are monotonic. If it's not, dependence "163 "is reported as unknown."));164 165static cl::opt<bool> DumpMonotonicityReport(166 "da-dump-monotonicity-report", cl::init(false), cl::Hidden,167 cl::desc(168 "When printing analysis, dump the results of monotonicity checks."));169 170//===----------------------------------------------------------------------===//171// basics172 173DependenceAnalysis::Result174DependenceAnalysis::run(Function &F, FunctionAnalysisManager &FAM) {175 auto &AA = FAM.getResult<AAManager>(F);176 auto &SE = FAM.getResult<ScalarEvolutionAnalysis>(F);177 auto &LI = FAM.getResult<LoopAnalysis>(F);178 return DependenceInfo(&F, &AA, &SE, &LI);179}180 181AnalysisKey DependenceAnalysis::Key;182 183INITIALIZE_PASS_BEGIN(DependenceAnalysisWrapperPass, "da",184 "Dependence Analysis", true, true)185INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)186INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)187INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)188INITIALIZE_PASS_END(DependenceAnalysisWrapperPass, "da", "Dependence Analysis",189 true, true)190 191char DependenceAnalysisWrapperPass::ID = 0;192 193DependenceAnalysisWrapperPass::DependenceAnalysisWrapperPass()194 : FunctionPass(ID) {}195 196FunctionPass *llvm::createDependenceAnalysisWrapperPass() {197 return new DependenceAnalysisWrapperPass();198}199 200bool DependenceAnalysisWrapperPass::runOnFunction(Function &F) {201 auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults();202 auto &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE();203 auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();204 info.reset(new DependenceInfo(&F, &AA, &SE, &LI));205 return false;206}207 208DependenceInfo &DependenceAnalysisWrapperPass::getDI() const { return *info; }209 210void DependenceAnalysisWrapperPass::releaseMemory() { info.reset(); }211 212void DependenceAnalysisWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {213 AU.setPreservesAll();214 AU.addRequiredTransitive<AAResultsWrapperPass>();215 AU.addRequiredTransitive<ScalarEvolutionWrapperPass>();216 AU.addRequiredTransitive<LoopInfoWrapperPass>();217}218 219namespace {220 221/// The property of monotonicity of a SCEV. To define the monotonicity, assume222/// a SCEV defined within N-nested loops. Let i_k denote the iteration number223/// of the k-th loop. Then we can regard the SCEV as an N-ary function:224///225/// F(i_1, i_2, ..., i_N)226///227/// The domain of i_k is the closed range [0, BTC_k], where BTC_k is the228/// backedge-taken count of the k-th loop.229///230/// A function F is said to be "monotonically increasing with respect to the231/// k-th loop" if x <= y implies the following condition:232///233/// F(i_1, ..., i_{k-1}, x, i_{k+1}, ..., i_N) <=234/// F(i_1, ..., i_{k-1}, y, i_{k+1}, ..., i_N)235///236/// where i_1, ..., i_{k-1}, i_{k+1}, ..., i_N, x, and y are elements of their237/// respective domains.238///239/// Likewise F is "monotonically decreasing with respect to the k-th loop"240/// if x <= y implies241///242/// F(i_1, ..., i_{k-1}, x, i_{k+1}, ..., i_N) >=243/// F(i_1, ..., i_{k-1}, y, i_{k+1}, ..., i_N)244///245/// A function F that is monotonically increasing or decreasing with respect to246/// the k-th loop is simply called "monotonic with respect to k-th loop".247///248/// A function F is said to be "multivariate monotonic" when it is monotonic249/// with respect to all of the N loops.250///251/// Since integer comparison can be either signed or unsigned, we need to252/// distinguish monotonicity in the signed sense from that in the unsigned253/// sense. Note that the inequality "x <= y" merely indicates loop progression254/// and is not affected by the difference between signed and unsigned order.255///256/// Currently we only consider monotonicity in a signed sense.257enum class SCEVMonotonicityType {258 /// We don't know anything about the monotonicity of the SCEV.259 Unknown,260 261 /// The SCEV is loop-invariant with respect to the outermost loop. In other262 /// words, the function F corresponding to the SCEV is a constant function.263 Invariant,264 265 /// The function F corresponding to the SCEV is multivariate monotonic in a266 /// signed sense. Note that the multivariate monotonic function may also be a267 /// constant function. The order employed in the definition of monotonicity268 /// is not strict order.269 MultivariateSignedMonotonic,270};271 272struct SCEVMonotonicity {273 SCEVMonotonicity(SCEVMonotonicityType Type,274 const SCEV *FailurePoint = nullptr);275 276 SCEVMonotonicityType getType() const { return Type; }277 278 const SCEV *getFailurePoint() const { return FailurePoint; }279 280 bool isUnknown() const { return Type == SCEVMonotonicityType::Unknown; }281 282 void print(raw_ostream &OS, unsigned Depth) const;283 284private:285 SCEVMonotonicityType Type;286 287 /// The subexpression that caused Unknown. Mainly for debugging purpose.288 const SCEV *FailurePoint;289};290 291/// Check the monotonicity of a SCEV. Since dependence tests (SIV, MIV, etc.)292/// assume that subscript expressions are (multivariate) monotonic, we need to293/// verify this property before applying those tests. Violating this assumption294/// may cause them to produce incorrect results.295struct SCEVMonotonicityChecker296 : public SCEVVisitor<SCEVMonotonicityChecker, SCEVMonotonicity> {297 298 SCEVMonotonicityChecker(ScalarEvolution *SE) : SE(SE) {}299 300 /// Check the monotonicity of \p Expr. \p Expr must be integer type. If \p301 /// OutermostLoop is not null, \p Expr must be defined in \p OutermostLoop or302 /// one of its nested loops.303 SCEVMonotonicity checkMonotonicity(const SCEV *Expr,304 const Loop *OutermostLoop);305 306private:307 ScalarEvolution *SE;308 309 /// The outermost loop that DA is analyzing.310 const Loop *OutermostLoop;311 312 /// A helper to classify \p Expr as either Invariant or Unknown.313 SCEVMonotonicity invariantOrUnknown(const SCEV *Expr);314 315 /// Return true if \p Expr is loop-invariant with respect to the outermost316 /// loop.317 bool isLoopInvariant(const SCEV *Expr) const;318 319 /// A helper to create an Unknown SCEVMonotonicity.320 SCEVMonotonicity createUnknown(const SCEV *FailurePoint) {321 return SCEVMonotonicity(SCEVMonotonicityType::Unknown, FailurePoint);322 }323 324 SCEVMonotonicity visitAddRecExpr(const SCEVAddRecExpr *Expr);325 326 SCEVMonotonicity visitConstant(const SCEVConstant *) {327 return SCEVMonotonicity(SCEVMonotonicityType::Invariant);328 }329 SCEVMonotonicity visitVScale(const SCEVVScale *) {330 return SCEVMonotonicity(SCEVMonotonicityType::Invariant);331 }332 333 // TODO: Handle more cases.334 SCEVMonotonicity visitZeroExtendExpr(const SCEVZeroExtendExpr *Expr) {335 return invariantOrUnknown(Expr);336 }337 SCEVMonotonicity visitSignExtendExpr(const SCEVSignExtendExpr *Expr) {338 return invariantOrUnknown(Expr);339 }340 SCEVMonotonicity visitAddExpr(const SCEVAddExpr *Expr) {341 return invariantOrUnknown(Expr);342 }343 SCEVMonotonicity visitMulExpr(const SCEVMulExpr *Expr) {344 return invariantOrUnknown(Expr);345 }346 SCEVMonotonicity visitPtrToIntExpr(const SCEVPtrToIntExpr *Expr) {347 return invariantOrUnknown(Expr);348 }349 SCEVMonotonicity visitTruncateExpr(const SCEVTruncateExpr *Expr) {350 return invariantOrUnknown(Expr);351 }352 SCEVMonotonicity visitUDivExpr(const SCEVUDivExpr *Expr) {353 return invariantOrUnknown(Expr);354 }355 SCEVMonotonicity visitSMaxExpr(const SCEVSMaxExpr *Expr) {356 return invariantOrUnknown(Expr);357 }358 SCEVMonotonicity visitUMaxExpr(const SCEVUMaxExpr *Expr) {359 return invariantOrUnknown(Expr);360 }361 SCEVMonotonicity visitSMinExpr(const SCEVSMinExpr *Expr) {362 return invariantOrUnknown(Expr);363 }364 SCEVMonotonicity visitUMinExpr(const SCEVUMinExpr *Expr) {365 return invariantOrUnknown(Expr);366 }367 SCEVMonotonicity visitSequentialUMinExpr(const SCEVSequentialUMinExpr *Expr) {368 return invariantOrUnknown(Expr);369 }370 SCEVMonotonicity visitUnknown(const SCEVUnknown *Expr) {371 return invariantOrUnknown(Expr);372 }373 SCEVMonotonicity visitCouldNotCompute(const SCEVCouldNotCompute *Expr) {374 return invariantOrUnknown(Expr);375 }376 377 friend struct SCEVVisitor<SCEVMonotonicityChecker, SCEVMonotonicity>;378};379 380} // anonymous namespace381 382// Used to test the dependence analyzer.383// Looks through the function, noting instructions that may access memory.384// Calls depends() on every possible pair and prints out the result.385// Ignores all other instructions.386static void dumpExampleDependence(raw_ostream &OS, DependenceInfo *DA,387 ScalarEvolution &SE, LoopInfo &LI,388 bool NormalizeResults) {389 auto *F = DA->getFunction();390 391 if (DumpMonotonicityReport) {392 SCEVMonotonicityChecker Checker(&SE);393 OS << "Monotonicity check:\n";394 for (Instruction &Inst : instructions(F)) {395 if (!isa<LoadInst>(Inst) && !isa<StoreInst>(Inst))396 continue;397 Value *Ptr = getLoadStorePointerOperand(&Inst);398 const Loop *L = LI.getLoopFor(Inst.getParent());399 const Loop *OutermostLoop = L ? L->getOutermostLoop() : nullptr;400 const SCEV *PtrSCEV = SE.getSCEVAtScope(Ptr, L);401 const SCEV *AccessFn = SE.removePointerBase(PtrSCEV);402 SCEVMonotonicity Mon = Checker.checkMonotonicity(AccessFn, OutermostLoop);403 OS.indent(2) << "Inst: " << Inst << "\n";404 OS.indent(4) << "Expr: " << *AccessFn << "\n";405 Mon.print(OS, 4);406 }407 OS << "\n";408 }409 410 for (inst_iterator SrcI = inst_begin(F), SrcE = inst_end(F); SrcI != SrcE;411 ++SrcI) {412 if (SrcI->mayReadOrWriteMemory()) {413 for (inst_iterator DstI = SrcI, DstE = inst_end(F); DstI != DstE;414 ++DstI) {415 if (DstI->mayReadOrWriteMemory()) {416 OS << "Src:" << *SrcI << " --> Dst:" << *DstI << "\n";417 OS << " da analyze - ";418 if (auto D = DA->depends(&*SrcI, &*DstI,419 /*UnderRuntimeAssumptions=*/true)) {420 421#ifndef NDEBUG422 // Verify that the distance being zero is equivalent to the423 // direction being EQ.424 for (unsigned Level = 1; Level <= D->getLevels(); Level++) {425 const SCEV *Distance = D->getDistance(Level);426 bool IsDistanceZero = Distance && Distance->isZero();427 bool IsDirectionEQ =428 D->getDirection(Level) == Dependence::DVEntry::EQ;429 assert(IsDistanceZero == IsDirectionEQ &&430 "Inconsistent distance and direction.");431 }432#endif433 434 // Normalize negative direction vectors if required by clients.435 if (NormalizeResults && D->normalize(&SE))436 OS << "normalized - ";437 D->dump(OS);438 } else439 OS << "none!\n";440 }441 }442 }443 }444}445 446void DependenceAnalysisWrapperPass::print(raw_ostream &OS,447 const Module *) const {448 dumpExampleDependence(449 OS, info.get(), getAnalysis<ScalarEvolutionWrapperPass>().getSE(),450 getAnalysis<LoopInfoWrapperPass>().getLoopInfo(), false);451}452 453PreservedAnalyses454DependenceAnalysisPrinterPass::run(Function &F, FunctionAnalysisManager &FAM) {455 OS << "Printing analysis 'Dependence Analysis' for function '" << F.getName()456 << "':\n";457 dumpExampleDependence(OS, &FAM.getResult<DependenceAnalysis>(F),458 FAM.getResult<ScalarEvolutionAnalysis>(F),459 FAM.getResult<LoopAnalysis>(F), NormalizeResults);460 return PreservedAnalyses::all();461}462 463//===----------------------------------------------------------------------===//464// Dependence methods465 466// Returns true if this is an input dependence.467bool Dependence::isInput() const {468 return Src->mayReadFromMemory() && Dst->mayReadFromMemory();469}470 471// Returns true if this is an output dependence.472bool Dependence::isOutput() const {473 return Src->mayWriteToMemory() && Dst->mayWriteToMemory();474}475 476// Returns true if this is an flow (aka true) dependence.477bool Dependence::isFlow() const {478 return Src->mayWriteToMemory() && Dst->mayReadFromMemory();479}480 481// Returns true if this is an anti dependence.482bool Dependence::isAnti() const {483 return Src->mayReadFromMemory() && Dst->mayWriteToMemory();484}485 486// Returns true if a particular level is scalar; that is,487// if no subscript in the source or destination mention the induction488// variable associated with the loop at this level.489// Leave this out of line, so it will serve as a virtual method anchor490bool Dependence::isScalar(unsigned level, bool IsSameSD) const { return false; }491 492//===----------------------------------------------------------------------===//493// FullDependence methods494 495FullDependence::FullDependence(Instruction *Source, Instruction *Destination,496 const SCEVUnionPredicate &Assumes,497 bool PossiblyLoopIndependent,498 unsigned CommonLevels)499 : Dependence(Source, Destination, Assumes), Levels(CommonLevels),500 LoopIndependent(PossiblyLoopIndependent) {501 Consistent = true;502 SameSDLevels = 0;503 if (CommonLevels)504 DV = std::make_unique<DVEntry[]>(CommonLevels);505}506 507// FIXME: in some cases the meaning of a negative direction vector508// may not be straightforward, e.g.,509// for (int i = 0; i < 32; ++i) {510// Src: A[i] = ...;511// Dst: use(A[31 - i]);512// }513// The dependency is514// flow { Src[i] -> Dst[31 - i] : when i >= 16 } and515// anti { Dst[i] -> Src[31 - i] : when i < 16 },516// -- hence a [<>].517// As long as a dependence result contains '>' ('<>', '<=>', "*"), it518// means that a reversed/normalized dependence needs to be considered519// as well. Nevertheless, current isDirectionNegative() only returns520// true with a '>' or '>=' dependency for ease of canonicalizing the521// dependency vector, since the reverse of '<>', '<=>' and "*" is itself.522bool FullDependence::isDirectionNegative() const {523 for (unsigned Level = 1; Level <= Levels; ++Level) {524 unsigned char Direction = DV[Level - 1].Direction;525 if (Direction == Dependence::DVEntry::EQ)526 continue;527 if (Direction == Dependence::DVEntry::GT ||528 Direction == Dependence::DVEntry::GE)529 return true;530 return false;531 }532 return false;533}534 535bool FullDependence::normalize(ScalarEvolution *SE) {536 if (!isDirectionNegative())537 return false;538 539 LLVM_DEBUG(dbgs() << "Before normalizing negative direction vectors:\n";540 dump(dbgs()););541 std::swap(Src, Dst);542 for (unsigned Level = 1; Level <= Levels; ++Level) {543 unsigned char Direction = DV[Level - 1].Direction;544 // Reverse the direction vector, this means LT becomes GT545 // and GT becomes LT.546 unsigned char RevDirection = Direction & Dependence::DVEntry::EQ;547 if (Direction & Dependence::DVEntry::LT)548 RevDirection |= Dependence::DVEntry::GT;549 if (Direction & Dependence::DVEntry::GT)550 RevDirection |= Dependence::DVEntry::LT;551 DV[Level - 1].Direction = RevDirection;552 // Reverse the dependence distance as well.553 if (DV[Level - 1].Distance != nullptr)554 DV[Level - 1].Distance = SE->getNegativeSCEV(DV[Level - 1].Distance);555 }556 557 LLVM_DEBUG(dbgs() << "After normalizing negative direction vectors:\n";558 dump(dbgs()););559 return true;560}561 562// The rest are simple getters that hide the implementation.563 564// getDirection - Returns the direction associated with a particular common or565// SameSD level.566unsigned FullDependence::getDirection(unsigned Level, bool IsSameSD) const {567 return getDVEntry(Level, IsSameSD).Direction;568}569 570// Returns the distance (or NULL) associated with a particular common or571// SameSD level.572const SCEV *FullDependence::getDistance(unsigned Level, bool IsSameSD) const {573 return getDVEntry(Level, IsSameSD).Distance;574}575 576// Returns true if a particular regular or SameSD level is scalar; that is,577// if no subscript in the source or destination mention the induction variable578// associated with the loop at this level.579bool FullDependence::isScalar(unsigned Level, bool IsSameSD) const {580 return getDVEntry(Level, IsSameSD).Scalar;581}582 583// Returns true if peeling the first iteration from this regular or SameSD584// loop level will break this dependence.585bool FullDependence::isPeelFirst(unsigned Level, bool IsSameSD) const {586 return getDVEntry(Level, IsSameSD).PeelFirst;587}588 589// Returns true if peeling the last iteration from this regular or SameSD590// loop level will break this dependence.591bool FullDependence::isPeelLast(unsigned Level, bool IsSameSD) const {592 return getDVEntry(Level, IsSameSD).PeelLast;593}594 595// inSameSDLoops - Returns true if this level is an SameSD level, i.e.,596// performed across two separate loop nests that have the Same iteration space597// and Depth.598bool FullDependence::inSameSDLoops(unsigned Level) const {599 assert(0 < Level && Level <= static_cast<unsigned>(Levels) + SameSDLevels &&600 "Level out of range");601 return Level > Levels;602}603 604//===----------------------------------------------------------------------===//605// SCEVMonotonicity606 607SCEVMonotonicity::SCEVMonotonicity(SCEVMonotonicityType Type,608 const SCEV *FailurePoint)609 : Type(Type), FailurePoint(FailurePoint) {610 assert(611 ((Type == SCEVMonotonicityType::Unknown) == (FailurePoint != nullptr)) &&612 "FailurePoint must be provided iff Type is Unknown");613}614 615void SCEVMonotonicity::print(raw_ostream &OS, unsigned Depth) const {616 OS.indent(Depth) << "Monotonicity: ";617 switch (Type) {618 case SCEVMonotonicityType::Unknown:619 assert(FailurePoint && "FailurePoint must be provided for Unknown");620 OS << "Unknown\n";621 OS.indent(Depth) << "Reason: " << *FailurePoint << "\n";622 break;623 case SCEVMonotonicityType::Invariant:624 OS << "Invariant\n";625 break;626 case SCEVMonotonicityType::MultivariateSignedMonotonic:627 OS << "MultivariateSignedMonotonic\n";628 break;629 }630}631 632bool SCEVMonotonicityChecker::isLoopInvariant(const SCEV *Expr) const {633 return !OutermostLoop || SE->isLoopInvariant(Expr, OutermostLoop);634}635 636SCEVMonotonicity SCEVMonotonicityChecker::invariantOrUnknown(const SCEV *Expr) {637 if (isLoopInvariant(Expr))638 return SCEVMonotonicity(SCEVMonotonicityType::Invariant);639 return createUnknown(Expr);640}641 642SCEVMonotonicity643SCEVMonotonicityChecker::checkMonotonicity(const SCEV *Expr,644 const Loop *OutermostLoop) {645 assert((!OutermostLoop || OutermostLoop->isOutermost()) &&646 "OutermostLoop must be outermost");647 assert(Expr->getType()->isIntegerTy() && "Expr must be integer type");648 this->OutermostLoop = OutermostLoop;649 return visit(Expr);650}651 652/// We only care about an affine AddRec at the moment. For an affine AddRec,653/// the monotonicity can be inferred from its nowrap property. For example, let654/// X and Y be loop-invariant, and assume Y is non-negative. An AddRec655/// {X,+.Y}<nsw> implies:656///657/// X <=s (X + Y) <=s ((X + Y) + Y) <=s ...658///659/// Thus, we can conclude that the AddRec is monotonically increasing with660/// respect to the associated loop in a signed sense. The similar reasoning661/// applies when Y is non-positive, leading to a monotonically decreasing662/// AddRec.663SCEVMonotonicity664SCEVMonotonicityChecker::visitAddRecExpr(const SCEVAddRecExpr *Expr) {665 if (!Expr->isAffine() || !Expr->hasNoSignedWrap())666 return createUnknown(Expr);667 668 const SCEV *Start = Expr->getStart();669 const SCEV *Step = Expr->getStepRecurrence(*SE);670 671 SCEVMonotonicity StartMon = visit(Start);672 if (StartMon.isUnknown())673 return StartMon;674 675 if (!isLoopInvariant(Step))676 return createUnknown(Expr);677 678 return SCEVMonotonicity(SCEVMonotonicityType::MultivariateSignedMonotonic);679}680 681//===----------------------------------------------------------------------===//682// DependenceInfo methods683 684// For debugging purposes. Dumps a dependence to OS.685void Dependence::dump(raw_ostream &OS) const {686 if (isConfused())687 OS << "confused";688 else {689 if (isConsistent())690 OS << "consistent ";691 if (isFlow())692 OS << "flow";693 else if (isOutput())694 OS << "output";695 else if (isAnti())696 OS << "anti";697 else if (isInput())698 OS << "input";699 dumpImp(OS);700 unsigned SameSDLevels = getSameSDLevels();701 if (SameSDLevels > 0) {702 OS << " / assuming " << SameSDLevels << " loop level(s) fused: ";703 dumpImp(OS, true);704 }705 }706 OS << "!\n";707 708 SCEVUnionPredicate Assumptions = getRuntimeAssumptions();709 if (!Assumptions.isAlwaysTrue()) {710 OS << " Runtime Assumptions:\n";711 Assumptions.print(OS, 2);712 }713}714 715// For debugging purposes. Dumps a dependence to OS with or without considering716// the SameSD levels.717void Dependence::dumpImp(raw_ostream &OS, bool IsSameSD) const {718 unsigned Levels = getLevels();719 unsigned SameSDLevels = getSameSDLevels();720 bool OnSameSD = false;721 unsigned LevelNum = Levels;722 if (IsSameSD)723 LevelNum += SameSDLevels;724 OS << " [";725 for (unsigned II = 1; II <= LevelNum; ++II) {726 if (!OnSameSD && inSameSDLoops(II))727 OnSameSD = true;728 if (isPeelFirst(II, OnSameSD))729 OS << 'p';730 const SCEV *Distance = getDistance(II, OnSameSD);731 if (Distance)732 OS << *Distance;733 else if (isScalar(II, OnSameSD))734 OS << "S";735 else {736 unsigned Direction = getDirection(II, OnSameSD);737 if (Direction == DVEntry::ALL)738 OS << "*";739 else {740 if (Direction & DVEntry::LT)741 OS << "<";742 if (Direction & DVEntry::EQ)743 OS << "=";744 if (Direction & DVEntry::GT)745 OS << ">";746 }747 }748 if (isPeelLast(II, OnSameSD))749 OS << 'p';750 if (II < LevelNum)751 OS << " ";752 }753 if (isLoopIndependent())754 OS << "|<";755 OS << "]";756}757 758// Returns NoAlias/MayAliass/MustAlias for two memory locations based upon their759// underlaying objects. If LocA and LocB are known to not alias (for any reason:760// tbaa, non-overlapping regions etc), then it is known there is no dependecy.761// Otherwise the underlying objects are checked to see if they point to762// different identifiable objects.763static AliasResult underlyingObjectsAlias(AAResults *AA, const DataLayout &DL,764 const MemoryLocation &LocA,765 const MemoryLocation &LocB) {766 // Check the original locations (minus size) for noalias, which can happen for767 // tbaa, incompatible underlying object locations, etc.768 MemoryLocation LocAS =769 MemoryLocation::getBeforeOrAfter(LocA.Ptr, LocA.AATags);770 MemoryLocation LocBS =771 MemoryLocation::getBeforeOrAfter(LocB.Ptr, LocB.AATags);772 BatchAAResults BAA(*AA);773 BAA.enableCrossIterationMode();774 775 if (BAA.isNoAlias(LocAS, LocBS))776 return AliasResult::NoAlias;777 778 // Check the underlying objects are the same779 const Value *AObj = getUnderlyingObject(LocA.Ptr);780 const Value *BObj = getUnderlyingObject(LocB.Ptr);781 782 // If the underlying objects are the same, they must alias783 if (AObj == BObj)784 return AliasResult::MustAlias;785 786 // We may have hit the recursion limit for underlying objects, or have787 // underlying objects where we don't know they will alias.788 if (!isIdentifiedObject(AObj) || !isIdentifiedObject(BObj))789 return AliasResult::MayAlias;790 791 // Otherwise we know the objects are different and both identified objects so792 // must not alias.793 return AliasResult::NoAlias;794}795 796// Returns true if the load or store can be analyzed. Atomic and volatile797// operations have properties which this analysis does not understand.798static bool isLoadOrStore(const Instruction *I) {799 if (const LoadInst *LI = dyn_cast<LoadInst>(I))800 return LI->isUnordered();801 else if (const StoreInst *SI = dyn_cast<StoreInst>(I))802 return SI->isUnordered();803 return false;804}805 806// Returns true if two loops have the Same iteration Space and Depth. To be807// more specific, two loops have SameSD if they are in the same nesting808// depth and have the same backedge count. SameSD stands for Same iteration809// Space and Depth.810bool DependenceInfo::haveSameSD(const Loop *SrcLoop,811 const Loop *DstLoop) const {812 if (SrcLoop == DstLoop)813 return true;814 815 if (SrcLoop->getLoopDepth() != DstLoop->getLoopDepth())816 return false;817 818 if (!SrcLoop || !SrcLoop->getLoopLatch() || !DstLoop ||819 !DstLoop->getLoopLatch())820 return false;821 822 const SCEV *SrcUB = nullptr, *DstUP = nullptr;823 if (SE->hasLoopInvariantBackedgeTakenCount(SrcLoop))824 SrcUB = SE->getBackedgeTakenCount(SrcLoop);825 if (SE->hasLoopInvariantBackedgeTakenCount(DstLoop))826 DstUP = SE->getBackedgeTakenCount(DstLoop);827 828 if (SrcUB != nullptr && DstUP != nullptr) {829 Type *WiderType = SE->getWiderType(SrcUB->getType(), DstUP->getType());830 SrcUB = SE->getNoopOrZeroExtend(SrcUB, WiderType);831 DstUP = SE->getNoopOrZeroExtend(DstUP, WiderType);832 833 if (SE->isKnownPredicate(ICmpInst::ICMP_EQ, SrcUB, DstUP))834 return true;835 }836 837 return false;838}839 840// Examines the loop nesting of the Src and Dst841// instructions and establishes their shared loops. Sets the variables842// CommonLevels, SrcLevels, and MaxLevels.843// The source and destination instructions needn't be contained in the same844// loop. The routine establishNestingLevels finds the level of most deeply845// nested loop that contains them both, CommonLevels. An instruction that's846// not contained in a loop is at level = 0. MaxLevels is equal to the level847// of the source plus the level of the destination, minus CommonLevels.848// This lets us allocate vectors MaxLevels in length, with room for every849// distinct loop referenced in both the source and destination subscripts.850// The variable SrcLevels is the nesting depth of the source instruction.851// It's used to help calculate distinct loops referenced by the destination.852// Here's the map from loops to levels:853// 0 - unused854// 1 - outermost common loop855// ... - other common loops856// CommonLevels - innermost common loop857// ... - loops containing Src but not Dst858// SrcLevels - innermost loop containing Src but not Dst859// ... - loops containing Dst but not Src860// MaxLevels - innermost loops containing Dst but not Src861// Consider the follow code fragment:862// for (a = ...) {863// for (b = ...) {864// for (c = ...) {865// for (d = ...) {866// A[] = ...;867// }868// }869// for (e = ...) {870// for (f = ...) {871// for (g = ...) {872// ... = A[];873// }874// }875// }876// }877// }878// If we're looking at the possibility of a dependence between the store879// to A (the Src) and the load from A (the Dst), we'll note that they880// have 2 loops in common, so CommonLevels will equal 2 and the direction881// vector for Result will have 2 entries. SrcLevels = 4 and MaxLevels = 7.882// A map from loop names to loop numbers would look like883// a - 1884// b - 2 = CommonLevels885// c - 3886// d - 4 = SrcLevels887// e - 5888// f - 6889// g - 7 = MaxLevels890// SameSDLevels counts the number of levels after common levels that are891// not common but have the same iteration space and depth. Internally this892// is checked using haveSameSD. Assume that in this code fragment, levels c and893// e have the same iteration space and depth, but levels d and f does not. Then894// SameSDLevels is set to 1. In that case the level numbers for the previous895// code look like896// a - 1897// b - 2898// c,e - 3 = CommonLevels899// d - 4 = SrcLevels900// f - 5901// g - 6 = MaxLevels902void DependenceInfo::establishNestingLevels(const Instruction *Src,903 const Instruction *Dst) {904 const BasicBlock *SrcBlock = Src->getParent();905 const BasicBlock *DstBlock = Dst->getParent();906 unsigned SrcLevel = LI->getLoopDepth(SrcBlock);907 unsigned DstLevel = LI->getLoopDepth(DstBlock);908 const Loop *SrcLoop = LI->getLoopFor(SrcBlock);909 const Loop *DstLoop = LI->getLoopFor(DstBlock);910 SrcLevels = SrcLevel;911 MaxLevels = SrcLevel + DstLevel;912 SameSDLevels = 0;913 while (SrcLevel > DstLevel) {914 SrcLoop = SrcLoop->getParentLoop();915 SrcLevel--;916 }917 while (DstLevel > SrcLevel) {918 DstLoop = DstLoop->getParentLoop();919 DstLevel--;920 }921 922 // find the first common level and count the SameSD levels leading to it923 while (SrcLoop != DstLoop) {924 SameSDLevels++;925 if (!haveSameSD(SrcLoop, DstLoop))926 SameSDLevels = 0;927 SrcLoop = SrcLoop->getParentLoop();928 DstLoop = DstLoop->getParentLoop();929 SrcLevel--;930 }931 CommonLevels = SrcLevel;932 MaxLevels -= CommonLevels;933}934 935// Given one of the loops containing the source, return936// its level index in our numbering scheme.937unsigned DependenceInfo::mapSrcLoop(const Loop *SrcLoop) const {938 return SrcLoop->getLoopDepth();939}940 941// Given one of the loops containing the destination,942// return its level index in our numbering scheme.943unsigned DependenceInfo::mapDstLoop(const Loop *DstLoop) const {944 unsigned D = DstLoop->getLoopDepth();945 if (D > CommonLevels)946 // This tries to make sure that we assign unique numbers to src and dst when947 // the memory accesses reside in different loops that have the same depth.948 return D - CommonLevels + SrcLevels;949 else950 return D;951}952 953// Returns true if Expression is loop invariant in LoopNest.954bool DependenceInfo::isLoopInvariant(const SCEV *Expression,955 const Loop *LoopNest) const {956 // Unlike ScalarEvolution::isLoopInvariant() we consider an access outside of957 // any loop as invariant, because we only consier expression evaluation at a958 // specific position (where the array access takes place), and not across the959 // entire function.960 if (!LoopNest)961 return true;962 963 // If the expression is invariant in the outermost loop of the loop nest, it964 // is invariant anywhere in the loop nest.965 return SE->isLoopInvariant(Expression, LoopNest->getOutermostLoop());966}967 968// Finds the set of loops from the LoopNest that969// have a level <= CommonLevels and are referred to by the SCEV Expression.970void DependenceInfo::collectCommonLoops(const SCEV *Expression,971 const Loop *LoopNest,972 SmallBitVector &Loops) const {973 while (LoopNest) {974 unsigned Level = LoopNest->getLoopDepth();975 if (Level <= CommonLevels && !SE->isLoopInvariant(Expression, LoopNest))976 Loops.set(Level);977 LoopNest = LoopNest->getParentLoop();978 }979}980 981void DependenceInfo::unifySubscriptType(ArrayRef<Subscript *> Pairs) {982 983 unsigned widestWidthSeen = 0;984 Type *widestType;985 986 // Go through each pair and find the widest bit to which we need987 // to extend all of them.988 for (Subscript *Pair : Pairs) {989 const SCEV *Src = Pair->Src;990 const SCEV *Dst = Pair->Dst;991 IntegerType *SrcTy = dyn_cast<IntegerType>(Src->getType());992 IntegerType *DstTy = dyn_cast<IntegerType>(Dst->getType());993 if (SrcTy == nullptr || DstTy == nullptr) {994 assert(SrcTy == DstTy &&995 "This function only unify integer types and "996 "expect Src and Dst share the same type otherwise.");997 continue;998 }999 if (SrcTy->getBitWidth() > widestWidthSeen) {1000 widestWidthSeen = SrcTy->getBitWidth();1001 widestType = SrcTy;1002 }1003 if (DstTy->getBitWidth() > widestWidthSeen) {1004 widestWidthSeen = DstTy->getBitWidth();1005 widestType = DstTy;1006 }1007 }1008 1009 assert(widestWidthSeen > 0);1010 1011 // Now extend each pair to the widest seen.1012 for (Subscript *Pair : Pairs) {1013 const SCEV *Src = Pair->Src;1014 const SCEV *Dst = Pair->Dst;1015 IntegerType *SrcTy = dyn_cast<IntegerType>(Src->getType());1016 IntegerType *DstTy = dyn_cast<IntegerType>(Dst->getType());1017 if (SrcTy == nullptr || DstTy == nullptr) {1018 assert(SrcTy == DstTy &&1019 "This function only unify integer types and "1020 "expect Src and Dst share the same type otherwise.");1021 continue;1022 }1023 if (SrcTy->getBitWidth() < widestWidthSeen)1024 // Sign-extend Src to widestType1025 Pair->Src = SE->getSignExtendExpr(Src, widestType);1026 if (DstTy->getBitWidth() < widestWidthSeen) {1027 // Sign-extend Dst to widestType1028 Pair->Dst = SE->getSignExtendExpr(Dst, widestType);1029 }1030 }1031}1032 1033// removeMatchingExtensions - Examines a subscript pair.1034// If the source and destination are identically sign (or zero)1035// extended, it strips off the extension in an effect to simplify1036// the actual analysis.1037void DependenceInfo::removeMatchingExtensions(Subscript *Pair) {1038 const SCEV *Src = Pair->Src;1039 const SCEV *Dst = Pair->Dst;1040 if ((isa<SCEVZeroExtendExpr>(Src) && isa<SCEVZeroExtendExpr>(Dst)) ||1041 (isa<SCEVSignExtendExpr>(Src) && isa<SCEVSignExtendExpr>(Dst))) {1042 const SCEVIntegralCastExpr *SrcCast = cast<SCEVIntegralCastExpr>(Src);1043 const SCEVIntegralCastExpr *DstCast = cast<SCEVIntegralCastExpr>(Dst);1044 const SCEV *SrcCastOp = SrcCast->getOperand();1045 const SCEV *DstCastOp = DstCast->getOperand();1046 if (SrcCastOp->getType() == DstCastOp->getType()) {1047 Pair->Src = SrcCastOp;1048 Pair->Dst = DstCastOp;1049 }1050 }1051}1052 1053// Examine the scev and return true iff it's affine.1054// Collect any loops mentioned in the set of "Loops".1055bool DependenceInfo::checkSubscript(const SCEV *Expr, const Loop *LoopNest,1056 SmallBitVector &Loops, bool IsSrc) {1057 const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Expr);1058 if (!AddRec)1059 return isLoopInvariant(Expr, LoopNest);1060 1061 // The AddRec must depend on one of the containing loops. Otherwise,1062 // mapSrcLoop and mapDstLoop return indices outside the intended range. This1063 // can happen when a subscript in one loop references an IV from a sibling1064 // loop that could not be replaced with a concrete exit value by1065 // getSCEVAtScope.1066 const Loop *L = LoopNest;1067 while (L && AddRec->getLoop() != L)1068 L = L->getParentLoop();1069 if (!L)1070 return false;1071 1072 const SCEV *Start = AddRec->getStart();1073 const SCEV *Step = AddRec->getStepRecurrence(*SE);1074 if (!isLoopInvariant(Step, LoopNest))1075 return false;1076 if (IsSrc)1077 Loops.set(mapSrcLoop(AddRec->getLoop()));1078 else1079 Loops.set(mapDstLoop(AddRec->getLoop()));1080 return checkSubscript(Start, LoopNest, Loops, IsSrc);1081}1082 1083// Examine the scev and return true iff it's linear.1084// Collect any loops mentioned in the set of "Loops".1085bool DependenceInfo::checkSrcSubscript(const SCEV *Src, const Loop *LoopNest,1086 SmallBitVector &Loops) {1087 return checkSubscript(Src, LoopNest, Loops, true);1088}1089 1090// Examine the scev and return true iff it's linear.1091// Collect any loops mentioned in the set of "Loops".1092bool DependenceInfo::checkDstSubscript(const SCEV *Dst, const Loop *LoopNest,1093 SmallBitVector &Loops) {1094 return checkSubscript(Dst, LoopNest, Loops, false);1095}1096 1097// Examines the subscript pair (the Src and Dst SCEVs)1098// and classifies it as either ZIV, SIV, RDIV, MIV, or Nonlinear.1099// Collects the associated loops in a set.1100DependenceInfo::Subscript::ClassificationKind1101DependenceInfo::classifyPair(const SCEV *Src, const Loop *SrcLoopNest,1102 const SCEV *Dst, const Loop *DstLoopNest,1103 SmallBitVector &Loops) {1104 SmallBitVector SrcLoops(MaxLevels + 1);1105 SmallBitVector DstLoops(MaxLevels + 1);1106 if (!checkSrcSubscript(Src, SrcLoopNest, SrcLoops))1107 return Subscript::NonLinear;1108 if (!checkDstSubscript(Dst, DstLoopNest, DstLoops))1109 return Subscript::NonLinear;1110 Loops = SrcLoops;1111 Loops |= DstLoops;1112 unsigned N = Loops.count();1113 if (N == 0)1114 return Subscript::ZIV;1115 if (N == 1)1116 return Subscript::SIV;1117 if (N == 2 && (SrcLoops.count() == 0 || DstLoops.count() == 0 ||1118 (SrcLoops.count() == 1 && DstLoops.count() == 1)))1119 return Subscript::RDIV;1120 return Subscript::MIV;1121}1122 1123// A wrapper around SCEV::isKnownPredicate.1124// Looks for cases where we're interested in comparing for equality.1125// If both X and Y have been identically sign or zero extended,1126// it strips off the (confusing) extensions before invoking1127// SCEV::isKnownPredicate. Perhaps, someday, the ScalarEvolution package1128// will be similarly updated.1129//1130// If SCEV::isKnownPredicate can't prove the predicate,1131// we try simple subtraction, which seems to help in some cases1132// involving symbolics.1133bool DependenceInfo::isKnownPredicate(ICmpInst::Predicate Pred, const SCEV *X,1134 const SCEV *Y) const {1135 if (Pred == CmpInst::ICMP_EQ || Pred == CmpInst::ICMP_NE) {1136 if ((isa<SCEVSignExtendExpr>(X) && isa<SCEVSignExtendExpr>(Y)) ||1137 (isa<SCEVZeroExtendExpr>(X) && isa<SCEVZeroExtendExpr>(Y))) {1138 const SCEVIntegralCastExpr *CX = cast<SCEVIntegralCastExpr>(X);1139 const SCEVIntegralCastExpr *CY = cast<SCEVIntegralCastExpr>(Y);1140 const SCEV *Xop = CX->getOperand();1141 const SCEV *Yop = CY->getOperand();1142 if (Xop->getType() == Yop->getType()) {1143 X = Xop;1144 Y = Yop;1145 }1146 }1147 }1148 if (SE->isKnownPredicate(Pred, X, Y))1149 return true;1150 // If SE->isKnownPredicate can't prove the condition,1151 // we try the brute-force approach of subtracting1152 // and testing the difference.1153 // By testing with SE->isKnownPredicate first, we avoid1154 // the possibility of overflow when the arguments are constants.1155 const SCEV *Delta = SE->getMinusSCEV(X, Y);1156 switch (Pred) {1157 case CmpInst::ICMP_EQ:1158 return Delta->isZero();1159 case CmpInst::ICMP_NE:1160 return SE->isKnownNonZero(Delta);1161 case CmpInst::ICMP_SGE:1162 return SE->isKnownNonNegative(Delta);1163 case CmpInst::ICMP_SLE:1164 return SE->isKnownNonPositive(Delta);1165 case CmpInst::ICMP_SGT:1166 return SE->isKnownPositive(Delta);1167 case CmpInst::ICMP_SLT:1168 return SE->isKnownNegative(Delta);1169 default:1170 llvm_unreachable("unexpected predicate in isKnownPredicate");1171 }1172}1173 1174// All subscripts are all the same type.1175// Loop bound may be smaller (e.g., a char).1176// Should zero extend loop bound, since it's always >= 0.1177// This routine collects upper bound and extends or truncates if needed.1178// Truncating is safe when subscripts are known not to wrap. Cases without1179// nowrap flags should have been rejected earlier.1180// Return null if no bound available.1181const SCEV *DependenceInfo::collectUpperBound(const Loop *L, Type *T) const {1182 if (SE->hasLoopInvariantBackedgeTakenCount(L)) {1183 const SCEV *UB = SE->getBackedgeTakenCount(L);1184 return SE->getTruncateOrZeroExtend(UB, T);1185 }1186 return nullptr;1187}1188 1189// Calls collectUpperBound(), then attempts to cast it to SCEVConstant.1190// If the cast fails, returns NULL.1191const SCEVConstant *DependenceInfo::collectConstantUpperBound(const Loop *L,1192 Type *T) const {1193 if (const SCEV *UB = collectUpperBound(L, T))1194 return dyn_cast<SCEVConstant>(UB);1195 return nullptr;1196}1197 1198/// Returns \p A - \p B if it guaranteed not to signed wrap. Otherwise returns1199/// nullptr. \p A and \p B must have the same integer type.1200static const SCEV *minusSCEVNoSignedOverflow(const SCEV *A, const SCEV *B,1201 ScalarEvolution &SE) {1202 if (SE.willNotOverflow(Instruction::Sub, /*Signed=*/true, A, B))1203 return SE.getMinusSCEV(A, B);1204 return nullptr;1205}1206 1207/// Returns \p A * \p B if it guaranteed not to signed wrap. Otherwise returns1208/// nullptr. \p A and \p B must have the same integer type.1209static const SCEV *mulSCEVNoSignedOverflow(const SCEV *A, const SCEV *B,1210 ScalarEvolution &SE) {1211 if (SE.willNotOverflow(Instruction::Mul, /*Signed=*/true, A, B))1212 return SE.getMulExpr(A, B);1213 return nullptr;1214}1215 1216/// Returns the absolute value of \p A. In the context of dependence analysis,1217/// we need an absolute value in a mathematical sense. If \p A is the signed1218/// minimum value, we cannot represent it unless extending the original type.1219/// Thus if we cannot prove that \p A is not the signed minimum value, returns1220/// nullptr.1221static const SCEV *absSCEVNoSignedOverflow(const SCEV *A, ScalarEvolution &SE) {1222 IntegerType *Ty = cast<IntegerType>(A->getType());1223 if (!Ty)1224 return nullptr;1225 1226 const SCEV *SMin =1227 SE.getConstant(APInt::getSignedMinValue(Ty->getBitWidth()));1228 if (!SE.isKnownPredicate(CmpInst::ICMP_NE, A, SMin))1229 return nullptr;1230 return SE.getAbsExpr(A, /*IsNSW=*/true);1231}1232 1233/// Returns true iff \p Test is enabled.1234static bool isDependenceTestEnabled(DependenceTestType Test) {1235 if (EnableDependenceTest == DependenceTestType::All)1236 return true;1237 return EnableDependenceTest == Test;1238}1239 1240// testZIV -1241// When we have a pair of subscripts of the form [c1] and [c2],1242// where c1 and c2 are both loop invariant, we attack it using1243// the ZIV test. Basically, we test by comparing the two values,1244// but there are actually three possible results:1245// 1) the values are equal, so there's a dependence1246// 2) the values are different, so there's no dependence1247// 3) the values might be equal, so we have to assume a dependence.1248//1249// Return true if dependence disproved.1250bool DependenceInfo::testZIV(const SCEV *Src, const SCEV *Dst,1251 FullDependence &Result) const {1252 LLVM_DEBUG(dbgs() << " src = " << *Src << "\n");1253 LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n");1254 ++ZIVapplications;1255 if (isKnownPredicate(CmpInst::ICMP_EQ, Src, Dst)) {1256 LLVM_DEBUG(dbgs() << " provably dependent\n");1257 return false; // provably dependent1258 }1259 if (isKnownPredicate(CmpInst::ICMP_NE, Src, Dst)) {1260 LLVM_DEBUG(dbgs() << " provably independent\n");1261 ++ZIVindependence;1262 return true; // provably independent1263 }1264 LLVM_DEBUG(dbgs() << " possibly dependent\n");1265 Result.Consistent = false;1266 return false; // possibly dependent1267}1268 1269// strongSIVtest -1270// From the paper, Practical Dependence Testing, Section 4.2.11271//1272// When we have a pair of subscripts of the form [c1 + a*i] and [c2 + a*i],1273// where i is an induction variable, c1 and c2 are loop invariant,1274// and a is a constant, we can solve it exactly using the Strong SIV test.1275//1276// Can prove independence. Failing that, can compute distance (and direction).1277// In the presence of symbolic terms, we can sometimes make progress.1278//1279// If there's a dependence,1280//1281// c1 + a*i = c2 + a*i'1282//1283// The dependence distance is1284//1285// d = i' - i = (c1 - c2)/a1286//1287// A dependence only exists if d is an integer and abs(d) <= U, where U is the1288// loop's upper bound. If a dependence exists, the dependence direction is1289// defined as1290//1291// { < if d > 01292// direction = { = if d = 01293// { > if d < 01294//1295// Return true if dependence disproved.1296bool DependenceInfo::strongSIVtest(const SCEV *Coeff, const SCEV *SrcConst,1297 const SCEV *DstConst, const Loop *CurSrcLoop,1298 const Loop *CurDstLoop, unsigned Level,1299 FullDependence &Result) const {1300 if (!isDependenceTestEnabled(DependenceTestType::StrongSIV))1301 return false;1302 1303 LLVM_DEBUG(dbgs() << "\tStrong SIV test\n");1304 LLVM_DEBUG(dbgs() << "\t Coeff = " << *Coeff);1305 LLVM_DEBUG(dbgs() << ", " << *Coeff->getType() << "\n");1306 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst);1307 LLVM_DEBUG(dbgs() << ", " << *SrcConst->getType() << "\n");1308 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst);1309 LLVM_DEBUG(dbgs() << ", " << *DstConst->getType() << "\n");1310 ++StrongSIVapplications;1311 assert(0 < Level && Level <= CommonLevels && "level out of range");1312 Level--;1313 1314 const SCEV *Delta = minusSCEVNoSignedOverflow(SrcConst, DstConst, *SE);1315 if (!Delta) {1316 Result.Consistent = false;1317 return false;1318 }1319 LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta);1320 LLVM_DEBUG(dbgs() << ", " << *Delta->getType() << "\n");1321 1322 // check that |Delta| < iteration count1323 bool IsDeltaLarge = [&] {1324 const SCEV *UpperBound = collectUpperBound(CurSrcLoop, Delta->getType());1325 if (!UpperBound)1326 return false;1327 1328 LLVM_DEBUG(dbgs() << "\t UpperBound = " << *UpperBound);1329 LLVM_DEBUG(dbgs() << ", " << *UpperBound->getType() << "\n");1330 const SCEV *AbsDelta = absSCEVNoSignedOverflow(Delta, *SE);1331 const SCEV *AbsCoeff = absSCEVNoSignedOverflow(Coeff, *SE);1332 if (!AbsDelta || !AbsCoeff)1333 return false;1334 const SCEV *Product = mulSCEVNoSignedOverflow(UpperBound, AbsCoeff, *SE);1335 if (!Product)1336 return false;1337 return isKnownPredicate(CmpInst::ICMP_SGT, AbsDelta, Product);1338 }();1339 if (IsDeltaLarge) {1340 // Distance greater than trip count - no dependence1341 ++StrongSIVindependence;1342 ++StrongSIVsuccesses;1343 return true;1344 }1345 1346 // Can we compute distance?1347 if (isa<SCEVConstant>(Delta) && isa<SCEVConstant>(Coeff)) {1348 APInt ConstDelta = cast<SCEVConstant>(Delta)->getAPInt();1349 APInt ConstCoeff = cast<SCEVConstant>(Coeff)->getAPInt();1350 APInt Distance = ConstDelta; // these need to be initialized1351 APInt Remainder = ConstDelta;1352 APInt::sdivrem(ConstDelta, ConstCoeff, Distance, Remainder);1353 LLVM_DEBUG(dbgs() << "\t Distance = " << Distance << "\n");1354 LLVM_DEBUG(dbgs() << "\t Remainder = " << Remainder << "\n");1355 // Make sure Coeff divides Delta exactly1356 if (Remainder != 0) {1357 // Coeff doesn't divide Distance, no dependence1358 ++StrongSIVindependence;1359 ++StrongSIVsuccesses;1360 return true;1361 }1362 Result.DV[Level].Distance = SE->getConstant(Distance);1363 if (Distance.sgt(0))1364 Result.DV[Level].Direction &= Dependence::DVEntry::LT;1365 else if (Distance.slt(0))1366 Result.DV[Level].Direction &= Dependence::DVEntry::GT;1367 else1368 Result.DV[Level].Direction &= Dependence::DVEntry::EQ;1369 ++StrongSIVsuccesses;1370 } else if (Delta->isZero()) {1371 // since 0/X == 01372 Result.DV[Level].Distance = Delta;1373 Result.DV[Level].Direction &= Dependence::DVEntry::EQ;1374 ++StrongSIVsuccesses;1375 } else {1376 if (Coeff->isOne()) {1377 LLVM_DEBUG(dbgs() << "\t Distance = " << *Delta << "\n");1378 Result.DV[Level].Distance = Delta; // since X/1 == X1379 } else {1380 Result.Consistent = false;1381 }1382 1383 // maybe we can get a useful direction1384 bool DeltaMaybeZero = !SE->isKnownNonZero(Delta);1385 bool DeltaMaybePositive = !SE->isKnownNonPositive(Delta);1386 bool DeltaMaybeNegative = !SE->isKnownNonNegative(Delta);1387 bool CoeffMaybePositive = !SE->isKnownNonPositive(Coeff);1388 bool CoeffMaybeNegative = !SE->isKnownNonNegative(Coeff);1389 // The double negatives above are confusing.1390 // It helps to read !SE->isKnownNonZero(Delta)1391 // as "Delta might be Zero"1392 unsigned NewDirection = Dependence::DVEntry::NONE;1393 if ((DeltaMaybePositive && CoeffMaybePositive) ||1394 (DeltaMaybeNegative && CoeffMaybeNegative))1395 NewDirection = Dependence::DVEntry::LT;1396 if (DeltaMaybeZero)1397 NewDirection |= Dependence::DVEntry::EQ;1398 if ((DeltaMaybeNegative && CoeffMaybePositive) ||1399 (DeltaMaybePositive && CoeffMaybeNegative))1400 NewDirection |= Dependence::DVEntry::GT;1401 if (NewDirection < Result.DV[Level].Direction)1402 ++StrongSIVsuccesses;1403 Result.DV[Level].Direction &= NewDirection;1404 }1405 return false;1406}1407 1408// weakCrossingSIVtest -1409// From the paper, Practical Dependence Testing, Section 4.2.21410//1411// When we have a pair of subscripts of the form [c1 + a*i] and [c2 - a*i],1412// where i is an induction variable, c1 and c2 are loop invariant,1413// and a is a constant, we can solve it exactly using the1414// Weak-Crossing SIV test.1415//1416// Given c1 + a*i = c2 - a*i', we can look for the intersection of1417// the two lines, where i = i', yielding1418//1419// c1 + a*i = c2 - a*i1420// 2a*i = c2 - c11421// i = (c2 - c1)/2a1422//1423// If i < 0, there is no dependence.1424// If i > upperbound, there is no dependence.1425// If i = 0 (i.e., if c1 = c2), there's a dependence with distance = 0.1426// If i = upperbound, there's a dependence with distance = 0.1427// If i is integral, there's a dependence (all directions).1428// If the non-integer part = 1/2, there's a dependence (<> directions).1429// Otherwise, there's no dependence.1430//1431// Can prove independence. Failing that,1432// can sometimes refine the directions.1433// Can determine iteration for splitting.1434//1435// Return true if dependence disproved.1436bool DependenceInfo::weakCrossingSIVtest(const SCEV *Coeff,1437 const SCEV *SrcConst,1438 const SCEV *DstConst,1439 const Loop *CurSrcLoop,1440 const Loop *CurDstLoop, unsigned Level,1441 FullDependence &Result) const {1442 if (!isDependenceTestEnabled(DependenceTestType::WeakCrossingSIV))1443 return false;1444 1445 LLVM_DEBUG(dbgs() << "\tWeak-Crossing SIV test\n");1446 LLVM_DEBUG(dbgs() << "\t Coeff = " << *Coeff << "\n");1447 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");1448 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n");1449 ++WeakCrossingSIVapplications;1450 assert(0 < Level && Level <= CommonLevels && "Level out of range");1451 Level--;1452 Result.Consistent = false;1453 const SCEV *Delta = SE->getMinusSCEV(DstConst, SrcConst);1454 LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n");1455 if (Delta->isZero()) {1456 Result.DV[Level].Direction &= ~Dependence::DVEntry::LT;1457 Result.DV[Level].Direction &= ~Dependence::DVEntry::GT;1458 ++WeakCrossingSIVsuccesses;1459 if (!Result.DV[Level].Direction) {1460 ++WeakCrossingSIVindependence;1461 return true;1462 }1463 Result.DV[Level].Distance = Delta; // = 01464 return false;1465 }1466 const SCEVConstant *ConstCoeff = dyn_cast<SCEVConstant>(Coeff);1467 if (!ConstCoeff)1468 return false;1469 1470 if (SE->isKnownNegative(ConstCoeff)) {1471 ConstCoeff = dyn_cast<SCEVConstant>(SE->getNegativeSCEV(ConstCoeff));1472 assert(ConstCoeff &&1473 "dynamic cast of negative of ConstCoeff should yield constant");1474 Delta = SE->getNegativeSCEV(Delta);1475 }1476 assert(SE->isKnownPositive(ConstCoeff) && "ConstCoeff should be positive");1477 1478 const SCEVConstant *ConstDelta = dyn_cast<SCEVConstant>(Delta);1479 if (!ConstDelta)1480 return false;1481 1482 // We're certain that ConstCoeff > 0; therefore,1483 // if Delta < 0, then no dependence.1484 LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n");1485 LLVM_DEBUG(dbgs() << "\t ConstCoeff = " << *ConstCoeff << "\n");1486 if (SE->isKnownNegative(Delta)) {1487 // No dependence, Delta < 01488 ++WeakCrossingSIVindependence;1489 ++WeakCrossingSIVsuccesses;1490 return true;1491 }1492 1493 // We're certain that Delta > 0 and ConstCoeff > 0.1494 // Check Delta/(2*ConstCoeff) against upper loop bound1495 if (const SCEV *UpperBound =1496 collectUpperBound(CurSrcLoop, Delta->getType())) {1497 LLVM_DEBUG(dbgs() << "\t UpperBound = " << *UpperBound << "\n");1498 const SCEV *ConstantTwo = SE->getConstant(UpperBound->getType(), 2);1499 const SCEV *ML =1500 SE->getMulExpr(SE->getMulExpr(ConstCoeff, UpperBound), ConstantTwo);1501 LLVM_DEBUG(dbgs() << "\t ML = " << *ML << "\n");1502 if (isKnownPredicate(CmpInst::ICMP_SGT, Delta, ML)) {1503 // Delta too big, no dependence1504 ++WeakCrossingSIVindependence;1505 ++WeakCrossingSIVsuccesses;1506 return true;1507 }1508 if (isKnownPredicate(CmpInst::ICMP_EQ, Delta, ML)) {1509 // i = i' = UB1510 Result.DV[Level].Direction &= ~Dependence::DVEntry::LT;1511 Result.DV[Level].Direction &= ~Dependence::DVEntry::GT;1512 ++WeakCrossingSIVsuccesses;1513 if (!Result.DV[Level].Direction) {1514 ++WeakCrossingSIVindependence;1515 return true;1516 }1517 Result.DV[Level].Distance = SE->getZero(Delta->getType());1518 return false;1519 }1520 }1521 1522 // check that Coeff divides Delta1523 APInt APDelta = ConstDelta->getAPInt();1524 APInt APCoeff = ConstCoeff->getAPInt();1525 APInt Distance = APDelta; // these need to be initialzed1526 APInt Remainder = APDelta;1527 APInt::sdivrem(APDelta, APCoeff, Distance, Remainder);1528 LLVM_DEBUG(dbgs() << "\t Remainder = " << Remainder << "\n");1529 if (Remainder != 0) {1530 // Coeff doesn't divide Delta, no dependence1531 ++WeakCrossingSIVindependence;1532 ++WeakCrossingSIVsuccesses;1533 return true;1534 }1535 LLVM_DEBUG(dbgs() << "\t Distance = " << Distance << "\n");1536 1537 // if 2*Coeff doesn't divide Delta, then the equal direction isn't possible1538 APInt Two = APInt(Distance.getBitWidth(), 2, true);1539 Remainder = Distance.srem(Two);1540 LLVM_DEBUG(dbgs() << "\t Remainder = " << Remainder << "\n");1541 if (Remainder != 0) {1542 // Equal direction isn't possible1543 Result.DV[Level].Direction &= ~Dependence::DVEntry::EQ;1544 ++WeakCrossingSIVsuccesses;1545 }1546 return false;1547}1548 1549// Kirch's algorithm, from1550//1551// Optimizing Supercompilers for Supercomputers1552// Michael Wolfe1553// MIT Press, 19891554//1555// Program 2.1, page 29.1556// Computes the GCD of AM and BM.1557// Also finds a solution to the equation ax - by = gcd(a, b).1558// Returns true if dependence disproved; i.e., gcd does not divide Delta.1559static bool findGCD(unsigned Bits, const APInt &AM, const APInt &BM,1560 const APInt &Delta, APInt &G, APInt &X, APInt &Y) {1561 APInt A0(Bits, 1, true), A1(Bits, 0, true);1562 APInt B0(Bits, 0, true), B1(Bits, 1, true);1563 APInt G0 = AM.abs();1564 APInt G1 = BM.abs();1565 APInt Q = G0; // these need to be initialized1566 APInt R = G0;1567 APInt::sdivrem(G0, G1, Q, R);1568 while (R != 0) {1569 // clang-format off1570 APInt A2 = A0 - Q*A1; A0 = A1; A1 = A2;1571 APInt B2 = B0 - Q*B1; B0 = B1; B1 = B2;1572 G0 = G1; G1 = R;1573 // clang-format on1574 APInt::sdivrem(G0, G1, Q, R);1575 }1576 G = G1;1577 LLVM_DEBUG(dbgs() << "\t GCD = " << G << "\n");1578 X = AM.slt(0) ? -A1 : A1;1579 Y = BM.slt(0) ? B1 : -B1;1580 1581 // make sure gcd divides Delta1582 R = Delta.srem(G);1583 if (R != 0)1584 return true; // gcd doesn't divide Delta, no dependence1585 Q = Delta.sdiv(G);1586 return false;1587}1588 1589static APInt floorOfQuotient(const APInt &A, const APInt &B) {1590 APInt Q = A; // these need to be initialized1591 APInt R = A;1592 APInt::sdivrem(A, B, Q, R);1593 if (R == 0)1594 return Q;1595 if ((A.sgt(0) && B.sgt(0)) || (A.slt(0) && B.slt(0)))1596 return Q;1597 else1598 return Q - 1;1599}1600 1601static APInt ceilingOfQuotient(const APInt &A, const APInt &B) {1602 APInt Q = A; // these need to be initialized1603 APInt R = A;1604 APInt::sdivrem(A, B, Q, R);1605 if (R == 0)1606 return Q;1607 if ((A.sgt(0) && B.sgt(0)) || (A.slt(0) && B.slt(0)))1608 return Q + 1;1609 else1610 return Q;1611}1612 1613/// Given an affine expression of the form A*k + B, where k is an arbitrary1614/// integer, infer the possible range of k based on the known range of the1615/// affine expression. If we know A*k + B is non-negative, i.e.,1616///1617/// A*k + B >= 01618///1619/// we can derive the following inequalities for k when A is positive:1620///1621/// k >= -B / A1622///1623/// Since k is an integer, it means k is greater than or equal to the1624/// ceil(-B / A).1625///1626/// If the upper bound of the affine expression \p UB is passed, the following1627/// inequality can be derived as well:1628///1629/// A*k + B <= UB1630///1631/// which leads to:1632///1633/// k <= (UB - B) / A1634///1635/// Again, as k is an integer, it means k is less than or equal to the1636/// floor((UB - B) / A).1637///1638/// The similar logic applies when A is negative, but the inequalities sign flip1639/// while working with them.1640///1641/// Preconditions: \p A is non-zero, and we know A*k + B is non-negative.1642static std::pair<std::optional<APInt>, std::optional<APInt>>1643inferDomainOfAffine(const APInt &A, const APInt &B,1644 const std::optional<APInt> &UB) {1645 assert(A != 0 && "A must be non-zero");1646 std::optional<APInt> TL, TU;1647 if (A.sgt(0)) {1648 TL = ceilingOfQuotient(-B, A);1649 LLVM_DEBUG(dbgs() << "\t Possible TL = " << *TL << "\n");1650 // New bound check - modification to Banerjee's e3 check1651 if (UB) {1652 // TODO?: Overflow check for UB - B1653 TU = floorOfQuotient(*UB - B, A);1654 LLVM_DEBUG(dbgs() << "\t Possible TU = " << *TU << "\n");1655 }1656 } else {1657 TU = floorOfQuotient(-B, A);1658 LLVM_DEBUG(dbgs() << "\t Possible TU = " << *TU << "\n");1659 // New bound check - modification to Banerjee's e3 check1660 if (UB) {1661 // TODO?: Overflow check for UB - B1662 TL = ceilingOfQuotient(*UB - B, A);1663 LLVM_DEBUG(dbgs() << "\t Possible TL = " << *TL << "\n");1664 }1665 }1666 return std::make_pair(TL, TU);1667}1668 1669// exactSIVtest -1670// When we have a pair of subscripts of the form [c1 + a1*i] and [c2 + a2*i],1671// where i is an induction variable, c1 and c2 are loop invariant, and a11672// and a2 are constant, we can solve it exactly using an algorithm developed1673// by Banerjee and Wolfe. See Algorithm 6.2.1 (case 2.5) in:1674//1675// Dependence Analysis for Supercomputing1676// Utpal Banerjee1677// Kluwer Academic Publishers, 19881678//1679// It's slower than the specialized tests (strong SIV, weak-zero SIV, etc),1680// so use them if possible. They're also a bit better with symbolics and,1681// in the case of the strong SIV test, can compute Distances.1682//1683// Return true if dependence disproved.1684//1685// This is a modified version of the original Banerjee algorithm. The original1686// only tested whether Dst depends on Src. This algorithm extends that and1687// returns all the dependencies that exist between Dst and Src.1688bool DependenceInfo::exactSIVtest(const SCEV *SrcCoeff, const SCEV *DstCoeff,1689 const SCEV *SrcConst, const SCEV *DstConst,1690 const Loop *CurSrcLoop,1691 const Loop *CurDstLoop, unsigned Level,1692 FullDependence &Result) const {1693 if (!isDependenceTestEnabled(DependenceTestType::ExactSIV))1694 return false;1695 1696 LLVM_DEBUG(dbgs() << "\tExact SIV test\n");1697 LLVM_DEBUG(dbgs() << "\t SrcCoeff = " << *SrcCoeff << " = AM\n");1698 LLVM_DEBUG(dbgs() << "\t DstCoeff = " << *DstCoeff << " = BM\n");1699 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");1700 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n");1701 ++ExactSIVapplications;1702 assert(0 < Level && Level <= CommonLevels && "Level out of range");1703 Level--;1704 Result.Consistent = false;1705 const SCEV *Delta = minusSCEVNoSignedOverflow(DstConst, SrcConst, *SE);1706 if (!Delta)1707 return false;1708 LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n");1709 const SCEVConstant *ConstDelta = dyn_cast<SCEVConstant>(Delta);1710 const SCEVConstant *ConstSrcCoeff = dyn_cast<SCEVConstant>(SrcCoeff);1711 const SCEVConstant *ConstDstCoeff = dyn_cast<SCEVConstant>(DstCoeff);1712 if (!ConstDelta || !ConstSrcCoeff || !ConstDstCoeff)1713 return false;1714 1715 // find gcd1716 APInt G, X, Y;1717 APInt AM = ConstSrcCoeff->getAPInt();1718 APInt BM = ConstDstCoeff->getAPInt();1719 APInt CM = ConstDelta->getAPInt();1720 unsigned Bits = AM.getBitWidth();1721 if (findGCD(Bits, AM, BM, CM, G, X, Y)) {1722 // gcd doesn't divide Delta, no dependence1723 ++ExactSIVindependence;1724 ++ExactSIVsuccesses;1725 return true;1726 }1727 1728 LLVM_DEBUG(dbgs() << "\t X = " << X << ", Y = " << Y << "\n");1729 1730 // since SCEV construction normalizes, LM = 01731 std::optional<APInt> UM;1732 // UM is perhaps unavailable, let's check1733 if (const SCEVConstant *CUB =1734 collectConstantUpperBound(CurSrcLoop, Delta->getType())) {1735 UM = CUB->getAPInt();1736 LLVM_DEBUG(dbgs() << "\t UM = " << *UM << "\n");1737 }1738 1739 APInt TU(APInt::getSignedMaxValue(Bits));1740 APInt TL(APInt::getSignedMinValue(Bits));1741 APInt TC = CM.sdiv(G);1742 APInt TX = X * TC;1743 APInt TY = Y * TC;1744 LLVM_DEBUG(dbgs() << "\t TC = " << TC << "\n");1745 LLVM_DEBUG(dbgs() << "\t TX = " << TX << "\n");1746 LLVM_DEBUG(dbgs() << "\t TY = " << TY << "\n");1747 1748 APInt TB = BM.sdiv(G);1749 APInt TA = AM.sdiv(G);1750 1751 // At this point, we have the following equations:1752 //1753 // TA*i0 - TB*i1 = TC1754 //1755 // Also, we know that the all pairs of (i0, i1) can be expressed as:1756 //1757 // (TX + k*TB, TY + k*TA)1758 //1759 // where k is an arbitrary integer.1760 auto [TL0, TU0] = inferDomainOfAffine(TB, TX, UM);1761 auto [TL1, TU1] = inferDomainOfAffine(TA, TY, UM);1762 1763 auto CreateVec = [](const std::optional<APInt> &V0,1764 const std::optional<APInt> &V1) {1765 SmallVector<APInt, 2> Vec;1766 if (V0)1767 Vec.push_back(*V0);1768 if (V1)1769 Vec.push_back(*V1);1770 return Vec;1771 };1772 1773 SmallVector<APInt, 2> TLVec = CreateVec(TL0, TL1);1774 SmallVector<APInt, 2> TUVec = CreateVec(TU0, TU1);1775 1776 LLVM_DEBUG(dbgs() << "\t TA = " << TA << "\n");1777 LLVM_DEBUG(dbgs() << "\t TB = " << TB << "\n");1778 1779 if (TLVec.empty() || TUVec.empty())1780 return false;1781 TL = APIntOps::smax(TLVec.front(), TLVec.back());1782 TU = APIntOps::smin(TUVec.front(), TUVec.back());1783 LLVM_DEBUG(dbgs() << "\t TL = " << TL << "\n");1784 LLVM_DEBUG(dbgs() << "\t TU = " << TU << "\n");1785 1786 if (TL.sgt(TU)) {1787 ++ExactSIVindependence;1788 ++ExactSIVsuccesses;1789 return true;1790 }1791 1792 // explore directions1793 unsigned NewDirection = Dependence::DVEntry::NONE;1794 APInt LowerDistance, UpperDistance;1795 // TODO: Overflow check may be needed.1796 if (TA.sgt(TB)) {1797 LowerDistance = (TY - TX) + (TA - TB) * TL;1798 UpperDistance = (TY - TX) + (TA - TB) * TU;1799 } else {1800 LowerDistance = (TY - TX) + (TA - TB) * TU;1801 UpperDistance = (TY - TX) + (TA - TB) * TL;1802 }1803 1804 LLVM_DEBUG(dbgs() << "\t LowerDistance = " << LowerDistance << "\n");1805 LLVM_DEBUG(dbgs() << "\t UpperDistance = " << UpperDistance << "\n");1806 1807 APInt Zero(Bits, 0, true);1808 if (LowerDistance.sle(Zero) && UpperDistance.sge(Zero)) {1809 NewDirection |= Dependence::DVEntry::EQ;1810 ++ExactSIVsuccesses;1811 }1812 if (LowerDistance.slt(0)) {1813 NewDirection |= Dependence::DVEntry::GT;1814 ++ExactSIVsuccesses;1815 }1816 if (UpperDistance.sgt(0)) {1817 NewDirection |= Dependence::DVEntry::LT;1818 ++ExactSIVsuccesses;1819 }1820 1821 // finished1822 Result.DV[Level].Direction &= NewDirection;1823 if (Result.DV[Level].Direction == Dependence::DVEntry::NONE)1824 ++ExactSIVindependence;1825 LLVM_DEBUG(dbgs() << "\t Result = ");1826 LLVM_DEBUG(Result.dump(dbgs()));1827 return Result.DV[Level].Direction == Dependence::DVEntry::NONE;1828}1829 1830// Return true if the divisor evenly divides the dividend.1831static bool isRemainderZero(const SCEVConstant *Dividend,1832 const SCEVConstant *Divisor) {1833 const APInt &ConstDividend = Dividend->getAPInt();1834 const APInt &ConstDivisor = Divisor->getAPInt();1835 return ConstDividend.srem(ConstDivisor) == 0;1836}1837 1838// weakZeroSrcSIVtest -1839// From the paper, Practical Dependence Testing, Section 4.2.21840//1841// When we have a pair of subscripts of the form [c1] and [c2 + a*i],1842// where i is an induction variable, c1 and c2 are loop invariant,1843// and a is a constant, we can solve it exactly using the1844// Weak-Zero SIV test.1845//1846// Given1847//1848// c1 = c2 + a*i1849//1850// we get1851//1852// (c1 - c2)/a = i1853//1854// If i is not an integer, there's no dependence.1855// If i < 0 or > UB, there's no dependence.1856// If i = 0, the direction is >= and peeling the1857// 1st iteration will break the dependence.1858// If i = UB, the direction is <= and peeling the1859// last iteration will break the dependence.1860// Otherwise, the direction is *.1861//1862// Can prove independence. Failing that, we can sometimes refine1863// the directions. Can sometimes show that first or last1864// iteration carries all the dependences (so worth peeling).1865//1866// (see also weakZeroDstSIVtest)1867//1868// Return true if dependence disproved.1869bool DependenceInfo::weakZeroSrcSIVtest(const SCEV *DstCoeff,1870 const SCEV *SrcConst,1871 const SCEV *DstConst,1872 const Loop *CurSrcLoop,1873 const Loop *CurDstLoop, unsigned Level,1874 FullDependence &Result) const {1875 if (!isDependenceTestEnabled(DependenceTestType::WeakZeroSIV))1876 return false;1877 1878 // For the WeakSIV test, it's possible the loop isn't common to1879 // the Src and Dst loops. If it isn't, then there's no need to1880 // record a direction.1881 LLVM_DEBUG(dbgs() << "\tWeak-Zero (src) SIV test\n");1882 LLVM_DEBUG(dbgs() << "\t DstCoeff = " << *DstCoeff << "\n");1883 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");1884 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n");1885 ++WeakZeroSIVapplications;1886 assert(0 < Level && Level <= MaxLevels && "Level out of range");1887 Level--;1888 Result.Consistent = false;1889 const SCEV *Delta = SE->getMinusSCEV(SrcConst, DstConst);1890 LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n");1891 if (isKnownPredicate(CmpInst::ICMP_EQ, SrcConst, DstConst)) {1892 if (Level < CommonLevels) {1893 Result.DV[Level].Direction &= Dependence::DVEntry::GE;1894 Result.DV[Level].PeelFirst = true;1895 ++WeakZeroSIVsuccesses;1896 }1897 return false; // dependences caused by first iteration1898 }1899 const SCEVConstant *ConstCoeff = dyn_cast<SCEVConstant>(DstCoeff);1900 if (!ConstCoeff)1901 return false;1902 1903 // Since ConstCoeff is constant, !isKnownNegative means it's non-negative.1904 // TODO: Bail out if it's a signed minimum value.1905 const SCEV *AbsCoeff = SE->isKnownNegative(ConstCoeff)1906 ? SE->getNegativeSCEV(ConstCoeff)1907 : ConstCoeff;1908 const SCEV *NewDelta =1909 SE->isKnownNegative(ConstCoeff) ? SE->getNegativeSCEV(Delta) : Delta;1910 1911 // check that Delta/SrcCoeff < iteration count1912 // really check NewDelta < count*AbsCoeff1913 if (const SCEV *UpperBound =1914 collectUpperBound(CurSrcLoop, Delta->getType())) {1915 LLVM_DEBUG(dbgs() << "\t UpperBound = " << *UpperBound << "\n");1916 const SCEV *Product = SE->getMulExpr(AbsCoeff, UpperBound);1917 if (isKnownPredicate(CmpInst::ICMP_SGT, NewDelta, Product)) {1918 ++WeakZeroSIVindependence;1919 ++WeakZeroSIVsuccesses;1920 return true;1921 }1922 if (isKnownPredicate(CmpInst::ICMP_EQ, NewDelta, Product)) {1923 // dependences caused by last iteration1924 if (Level < CommonLevels) {1925 Result.DV[Level].Direction &= Dependence::DVEntry::LE;1926 Result.DV[Level].PeelLast = true;1927 ++WeakZeroSIVsuccesses;1928 }1929 return false;1930 }1931 }1932 1933 // check that Delta/SrcCoeff >= 01934 // really check that NewDelta >= 01935 if (SE->isKnownNegative(NewDelta)) {1936 // No dependence, newDelta < 01937 ++WeakZeroSIVindependence;1938 ++WeakZeroSIVsuccesses;1939 return true;1940 }1941 1942 // if SrcCoeff doesn't divide Delta, then no dependence1943 if (isa<SCEVConstant>(Delta) &&1944 !isRemainderZero(cast<SCEVConstant>(Delta), ConstCoeff)) {1945 ++WeakZeroSIVindependence;1946 ++WeakZeroSIVsuccesses;1947 return true;1948 }1949 return false;1950}1951 1952// weakZeroDstSIVtest -1953// From the paper, Practical Dependence Testing, Section 4.2.21954//1955// When we have a pair of subscripts of the form [c1 + a*i] and [c2],1956// where i is an induction variable, c1 and c2 are loop invariant,1957// and a is a constant, we can solve it exactly using the1958// Weak-Zero SIV test.1959//1960// Given1961//1962// c1 + a*i = c21963//1964// we get1965//1966// i = (c2 - c1)/a1967//1968// If i is not an integer, there's no dependence.1969// If i < 0 or > UB, there's no dependence.1970// If i = 0, the direction is <= and peeling the1971// 1st iteration will break the dependence.1972// If i = UB, the direction is >= and peeling the1973// last iteration will break the dependence.1974// Otherwise, the direction is *.1975//1976// Can prove independence. Failing that, we can sometimes refine1977// the directions. Can sometimes show that first or last1978// iteration carries all the dependences (so worth peeling).1979//1980// (see also weakZeroSrcSIVtest)1981//1982// Return true if dependence disproved.1983bool DependenceInfo::weakZeroDstSIVtest(const SCEV *SrcCoeff,1984 const SCEV *SrcConst,1985 const SCEV *DstConst,1986 const Loop *CurSrcLoop,1987 const Loop *CurDstLoop, unsigned Level,1988 FullDependence &Result) const {1989 if (!isDependenceTestEnabled(DependenceTestType::WeakZeroSIV))1990 return false;1991 1992 // For the WeakSIV test, it's possible the loop isn't common to the1993 // Src and Dst loops. If it isn't, then there's no need to record a direction.1994 LLVM_DEBUG(dbgs() << "\tWeak-Zero (dst) SIV test\n");1995 LLVM_DEBUG(dbgs() << "\t SrcCoeff = " << *SrcCoeff << "\n");1996 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");1997 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n");1998 ++WeakZeroSIVapplications;1999 assert(0 < Level && Level <= SrcLevels && "Level out of range");2000 Level--;2001 Result.Consistent = false;2002 const SCEV *Delta = SE->getMinusSCEV(DstConst, SrcConst);2003 LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n");2004 if (isKnownPredicate(CmpInst::ICMP_EQ, DstConst, SrcConst)) {2005 if (Level < CommonLevels) {2006 Result.DV[Level].Direction &= Dependence::DVEntry::LE;2007 Result.DV[Level].PeelFirst = true;2008 ++WeakZeroSIVsuccesses;2009 }2010 return false; // dependences caused by first iteration2011 }2012 const SCEVConstant *ConstCoeff = dyn_cast<SCEVConstant>(SrcCoeff);2013 if (!ConstCoeff)2014 return false;2015 2016 // Since ConstCoeff is constant, !isKnownNegative means it's non-negative.2017 // TODO: Bail out if it's a signed minimum value.2018 const SCEV *AbsCoeff = SE->isKnownNegative(ConstCoeff)2019 ? SE->getNegativeSCEV(ConstCoeff)2020 : ConstCoeff;2021 const SCEV *NewDelta =2022 SE->isKnownNegative(ConstCoeff) ? SE->getNegativeSCEV(Delta) : Delta;2023 2024 // check that Delta/SrcCoeff < iteration count2025 // really check NewDelta < count*AbsCoeff2026 if (const SCEV *UpperBound =2027 collectUpperBound(CurSrcLoop, Delta->getType())) {2028 LLVM_DEBUG(dbgs() << "\t UpperBound = " << *UpperBound << "\n");2029 const SCEV *Product = SE->getMulExpr(AbsCoeff, UpperBound);2030 if (isKnownPredicate(CmpInst::ICMP_SGT, NewDelta, Product)) {2031 ++WeakZeroSIVindependence;2032 ++WeakZeroSIVsuccesses;2033 return true;2034 }2035 if (isKnownPredicate(CmpInst::ICMP_EQ, NewDelta, Product)) {2036 // dependences caused by last iteration2037 if (Level < CommonLevels) {2038 Result.DV[Level].Direction &= Dependence::DVEntry::GE;2039 Result.DV[Level].PeelLast = true;2040 ++WeakZeroSIVsuccesses;2041 }2042 return false;2043 }2044 }2045 2046 // check that Delta/SrcCoeff >= 02047 // really check that NewDelta >= 02048 if (SE->isKnownNegative(NewDelta)) {2049 // No dependence, newDelta < 02050 ++WeakZeroSIVindependence;2051 ++WeakZeroSIVsuccesses;2052 return true;2053 }2054 2055 // if SrcCoeff doesn't divide Delta, then no dependence2056 if (isa<SCEVConstant>(Delta) &&2057 !isRemainderZero(cast<SCEVConstant>(Delta), ConstCoeff)) {2058 ++WeakZeroSIVindependence;2059 ++WeakZeroSIVsuccesses;2060 return true;2061 }2062 return false;2063}2064 2065// exactRDIVtest - Tests the RDIV subscript pair for dependence.2066// Things of the form [c1 + a*i] and [c2 + b*j],2067// where i and j are induction variable, c1 and c2 are loop invariant,2068// and a and b are constants.2069// Returns true if any possible dependence is disproved.2070// Marks the result as inconsistent.2071// Works in some cases that symbolicRDIVtest doesn't, and vice versa.2072bool DependenceInfo::exactRDIVtest(const SCEV *SrcCoeff, const SCEV *DstCoeff,2073 const SCEV *SrcConst, const SCEV *DstConst,2074 const Loop *SrcLoop, const Loop *DstLoop,2075 FullDependence &Result) const {2076 if (!isDependenceTestEnabled(DependenceTestType::ExactRDIV))2077 return false;2078 2079 LLVM_DEBUG(dbgs() << "\tExact RDIV test\n");2080 LLVM_DEBUG(dbgs() << "\t SrcCoeff = " << *SrcCoeff << " = AM\n");2081 LLVM_DEBUG(dbgs() << "\t DstCoeff = " << *DstCoeff << " = BM\n");2082 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");2083 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n");2084 ++ExactRDIVapplications;2085 Result.Consistent = false;2086 const SCEV *Delta = SE->getMinusSCEV(DstConst, SrcConst);2087 LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n");2088 const SCEVConstant *ConstDelta = dyn_cast<SCEVConstant>(Delta);2089 const SCEVConstant *ConstSrcCoeff = dyn_cast<SCEVConstant>(SrcCoeff);2090 const SCEVConstant *ConstDstCoeff = dyn_cast<SCEVConstant>(DstCoeff);2091 if (!ConstDelta || !ConstSrcCoeff || !ConstDstCoeff)2092 return false;2093 2094 // find gcd2095 APInt G, X, Y;2096 APInt AM = ConstSrcCoeff->getAPInt();2097 APInt BM = ConstDstCoeff->getAPInt();2098 APInt CM = ConstDelta->getAPInt();2099 unsigned Bits = AM.getBitWidth();2100 if (findGCD(Bits, AM, BM, CM, G, X, Y)) {2101 // gcd doesn't divide Delta, no dependence2102 ++ExactRDIVindependence;2103 return true;2104 }2105 2106 LLVM_DEBUG(dbgs() << "\t X = " << X << ", Y = " << Y << "\n");2107 2108 // since SCEV construction seems to normalize, LM = 02109 std::optional<APInt> SrcUM;2110 // SrcUM is perhaps unavailable, let's check2111 if (const SCEVConstant *UpperBound =2112 collectConstantUpperBound(SrcLoop, Delta->getType())) {2113 SrcUM = UpperBound->getAPInt();2114 LLVM_DEBUG(dbgs() << "\t SrcUM = " << *SrcUM << "\n");2115 }2116 2117 std::optional<APInt> DstUM;2118 // UM is perhaps unavailable, let's check2119 if (const SCEVConstant *UpperBound =2120 collectConstantUpperBound(DstLoop, Delta->getType())) {2121 DstUM = UpperBound->getAPInt();2122 LLVM_DEBUG(dbgs() << "\t DstUM = " << *DstUM << "\n");2123 }2124 2125 APInt TU(APInt::getSignedMaxValue(Bits));2126 APInt TL(APInt::getSignedMinValue(Bits));2127 APInt TC = CM.sdiv(G);2128 APInt TX = X * TC;2129 APInt TY = Y * TC;2130 LLVM_DEBUG(dbgs() << "\t TC = " << TC << "\n");2131 LLVM_DEBUG(dbgs() << "\t TX = " << TX << "\n");2132 LLVM_DEBUG(dbgs() << "\t TY = " << TY << "\n");2133 2134 APInt TB = BM.sdiv(G);2135 APInt TA = AM.sdiv(G);2136 2137 // At this point, we have the following equations:2138 //2139 // TA*i - TB*j = TC2140 //2141 // Also, we know that the all pairs of (i, j) can be expressed as:2142 //2143 // (TX + k*TB, TY + k*TA)2144 //2145 // where k is an arbitrary integer.2146 auto [TL0, TU0] = inferDomainOfAffine(TB, TX, SrcUM);2147 auto [TL1, TU1] = inferDomainOfAffine(TA, TY, DstUM);2148 2149 LLVM_DEBUG(dbgs() << "\t TA = " << TA << "\n");2150 LLVM_DEBUG(dbgs() << "\t TB = " << TB << "\n");2151 2152 auto CreateVec = [](const std::optional<APInt> &V0,2153 const std::optional<APInt> &V1) {2154 SmallVector<APInt, 2> Vec;2155 if (V0)2156 Vec.push_back(*V0);2157 if (V1)2158 Vec.push_back(*V1);2159 return Vec;2160 };2161 2162 SmallVector<APInt, 2> TLVec = CreateVec(TL0, TL1);2163 SmallVector<APInt, 2> TUVec = CreateVec(TU0, TU1);2164 if (TLVec.empty() || TUVec.empty())2165 return false;2166 2167 TL = APIntOps::smax(TLVec.front(), TLVec.back());2168 TU = APIntOps::smin(TUVec.front(), TUVec.back());2169 LLVM_DEBUG(dbgs() << "\t TL = " << TL << "\n");2170 LLVM_DEBUG(dbgs() << "\t TU = " << TU << "\n");2171 2172 if (TL.sgt(TU))2173 ++ExactRDIVindependence;2174 return TL.sgt(TU);2175}2176 2177// symbolicRDIVtest -2178// In Section 4.5 of the Practical Dependence Testing paper,the authors2179// introduce a special case of Banerjee's Inequalities (also called the2180// Extreme-Value Test) that can handle some of the SIV and RDIV cases,2181// particularly cases with symbolics. Since it's only able to disprove2182// dependence (not compute distances or directions), we'll use it as a2183// fall back for the other tests.2184//2185// When we have a pair of subscripts of the form [c1 + a1*i] and [c2 + a2*j]2186// where i and j are induction variables and c1 and c2 are loop invariants,2187// we can use the symbolic tests to disprove some dependences, serving as a2188// backup for the RDIV test. Note that i and j can be the same variable,2189// letting this test serve as a backup for the various SIV tests.2190//2191// For a dependence to exist, c1 + a1*i must equal c2 + a2*j for some2192// 0 <= i <= N1 and some 0 <= j <= N2, where N1 and N2 are the (normalized)2193// loop bounds for the i and j loops, respectively. So, ...2194//2195// c1 + a1*i = c2 + a2*j2196// a1*i - a2*j = c2 - c12197//2198// To test for a dependence, we compute c2 - c1 and make sure it's in the2199// range of the maximum and minimum possible values of a1*i - a2*j.2200// Considering the signs of a1 and a2, we have 4 possible cases:2201//2202// 1) If a1 >= 0 and a2 >= 0, then2203// a1*0 - a2*N2 <= c2 - c1 <= a1*N1 - a2*02204// -a2*N2 <= c2 - c1 <= a1*N12205//2206// 2) If a1 >= 0 and a2 <= 0, then2207// a1*0 - a2*0 <= c2 - c1 <= a1*N1 - a2*N22208// 0 <= c2 - c1 <= a1*N1 - a2*N22209//2210// 3) If a1 <= 0 and a2 >= 0, then2211// a1*N1 - a2*N2 <= c2 - c1 <= a1*0 - a2*02212// a1*N1 - a2*N2 <= c2 - c1 <= 02213//2214// 4) If a1 <= 0 and a2 <= 0, then2215// a1*N1 - a2*0 <= c2 - c1 <= a1*0 - a2*N22216// a1*N1 <= c2 - c1 <= -a2*N22217//2218// return true if dependence disproved2219bool DependenceInfo::symbolicRDIVtest(const SCEV *A1, const SCEV *A2,2220 const SCEV *C1, const SCEV *C2,2221 const Loop *Loop1,2222 const Loop *Loop2) const {2223 if (!isDependenceTestEnabled(DependenceTestType::SymbolicRDIV))2224 return false;2225 2226 ++SymbolicRDIVapplications;2227 LLVM_DEBUG(dbgs() << "\ttry symbolic RDIV test\n");2228 LLVM_DEBUG(dbgs() << "\t A1 = " << *A1);2229 LLVM_DEBUG(dbgs() << ", type = " << *A1->getType() << "\n");2230 LLVM_DEBUG(dbgs() << "\t A2 = " << *A2 << "\n");2231 LLVM_DEBUG(dbgs() << "\t C1 = " << *C1 << "\n");2232 LLVM_DEBUG(dbgs() << "\t C2 = " << *C2 << "\n");2233 const SCEV *N1 = collectUpperBound(Loop1, A1->getType());2234 const SCEV *N2 = collectUpperBound(Loop2, A1->getType());2235 LLVM_DEBUG(if (N1) dbgs() << "\t N1 = " << *N1 << "\n");2236 LLVM_DEBUG(if (N2) dbgs() << "\t N2 = " << *N2 << "\n");2237 const SCEV *C2_C1 = SE->getMinusSCEV(C2, C1);2238 const SCEV *C1_C2 = SE->getMinusSCEV(C1, C2);2239 LLVM_DEBUG(dbgs() << "\t C2 - C1 = " << *C2_C1 << "\n");2240 LLVM_DEBUG(dbgs() << "\t C1 - C2 = " << *C1_C2 << "\n");2241 if (SE->isKnownNonNegative(A1)) {2242 if (SE->isKnownNonNegative(A2)) {2243 // A1 >= 0 && A2 >= 02244 if (N1) {2245 // make sure that c2 - c1 <= a1*N12246 const SCEV *A1N1 = SE->getMulExpr(A1, N1);2247 LLVM_DEBUG(dbgs() << "\t A1*N1 = " << *A1N1 << "\n");2248 if (isKnownPredicate(CmpInst::ICMP_SGT, C2_C1, A1N1)) {2249 ++SymbolicRDIVindependence;2250 return true;2251 }2252 }2253 if (N2) {2254 // make sure that -a2*N2 <= c2 - c1, or a2*N2 >= c1 - c22255 const SCEV *A2N2 = SE->getMulExpr(A2, N2);2256 LLVM_DEBUG(dbgs() << "\t A2*N2 = " << *A2N2 << "\n");2257 if (isKnownPredicate(CmpInst::ICMP_SLT, A2N2, C1_C2)) {2258 ++SymbolicRDIVindependence;2259 return true;2260 }2261 }2262 } else if (SE->isKnownNonPositive(A2)) {2263 // a1 >= 0 && a2 <= 02264 if (N1 && N2) {2265 // make sure that c2 - c1 <= a1*N1 - a2*N22266 const SCEV *A1N1 = SE->getMulExpr(A1, N1);2267 const SCEV *A2N2 = SE->getMulExpr(A2, N2);2268 const SCEV *A1N1_A2N2 = SE->getMinusSCEV(A1N1, A2N2);2269 LLVM_DEBUG(dbgs() << "\t A1*N1 - A2*N2 = " << *A1N1_A2N2 << "\n");2270 if (isKnownPredicate(CmpInst::ICMP_SGT, C2_C1, A1N1_A2N2)) {2271 ++SymbolicRDIVindependence;2272 return true;2273 }2274 }2275 // make sure that 0 <= c2 - c12276 if (SE->isKnownNegative(C2_C1)) {2277 ++SymbolicRDIVindependence;2278 return true;2279 }2280 }2281 } else if (SE->isKnownNonPositive(A1)) {2282 if (SE->isKnownNonNegative(A2)) {2283 // a1 <= 0 && a2 >= 02284 if (N1 && N2) {2285 // make sure that a1*N1 - a2*N2 <= c2 - c12286 const SCEV *A1N1 = SE->getMulExpr(A1, N1);2287 const SCEV *A2N2 = SE->getMulExpr(A2, N2);2288 const SCEV *A1N1_A2N2 = SE->getMinusSCEV(A1N1, A2N2);2289 LLVM_DEBUG(dbgs() << "\t A1*N1 - A2*N2 = " << *A1N1_A2N2 << "\n");2290 if (isKnownPredicate(CmpInst::ICMP_SGT, A1N1_A2N2, C2_C1)) {2291 ++SymbolicRDIVindependence;2292 return true;2293 }2294 }2295 // make sure that c2 - c1 <= 02296 if (SE->isKnownPositive(C2_C1)) {2297 ++SymbolicRDIVindependence;2298 return true;2299 }2300 } else if (SE->isKnownNonPositive(A2)) {2301 // a1 <= 0 && a2 <= 02302 if (N1) {2303 // make sure that a1*N1 <= c2 - c12304 const SCEV *A1N1 = SE->getMulExpr(A1, N1);2305 LLVM_DEBUG(dbgs() << "\t A1*N1 = " << *A1N1 << "\n");2306 if (isKnownPredicate(CmpInst::ICMP_SGT, A1N1, C2_C1)) {2307 ++SymbolicRDIVindependence;2308 return true;2309 }2310 }2311 if (N2) {2312 // make sure that c2 - c1 <= -a2*N2, or c1 - c2 >= a2*N22313 const SCEV *A2N2 = SE->getMulExpr(A2, N2);2314 LLVM_DEBUG(dbgs() << "\t A2*N2 = " << *A2N2 << "\n");2315 if (isKnownPredicate(CmpInst::ICMP_SLT, C1_C2, A2N2)) {2316 ++SymbolicRDIVindependence;2317 return true;2318 }2319 }2320 }2321 }2322 return false;2323}2324 2325// testSIV -2326// When we have a pair of subscripts of the form [c1 + a1*i] and [c2 - a2*i]2327// where i is an induction variable, c1 and c2 are loop invariant, and a1 and2328// a2 are constant, we attack it with an SIV test. While they can all be2329// solved with the Exact SIV test, it's worthwhile to use simpler tests when2330// they apply; they're cheaper and sometimes more precise.2331//2332// Return true if dependence disproved.2333bool DependenceInfo::testSIV(const SCEV *Src, const SCEV *Dst, unsigned &Level,2334 FullDependence &Result) const {2335 LLVM_DEBUG(dbgs() << " src = " << *Src << "\n");2336 LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n");2337 const SCEVAddRecExpr *SrcAddRec = dyn_cast<SCEVAddRecExpr>(Src);2338 const SCEVAddRecExpr *DstAddRec = dyn_cast<SCEVAddRecExpr>(Dst);2339 if (SrcAddRec && DstAddRec) {2340 const SCEV *SrcConst = SrcAddRec->getStart();2341 const SCEV *DstConst = DstAddRec->getStart();2342 const SCEV *SrcCoeff = SrcAddRec->getStepRecurrence(*SE);2343 const SCEV *DstCoeff = DstAddRec->getStepRecurrence(*SE);2344 const Loop *CurSrcLoop = SrcAddRec->getLoop();2345 const Loop *CurDstLoop = DstAddRec->getLoop();2346 assert(haveSameSD(CurSrcLoop, CurDstLoop) &&2347 "Loops in the SIV test should have the same iteration space and "2348 "depth");2349 Level = mapSrcLoop(CurSrcLoop);2350 bool disproven;2351 if (SrcCoeff == DstCoeff)2352 disproven = strongSIVtest(SrcCoeff, SrcConst, DstConst, CurSrcLoop,2353 CurDstLoop, Level, Result);2354 else if (SrcCoeff == SE->getNegativeSCEV(DstCoeff))2355 disproven = weakCrossingSIVtest(SrcCoeff, SrcConst, DstConst, CurSrcLoop,2356 CurDstLoop, Level, Result);2357 else2358 disproven = exactSIVtest(SrcCoeff, DstCoeff, SrcConst, DstConst,2359 CurSrcLoop, CurDstLoop, Level, Result);2360 return disproven || gcdMIVtest(Src, Dst, Result) ||2361 symbolicRDIVtest(SrcCoeff, DstCoeff, SrcConst, DstConst, CurSrcLoop,2362 CurDstLoop);2363 }2364 if (SrcAddRec) {2365 const SCEV *SrcConst = SrcAddRec->getStart();2366 const SCEV *SrcCoeff = SrcAddRec->getStepRecurrence(*SE);2367 const SCEV *DstConst = Dst;2368 const Loop *CurSrcLoop = SrcAddRec->getLoop();2369 Level = mapSrcLoop(CurSrcLoop);2370 return weakZeroDstSIVtest(SrcCoeff, SrcConst, DstConst, CurSrcLoop,2371 CurSrcLoop, Level, Result) ||2372 gcdMIVtest(Src, Dst, Result);2373 }2374 if (DstAddRec) {2375 const SCEV *DstConst = DstAddRec->getStart();2376 const SCEV *DstCoeff = DstAddRec->getStepRecurrence(*SE);2377 const SCEV *SrcConst = Src;2378 const Loop *CurDstLoop = DstAddRec->getLoop();2379 Level = mapDstLoop(CurDstLoop);2380 return weakZeroSrcSIVtest(DstCoeff, SrcConst, DstConst, CurDstLoop,2381 CurDstLoop, Level, Result) ||2382 gcdMIVtest(Src, Dst, Result);2383 }2384 llvm_unreachable("SIV test expected at least one AddRec");2385 return false;2386}2387 2388// testRDIV -2389// When we have a pair of subscripts of the form [c1 + a1*i] and [c2 + a2*j]2390// where i and j are induction variables, c1 and c2 are loop invariant,2391// and a1 and a2 are constant, we can solve it exactly with an easy adaptation2392// of the Exact SIV test, the Restricted Double Index Variable (RDIV) test.2393// It doesn't make sense to talk about distance or direction in this case,2394// so there's no point in making special versions of the Strong SIV test or2395// the Weak-crossing SIV test.2396//2397// With minor algebra, this test can also be used for things like2398// [c1 + a1*i + a2*j][c2].2399//2400// Return true if dependence disproved.2401bool DependenceInfo::testRDIV(const SCEV *Src, const SCEV *Dst,2402 FullDependence &Result) const {2403 // we have 3 possible situations here:2404 // 1) [a*i + b] and [c*j + d]2405 // 2) [a*i + c*j + b] and [d]2406 // 3) [b] and [a*i + c*j + d]2407 // We need to find what we've got and get organized2408 2409 const SCEV *SrcConst, *DstConst;2410 const SCEV *SrcCoeff, *DstCoeff;2411 const Loop *SrcLoop, *DstLoop;2412 2413 LLVM_DEBUG(dbgs() << " src = " << *Src << "\n");2414 LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n");2415 const SCEVAddRecExpr *SrcAddRec = dyn_cast<SCEVAddRecExpr>(Src);2416 const SCEVAddRecExpr *DstAddRec = dyn_cast<SCEVAddRecExpr>(Dst);2417 if (SrcAddRec && DstAddRec) {2418 SrcConst = SrcAddRec->getStart();2419 SrcCoeff = SrcAddRec->getStepRecurrence(*SE);2420 SrcLoop = SrcAddRec->getLoop();2421 DstConst = DstAddRec->getStart();2422 DstCoeff = DstAddRec->getStepRecurrence(*SE);2423 DstLoop = DstAddRec->getLoop();2424 } else if (SrcAddRec) {2425 if (const SCEVAddRecExpr *tmpAddRec =2426 dyn_cast<SCEVAddRecExpr>(SrcAddRec->getStart())) {2427 SrcConst = tmpAddRec->getStart();2428 SrcCoeff = tmpAddRec->getStepRecurrence(*SE);2429 SrcLoop = tmpAddRec->getLoop();2430 DstConst = Dst;2431 DstCoeff = SE->getNegativeSCEV(SrcAddRec->getStepRecurrence(*SE));2432 DstLoop = SrcAddRec->getLoop();2433 } else2434 llvm_unreachable("RDIV reached by surprising SCEVs");2435 } else if (DstAddRec) {2436 if (const SCEVAddRecExpr *tmpAddRec =2437 dyn_cast<SCEVAddRecExpr>(DstAddRec->getStart())) {2438 DstConst = tmpAddRec->getStart();2439 DstCoeff = tmpAddRec->getStepRecurrence(*SE);2440 DstLoop = tmpAddRec->getLoop();2441 SrcConst = Src;2442 SrcCoeff = SE->getNegativeSCEV(DstAddRec->getStepRecurrence(*SE));2443 SrcLoop = DstAddRec->getLoop();2444 } else2445 llvm_unreachable("RDIV reached by surprising SCEVs");2446 } else2447 llvm_unreachable("RDIV expected at least one AddRec");2448 return exactRDIVtest(SrcCoeff, DstCoeff, SrcConst, DstConst, SrcLoop, DstLoop,2449 Result) ||2450 gcdMIVtest(Src, Dst, Result) ||2451 symbolicRDIVtest(SrcCoeff, DstCoeff, SrcConst, DstConst, SrcLoop,2452 DstLoop);2453}2454 2455// Tests the single-subscript MIV pair (Src and Dst) for dependence.2456// Return true if dependence disproved.2457// Can sometimes refine direction vectors.2458bool DependenceInfo::testMIV(const SCEV *Src, const SCEV *Dst,2459 const SmallBitVector &Loops,2460 FullDependence &Result) const {2461 LLVM_DEBUG(dbgs() << " src = " << *Src << "\n");2462 LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n");2463 Result.Consistent = false;2464 return gcdMIVtest(Src, Dst, Result) ||2465 banerjeeMIVtest(Src, Dst, Loops, Result);2466}2467 2468/// Given a SCEVMulExpr, returns its first operand if its first operand is a2469/// constant and the product doesn't overflow in a signed sense. Otherwise,2470/// returns std::nullopt. For example, given (10 * X * Y)<nsw>, it returns 10.2471/// Notably, if it doesn't have nsw, the multiplication may overflow, and if2472/// so, it may not a multiple of 10.2473static std::optional<APInt> getConstanCoefficient(const SCEV *Expr) {2474 if (const auto *Constant = dyn_cast<SCEVConstant>(Expr))2475 return Constant->getAPInt();2476 if (const auto *Product = dyn_cast<SCEVMulExpr>(Expr))2477 if (const auto *Constant = dyn_cast<SCEVConstant>(Product->getOperand(0)))2478 if (Product->hasNoSignedWrap())2479 return Constant->getAPInt();2480 return std::nullopt;2481}2482 2483bool DependenceInfo::accumulateCoefficientsGCD(const SCEV *Expr,2484 const Loop *CurLoop,2485 const SCEV *&CurLoopCoeff,2486 APInt &RunningGCD) const {2487 // If RunningGCD is already 1, exit early.2488 // TODO: It might be better to continue the recursion to find CurLoopCoeff.2489 if (RunningGCD == 1)2490 return true;2491 2492 const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Expr);2493 if (!AddRec) {2494 assert(isLoopInvariant(Expr, CurLoop) &&2495 "Expected loop invariant expression");2496 return true;2497 }2498 2499 assert(AddRec->isAffine() && "Unexpected Expr");2500 const SCEV *Start = AddRec->getStart();2501 const SCEV *Step = AddRec->getStepRecurrence(*SE);2502 if (AddRec->getLoop() == CurLoop) {2503 CurLoopCoeff = Step;2504 } else {2505 std::optional<APInt> ConstCoeff = getConstanCoefficient(Step);2506 2507 // If the coefficient is the product of a constant and other stuff, we can2508 // use the constant in the GCD computation.2509 if (!ConstCoeff)2510 return false;2511 2512 // TODO: What happens if ConstCoeff is the "most negative" signed number2513 // (e.g. -128 for 8 bit wide APInt)?2514 RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff->abs());2515 }2516 2517 return accumulateCoefficientsGCD(Start, CurLoop, CurLoopCoeff, RunningGCD);2518}2519 2520//===----------------------------------------------------------------------===//2521// gcdMIVtest -2522// Tests an MIV subscript pair for dependence.2523// Returns true if any possible dependence is disproved.2524// Marks the result as inconsistent.2525// Can sometimes disprove the equal direction for 1 or more loops,2526// as discussed in Michael Wolfe's book,2527// High Performance Compilers for Parallel Computing, page 235.2528//2529// We spend some effort (code!) to handle cases like2530// [10*i + 5*N*j + 15*M + 6], where i and j are induction variables,2531// but M and N are just loop-invariant variables.2532// This should help us handle linearized subscripts;2533// also makes this test a useful backup to the various SIV tests.2534//2535// It occurs to me that the presence of loop-invariant variables2536// changes the nature of the test from "greatest common divisor"2537// to "a common divisor".2538bool DependenceInfo::gcdMIVtest(const SCEV *Src, const SCEV *Dst,2539 FullDependence &Result) const {2540 if (!isDependenceTestEnabled(DependenceTestType::GCDMIV))2541 return false;2542 2543 LLVM_DEBUG(dbgs() << "starting gcd\n");2544 ++GCDapplications;2545 unsigned BitWidth = SE->getTypeSizeInBits(Src->getType());2546 APInt RunningGCD = APInt::getZero(BitWidth);2547 2548 // Examine Src coefficients.2549 // Compute running GCD and record source constant.2550 // Because we're looking for the constant at the end of the chain,2551 // we can't quit the loop just because the GCD == 1.2552 const SCEV *Coefficients = Src;2553 while (const SCEVAddRecExpr *AddRec =2554 dyn_cast<SCEVAddRecExpr>(Coefficients)) {2555 const SCEV *Coeff = AddRec->getStepRecurrence(*SE);2556 // If the coefficient is the product of a constant and other stuff,2557 // we can use the constant in the GCD computation.2558 std::optional<APInt> ConstCoeff = getConstanCoefficient(Coeff);2559 if (!ConstCoeff)2560 return false;2561 RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff->abs());2562 Coefficients = AddRec->getStart();2563 }2564 const SCEV *SrcConst = Coefficients;2565 2566 // Examine Dst coefficients.2567 // Compute running GCD and record destination constant.2568 // Because we're looking for the constant at the end of the chain,2569 // we can't quit the loop just because the GCD == 1.2570 Coefficients = Dst;2571 while (const SCEVAddRecExpr *AddRec =2572 dyn_cast<SCEVAddRecExpr>(Coefficients)) {2573 const SCEV *Coeff = AddRec->getStepRecurrence(*SE);2574 // If the coefficient is the product of a constant and other stuff,2575 // we can use the constant in the GCD computation.2576 std::optional<APInt> ConstCoeff = getConstanCoefficient(Coeff);2577 if (!ConstCoeff)2578 return false;2579 RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff->abs());2580 Coefficients = AddRec->getStart();2581 }2582 const SCEV *DstConst = Coefficients;2583 2584 APInt ExtraGCD = APInt::getZero(BitWidth);2585 const SCEV *Delta = minusSCEVNoSignedOverflow(DstConst, SrcConst, *SE);2586 if (!Delta)2587 return false;2588 LLVM_DEBUG(dbgs() << " Delta = " << *Delta << "\n");2589 const SCEVConstant *Constant = dyn_cast<SCEVConstant>(Delta);2590 if (!Constant)2591 return false;2592 APInt ConstDelta = cast<SCEVConstant>(Constant)->getAPInt();2593 LLVM_DEBUG(dbgs() << " ConstDelta = " << ConstDelta << "\n");2594 if (ConstDelta == 0)2595 return false;2596 LLVM_DEBUG(dbgs() << " RunningGCD = " << RunningGCD << "\n");2597 APInt Remainder = ConstDelta.srem(RunningGCD);2598 if (Remainder != 0) {2599 ++GCDindependence;2600 return true;2601 }2602 2603 // Try to disprove equal directions.2604 // For example, given a subscript pair [3*i + 2*j] and [i' + 2*j' - 1],2605 // the code above can't disprove the dependence because the GCD = 1.2606 // So we consider what happen if i = i' and what happens if j = j'.2607 // If i = i', we can simplify the subscript to [2*i + 2*j] and [2*j' - 1],2608 // which is infeasible, so we can disallow the = direction for the i level.2609 // Setting j = j' doesn't help matters, so we end up with a direction vector2610 // of [<>, *]2611 //2612 // Given A[5*i + 10*j*M + 9*M*N] and A[15*i + 20*j*M - 21*N*M + 5],2613 // we need to remember that the constant part is 5 and the RunningGCD should2614 // be initialized to ExtraGCD = 30.2615 LLVM_DEBUG(dbgs() << " ExtraGCD = " << ExtraGCD << '\n');2616 2617 bool Improved = false;2618 Coefficients = Src;2619 while (const SCEVAddRecExpr *AddRec =2620 dyn_cast<SCEVAddRecExpr>(Coefficients)) {2621 Coefficients = AddRec->getStart();2622 const Loop *CurLoop = AddRec->getLoop();2623 RunningGCD = ExtraGCD;2624 const SCEV *SrcCoeff = AddRec->getStepRecurrence(*SE);2625 const SCEV *DstCoeff = SE->getMinusSCEV(SrcCoeff, SrcCoeff);2626 2627 if (!accumulateCoefficientsGCD(Src, CurLoop, SrcCoeff, RunningGCD) ||2628 !accumulateCoefficientsGCD(Dst, CurLoop, DstCoeff, RunningGCD))2629 return false;2630 2631 Delta = SE->getMinusSCEV(SrcCoeff, DstCoeff);2632 // If the coefficient is the product of a constant and other stuff,2633 // we can use the constant in the GCD computation.2634 std::optional<APInt> ConstCoeff = getConstanCoefficient(Delta);2635 if (!ConstCoeff)2636 // The difference of the two coefficients might not be a product2637 // or constant, in which case we give up on this direction.2638 continue;2639 RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff->abs());2640 LLVM_DEBUG(dbgs() << "\tRunningGCD = " << RunningGCD << "\n");2641 if (RunningGCD != 0) {2642 Remainder = ConstDelta.srem(RunningGCD);2643 LLVM_DEBUG(dbgs() << "\tRemainder = " << Remainder << "\n");2644 if (Remainder != 0) {2645 unsigned Level = mapSrcLoop(CurLoop);2646 Result.DV[Level - 1].Direction &= ~Dependence::DVEntry::EQ;2647 Improved = true;2648 }2649 }2650 }2651 if (Improved)2652 ++GCDsuccesses;2653 LLVM_DEBUG(dbgs() << "all done\n");2654 return false;2655}2656 2657//===----------------------------------------------------------------------===//2658// banerjeeMIVtest -2659// Use Banerjee's Inequalities to test an MIV subscript pair.2660// (Wolfe, in the race-car book, calls this the Extreme Value Test.)2661// Generally follows the discussion in Section 2.5.2 of2662//2663// Optimizing Supercompilers for Supercomputers2664// Michael Wolfe2665//2666// The inequalities given on page 25 are simplified in that loops are2667// normalized so that the lower bound is always 0 and the stride is always 1.2668// For example, Wolfe gives2669//2670// LB^<_k = (A^-_k - B_k)^- (U_k - L_k - N_k) + (A_k - B_k)L_k - B_k N_k2671//2672// where A_k is the coefficient of the kth index in the source subscript,2673// B_k is the coefficient of the kth index in the destination subscript,2674// U_k is the upper bound of the kth index, L_k is the lower bound of the Kth2675// index, and N_k is the stride of the kth index. Since all loops are normalized2676// by the SCEV package, N_k = 1 and L_k = 0, allowing us to simplify the2677// equation to2678//2679// LB^<_k = (A^-_k - B_k)^- (U_k - 0 - 1) + (A_k - B_k)0 - B_k 12680// = (A^-_k - B_k)^- (U_k - 1) - B_k2681//2682// Similar simplifications are possible for the other equations.2683//2684// When we can't determine the number of iterations for a loop,2685// we use NULL as an indicator for the worst case, infinity.2686// When computing the upper bound, NULL denotes +inf;2687// for the lower bound, NULL denotes -inf.2688//2689// Return true if dependence disproved.2690bool DependenceInfo::banerjeeMIVtest(const SCEV *Src, const SCEV *Dst,2691 const SmallBitVector &Loops,2692 FullDependence &Result) const {2693 if (!isDependenceTestEnabled(DependenceTestType::BanerjeeMIV))2694 return false;2695 2696 LLVM_DEBUG(dbgs() << "starting Banerjee\n");2697 ++BanerjeeApplications;2698 LLVM_DEBUG(dbgs() << " Src = " << *Src << '\n');2699 const SCEV *A0;2700 CoefficientInfo *A = collectCoeffInfo(Src, true, A0);2701 LLVM_DEBUG(dbgs() << " Dst = " << *Dst << '\n');2702 const SCEV *B0;2703 CoefficientInfo *B = collectCoeffInfo(Dst, false, B0);2704 BoundInfo *Bound = new BoundInfo[MaxLevels + 1];2705 const SCEV *Delta = SE->getMinusSCEV(B0, A0);2706 LLVM_DEBUG(dbgs() << "\tDelta = " << *Delta << '\n');2707 2708 // Compute bounds for all the * directions.2709 LLVM_DEBUG(dbgs() << "\tBounds[*]\n");2710 for (unsigned K = 1; K <= MaxLevels; ++K) {2711 Bound[K].Iterations = A[K].Iterations ? A[K].Iterations : B[K].Iterations;2712 Bound[K].Direction = Dependence::DVEntry::ALL;2713 Bound[K].DirSet = Dependence::DVEntry::NONE;2714 findBoundsALL(A, B, Bound, K);2715#ifndef NDEBUG2716 LLVM_DEBUG(dbgs() << "\t " << K << '\t');2717 if (Bound[K].Lower[Dependence::DVEntry::ALL])2718 LLVM_DEBUG(dbgs() << *Bound[K].Lower[Dependence::DVEntry::ALL] << '\t');2719 else2720 LLVM_DEBUG(dbgs() << "-inf\t");2721 if (Bound[K].Upper[Dependence::DVEntry::ALL])2722 LLVM_DEBUG(dbgs() << *Bound[K].Upper[Dependence::DVEntry::ALL] << '\n');2723 else2724 LLVM_DEBUG(dbgs() << "+inf\n");2725#endif2726 }2727 2728 // Test the *, *, *, ... case.2729 bool Disproved = false;2730 if (testBounds(Dependence::DVEntry::ALL, 0, Bound, Delta)) {2731 // Explore the direction vector hierarchy.2732 unsigned DepthExpanded = 0;2733 unsigned NewDeps =2734 exploreDirections(1, A, B, Bound, Loops, DepthExpanded, Delta);2735 if (NewDeps > 0) {2736 bool Improved = false;2737 for (unsigned K = 1; K <= CommonLevels; ++K) {2738 if (Loops[K]) {2739 unsigned Old = Result.DV[K - 1].Direction;2740 Result.DV[K - 1].Direction = Old & Bound[K].DirSet;2741 Improved |= Old != Result.DV[K - 1].Direction;2742 if (!Result.DV[K - 1].Direction) {2743 Improved = false;2744 Disproved = true;2745 break;2746 }2747 }2748 }2749 if (Improved)2750 ++BanerjeeSuccesses;2751 } else {2752 ++BanerjeeIndependence;2753 Disproved = true;2754 }2755 } else {2756 ++BanerjeeIndependence;2757 Disproved = true;2758 }2759 delete[] Bound;2760 delete[] A;2761 delete[] B;2762 return Disproved;2763}2764 2765// Hierarchically expands the direction vector2766// search space, combining the directions of discovered dependences2767// in the DirSet field of Bound. Returns the number of distinct2768// dependences discovered. If the dependence is disproved,2769// it will return 0.2770unsigned DependenceInfo::exploreDirections(unsigned Level, CoefficientInfo *A,2771 CoefficientInfo *B, BoundInfo *Bound,2772 const SmallBitVector &Loops,2773 unsigned &DepthExpanded,2774 const SCEV *Delta) const {2775 // This algorithm has worst case complexity of O(3^n), where 'n' is the number2776 // of common loop levels. To avoid excessive compile-time, pessimize all the2777 // results and immediately return when the number of common levels is beyond2778 // the given threshold.2779 if (CommonLevels > MIVMaxLevelThreshold) {2780 LLVM_DEBUG(dbgs() << "Number of common levels exceeded the threshold. MIV "2781 "direction exploration is terminated.\n");2782 for (unsigned K = 1; K <= CommonLevels; ++K)2783 if (Loops[K])2784 Bound[K].DirSet = Dependence::DVEntry::ALL;2785 return 1;2786 }2787 2788 if (Level > CommonLevels) {2789 // record result2790 LLVM_DEBUG(dbgs() << "\t[");2791 for (unsigned K = 1; K <= CommonLevels; ++K) {2792 if (Loops[K]) {2793 Bound[K].DirSet |= Bound[K].Direction;2794#ifndef NDEBUG2795 switch (Bound[K].Direction) {2796 case Dependence::DVEntry::LT:2797 LLVM_DEBUG(dbgs() << " <");2798 break;2799 case Dependence::DVEntry::EQ:2800 LLVM_DEBUG(dbgs() << " =");2801 break;2802 case Dependence::DVEntry::GT:2803 LLVM_DEBUG(dbgs() << " >");2804 break;2805 case Dependence::DVEntry::ALL:2806 LLVM_DEBUG(dbgs() << " *");2807 break;2808 default:2809 llvm_unreachable("unexpected Bound[K].Direction");2810 }2811#endif2812 }2813 }2814 LLVM_DEBUG(dbgs() << " ]\n");2815 return 1;2816 }2817 if (Loops[Level]) {2818 if (Level > DepthExpanded) {2819 DepthExpanded = Level;2820 // compute bounds for <, =, > at current level2821 findBoundsLT(A, B, Bound, Level);2822 findBoundsGT(A, B, Bound, Level);2823 findBoundsEQ(A, B, Bound, Level);2824#ifndef NDEBUG2825 LLVM_DEBUG(dbgs() << "\tBound for level = " << Level << '\n');2826 LLVM_DEBUG(dbgs() << "\t <\t");2827 if (Bound[Level].Lower[Dependence::DVEntry::LT])2828 LLVM_DEBUG(dbgs() << *Bound[Level].Lower[Dependence::DVEntry::LT]2829 << '\t');2830 else2831 LLVM_DEBUG(dbgs() << "-inf\t");2832 if (Bound[Level].Upper[Dependence::DVEntry::LT])2833 LLVM_DEBUG(dbgs() << *Bound[Level].Upper[Dependence::DVEntry::LT]2834 << '\n');2835 else2836 LLVM_DEBUG(dbgs() << "+inf\n");2837 LLVM_DEBUG(dbgs() << "\t =\t");2838 if (Bound[Level].Lower[Dependence::DVEntry::EQ])2839 LLVM_DEBUG(dbgs() << *Bound[Level].Lower[Dependence::DVEntry::EQ]2840 << '\t');2841 else2842 LLVM_DEBUG(dbgs() << "-inf\t");2843 if (Bound[Level].Upper[Dependence::DVEntry::EQ])2844 LLVM_DEBUG(dbgs() << *Bound[Level].Upper[Dependence::DVEntry::EQ]2845 << '\n');2846 else2847 LLVM_DEBUG(dbgs() << "+inf\n");2848 LLVM_DEBUG(dbgs() << "\t >\t");2849 if (Bound[Level].Lower[Dependence::DVEntry::GT])2850 LLVM_DEBUG(dbgs() << *Bound[Level].Lower[Dependence::DVEntry::GT]2851 << '\t');2852 else2853 LLVM_DEBUG(dbgs() << "-inf\t");2854 if (Bound[Level].Upper[Dependence::DVEntry::GT])2855 LLVM_DEBUG(dbgs() << *Bound[Level].Upper[Dependence::DVEntry::GT]2856 << '\n');2857 else2858 LLVM_DEBUG(dbgs() << "+inf\n");2859#endif2860 }2861 2862 unsigned NewDeps = 0;2863 2864 // test bounds for <, *, *, ...2865 if (testBounds(Dependence::DVEntry::LT, Level, Bound, Delta))2866 NewDeps += exploreDirections(Level + 1, A, B, Bound, Loops, DepthExpanded,2867 Delta);2868 2869 // Test bounds for =, *, *, ...2870 if (testBounds(Dependence::DVEntry::EQ, Level, Bound, Delta))2871 NewDeps += exploreDirections(Level + 1, A, B, Bound, Loops, DepthExpanded,2872 Delta);2873 2874 // test bounds for >, *, *, ...2875 if (testBounds(Dependence::DVEntry::GT, Level, Bound, Delta))2876 NewDeps += exploreDirections(Level + 1, A, B, Bound, Loops, DepthExpanded,2877 Delta);2878 2879 Bound[Level].Direction = Dependence::DVEntry::ALL;2880 return NewDeps;2881 } else2882 return exploreDirections(Level + 1, A, B, Bound, Loops, DepthExpanded,2883 Delta);2884}2885 2886// Returns true iff the current bounds are plausible.2887bool DependenceInfo::testBounds(unsigned char DirKind, unsigned Level,2888 BoundInfo *Bound, const SCEV *Delta) const {2889 Bound[Level].Direction = DirKind;2890 if (const SCEV *LowerBound = getLowerBound(Bound))2891 if (isKnownPredicate(CmpInst::ICMP_SGT, LowerBound, Delta))2892 return false;2893 if (const SCEV *UpperBound = getUpperBound(Bound))2894 if (isKnownPredicate(CmpInst::ICMP_SGT, Delta, UpperBound))2895 return false;2896 return true;2897}2898 2899// Computes the upper and lower bounds for level K2900// using the * direction. Records them in Bound.2901// Wolfe gives the equations2902//2903// LB^*_k = (A^-_k - B^+_k)(U_k - L_k) + (A_k - B_k)L_k2904// UB^*_k = (A^+_k - B^-_k)(U_k - L_k) + (A_k - B_k)L_k2905//2906// Since we normalize loops, we can simplify these equations to2907//2908// LB^*_k = (A^-_k - B^+_k)U_k2909// UB^*_k = (A^+_k - B^-_k)U_k2910//2911// We must be careful to handle the case where the upper bound is unknown.2912// Note that the lower bound is always <= 02913// and the upper bound is always >= 0.2914void DependenceInfo::findBoundsALL(CoefficientInfo *A, CoefficientInfo *B,2915 BoundInfo *Bound, unsigned K) const {2916 Bound[K].Lower[Dependence::DVEntry::ALL] =2917 nullptr; // Default value = -infinity.2918 Bound[K].Upper[Dependence::DVEntry::ALL] =2919 nullptr; // Default value = +infinity.2920 if (Bound[K].Iterations) {2921 Bound[K].Lower[Dependence::DVEntry::ALL] = SE->getMulExpr(2922 SE->getMinusSCEV(A[K].NegPart, B[K].PosPart), Bound[K].Iterations);2923 Bound[K].Upper[Dependence::DVEntry::ALL] = SE->getMulExpr(2924 SE->getMinusSCEV(A[K].PosPart, B[K].NegPart), Bound[K].Iterations);2925 } else {2926 // If the difference is 0, we won't need to know the number of iterations.2927 if (isKnownPredicate(CmpInst::ICMP_EQ, A[K].NegPart, B[K].PosPart))2928 Bound[K].Lower[Dependence::DVEntry::ALL] =2929 SE->getZero(A[K].Coeff->getType());2930 if (isKnownPredicate(CmpInst::ICMP_EQ, A[K].PosPart, B[K].NegPart))2931 Bound[K].Upper[Dependence::DVEntry::ALL] =2932 SE->getZero(A[K].Coeff->getType());2933 }2934}2935 2936// Computes the upper and lower bounds for level K2937// using the = direction. Records them in Bound.2938// Wolfe gives the equations2939//2940// LB^=_k = (A_k - B_k)^- (U_k - L_k) + (A_k - B_k)L_k2941// UB^=_k = (A_k - B_k)^+ (U_k - L_k) + (A_k - B_k)L_k2942//2943// Since we normalize loops, we can simplify these equations to2944//2945// LB^=_k = (A_k - B_k)^- U_k2946// UB^=_k = (A_k - B_k)^+ U_k2947//2948// We must be careful to handle the case where the upper bound is unknown.2949// Note that the lower bound is always <= 02950// and the upper bound is always >= 0.2951void DependenceInfo::findBoundsEQ(CoefficientInfo *A, CoefficientInfo *B,2952 BoundInfo *Bound, unsigned K) const {2953 Bound[K].Lower[Dependence::DVEntry::EQ] =2954 nullptr; // Default value = -infinity.2955 Bound[K].Upper[Dependence::DVEntry::EQ] =2956 nullptr; // Default value = +infinity.2957 if (Bound[K].Iterations) {2958 const SCEV *Delta = SE->getMinusSCEV(A[K].Coeff, B[K].Coeff);2959 const SCEV *NegativePart = getNegativePart(Delta);2960 Bound[K].Lower[Dependence::DVEntry::EQ] =2961 SE->getMulExpr(NegativePart, Bound[K].Iterations);2962 const SCEV *PositivePart = getPositivePart(Delta);2963 Bound[K].Upper[Dependence::DVEntry::EQ] =2964 SE->getMulExpr(PositivePart, Bound[K].Iterations);2965 } else {2966 // If the positive/negative part of the difference is 0,2967 // we won't need to know the number of iterations.2968 const SCEV *Delta = SE->getMinusSCEV(A[K].Coeff, B[K].Coeff);2969 const SCEV *NegativePart = getNegativePart(Delta);2970 if (NegativePart->isZero())2971 Bound[K].Lower[Dependence::DVEntry::EQ] = NegativePart; // Zero2972 const SCEV *PositivePart = getPositivePart(Delta);2973 if (PositivePart->isZero())2974 Bound[K].Upper[Dependence::DVEntry::EQ] = PositivePart; // Zero2975 }2976}2977 2978// Computes the upper and lower bounds for level K2979// using the < direction. Records them in Bound.2980// Wolfe gives the equations2981//2982// LB^<_k = (A^-_k - B_k)^- (U_k - L_k - N_k) + (A_k - B_k)L_k - B_k N_k2983// UB^<_k = (A^+_k - B_k)^+ (U_k - L_k - N_k) + (A_k - B_k)L_k - B_k N_k2984//2985// Since we normalize loops, we can simplify these equations to2986//2987// LB^<_k = (A^-_k - B_k)^- (U_k - 1) - B_k2988// UB^<_k = (A^+_k - B_k)^+ (U_k - 1) - B_k2989//2990// We must be careful to handle the case where the upper bound is unknown.2991void DependenceInfo::findBoundsLT(CoefficientInfo *A, CoefficientInfo *B,2992 BoundInfo *Bound, unsigned K) const {2993 Bound[K].Lower[Dependence::DVEntry::LT] =2994 nullptr; // Default value = -infinity.2995 Bound[K].Upper[Dependence::DVEntry::LT] =2996 nullptr; // Default value = +infinity.2997 if (Bound[K].Iterations) {2998 const SCEV *Iter_1 = SE->getMinusSCEV(2999 Bound[K].Iterations, SE->getOne(Bound[K].Iterations->getType()));3000 const SCEV *NegPart =3001 getNegativePart(SE->getMinusSCEV(A[K].NegPart, B[K].Coeff));3002 Bound[K].Lower[Dependence::DVEntry::LT] =3003 SE->getMinusSCEV(SE->getMulExpr(NegPart, Iter_1), B[K].Coeff);3004 const SCEV *PosPart =3005 getPositivePart(SE->getMinusSCEV(A[K].PosPart, B[K].Coeff));3006 Bound[K].Upper[Dependence::DVEntry::LT] =3007 SE->getMinusSCEV(SE->getMulExpr(PosPart, Iter_1), B[K].Coeff);3008 } else {3009 // If the positive/negative part of the difference is 0,3010 // we won't need to know the number of iterations.3011 const SCEV *NegPart =3012 getNegativePart(SE->getMinusSCEV(A[K].NegPart, B[K].Coeff));3013 if (NegPart->isZero())3014 Bound[K].Lower[Dependence::DVEntry::LT] = SE->getNegativeSCEV(B[K].Coeff);3015 const SCEV *PosPart =3016 getPositivePart(SE->getMinusSCEV(A[K].PosPart, B[K].Coeff));3017 if (PosPart->isZero())3018 Bound[K].Upper[Dependence::DVEntry::LT] = SE->getNegativeSCEV(B[K].Coeff);3019 }3020}3021 3022// Computes the upper and lower bounds for level K3023// using the > direction. Records them in Bound.3024// Wolfe gives the equations3025//3026// LB^>_k = (A_k - B^+_k)^- (U_k - L_k - N_k) + (A_k - B_k)L_k + A_k N_k3027// UB^>_k = (A_k - B^-_k)^+ (U_k - L_k - N_k) + (A_k - B_k)L_k + A_k N_k3028//3029// Since we normalize loops, we can simplify these equations to3030//3031// LB^>_k = (A_k - B^+_k)^- (U_k - 1) + A_k3032// UB^>_k = (A_k - B^-_k)^+ (U_k - 1) + A_k3033//3034// We must be careful to handle the case where the upper bound is unknown.3035void DependenceInfo::findBoundsGT(CoefficientInfo *A, CoefficientInfo *B,3036 BoundInfo *Bound, unsigned K) const {3037 Bound[K].Lower[Dependence::DVEntry::GT] =3038 nullptr; // Default value = -infinity.3039 Bound[K].Upper[Dependence::DVEntry::GT] =3040 nullptr; // Default value = +infinity.3041 if (Bound[K].Iterations) {3042 const SCEV *Iter_1 = SE->getMinusSCEV(3043 Bound[K].Iterations, SE->getOne(Bound[K].Iterations->getType()));3044 const SCEV *NegPart =3045 getNegativePart(SE->getMinusSCEV(A[K].Coeff, B[K].PosPart));3046 Bound[K].Lower[Dependence::DVEntry::GT] =3047 SE->getAddExpr(SE->getMulExpr(NegPart, Iter_1), A[K].Coeff);3048 const SCEV *PosPart =3049 getPositivePart(SE->getMinusSCEV(A[K].Coeff, B[K].NegPart));3050 Bound[K].Upper[Dependence::DVEntry::GT] =3051 SE->getAddExpr(SE->getMulExpr(PosPart, Iter_1), A[K].Coeff);3052 } else {3053 // If the positive/negative part of the difference is 0,3054 // we won't need to know the number of iterations.3055 const SCEV *NegPart =3056 getNegativePart(SE->getMinusSCEV(A[K].Coeff, B[K].PosPart));3057 if (NegPart->isZero())3058 Bound[K].Lower[Dependence::DVEntry::GT] = A[K].Coeff;3059 const SCEV *PosPart =3060 getPositivePart(SE->getMinusSCEV(A[K].Coeff, B[K].NegPart));3061 if (PosPart->isZero())3062 Bound[K].Upper[Dependence::DVEntry::GT] = A[K].Coeff;3063 }3064}3065 3066// X^+ = max(X, 0)3067const SCEV *DependenceInfo::getPositivePart(const SCEV *X) const {3068 return SE->getSMaxExpr(X, SE->getZero(X->getType()));3069}3070 3071// X^- = min(X, 0)3072const SCEV *DependenceInfo::getNegativePart(const SCEV *X) const {3073 return SE->getSMinExpr(X, SE->getZero(X->getType()));3074}3075 3076// Walks through the subscript,3077// collecting each coefficient, the associated loop bounds,3078// and recording its positive and negative parts for later use.3079DependenceInfo::CoefficientInfo *3080DependenceInfo::collectCoeffInfo(const SCEV *Subscript, bool SrcFlag,3081 const SCEV *&Constant) const {3082 const SCEV *Zero = SE->getZero(Subscript->getType());3083 CoefficientInfo *CI = new CoefficientInfo[MaxLevels + 1];3084 for (unsigned K = 1; K <= MaxLevels; ++K) {3085 CI[K].Coeff = Zero;3086 CI[K].PosPart = Zero;3087 CI[K].NegPart = Zero;3088 CI[K].Iterations = nullptr;3089 }3090 while (const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Subscript)) {3091 const Loop *L = AddRec->getLoop();3092 unsigned K = SrcFlag ? mapSrcLoop(L) : mapDstLoop(L);3093 CI[K].Coeff = AddRec->getStepRecurrence(*SE);3094 CI[K].PosPart = getPositivePart(CI[K].Coeff);3095 CI[K].NegPart = getNegativePart(CI[K].Coeff);3096 CI[K].Iterations = collectUpperBound(L, Subscript->getType());3097 Subscript = AddRec->getStart();3098 }3099 Constant = Subscript;3100#ifndef NDEBUG3101 LLVM_DEBUG(dbgs() << "\tCoefficient Info\n");3102 for (unsigned K = 1; K <= MaxLevels; ++K) {3103 LLVM_DEBUG(dbgs() << "\t " << K << "\t" << *CI[K].Coeff);3104 LLVM_DEBUG(dbgs() << "\tPos Part = ");3105 LLVM_DEBUG(dbgs() << *CI[K].PosPart);3106 LLVM_DEBUG(dbgs() << "\tNeg Part = ");3107 LLVM_DEBUG(dbgs() << *CI[K].NegPart);3108 LLVM_DEBUG(dbgs() << "\tUpper Bound = ");3109 if (CI[K].Iterations)3110 LLVM_DEBUG(dbgs() << *CI[K].Iterations);3111 else3112 LLVM_DEBUG(dbgs() << "+inf");3113 LLVM_DEBUG(dbgs() << '\n');3114 }3115 LLVM_DEBUG(dbgs() << "\t Constant = " << *Subscript << '\n');3116#endif3117 return CI;3118}3119 3120// Looks through all the bounds info and3121// computes the lower bound given the current direction settings3122// at each level. If the lower bound for any level is -inf,3123// the result is -inf.3124const SCEV *DependenceInfo::getLowerBound(BoundInfo *Bound) const {3125 const SCEV *Sum = Bound[1].Lower[Bound[1].Direction];3126 for (unsigned K = 2; Sum && K <= MaxLevels; ++K) {3127 if (Bound[K].Lower[Bound[K].Direction])3128 Sum = SE->getAddExpr(Sum, Bound[K].Lower[Bound[K].Direction]);3129 else3130 Sum = nullptr;3131 }3132 return Sum;3133}3134 3135// Looks through all the bounds info and3136// computes the upper bound given the current direction settings3137// at each level. If the upper bound at any level is +inf,3138// the result is +inf.3139const SCEV *DependenceInfo::getUpperBound(BoundInfo *Bound) const {3140 const SCEV *Sum = Bound[1].Upper[Bound[1].Direction];3141 for (unsigned K = 2; Sum && K <= MaxLevels; ++K) {3142 if (Bound[K].Upper[Bound[K].Direction])3143 Sum = SE->getAddExpr(Sum, Bound[K].Upper[Bound[K].Direction]);3144 else3145 Sum = nullptr;3146 }3147 return Sum;3148}3149 3150/// Check if we can delinearize the subscripts. If the SCEVs representing the3151/// source and destination array references are recurrences on a nested loop,3152/// this function flattens the nested recurrences into separate recurrences3153/// for each loop level.3154bool DependenceInfo::tryDelinearize(Instruction *Src, Instruction *Dst,3155 SmallVectorImpl<Subscript> &Pair) {3156 assert(isLoadOrStore(Src) && "instruction is not load or store");3157 assert(isLoadOrStore(Dst) && "instruction is not load or store");3158 Value *SrcPtr = getLoadStorePointerOperand(Src);3159 Value *DstPtr = getLoadStorePointerOperand(Dst);3160 Loop *SrcLoop = LI->getLoopFor(Src->getParent());3161 Loop *DstLoop = LI->getLoopFor(Dst->getParent());3162 const SCEV *SrcAccessFn = SE->getSCEVAtScope(SrcPtr, SrcLoop);3163 const SCEV *DstAccessFn = SE->getSCEVAtScope(DstPtr, DstLoop);3164 const SCEVUnknown *SrcBase =3165 dyn_cast<SCEVUnknown>(SE->getPointerBase(SrcAccessFn));3166 const SCEVUnknown *DstBase =3167 dyn_cast<SCEVUnknown>(SE->getPointerBase(DstAccessFn));3168 3169 if (!SrcBase || !DstBase || SrcBase != DstBase)3170 return false;3171 3172 SmallVector<const SCEV *, 4> SrcSubscripts, DstSubscripts;3173 3174 if (!tryDelinearizeFixedSize(Src, Dst, SrcAccessFn, DstAccessFn,3175 SrcSubscripts, DstSubscripts) &&3176 !tryDelinearizeParametricSize(Src, Dst, SrcAccessFn, DstAccessFn,3177 SrcSubscripts, DstSubscripts))3178 return false;3179 3180 assert(isLoopInvariant(SrcBase, SrcLoop) &&3181 isLoopInvariant(DstBase, DstLoop) &&3182 "Expected SrcBase and DstBase to be loop invariant");3183 3184 int Size = SrcSubscripts.size();3185 LLVM_DEBUG({3186 dbgs() << "\nSrcSubscripts: ";3187 for (int I = 0; I < Size; I++)3188 dbgs() << *SrcSubscripts[I];3189 dbgs() << "\nDstSubscripts: ";3190 for (int I = 0; I < Size; I++)3191 dbgs() << *DstSubscripts[I];3192 });3193 3194 // The delinearization transforms a single-subscript MIV dependence test into3195 // a multi-subscript SIV dependence test that is easier to compute. So we3196 // resize Pair to contain as many pairs of subscripts as the delinearization3197 // has found, and then initialize the pairs following the delinearization.3198 Pair.resize(Size);3199 SCEVMonotonicityChecker MonChecker(SE);3200 const Loop *OutermostLoop = SrcLoop ? SrcLoop->getOutermostLoop() : nullptr;3201 for (int I = 0; I < Size; ++I) {3202 Pair[I].Src = SrcSubscripts[I];3203 Pair[I].Dst = DstSubscripts[I];3204 unifySubscriptType(&Pair[I]);3205 3206 if (EnableMonotonicityCheck) {3207 if (MonChecker.checkMonotonicity(Pair[I].Src, OutermostLoop).isUnknown())3208 return false;3209 if (MonChecker.checkMonotonicity(Pair[I].Dst, OutermostLoop).isUnknown())3210 return false;3211 }3212 }3213 3214 return true;3215}3216 3217/// Try to delinearize \p SrcAccessFn and \p DstAccessFn if the underlying3218/// arrays accessed are fixed-size arrays. Return true if delinearization was3219/// successful.3220bool DependenceInfo::tryDelinearizeFixedSize(3221 Instruction *Src, Instruction *Dst, const SCEV *SrcAccessFn,3222 const SCEV *DstAccessFn, SmallVectorImpl<const SCEV *> &SrcSubscripts,3223 SmallVectorImpl<const SCEV *> &DstSubscripts) {3224 LLVM_DEBUG({3225 const SCEVUnknown *SrcBase =3226 dyn_cast<SCEVUnknown>(SE->getPointerBase(SrcAccessFn));3227 const SCEVUnknown *DstBase =3228 dyn_cast<SCEVUnknown>(SE->getPointerBase(DstAccessFn));3229 assert(SrcBase && DstBase && SrcBase == DstBase &&3230 "expected src and dst scev unknowns to be equal");3231 });3232 3233 const SCEV *ElemSize = SE->getElementSize(Src);3234 assert(ElemSize == SE->getElementSize(Dst) && "Different element sizes");3235 SmallVector<const SCEV *, 4> SrcSizes, DstSizes;3236 if (!delinearizeFixedSizeArray(*SE, SE->removePointerBase(SrcAccessFn),3237 SrcSubscripts, SrcSizes, ElemSize) ||3238 !delinearizeFixedSizeArray(*SE, SE->removePointerBase(DstAccessFn),3239 DstSubscripts, DstSizes, ElemSize))3240 return false;3241 3242 // Check that the two size arrays are non-empty and equal in length and3243 // value.3244 if (SrcSizes.size() != DstSizes.size() ||3245 !std::equal(SrcSizes.begin(), SrcSizes.end(), DstSizes.begin())) {3246 SrcSubscripts.clear();3247 DstSubscripts.clear();3248 return false;3249 }3250 3251 assert(SrcSubscripts.size() == DstSubscripts.size() &&3252 "Expected equal number of entries in the list of SrcSubscripts and "3253 "DstSubscripts.");3254 3255 Value *SrcPtr = getLoadStorePointerOperand(Src);3256 Value *DstPtr = getLoadStorePointerOperand(Dst);3257 3258 // In general we cannot safely assume that the subscripts recovered from GEPs3259 // are in the range of values defined for their corresponding array3260 // dimensions. For example some C language usage/interpretation make it3261 // impossible to verify this at compile-time. As such we can only delinearize3262 // iff the subscripts are positive and are less than the range of the3263 // dimension.3264 if (!DisableDelinearizationChecks) {3265 if (!validateDelinearizationResult(*SE, SrcSizes, SrcSubscripts, SrcPtr) ||3266 !validateDelinearizationResult(*SE, DstSizes, DstSubscripts, DstPtr)) {3267 SrcSubscripts.clear();3268 DstSubscripts.clear();3269 return false;3270 }3271 }3272 LLVM_DEBUG({3273 dbgs() << "Delinearized subscripts of fixed-size array\n"3274 << "SrcGEP:" << *SrcPtr << "\n"3275 << "DstGEP:" << *DstPtr << "\n";3276 });3277 return true;3278}3279 3280bool DependenceInfo::tryDelinearizeParametricSize(3281 Instruction *Src, Instruction *Dst, const SCEV *SrcAccessFn,3282 const SCEV *DstAccessFn, SmallVectorImpl<const SCEV *> &SrcSubscripts,3283 SmallVectorImpl<const SCEV *> &DstSubscripts) {3284 3285 Value *SrcPtr = getLoadStorePointerOperand(Src);3286 Value *DstPtr = getLoadStorePointerOperand(Dst);3287 const SCEVUnknown *SrcBase =3288 dyn_cast<SCEVUnknown>(SE->getPointerBase(SrcAccessFn));3289 const SCEVUnknown *DstBase =3290 dyn_cast<SCEVUnknown>(SE->getPointerBase(DstAccessFn));3291 assert(SrcBase && DstBase && SrcBase == DstBase &&3292 "expected src and dst scev unknowns to be equal");3293 3294 const SCEV *ElementSize = SE->getElementSize(Src);3295 if (ElementSize != SE->getElementSize(Dst))3296 return false;3297 3298 const SCEV *SrcSCEV = SE->getMinusSCEV(SrcAccessFn, SrcBase);3299 const SCEV *DstSCEV = SE->getMinusSCEV(DstAccessFn, DstBase);3300 3301 const SCEVAddRecExpr *SrcAR = dyn_cast<SCEVAddRecExpr>(SrcSCEV);3302 const SCEVAddRecExpr *DstAR = dyn_cast<SCEVAddRecExpr>(DstSCEV);3303 if (!SrcAR || !DstAR || !SrcAR->isAffine() || !DstAR->isAffine())3304 return false;3305 3306 // First step: collect parametric terms in both array references.3307 SmallVector<const SCEV *, 4> Terms;3308 collectParametricTerms(*SE, SrcAR, Terms);3309 collectParametricTerms(*SE, DstAR, Terms);3310 3311 // Second step: find subscript sizes.3312 SmallVector<const SCEV *, 4> Sizes;3313 findArrayDimensions(*SE, Terms, Sizes, ElementSize);3314 3315 // Third step: compute the access functions for each subscript.3316 computeAccessFunctions(*SE, SrcAR, SrcSubscripts, Sizes);3317 computeAccessFunctions(*SE, DstAR, DstSubscripts, Sizes);3318 3319 // Fail when there is only a subscript: that's a linearized access function.3320 if (SrcSubscripts.size() < 2 || DstSubscripts.size() < 2 ||3321 SrcSubscripts.size() != DstSubscripts.size())3322 return false;3323 3324 // Statically check that the array bounds are in-range. The first subscript we3325 // don't have a size for and it cannot overflow into another subscript, so is3326 // always safe. The others need to be 0 <= subscript[i] < bound, for both src3327 // and dst.3328 // FIXME: It may be better to record these sizes and add them as constraints3329 // to the dependency checks.3330 if (!DisableDelinearizationChecks)3331 if (!validateDelinearizationResult(*SE, Sizes, SrcSubscripts, SrcPtr) ||3332 !validateDelinearizationResult(*SE, Sizes, DstSubscripts, DstPtr))3333 return false;3334 3335 return true;3336}3337 3338//===----------------------------------------------------------------------===//3339 3340#ifndef NDEBUG3341// For debugging purposes, dump a small bit vector to dbgs().3342static void dumpSmallBitVector(SmallBitVector &BV) {3343 dbgs() << "{";3344 for (unsigned VI : BV.set_bits()) {3345 dbgs() << VI;3346 if (BV.find_next(VI) >= 0)3347 dbgs() << ' ';3348 }3349 dbgs() << "}\n";3350}3351#endif3352 3353bool DependenceInfo::invalidate(Function &F, const PreservedAnalyses &PA,3354 FunctionAnalysisManager::Invalidator &Inv) {3355 // Check if the analysis itself has been invalidated.3356 auto PAC = PA.getChecker<DependenceAnalysis>();3357 if (!PAC.preserved() && !PAC.preservedSet<AllAnalysesOn<Function>>())3358 return true;3359 3360 // Check transitive dependencies.3361 return Inv.invalidate<AAManager>(F, PA) ||3362 Inv.invalidate<ScalarEvolutionAnalysis>(F, PA) ||3363 Inv.invalidate<LoopAnalysis>(F, PA);3364}3365 3366// depends -3367// Returns NULL if there is no dependence.3368// Otherwise, return a Dependence with as many details as possible.3369// Corresponds to Section 3.1 in the paper3370//3371// Practical Dependence Testing3372// Goff, Kennedy, Tseng3373// PLDI 19913374//3375std::unique_ptr<Dependence>3376DependenceInfo::depends(Instruction *Src, Instruction *Dst,3377 bool UnderRuntimeAssumptions) {3378 SmallVector<const SCEVPredicate *, 4> Assume;3379 bool PossiblyLoopIndependent = true;3380 if (Src == Dst)3381 PossiblyLoopIndependent = false;3382 3383 if (!(Src->mayReadOrWriteMemory() && Dst->mayReadOrWriteMemory()))3384 // if both instructions don't reference memory, there's no dependence3385 return nullptr;3386 3387 if (!isLoadOrStore(Src) || !isLoadOrStore(Dst)) {3388 // can only analyze simple loads and stores, i.e., no calls, invokes, etc.3389 LLVM_DEBUG(dbgs() << "can only handle simple loads and stores\n");3390 return std::make_unique<Dependence>(Src, Dst,3391 SCEVUnionPredicate(Assume, *SE));3392 }3393 3394 const MemoryLocation &DstLoc = MemoryLocation::get(Dst);3395 const MemoryLocation &SrcLoc = MemoryLocation::get(Src);3396 3397 switch (underlyingObjectsAlias(AA, F->getDataLayout(), DstLoc, SrcLoc)) {3398 case AliasResult::MayAlias:3399 case AliasResult::PartialAlias:3400 // cannot analyse objects if we don't understand their aliasing.3401 LLVM_DEBUG(dbgs() << "can't analyze may or partial alias\n");3402 return std::make_unique<Dependence>(Src, Dst,3403 SCEVUnionPredicate(Assume, *SE));3404 case AliasResult::NoAlias:3405 // If the objects noalias, they are distinct, accesses are independent.3406 LLVM_DEBUG(dbgs() << "no alias\n");3407 return nullptr;3408 case AliasResult::MustAlias:3409 break; // The underlying objects alias; test accesses for dependence.3410 }3411 3412 if (DstLoc.Size != SrcLoc.Size || !DstLoc.Size.isPrecise() ||3413 !SrcLoc.Size.isPrecise()) {3414 // The dependence test gets confused if the size of the memory accesses3415 // differ.3416 LLVM_DEBUG(dbgs() << "can't analyze must alias with different sizes\n");3417 return std::make_unique<Dependence>(Src, Dst,3418 SCEVUnionPredicate(Assume, *SE));3419 }3420 3421 Value *SrcPtr = getLoadStorePointerOperand(Src);3422 Value *DstPtr = getLoadStorePointerOperand(Dst);3423 const SCEV *SrcSCEV = SE->getSCEV(SrcPtr);3424 const SCEV *DstSCEV = SE->getSCEV(DstPtr);3425 LLVM_DEBUG(dbgs() << " SrcSCEV = " << *SrcSCEV << "\n");3426 LLVM_DEBUG(dbgs() << " DstSCEV = " << *DstSCEV << "\n");3427 const SCEV *SrcBase = SE->getPointerBase(SrcSCEV);3428 const SCEV *DstBase = SE->getPointerBase(DstSCEV);3429 if (SrcBase != DstBase) {3430 // If two pointers have different bases, trying to analyze indexes won't3431 // work; we can't compare them to each other. This can happen, for example,3432 // if one is produced by an LCSSA PHI node.3433 //3434 // We check this upfront so we don't crash in cases where getMinusSCEV()3435 // returns a SCEVCouldNotCompute.3436 LLVM_DEBUG(dbgs() << "can't analyze SCEV with different pointer base\n");3437 return std::make_unique<Dependence>(Src, Dst,3438 SCEVUnionPredicate(Assume, *SE));3439 }3440 3441 // Even if the base pointers are the same, they may not be loop-invariant. It3442 // could lead to incorrect results, as we're analyzing loop-carried3443 // dependencies. Src and Dst can be in different loops, so we need to check3444 // the base pointer is invariant in both loops.3445 Loop *SrcLoop = LI->getLoopFor(Src->getParent());3446 Loop *DstLoop = LI->getLoopFor(Dst->getParent());3447 if (!isLoopInvariant(SrcBase, SrcLoop) ||3448 !isLoopInvariant(DstBase, DstLoop)) {3449 LLVM_DEBUG(dbgs() << "The base pointer is not loop invariant.\n");3450 return std::make_unique<Dependence>(Src, Dst,3451 SCEVUnionPredicate(Assume, *SE));3452 }3453 3454 uint64_t EltSize = SrcLoc.Size.toRaw();3455 const SCEV *SrcEv = SE->getMinusSCEV(SrcSCEV, SrcBase);3456 const SCEV *DstEv = SE->getMinusSCEV(DstSCEV, DstBase);3457 3458 // Check that memory access offsets are multiples of element sizes.3459 if (!SE->isKnownMultipleOf(SrcEv, EltSize, Assume) ||3460 !SE->isKnownMultipleOf(DstEv, EltSize, Assume)) {3461 LLVM_DEBUG(dbgs() << "can't analyze SCEV with different offsets\n");3462 return std::make_unique<Dependence>(Src, Dst,3463 SCEVUnionPredicate(Assume, *SE));3464 }3465 3466 if (!Assume.empty() && !UnderRuntimeAssumptions) {3467 // Runtime assumptions needed but not allowed.3468 return std::make_unique<Dependence>(Src, Dst,3469 SCEVUnionPredicate(Assume, *SE));3470 }3471 3472 unsigned Pairs = 1;3473 SmallVector<Subscript, 2> Pair(Pairs);3474 Pair[0].Src = SrcEv;3475 Pair[0].Dst = DstEv;3476 3477 SCEVMonotonicityChecker MonChecker(SE);3478 const Loop *OutermostLoop = SrcLoop ? SrcLoop->getOutermostLoop() : nullptr;3479 if (EnableMonotonicityCheck)3480 if (MonChecker.checkMonotonicity(Pair[0].Src, OutermostLoop).isUnknown() ||3481 MonChecker.checkMonotonicity(Pair[0].Dst, OutermostLoop).isUnknown())3482 return std::make_unique<Dependence>(Src, Dst,3483 SCEVUnionPredicate(Assume, *SE));3484 3485 if (Delinearize) {3486 if (tryDelinearize(Src, Dst, Pair)) {3487 LLVM_DEBUG(dbgs() << " delinearized\n");3488 Pairs = Pair.size();3489 }3490 }3491 3492 // Establish loop nesting levels considering SameSD loops as common3493 establishNestingLevels(Src, Dst);3494 3495 LLVM_DEBUG(dbgs() << " common nesting levels = " << CommonLevels << "\n");3496 LLVM_DEBUG(dbgs() << " maximum nesting levels = " << MaxLevels << "\n");3497 LLVM_DEBUG(dbgs() << " SameSD nesting levels = " << SameSDLevels << "\n");3498 3499 // Modify common levels to consider the SameSD levels in the tests3500 CommonLevels += SameSDLevels;3501 MaxLevels -= SameSDLevels;3502 if (SameSDLevels > 0) {3503 // Not all tests are handled yet over SameSD loops3504 // Revoke if there are any tests other than ZIV, SIV or RDIV3505 for (unsigned P = 0; P < Pairs; ++P) {3506 SmallBitVector Loops;3507 Subscript::ClassificationKind TestClass =3508 classifyPair(Pair[P].Src, LI->getLoopFor(Src->getParent()),3509 Pair[P].Dst, LI->getLoopFor(Dst->getParent()), Loops);3510 3511 if (TestClass != Subscript::ZIV && TestClass != Subscript::SIV &&3512 TestClass != Subscript::RDIV) {3513 // Revert the levels to not consider the SameSD levels3514 CommonLevels -= SameSDLevels;3515 MaxLevels += SameSDLevels;3516 SameSDLevels = 0;3517 break;3518 }3519 }3520 }3521 3522 if (SameSDLevels > 0)3523 SameSDLoopsCount++;3524 3525 FullDependence Result(Src, Dst, SCEVUnionPredicate(Assume, *SE),3526 PossiblyLoopIndependent, CommonLevels);3527 ++TotalArrayPairs;3528 3529 for (unsigned P = 0; P < Pairs; ++P) {3530 assert(Pair[P].Src->getType()->isIntegerTy() && "Src must be an integer");3531 assert(Pair[P].Dst->getType()->isIntegerTy() && "Dst must be an integer");3532 Pair[P].Loops.resize(MaxLevels + 1);3533 Pair[P].GroupLoops.resize(MaxLevels + 1);3534 Pair[P].Group.resize(Pairs);3535 removeMatchingExtensions(&Pair[P]);3536 Pair[P].Classification =3537 classifyPair(Pair[P].Src, LI->getLoopFor(Src->getParent()), Pair[P].Dst,3538 LI->getLoopFor(Dst->getParent()), Pair[P].Loops);3539 Pair[P].GroupLoops = Pair[P].Loops;3540 Pair[P].Group.set(P);3541 LLVM_DEBUG(dbgs() << " subscript " << P << "\n");3542 LLVM_DEBUG(dbgs() << "\tsrc = " << *Pair[P].Src << "\n");3543 LLVM_DEBUG(dbgs() << "\tdst = " << *Pair[P].Dst << "\n");3544 LLVM_DEBUG(dbgs() << "\tclass = " << Pair[P].Classification << "\n");3545 LLVM_DEBUG(dbgs() << "\tloops = ");3546 LLVM_DEBUG(dumpSmallBitVector(Pair[P].Loops));3547 }3548 3549 // Test each subscript individually3550 for (unsigned SI = 0; SI < Pairs; ++SI) {3551 LLVM_DEBUG(dbgs() << "testing subscript " << SI);3552 switch (Pair[SI].Classification) {3553 case Subscript::NonLinear:3554 // ignore these, but collect loops for later3555 ++NonlinearSubscriptPairs;3556 collectCommonLoops(Pair[SI].Src, LI->getLoopFor(Src->getParent()),3557 Pair[SI].Loops);3558 collectCommonLoops(Pair[SI].Dst, LI->getLoopFor(Dst->getParent()),3559 Pair[SI].Loops);3560 Result.Consistent = false;3561 break;3562 case Subscript::ZIV:3563 LLVM_DEBUG(dbgs() << ", ZIV\n");3564 if (testZIV(Pair[SI].Src, Pair[SI].Dst, Result))3565 return nullptr;3566 break;3567 case Subscript::SIV: {3568 LLVM_DEBUG(dbgs() << ", SIV\n");3569 unsigned Level;3570 if (testSIV(Pair[SI].Src, Pair[SI].Dst, Level, Result))3571 return nullptr;3572 break;3573 }3574 case Subscript::RDIV:3575 LLVM_DEBUG(dbgs() << ", RDIV\n");3576 if (testRDIV(Pair[SI].Src, Pair[SI].Dst, Result))3577 return nullptr;3578 break;3579 case Subscript::MIV:3580 LLVM_DEBUG(dbgs() << ", MIV\n");3581 if (testMIV(Pair[SI].Src, Pair[SI].Dst, Pair[SI].Loops, Result))3582 return nullptr;3583 break;3584 }3585 }3586 3587 // Make sure the Scalar flags are set correctly.3588 SmallBitVector CompleteLoops(MaxLevels + 1);3589 for (unsigned SI = 0; SI < Pairs; ++SI)3590 CompleteLoops |= Pair[SI].Loops;3591 for (unsigned II = 1; II <= CommonLevels; ++II)3592 if (CompleteLoops[II])3593 Result.DV[II - 1].Scalar = false;3594 3595 // Set the distance to zero if the direction is EQ.3596 // TODO: Ideally, the distance should be set to 0 immediately simultaneously3597 // with the corresponding direction being set to EQ.3598 for (unsigned II = 1; II <= Result.getLevels(); ++II) {3599 if (Result.getDirection(II) == Dependence::DVEntry::EQ) {3600 if (Result.DV[II - 1].Distance == nullptr)3601 Result.DV[II - 1].Distance = SE->getZero(SrcSCEV->getType());3602 else3603 assert(Result.DV[II - 1].Distance->isZero() &&3604 "Inconsistency between distance and direction");3605 }3606 3607#ifndef NDEBUG3608 // Check that the converse (i.e., if the distance is zero, then the3609 // direction is EQ) holds.3610 const SCEV *Distance = Result.getDistance(II);3611 if (Distance && Distance->isZero())3612 assert(Result.getDirection(II) == Dependence::DVEntry::EQ &&3613 "Distance is zero, but direction is not EQ");3614#endif3615 }3616 3617 if (SameSDLevels > 0) {3618 // Extracting SameSD levels from the common levels3619 // Reverting CommonLevels and MaxLevels to their original values3620 assert(CommonLevels >= SameSDLevels);3621 CommonLevels -= SameSDLevels;3622 MaxLevels += SameSDLevels;3623 std::unique_ptr<FullDependence::DVEntry[]> DV, DVSameSD;3624 DV = std::make_unique<FullDependence::DVEntry[]>(CommonLevels);3625 DVSameSD = std::make_unique<FullDependence::DVEntry[]>(SameSDLevels);3626 for (unsigned Level = 0; Level < CommonLevels; ++Level)3627 DV[Level] = Result.DV[Level];3628 for (unsigned Level = 0; Level < SameSDLevels; ++Level)3629 DVSameSD[Level] = Result.DV[CommonLevels + Level];3630 Result.DV = std::move(DV);3631 Result.DVSameSD = std::move(DVSameSD);3632 Result.Levels = CommonLevels;3633 Result.SameSDLevels = SameSDLevels;3634 // Result is not consistent if it considers SameSD levels3635 Result.Consistent = false;3636 }3637 3638 if (PossiblyLoopIndependent) {3639 // Make sure the LoopIndependent flag is set correctly.3640 // All directions must include equal, otherwise no3641 // loop-independent dependence is possible.3642 for (unsigned II = 1; II <= CommonLevels; ++II) {3643 if (!(Result.getDirection(II) & Dependence::DVEntry::EQ)) {3644 Result.LoopIndependent = false;3645 break;3646 }3647 }3648 } else {3649 // On the other hand, if all directions are equal and there's no3650 // loop-independent dependence possible, then no dependence exists.3651 bool AllEqual = true;3652 for (unsigned II = 1; II <= CommonLevels; ++II) {3653 if (Result.getDirection(II) != Dependence::DVEntry::EQ) {3654 AllEqual = false;3655 break;3656 }3657 }3658 if (AllEqual)3659 return nullptr;3660 }3661 3662 return std::make_unique<FullDependence>(std::move(Result));3663}3664