LLVM 23.0.0git
DependenceAnalysis.cpp
Go to the documentation of this file.
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-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// DependenceAnalysis is an LLVM pass that analyses dependences between memory
10// accesses. Currently, it is an (incomplete) implementation of the approach
11// described in
12//
13// Practical Dependence Testing
14// Goff, Kennedy, Tseng
15// PLDI 1991
16//
17// There's a single entry point that analyzes the dependence between a pair
18// 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 dependence
22// analysis is using SCEV->delinearize to recover the representation of multiple
23// subscripts, and thus avoid the more expensive and less precise MIV tests. The
24// delinearization is controlled by the flag -da-delinearize.
25//
26// We should pay some careful attention to the possibility of integer overflow
27// 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 test
31// (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 SCEV
35// 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 to
39// change.
40//
41//===----------------------------------------------------------------------===//
42// //
43// In memory of Ken Kennedy, 1945 - 2007 //
44// //
45//===----------------------------------------------------------------------===//
46
48#include "llvm/ADT/Statistic.h"
56#include "llvm/IR/Module.h"
59#include "llvm/Support/Debug.h"
62
63using namespace llvm;
64
65#define DEBUG_TYPE "da"
66
67//===----------------------------------------------------------------------===//
68// statistics
69
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(GCDapplications, "GCD applications");
89STATISTIC(GCDsuccesses, "GCD successes");
90STATISTIC(GCDindependence, "GCD independence");
91STATISTIC(BanerjeeApplications, "Banerjee applications");
92STATISTIC(BanerjeeIndependence, "Banerjee independence");
93STATISTIC(BanerjeeSuccesses, "Banerjee successes");
94STATISTIC(SameSDLoopsCount, "Loops with Same iteration Space and Depth");
95
96static cl::opt<bool>
97 Delinearize("da-delinearize", cl::init(true), cl::Hidden,
98 cl::desc("Try to delinearize array references."));
100 "da-disable-delinearization-checks", cl::Hidden,
101 cl::desc(
102 "Disable checks that try to statically verify validity of "
103 "delinearized subscripts. Enabling this option may result in incorrect "
104 "dependence vectors for languages that allow the subscript of one "
105 "dimension to underflow or overflow into another dimension."));
106
108 "da-miv-max-level-threshold", cl::init(7), cl::Hidden,
109 cl::desc("Maximum depth allowed for the recursive algorithm used to "
110 "explore MIV direction vectors."));
111
112namespace {
113
114/// Types of dependence test routines.
115enum class DependenceTestType {
116 All,
117 StrongSIV,
118 WeakCrossingSIV,
119 ExactSIV,
120 WeakZeroSIV,
121 ExactRDIV,
122 GCDMIV,
123 BanerjeeMIV,
124};
125
126} // anonymous namespace
127
129 "da-enable-dependence-test", cl::init(DependenceTestType::All),
131 cl::desc("Run only specified dependence test routine and disable others. "
132 "The purpose is mainly to exclude the influence of other "
133 "dependence test routines in regression tests. If set to All, all "
134 "dependence test routines are enabled."),
135 cl::values(clEnumValN(DependenceTestType::All, "all",
136 "Enable all dependence test routines."),
137 clEnumValN(DependenceTestType::StrongSIV, "strong-siv",
138 "Enable only Strong SIV test."),
139 clEnumValN(DependenceTestType::WeakCrossingSIV,
140 "weak-crossing-siv",
141 "Enable only Weak-Crossing SIV test."),
142 clEnumValN(DependenceTestType::ExactSIV, "exact-siv",
143 "Enable only Exact SIV test."),
144 clEnumValN(DependenceTestType::WeakZeroSIV, "weak-zero-siv",
145 "Enable only Weak-Zero SIV test."),
146 clEnumValN(DependenceTestType::ExactRDIV, "exact-rdiv",
147 "Enable only Exact RDIV test."),
148 clEnumValN(DependenceTestType::GCDMIV, "gcd-miv",
149 "Enable only GCD MIV test."),
150 clEnumValN(DependenceTestType::BanerjeeMIV, "banerjee-miv",
151 "Enable only Banerjee MIV test.")));
152
153// TODO: This flag is disabled by default because it is still under development.
154// Enable it or delete this flag when the feature is ready.
156 "da-enable-monotonicity-check", cl::init(false), cl::Hidden,
157 cl::desc("Check if the subscripts are monotonic. If it's not, dependence "
158 "is reported as unknown."));
159
161 "da-dump-monotonicity-report", cl::init(false), cl::Hidden,
162 cl::desc(
163 "When printing analysis, dump the results of monotonicity checks."));
164
165//===----------------------------------------------------------------------===//
166// basics
167
170 auto &AA = FAM.getResult<AAManager>(F);
171 auto &SE = FAM.getResult<ScalarEvolutionAnalysis>(F);
172 auto &LI = FAM.getResult<LoopAnalysis>(F);
173 return DependenceInfo(&F, &AA, &SE, &LI);
174}
175
176AnalysisKey DependenceAnalysis::Key;
177
179 "Dependence Analysis", true, true)
185
187
190
194
196 auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults();
197 auto &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE();
198 auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
199 info.reset(new DependenceInfo(&F, &AA, &SE, &LI));
200 return false;
201}
202
204
206
213
214namespace {
215
216/// The property of monotonicity of a SCEV. To define the monotonicity, assume
217/// a SCEV defined within N-nested loops. Let i_k denote the iteration number
218/// of the k-th loop. Then we can regard the SCEV as an N-ary function:
219///
220/// F(i_1, i_2, ..., i_N)
221///
222/// The domain of i_k is the closed range [0, BTC_k], where BTC_k is the
223/// backedge-taken count of the k-th loop.
224///
225/// A function F is said to be "monotonically increasing with respect to the
226/// k-th loop" if x <= y implies the following condition:
227///
228/// F(i_1, ..., i_{k-1}, x, i_{k+1}, ..., i_N) <=
229/// F(i_1, ..., i_{k-1}, y, i_{k+1}, ..., i_N)
230///
231/// where i_1, ..., i_{k-1}, i_{k+1}, ..., i_N, x, and y are elements of their
232/// respective domains.
233///
234/// Likewise F is "monotonically decreasing with respect to the k-th loop"
235/// if x <= y implies
236///
237/// F(i_1, ..., i_{k-1}, x, i_{k+1}, ..., i_N) >=
238/// F(i_1, ..., i_{k-1}, y, i_{k+1}, ..., i_N)
239///
240/// A function F that is monotonically increasing or decreasing with respect to
241/// the k-th loop is simply called "monotonic with respect to k-th loop".
242///
243/// A function F is said to be "multivariate monotonic" when it is monotonic
244/// with respect to all of the N loops.
245///
246/// Since integer comparison can be either signed or unsigned, we need to
247/// distinguish monotonicity in the signed sense from that in the unsigned
248/// sense. Note that the inequality "x <= y" merely indicates loop progression
249/// and is not affected by the difference between signed and unsigned order.
250///
251/// Currently we only consider monotonicity in a signed sense.
252enum class SCEVMonotonicityType {
253 /// We don't know anything about the monotonicity of the SCEV.
254 Unknown,
255
256 /// The SCEV is loop-invariant with respect to the outermost loop. In other
257 /// words, the function F corresponding to the SCEV is a constant function.
258 Invariant,
259
260 /// The function F corresponding to the SCEV is multivariate monotonic in a
261 /// signed sense. Note that the multivariate monotonic function may also be a
262 /// constant function. The order employed in the definition of monotonicity
263 /// is not strict order.
264 MultivariateSignedMonotonic,
265};
266
267struct SCEVMonotonicity {
268 SCEVMonotonicity(SCEVMonotonicityType Type,
269 const SCEV *FailurePoint = nullptr);
270
271 SCEVMonotonicityType getType() const { return Type; }
272
273 const SCEV *getFailurePoint() const { return FailurePoint; }
274
275 bool isUnknown() const { return Type == SCEVMonotonicityType::Unknown; }
276
277 void print(raw_ostream &OS, unsigned Depth) const;
278
279private:
280 SCEVMonotonicityType Type;
281
282 /// The subexpression that caused Unknown. Mainly for debugging purpose.
283 const SCEV *FailurePoint;
284};
285
286/// Check the monotonicity of a SCEV. Since dependence tests (SIV, MIV, etc.)
287/// assume that subscript expressions are (multivariate) monotonic, we need to
288/// verify this property before applying those tests. Violating this assumption
289/// may cause them to produce incorrect results.
290struct SCEVMonotonicityChecker
291 : public SCEVVisitor<SCEVMonotonicityChecker, SCEVMonotonicity> {
292
293 SCEVMonotonicityChecker(ScalarEvolution *SE) : SE(SE) {}
294
295 /// Check the monotonicity of \p Expr. \p Expr must be integer type. If \p
296 /// OutermostLoop is not null, \p Expr must be defined in \p OutermostLoop or
297 /// one of its nested loops.
298 SCEVMonotonicity checkMonotonicity(const SCEV *Expr,
299 const Loop *OutermostLoop);
300
301private:
302 ScalarEvolution *SE;
303
304 /// The outermost loop that DA is analyzing.
305 const Loop *OutermostLoop;
306
307 /// A helper to classify \p Expr as either Invariant or Unknown.
308 SCEVMonotonicity invariantOrUnknown(const SCEV *Expr);
309
310 /// Return true if \p Expr is loop-invariant with respect to the outermost
311 /// loop.
312 bool isLoopInvariant(const SCEV *Expr) const;
313
314 /// A helper to create an Unknown SCEVMonotonicity.
315 SCEVMonotonicity createUnknown(const SCEV *FailurePoint) {
316 return SCEVMonotonicity(SCEVMonotonicityType::Unknown, FailurePoint);
317 }
318
319 SCEVMonotonicity visitAddRecExpr(const SCEVAddRecExpr *Expr);
320
321 SCEVMonotonicity visitConstant(const SCEVConstant *) {
322 return SCEVMonotonicity(SCEVMonotonicityType::Invariant);
323 }
324 SCEVMonotonicity visitVScale(const SCEVVScale *) {
325 return SCEVMonotonicity(SCEVMonotonicityType::Invariant);
326 }
327
328 // TODO: Handle more cases.
329 SCEVMonotonicity visitZeroExtendExpr(const SCEVZeroExtendExpr *Expr) {
330 return invariantOrUnknown(Expr);
331 }
332 SCEVMonotonicity visitSignExtendExpr(const SCEVSignExtendExpr *Expr) {
333 return invariantOrUnknown(Expr);
334 }
335 SCEVMonotonicity visitAddExpr(const SCEVAddExpr *Expr) {
336 return invariantOrUnknown(Expr);
337 }
338 SCEVMonotonicity visitMulExpr(const SCEVMulExpr *Expr) {
339 return invariantOrUnknown(Expr);
340 }
341 SCEVMonotonicity visitPtrToAddrExpr(const SCEVPtrToAddrExpr *Expr) {
342 return invariantOrUnknown(Expr);
343 }
344 SCEVMonotonicity visitPtrToIntExpr(const SCEVPtrToIntExpr *Expr) {
345 return invariantOrUnknown(Expr);
346 }
347 SCEVMonotonicity visitTruncateExpr(const SCEVTruncateExpr *Expr) {
348 return invariantOrUnknown(Expr);
349 }
350 SCEVMonotonicity visitUDivExpr(const SCEVUDivExpr *Expr) {
351 return invariantOrUnknown(Expr);
352 }
353 SCEVMonotonicity visitSMaxExpr(const SCEVSMaxExpr *Expr) {
354 return invariantOrUnknown(Expr);
355 }
356 SCEVMonotonicity visitUMaxExpr(const SCEVUMaxExpr *Expr) {
357 return invariantOrUnknown(Expr);
358 }
359 SCEVMonotonicity visitSMinExpr(const SCEVSMinExpr *Expr) {
360 return invariantOrUnknown(Expr);
361 }
362 SCEVMonotonicity visitUMinExpr(const SCEVUMinExpr *Expr) {
363 return invariantOrUnknown(Expr);
364 }
365 SCEVMonotonicity visitSequentialUMinExpr(const SCEVSequentialUMinExpr *Expr) {
366 return invariantOrUnknown(Expr);
367 }
368 SCEVMonotonicity visitUnknown(const SCEVUnknown *Expr) {
369 return invariantOrUnknown(Expr);
370 }
371 SCEVMonotonicity visitCouldNotCompute(const SCEVCouldNotCompute *Expr) {
372 return invariantOrUnknown(Expr);
373 }
374
375 friend struct SCEVVisitor<SCEVMonotonicityChecker, SCEVMonotonicity>;
376};
377
378/// A wrapper class for std::optional<APInt> that provides arithmetic operators
379/// with overflow checking in a signed sense. This allows us to omit inserting
380/// an overflow check at every arithmetic operation, which simplifies the code
381/// if the operations are chained like `a + b + c + ...`.
382///
383/// If an calculation overflows, the result becomes "invalid" which is
384/// internally represented by std::nullopt. If any operand of an arithmetic
385/// operation is "invalid", the result will also be "invalid".
386struct OverflowSafeSignedAPInt {
387 OverflowSafeSignedAPInt() : Value(std::nullopt) {}
388 OverflowSafeSignedAPInt(const APInt &V) : Value(V) {}
389 OverflowSafeSignedAPInt(const std::optional<APInt> &V) : Value(V) {}
390
391 OverflowSafeSignedAPInt operator+(const OverflowSafeSignedAPInt &RHS) const {
392 if (!Value || !RHS.Value)
393 return OverflowSafeSignedAPInt();
394 bool Overflow;
395 APInt Result = Value->sadd_ov(*RHS.Value, Overflow);
396 if (Overflow)
397 return OverflowSafeSignedAPInt();
398 return OverflowSafeSignedAPInt(Result);
399 }
400
401 OverflowSafeSignedAPInt operator+(int RHS) const {
402 if (!Value)
403 return OverflowSafeSignedAPInt();
404 return *this + fromInt(RHS);
405 }
406
407 OverflowSafeSignedAPInt operator-(const OverflowSafeSignedAPInt &RHS) const {
408 if (!Value || !RHS.Value)
409 return OverflowSafeSignedAPInt();
410 bool Overflow;
411 APInt Result = Value->ssub_ov(*RHS.Value, Overflow);
412 if (Overflow)
413 return OverflowSafeSignedAPInt();
414 return OverflowSafeSignedAPInt(Result);
415 }
416
417 OverflowSafeSignedAPInt operator-(int RHS) const {
418 if (!Value)
419 return OverflowSafeSignedAPInt();
420 return *this - fromInt(RHS);
421 }
422
423 OverflowSafeSignedAPInt operator*(const OverflowSafeSignedAPInt &RHS) const {
424 if (!Value || !RHS.Value)
425 return OverflowSafeSignedAPInt();
426 bool Overflow;
427 APInt Result = Value->smul_ov(*RHS.Value, Overflow);
428 if (Overflow)
429 return OverflowSafeSignedAPInt();
430 return OverflowSafeSignedAPInt(Result);
431 }
432
433 OverflowSafeSignedAPInt operator-() const {
434 if (!Value)
435 return OverflowSafeSignedAPInt();
436 if (Value->isMinSignedValue())
437 return OverflowSafeSignedAPInt();
438 return OverflowSafeSignedAPInt(-*Value);
439 }
440
441 operator bool() const { return Value.has_value(); }
442
443 bool operator!() const { return !Value.has_value(); }
444
445 const APInt &operator*() const {
446 assert(Value && "Value is not available.");
447 return *Value;
448 }
449
450 const APInt *operator->() const {
451 assert(Value && "Value is not available.");
452 return &*Value;
453 }
454
455private:
456 /// Underlying value. std::nullopt means "unknown". An arithmetic operation on
457 /// "unknown" always produces "unknown".
458 std::optional<APInt> Value;
459
460 OverflowSafeSignedAPInt fromInt(uint64_t V) const {
461 assert(Value && "Value is not available.");
462 return OverflowSafeSignedAPInt(
463 APInt(Value->getBitWidth(), V, /*isSigned=*/true));
464 }
465};
466
467} // anonymous namespace
468
469// Used to test the dependence analyzer.
470// Looks through the function, noting instructions that may access memory.
471// Calls depends() on every possible pair and prints out the result.
472// Ignores all other instructions.
474 ScalarEvolution &SE, LoopInfo &LI,
475 bool NormalizeResults) {
476 auto *F = DA->getFunction();
477
479 SCEVMonotonicityChecker Checker(&SE);
480 OS << "Monotonicity check:\n";
481 for (Instruction &Inst : instructions(F)) {
482 if (!isa<LoadInst>(Inst) && !isa<StoreInst>(Inst))
483 continue;
484 Value *Ptr = getLoadStorePointerOperand(&Inst);
485 const Loop *L = LI.getLoopFor(Inst.getParent());
486 const Loop *OutermostLoop = L ? L->getOutermostLoop() : nullptr;
487 const SCEV *PtrSCEV = SE.getSCEVAtScope(Ptr, L);
488 const SCEV *AccessFn = SE.removePointerBase(PtrSCEV);
489 SCEVMonotonicity Mon = Checker.checkMonotonicity(AccessFn, OutermostLoop);
490 OS.indent(2) << "Inst: " << Inst << "\n";
491 OS.indent(4) << "Expr: " << *AccessFn << "\n";
492 Mon.print(OS, 4);
493 }
494 OS << "\n";
495 }
496
497 for (inst_iterator SrcI = inst_begin(F), SrcE = inst_end(F); SrcI != SrcE;
498 ++SrcI) {
499 if (SrcI->mayReadOrWriteMemory()) {
500 for (inst_iterator DstI = SrcI, DstE = inst_end(F); DstI != DstE;
501 ++DstI) {
502 if (DstI->mayReadOrWriteMemory()) {
503 OS << "Src:" << *SrcI << " --> Dst:" << *DstI << "\n";
504 OS << " da analyze - ";
505 if (auto D = DA->depends(&*SrcI, &*DstI,
506 /*UnderRuntimeAssumptions=*/true)) {
507
508#ifndef NDEBUG
509 // Verify that the distance being zero is equivalent to the
510 // direction being EQ.
511 for (unsigned Level = 1; Level <= D->getLevels(); Level++) {
512 const SCEV *Distance = D->getDistance(Level);
513 bool IsDistanceZero = Distance && Distance->isZero();
514 bool IsDirectionEQ =
515 D->getDirection(Level) == Dependence::DVEntry::EQ;
516 assert(IsDistanceZero == IsDirectionEQ &&
517 "Inconsistent distance and direction.");
518 }
519#endif
520
521 // Normalize negative direction vectors if required by clients.
522 if (NormalizeResults && D->normalize(&SE))
523 OS << "normalized - ";
524 D->dump(OS);
525 } else
526 OS << "none!\n";
527 }
528 }
529 }
530 }
531}
532
534 const Module *) const {
536 OS, info.get(), getAnalysis<ScalarEvolutionWrapperPass>().getSE(),
537 getAnalysis<LoopInfoWrapperPass>().getLoopInfo(), false);
538}
539
542 OS << "Printing analysis 'Dependence Analysis' for function '" << F.getName()
543 << "':\n";
545 FAM.getResult<ScalarEvolutionAnalysis>(F),
546 FAM.getResult<LoopAnalysis>(F), NormalizeResults);
547 return PreservedAnalyses::all();
548}
549
550//===----------------------------------------------------------------------===//
551// Dependence methods
552
553// Returns true if this is an input dependence.
555 return Src->mayReadFromMemory() && Dst->mayReadFromMemory();
556}
557
558// Returns true if this is an output dependence.
560 return Src->mayWriteToMemory() && Dst->mayWriteToMemory();
561}
562
563// Returns true if this is an flow (aka true) dependence.
564bool Dependence::isFlow() const {
565 return Src->mayWriteToMemory() && Dst->mayReadFromMemory();
566}
567
568// Returns true if this is an anti dependence.
569bool Dependence::isAnti() const {
570 return Src->mayReadFromMemory() && Dst->mayWriteToMemory();
571}
572
573// Returns true if a particular level is scalar; that is,
574// if no subscript in the source or destination mention the induction
575// variable associated with the loop at this level.
576// Leave this out of line, so it will serve as a virtual method anchor
577bool Dependence::isScalar(unsigned level, bool IsSameSD) const { return false; }
578
579//===----------------------------------------------------------------------===//
580// FullDependence methods
581
583 const SCEVUnionPredicate &Assumes,
584 bool PossiblyLoopIndependent,
585 unsigned CommonLevels)
586 : Dependence(Source, Destination, Assumes), Levels(CommonLevels),
587 LoopIndependent(PossiblyLoopIndependent) {
588 SameSDLevels = 0;
589 if (CommonLevels)
590 DV = std::make_unique<DVEntry[]>(CommonLevels);
591}
592
593// FIXME: in some cases the meaning of a negative direction vector
594// may not be straightforward, e.g.,
595// for (int i = 0; i < 32; ++i) {
596// Src: A[i] = ...;
597// Dst: use(A[31 - i]);
598// }
599// The dependency is
600// flow { Src[i] -> Dst[31 - i] : when i >= 16 } and
601// anti { Dst[i] -> Src[31 - i] : when i < 16 },
602// -- hence a [<>].
603// As long as a dependence result contains '>' ('<>', '<=>', "*"), it
604// means that a reversed/normalized dependence needs to be considered
605// as well. Nevertheless, current isDirectionNegative() only returns
606// true with a '>' or '>=' dependency for ease of canonicalizing the
607// dependency vector, since the reverse of '<>', '<=>' and "*" is itself.
609 for (unsigned Level = 1; Level <= Levels; ++Level) {
610 unsigned char Direction = DV[Level - 1].Direction;
611 if (Direction == Dependence::DVEntry::EQ)
612 continue;
613 if (Direction == Dependence::DVEntry::GT ||
614 Direction == Dependence::DVEntry::GE)
615 return true;
616 return false;
617 }
618 return false;
619}
620
622 std::swap(Src, Dst);
623 for (unsigned Level = 1; Level <= Levels; ++Level) {
624 unsigned char Direction = DV[Level - 1].Direction;
625 // Reverse the direction vector, this means LT becomes GT
626 // and GT becomes LT.
627 unsigned char RevDirection = Direction & Dependence::DVEntry::EQ;
628 if (Direction & Dependence::DVEntry::LT)
629 RevDirection |= Dependence::DVEntry::GT;
630 if (Direction & Dependence::DVEntry::GT)
631 RevDirection |= Dependence::DVEntry::LT;
632 DV[Level - 1].Direction = RevDirection;
633 // Reverse the dependence distance as well.
634 if (DV[Level - 1].Distance != nullptr)
635 DV[Level - 1].Distance = SE.getNegativeSCEV(DV[Level - 1].Distance);
636 }
637}
638
640 if (!isDirectionNegative())
641 return false;
642
643 LLVM_DEBUG(dbgs() << "Before normalizing negative direction vectors:\n";
644 dump(dbgs()););
645 negate(*SE);
646 LLVM_DEBUG(dbgs() << "After normalizing negative direction vectors:\n";
647 dump(dbgs()););
648 return true;
649}
650
651// The rest are simple getters that hide the implementation.
652
653// getDirection - Returns the direction associated with a particular common or
654// SameSD level.
655unsigned FullDependence::getDirection(unsigned Level, bool IsSameSD) const {
656 return getDVEntry(Level, IsSameSD).Direction;
657}
658
659// Returns the distance (or NULL) associated with a particular common or
660// SameSD level.
661const SCEV *FullDependence::getDistance(unsigned Level, bool IsSameSD) const {
662 return getDVEntry(Level, IsSameSD).Distance;
663}
664
665// Returns true if a particular regular or SameSD level is scalar; that is,
666// if no subscript in the source or destination mention the induction variable
667// associated with the loop at this level.
668bool FullDependence::isScalar(unsigned Level, bool IsSameSD) const {
669 return getDVEntry(Level, IsSameSD).Scalar;
670}
671
672// inSameSDLoops - Returns true if this level is an SameSD level, i.e.,
673// performed across two separate loop nests that have the Same iteration space
674// and Depth.
675bool FullDependence::inSameSDLoops(unsigned Level) const {
676 assert(0 < Level && Level <= static_cast<unsigned>(Levels) + SameSDLevels &&
677 "Level out of range");
678 return Level > Levels;
679}
680
681//===----------------------------------------------------------------------===//
682// SCEVMonotonicity
683
684SCEVMonotonicity::SCEVMonotonicity(SCEVMonotonicityType Type,
685 const SCEV *FailurePoint)
686 : Type(Type), FailurePoint(FailurePoint) {
687 assert(
688 ((Type == SCEVMonotonicityType::Unknown) == (FailurePoint != nullptr)) &&
689 "FailurePoint must be provided iff Type is Unknown");
690}
691
692void SCEVMonotonicity::print(raw_ostream &OS, unsigned Depth) const {
693 OS.indent(Depth) << "Monotonicity: ";
694 switch (Type) {
695 case SCEVMonotonicityType::Unknown:
696 assert(FailurePoint && "FailurePoint must be provided for Unknown");
697 OS << "Unknown\n";
698 OS.indent(Depth) << "Reason: " << *FailurePoint << "\n";
699 break;
700 case SCEVMonotonicityType::Invariant:
701 OS << "Invariant\n";
702 break;
703 case SCEVMonotonicityType::MultivariateSignedMonotonic:
704 OS << "MultivariateSignedMonotonic\n";
705 break;
706 }
707}
708
709bool SCEVMonotonicityChecker::isLoopInvariant(const SCEV *Expr) const {
710 return !OutermostLoop || SE->isLoopInvariant(Expr, OutermostLoop);
711}
712
713SCEVMonotonicity SCEVMonotonicityChecker::invariantOrUnknown(const SCEV *Expr) {
714 if (isLoopInvariant(Expr))
715 return SCEVMonotonicity(SCEVMonotonicityType::Invariant);
716 return createUnknown(Expr);
717}
718
719SCEVMonotonicity
720SCEVMonotonicityChecker::checkMonotonicity(const SCEV *Expr,
721 const Loop *OutermostLoop) {
722 assert((!OutermostLoop || OutermostLoop->isOutermost()) &&
723 "OutermostLoop must be outermost");
724 assert(Expr->getType()->isIntegerTy() && "Expr must be integer type");
725 this->OutermostLoop = OutermostLoop;
726 return visit(Expr);
727}
728
729/// We only care about an affine AddRec at the moment. For an affine AddRec,
730/// the monotonicity can be inferred from its nowrap property. For example, let
731/// X and Y be loop-invariant, and assume Y is non-negative. An AddRec
732/// {X,+.Y}<nsw> implies:
733///
734/// X <=s (X + Y) <=s ((X + Y) + Y) <=s ...
735///
736/// Thus, we can conclude that the AddRec is monotonically increasing with
737/// respect to the associated loop in a signed sense. The similar reasoning
738/// applies when Y is non-positive, leading to a monotonically decreasing
739/// AddRec.
740SCEVMonotonicity
741SCEVMonotonicityChecker::visitAddRecExpr(const SCEVAddRecExpr *Expr) {
742 if (!Expr->isAffine() || !Expr->hasNoSignedWrap())
743 return createUnknown(Expr);
744
745 const SCEV *Start = Expr->getStart();
746 const SCEV *Step = Expr->getStepRecurrence(*SE);
747
748 SCEVMonotonicity StartMon = visit(Start);
749 if (StartMon.isUnknown())
750 return StartMon;
751
752 if (!isLoopInvariant(Step))
753 return createUnknown(Expr);
754
755 return SCEVMonotonicity(SCEVMonotonicityType::MultivariateSignedMonotonic);
756}
757
758//===----------------------------------------------------------------------===//
759// DependenceInfo methods
760
761// For debugging purposes. Dumps a dependence to OS.
763 if (isConfused())
764 OS << "confused";
765 else {
766 if (isFlow())
767 OS << "flow";
768 else if (isOutput())
769 OS << "output";
770 else if (isAnti())
771 OS << "anti";
772 else if (isInput())
773 OS << "input";
774 dumpImp(OS);
775 unsigned SameSDLevels = getSameSDLevels();
776 if (SameSDLevels > 0) {
777 OS << " / assuming " << SameSDLevels << " loop level(s) fused: ";
778 dumpImp(OS, true);
779 }
780 }
781 OS << "!\n";
782
784 if (!Assumptions.isAlwaysTrue()) {
785 OS << " Runtime Assumptions:\n";
786 Assumptions.print(OS, 2);
787 }
788}
789
790// For debugging purposes. Dumps a dependence to OS with or without considering
791// the SameSD levels.
792void Dependence::dumpImp(raw_ostream &OS, bool IsSameSD) const {
793 unsigned Levels = getLevels();
794 unsigned SameSDLevels = getSameSDLevels();
795 bool OnSameSD = false;
796 unsigned LevelNum = Levels;
797 if (IsSameSD)
798 LevelNum += SameSDLevels;
799 OS << " [";
800 for (unsigned II = 1; II <= LevelNum; ++II) {
801 if (!OnSameSD && inSameSDLoops(II))
802 OnSameSD = true;
803 const SCEV *Distance = getDistance(II, OnSameSD);
804 if (Distance)
805 OS << *Distance;
806 else if (isScalar(II, OnSameSD))
807 OS << "S";
808 else {
809 unsigned Direction = getDirection(II, OnSameSD);
810 if (Direction == DVEntry::ALL)
811 OS << "*";
812 else {
813 if (Direction & DVEntry::LT)
814 OS << "<";
815 if (Direction & DVEntry::EQ)
816 OS << "=";
817 if (Direction & DVEntry::GT)
818 OS << ">";
819 }
820 }
821 if (II < LevelNum)
822 OS << " ";
823 }
824 if (isLoopIndependent())
825 OS << "|<";
826 OS << "]";
827}
828
829// Returns NoAlias/MayAliass/MustAlias for two memory locations based upon their
830// underlaying objects. If LocA and LocB are known to not alias (for any reason:
831// tbaa, non-overlapping regions etc), then it is known there is no dependecy.
832// Otherwise the underlying objects are checked to see if they point to
833// different identifiable objects.
835 const MemoryLocation &LocA,
836 const MemoryLocation &LocB) {
837 // Check the original locations (minus size) for noalias, which can happen for
838 // tbaa, incompatible underlying object locations, etc.
839 MemoryLocation LocAS =
841 MemoryLocation LocBS =
843 BatchAAResults BAA(*AA);
845
846 if (BAA.isNoAlias(LocAS, LocBS))
848
849 // Check the underlying objects are the same
850 const Value *AObj = getUnderlyingObject(LocA.Ptr);
851 const Value *BObj = getUnderlyingObject(LocB.Ptr);
852
853 // If the underlying objects are the same, they must alias
854 if (AObj == BObj)
856
857 // We may have hit the recursion limit for underlying objects, or have
858 // underlying objects where we don't know they will alias.
859 if (!isIdentifiedObject(AObj) || !isIdentifiedObject(BObj))
861
862 // Otherwise we know the objects are different and both identified objects so
863 // must not alias.
865}
866
867// Returns true if the load or store can be analyzed. Atomic and volatile
868// operations have properties which this analysis does not understand.
869static bool isLoadOrStore(const Instruction *I) {
870 if (const LoadInst *LI = dyn_cast<LoadInst>(I))
871 return LI->isUnordered();
872 else if (const StoreInst *SI = dyn_cast<StoreInst>(I))
873 return SI->isUnordered();
874 return false;
875}
876
877// Returns true if two loops have the Same iteration Space and Depth. To be
878// more specific, two loops have SameSD if they are in the same nesting
879// depth and have the same backedge count. SameSD stands for Same iteration
880// Space and Depth.
881bool DependenceInfo::haveSameSD(const Loop *SrcLoop,
882 const Loop *DstLoop) const {
883 if (SrcLoop == DstLoop)
884 return true;
885
886 if (SrcLoop->getLoopDepth() != DstLoop->getLoopDepth())
887 return false;
888
889 if (!SrcLoop || !SrcLoop->getLoopLatch() || !DstLoop ||
890 !DstLoop->getLoopLatch())
891 return false;
892
893 const SCEV *SrcUB = SE->getBackedgeTakenCount(SrcLoop);
894 const SCEV *DstUB = SE->getBackedgeTakenCount(DstLoop);
896 return false;
897
898 Type *WiderType = SE->getWiderType(SrcUB->getType(), DstUB->getType());
899 SrcUB = SE->getNoopOrZeroExtend(SrcUB, WiderType);
900 DstUB = SE->getNoopOrZeroExtend(DstUB, WiderType);
901
902 if (SrcUB == DstUB)
903 return true;
904
905 return false;
906}
907
908// Examines the loop nesting of the Src and Dst
909// instructions and establishes their shared loops. Sets the variables
910// CommonLevels, SrcLevels, and MaxLevels.
911// The source and destination instructions needn't be contained in the same
912// loop. The routine establishNestingLevels finds the level of most deeply
913// nested loop that contains them both, CommonLevels. An instruction that's
914// not contained in a loop is at level = 0. MaxLevels is equal to the level
915// of the source plus the level of the destination, minus CommonLevels.
916// This lets us allocate vectors MaxLevels in length, with room for every
917// distinct loop referenced in both the source and destination subscripts.
918// The variable SrcLevels is the nesting depth of the source instruction.
919// It's used to help calculate distinct loops referenced by the destination.
920// Here's the map from loops to levels:
921// 0 - unused
922// 1 - outermost common loop
923// ... - other common loops
924// CommonLevels - innermost common loop
925// ... - loops containing Src but not Dst
926// SrcLevels - innermost loop containing Src but not Dst
927// ... - loops containing Dst but not Src
928// MaxLevels - innermost loops containing Dst but not Src
929// Consider the follow code fragment:
930// for (a = ...) {
931// for (b = ...) {
932// for (c = ...) {
933// for (d = ...) {
934// A[] = ...;
935// }
936// }
937// for (e = ...) {
938// for (f = ...) {
939// for (g = ...) {
940// ... = A[];
941// }
942// }
943// }
944// }
945// }
946// If we're looking at the possibility of a dependence between the store
947// to A (the Src) and the load from A (the Dst), we'll note that they
948// have 2 loops in common, so CommonLevels will equal 2 and the direction
949// vector for Result will have 2 entries. SrcLevels = 4 and MaxLevels = 7.
950// A map from loop names to loop numbers would look like
951// a - 1
952// b - 2 = CommonLevels
953// c - 3
954// d - 4 = SrcLevels
955// e - 5
956// f - 6
957// g - 7 = MaxLevels
958// SameSDLevels counts the number of levels after common levels that are
959// not common but have the same iteration space and depth. Internally this
960// is checked using haveSameSD. Currently we only need to check for SameSD
961// levels up to one level after the common levels, and therefore SameSDLevels
962// will be either 0 or 1.
963// 1. Assume that in this code fragment, levels c and e have the same iteration
964// space and depth, but levels d and f does not. Then SameSDLevels is set to 1.
965// In that case the level numbers for the previous code look like
966// a - 1
967// b - 2
968// c,e - 3 = CommonLevels
969// d - 4 = SrcLevels
970// f - 5
971// g - 6 = MaxLevels
972void DependenceInfo::establishNestingLevels(const Instruction *Src,
973 const Instruction *Dst) {
974 const BasicBlock *SrcBlock = Src->getParent();
975 const BasicBlock *DstBlock = Dst->getParent();
976 unsigned SrcLevel = LI->getLoopDepth(SrcBlock);
977 unsigned DstLevel = LI->getLoopDepth(DstBlock);
978 const Loop *SrcLoop = LI->getLoopFor(SrcBlock);
979 const Loop *DstLoop = LI->getLoopFor(DstBlock);
980 SrcLevels = SrcLevel;
981 MaxLevels = SrcLevel + DstLevel;
982 SameSDLevels = 0;
983 while (SrcLevel > DstLevel) {
984 SrcLoop = SrcLoop->getParentLoop();
985 SrcLevel--;
986 }
987 while (DstLevel > SrcLevel) {
988 DstLoop = DstLoop->getParentLoop();
989 DstLevel--;
990 }
991
992 const Loop *SrcUncommonFrontier = nullptr, *DstUncommonFrontier = nullptr;
993 // Find the first uncommon level pair and check if the associated levels have
994 // the SameSD.
995 while (SrcLoop != DstLoop) {
996 SrcUncommonFrontier = SrcLoop;
997 DstUncommonFrontier = DstLoop;
998 SrcLoop = SrcLoop->getParentLoop();
999 DstLoop = DstLoop->getParentLoop();
1000 SrcLevel--;
1001 }
1002 if (SrcUncommonFrontier && DstUncommonFrontier &&
1003 haveSameSD(SrcUncommonFrontier, DstUncommonFrontier))
1004 SameSDLevels = 1;
1005 CommonLevels = SrcLevel;
1006 MaxLevels -= CommonLevels;
1007}
1008
1009// Given one of the loops containing the source, return
1010// its level index in our numbering scheme.
1011unsigned DependenceInfo::mapSrcLoop(const Loop *SrcLoop) const {
1012 return SrcLoop->getLoopDepth();
1013}
1014
1015// Given one of the loops containing the destination,
1016// return its level index in our numbering scheme.
1017unsigned DependenceInfo::mapDstLoop(const Loop *DstLoop) const {
1018 unsigned D = DstLoop->getLoopDepth();
1019 if (D > CommonLevels)
1020 // This tries to make sure that we assign unique numbers to src and dst when
1021 // the memory accesses reside in different loops that have the same depth.
1022 return D - CommonLevels + SrcLevels;
1023 else
1024 return D;
1025}
1026
1027// Returns true if Expression is loop invariant in LoopNest.
1028bool DependenceInfo::isLoopInvariant(const SCEV *Expression,
1029 const Loop *LoopNest) const {
1030 // Unlike ScalarEvolution::isLoopInvariant() we consider an access outside of
1031 // any loop as invariant, because we only consier expression evaluation at a
1032 // specific position (where the array access takes place), and not across the
1033 // entire function.
1034 if (!LoopNest)
1035 return true;
1036
1037 // If the expression is invariant in the outermost loop of the loop nest, it
1038 // is invariant anywhere in the loop nest.
1039 return SE->isLoopInvariant(Expression, LoopNest->getOutermostLoop());
1040}
1041
1042// Finds the set of loops from the LoopNest that
1043// have a level <= CommonLevels and are referred to by the SCEV Expression.
1044void DependenceInfo::collectCommonLoops(const SCEV *Expression,
1045 const Loop *LoopNest,
1046 SmallBitVector &Loops) const {
1047 while (LoopNest) {
1048 unsigned Level = LoopNest->getLoopDepth();
1049 if (Level <= CommonLevels && !SE->isLoopInvariant(Expression, LoopNest))
1050 Loops.set(Level);
1051 LoopNest = LoopNest->getParentLoop();
1052 }
1053}
1054
1055// Examine the scev and return true iff it's affine.
1056// Collect any loops mentioned in the set of "Loops".
1057bool DependenceInfo::checkSubscript(const SCEV *Expr, const Loop *LoopNest,
1058 SmallBitVector &Loops, bool IsSrc) {
1059 const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Expr);
1060 if (!AddRec)
1061 return isLoopInvariant(Expr, LoopNest);
1062
1063 // The AddRec must depend on one of the containing loops. Otherwise,
1064 // mapSrcLoop and mapDstLoop return indices outside the intended range. This
1065 // can happen when a subscript in one loop references an IV from a sibling
1066 // loop that could not be replaced with a concrete exit value by
1067 // getSCEVAtScope.
1068 const Loop *L = LoopNest;
1069 while (L && AddRec->getLoop() != L)
1070 L = L->getParentLoop();
1071 if (!L)
1072 return false;
1073
1074 const SCEV *Start = AddRec->getStart();
1075 const SCEV *Step = AddRec->getStepRecurrence(*SE);
1076 if (!isLoopInvariant(Step, LoopNest))
1077 return false;
1078 if (IsSrc)
1079 Loops.set(mapSrcLoop(AddRec->getLoop()));
1080 else
1081 Loops.set(mapDstLoop(AddRec->getLoop()));
1082 return checkSubscript(Start, LoopNest, Loops, IsSrc);
1083}
1084
1085// Examine the scev and return true iff it's linear.
1086// Collect any loops mentioned in the set of "Loops".
1087bool DependenceInfo::checkSrcSubscript(const SCEV *Src, const Loop *LoopNest,
1089 return checkSubscript(Src, LoopNest, Loops, true);
1090}
1091
1092// Examine the scev and return true iff it's linear.
1093// Collect any loops mentioned in the set of "Loops".
1094bool DependenceInfo::checkDstSubscript(const SCEV *Dst, const Loop *LoopNest,
1096 return checkSubscript(Dst, LoopNest, Loops, false);
1097}
1098
1099// Examines the subscript pair (the Src and Dst SCEVs)
1100// and classifies it as either ZIV, SIV, RDIV, MIV, or Nonlinear.
1101// Collects the associated loops in a set.
1102DependenceInfo::Subscript::ClassificationKind
1103DependenceInfo::classifyPair(const SCEV *Src, const Loop *SrcLoopNest,
1104 const SCEV *Dst, const Loop *DstLoopNest,
1106 SmallBitVector SrcLoops(MaxLevels + 1);
1107 SmallBitVector DstLoops(MaxLevels + 1);
1108 if (!checkSrcSubscript(Src, SrcLoopNest, SrcLoops))
1109 return Subscript::NonLinear;
1110 if (!checkDstSubscript(Dst, DstLoopNest, DstLoops))
1111 return Subscript::NonLinear;
1112 Loops = SrcLoops;
1113 Loops |= DstLoops;
1114 unsigned N = Loops.count();
1115 if (N == 0)
1116 return Subscript::ZIV;
1117 if (N == 1)
1118 return Subscript::SIV;
1119 if (N == 2 && SrcLoops.count() == 1 && DstLoops.count() == 1)
1120 return Subscript::RDIV;
1121 return Subscript::MIV;
1122}
1123
1124// All subscripts are all the same type.
1125// Loop bound may be smaller (e.g., a char).
1126// Should zero extend loop bound, since it's always >= 0.
1127// This routine collects upper bound and extends or truncates if needed.
1128// Truncating is safe when subscripts are known not to wrap. Cases without
1129// nowrap flags should have been rejected earlier.
1130// Return null if no bound available.
1131const SCEV *DependenceInfo::collectUpperBound(const Loop *L, Type *T) const {
1132 if (SE->hasLoopInvariantBackedgeTakenCount(L)) {
1133 const SCEV *UB = SE->getBackedgeTakenCount(L);
1134 return SE->getTruncateOrZeroExtend(UB, T);
1135 }
1136 return nullptr;
1137}
1138
1139// Calls collectUpperBound(), then attempts to cast it to APInt.
1140// If the cast fails, returns std::nullopt.
1141std::optional<APInt>
1142DependenceInfo::collectNonNegativeConstantUpperBound(const Loop *L,
1143 Type *T) const {
1144 if (const SCEV *UB = collectUpperBound(L, T))
1145 if (auto *C = dyn_cast<SCEVConstant>(UB)) {
1146 APInt Res = C->getAPInt();
1147 if (Res.isNonNegative())
1148 return Res;
1149 }
1150 return std::nullopt;
1151}
1152
1153/// Returns \p A - \p B if it guaranteed not to signed wrap. Otherwise returns
1154/// nullptr. \p A and \p B must have the same integer type.
1155static const SCEV *minusSCEVNoSignedOverflow(const SCEV *A, const SCEV *B,
1156 ScalarEvolution &SE) {
1157 if (SE.willNotOverflow(Instruction::Sub, /*Signed=*/true, A, B))
1158 return SE.getMinusSCEV(A, B);
1159 return nullptr;
1160}
1161
1162/// Returns true iff \p Test is enabled.
1163static bool isDependenceTestEnabled(DependenceTestType Test) {
1164 if (EnableDependenceTest == DependenceTestType::All)
1165 return true;
1166 return EnableDependenceTest == Test;
1167}
1168
1169// testZIV -
1170// When we have a pair of subscripts of the form [c1] and [c2],
1171// where c1 and c2 are both loop invariant, we attack it using
1172// the ZIV test. Basically, we test by comparing the two values,
1173// but there are actually three possible results:
1174// 1) the values are equal, so there's a dependence
1175// 2) the values are different, so there's no dependence
1176// 3) the values might be equal, so we have to assume a dependence.
1177//
1178// Return true if dependence disproved.
1179bool DependenceInfo::testZIV(const SCEV *Src, const SCEV *Dst,
1180 FullDependence &Result) const {
1181 LLVM_DEBUG(dbgs() << " src = " << *Src << "\n");
1182 LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n");
1183 ++ZIVapplications;
1184 if (SE->isKnownPredicate(CmpInst::ICMP_EQ, Src, Dst)) {
1185 LLVM_DEBUG(dbgs() << " provably dependent\n");
1186 return false; // provably dependent
1187 }
1188 if (SE->isKnownPredicate(CmpInst::ICMP_NE, Src, Dst)) {
1189 LLVM_DEBUG(dbgs() << " provably independent\n");
1190 ++ZIVindependence;
1191 return true; // provably independent
1192 }
1193 LLVM_DEBUG(dbgs() << " possibly dependent\n");
1194 return false; // possibly dependent
1195}
1196
1197// strongSIVtest -
1198// From the paper, Practical Dependence Testing, Section 4.2.1
1199//
1200// When we have a pair of subscripts of the form [c1 + a*i] and [c2 + a*i],
1201// where i is an induction variable, c1 and c2 are loop invariant,
1202// and a is a constant, we can solve it exactly using the Strong SIV test.
1203//
1204// Can prove independence. Failing that, can compute distance (and direction).
1205// In the presence of symbolic terms, we can sometimes make progress.
1206//
1207// If there's a dependence,
1208//
1209// c1 + a*i = c2 + a*i'
1210//
1211// The dependence distance is
1212//
1213// d = i' - i = (c1 - c2)/a
1214//
1215// A dependence only exists if d is an integer and abs(d) <= U, where U is the
1216// loop's upper bound. If a dependence exists, the dependence direction is
1217// defined as
1218//
1219// { < if d > 0
1220// direction = { = if d = 0
1221// { > if d < 0
1222//
1223// Return true if dependence disproved.
1224bool DependenceInfo::strongSIVtest(const SCEVAddRecExpr *Src,
1225 const SCEVAddRecExpr *Dst, unsigned Level,
1226 FullDependence &Result,
1227 bool UnderRuntimeAssumptions) {
1228 if (!isDependenceTestEnabled(DependenceTestType::StrongSIV))
1229 return false;
1230
1231 if (!Src->hasNoSignedWrap() || !Dst->hasNoSignedWrap())
1232 return false;
1233
1234 const SCEV *Coeff = Src->getStepRecurrence(*SE);
1235 assert(Coeff == Dst->getStepRecurrence(*SE) &&
1236 "Expecting same coefficient in Strong SIV test");
1237 const SCEV *SrcConst = Src->getStart();
1238 const SCEV *DstConst = Dst->getStart();
1239 LLVM_DEBUG(dbgs() << "\tStrong SIV test\n");
1240 LLVM_DEBUG(dbgs() << "\t Coeff = " << *Coeff);
1241 LLVM_DEBUG(dbgs() << ", " << *Coeff->getType() << "\n");
1242 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst);
1243 LLVM_DEBUG(dbgs() << ", " << *SrcConst->getType() << "\n");
1244 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst);
1245 LLVM_DEBUG(dbgs() << ", " << *DstConst->getType() << "\n");
1246 ++StrongSIVapplications;
1247 assert(0 < Level && Level <= CommonLevels && "level out of range");
1248 Level--;
1249
1250 const SCEV *Delta = minusSCEVNoSignedOverflow(SrcConst, DstConst, *SE);
1251 if (!Delta)
1252 return false;
1253 LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta);
1254 LLVM_DEBUG(dbgs() << ", " << *Delta->getType() << "\n");
1255
1256 // Can we compute distance?
1257 if (isa<SCEVConstant>(Delta) && isa<SCEVConstant>(Coeff)) {
1258 APInt ConstDelta = cast<SCEVConstant>(Delta)->getAPInt();
1259 APInt ConstCoeff = cast<SCEVConstant>(Coeff)->getAPInt();
1260 APInt Distance = ConstDelta; // these need to be initialized
1261 APInt Remainder = ConstDelta;
1262 APInt::sdivrem(ConstDelta, ConstCoeff, Distance, Remainder);
1263 LLVM_DEBUG(dbgs() << "\t Distance = " << Distance << "\n");
1264 LLVM_DEBUG(dbgs() << "\t Remainder = " << Remainder << "\n");
1265 // Make sure Coeff divides Delta exactly
1266 if (Remainder != 0) {
1267 // Coeff doesn't divide Distance, no dependence
1268 ++StrongSIVindependence;
1269 ++StrongSIVsuccesses;
1270 return true;
1271 }
1272 Result.DV[Level].Distance = SE->getConstant(Distance);
1273 if (Distance.sgt(0))
1274 Result.DV[Level].Direction &= Dependence::DVEntry::LT;
1275 else if (Distance.slt(0))
1276 Result.DV[Level].Direction &= Dependence::DVEntry::GT;
1277 else
1278 Result.DV[Level].Direction &= Dependence::DVEntry::EQ;
1279 ++StrongSIVsuccesses;
1280 } else if (Delta->isZero()) {
1281 // Check if coefficient could be zero. If so, 0/0 is undefined and we
1282 // cannot conclude that only same-iteration dependencies exist.
1283 // When coeff=0, all iterations access the same location.
1284 if (SE->isKnownNonZero(Coeff)) {
1285 LLVM_DEBUG(
1286 dbgs() << "\t Coefficient proven non-zero by SCEV analysis\n");
1287 } else {
1288 // Cannot prove at compile time, would need runtime assumption.
1289 if (UnderRuntimeAssumptions) {
1290 const SCEVPredicate *Pred = SE->getComparePredicate(
1291 ICmpInst::ICMP_NE, Coeff, SE->getZero(Coeff->getType()));
1292 Result.Assumptions = Result.Assumptions.getUnionWith(Pred, *SE);
1293 LLVM_DEBUG(dbgs() << "\t Added runtime assumption: " << *Coeff
1294 << " != 0\n");
1295 } else {
1296 // Cannot add runtime assumptions, this test cannot handle this case.
1297 // Let more complex tests try.
1298 LLVM_DEBUG(dbgs() << "\t Would need runtime assumption " << *Coeff
1299 << " != 0, but not allowed. Failing this test.\n");
1300 return false;
1301 }
1302 }
1303 // Since 0/X == 0 (where X is known non-zero or assumed non-zero).
1304 Result.DV[Level].Distance = Delta;
1305 Result.DV[Level].Direction &= Dependence::DVEntry::EQ;
1306 ++StrongSIVsuccesses;
1307 } else {
1308 if (Coeff->isOne()) {
1309 LLVM_DEBUG(dbgs() << "\t Distance = " << *Delta << "\n");
1310 Result.DV[Level].Distance = Delta; // since X/1 == X
1311 }
1312
1313 // maybe we can get a useful direction
1314 bool DeltaMaybeZero = !SE->isKnownNonZero(Delta);
1315 bool DeltaMaybePositive = !SE->isKnownNonPositive(Delta);
1316 bool DeltaMaybeNegative = !SE->isKnownNonNegative(Delta);
1317 bool CoeffMaybePositive = !SE->isKnownNonPositive(Coeff);
1318 bool CoeffMaybeNegative = !SE->isKnownNonNegative(Coeff);
1319 // The double negatives above are confusing.
1320 // It helps to read !SE->isKnownNonZero(Delta)
1321 // as "Delta might be Zero"
1322 unsigned NewDirection = Dependence::DVEntry::NONE;
1323 if ((DeltaMaybePositive && CoeffMaybePositive) ||
1324 (DeltaMaybeNegative && CoeffMaybeNegative))
1325 NewDirection = Dependence::DVEntry::LT;
1326 if (DeltaMaybeZero)
1327 NewDirection |= Dependence::DVEntry::EQ;
1328 if ((DeltaMaybeNegative && CoeffMaybePositive) ||
1329 (DeltaMaybePositive && CoeffMaybeNegative))
1330 NewDirection |= Dependence::DVEntry::GT;
1331 if (NewDirection < Result.DV[Level].Direction)
1332 ++StrongSIVsuccesses;
1333 Result.DV[Level].Direction &= NewDirection;
1334 }
1335 return false;
1336}
1337
1338// weakCrossingSIVtest -
1339// From the paper, Practical Dependence Testing, Section 4.2.2
1340//
1341// When we have a pair of subscripts of the form [c1 + a*i] and [c2 - a*i],
1342// where i is an induction variable, c1 and c2 are loop invariant,
1343// and a is a constant, we can solve it exactly using the
1344// Weak-Crossing SIV test.
1345//
1346// Given c1 + a*i = c2 - a*i', we can look for the intersection of
1347// the two lines, where i = i', yielding
1348//
1349// c1 + a*i = c2 - a*i
1350// 2a*i = c2 - c1
1351// i = (c2 - c1)/2a
1352//
1353// If i < 0, there is no dependence.
1354// If i > upperbound, there is no dependence.
1355// If i = 0 (i.e., if c1 = c2), there's a dependence with distance = 0.
1356// If i = upperbound, there's a dependence with distance = 0.
1357// If i is integral, there's a dependence (all directions).
1358// If the non-integer part = 1/2, there's a dependence (<> directions).
1359// Otherwise, there's no dependence.
1360//
1361// Can prove independence. Failing that,
1362// can sometimes refine the directions.
1363// Can determine iteration for splitting.
1364//
1365// Return true if dependence disproved.
1366bool DependenceInfo::weakCrossingSIVtest(const SCEVAddRecExpr *Src,
1367 const SCEVAddRecExpr *Dst,
1368 unsigned Level,
1369 FullDependence &Result) const {
1370 if (!isDependenceTestEnabled(DependenceTestType::WeakCrossingSIV))
1371 return false;
1372
1373 if (!Src->hasNoSignedWrap() || !Dst->hasNoSignedWrap())
1374 return false;
1375
1376 const SCEV *Coeff = Src->getStepRecurrence(*SE);
1377 const SCEV *SrcConst = Src->getStart();
1378 const SCEV *DstConst = Dst->getStart();
1379
1380 assert(Coeff == SE->getNegativeSCEV(Dst->getStepRecurrence(*SE)) &&
1381 "Unexpected input for weakCrossingSIVtest");
1382
1383 LLVM_DEBUG(dbgs() << "\tWeak-Crossing SIV test\n");
1384 LLVM_DEBUG(dbgs() << "\t Coeff = " << *Coeff << "\n");
1385 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");
1386 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n");
1387 ++WeakCrossingSIVapplications;
1388 assert(0 < Level && Level <= CommonLevels && "Level out of range");
1389 Level--;
1390 const SCEV *Delta = SE->getMinusSCEV(DstConst, SrcConst);
1391 LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n");
1392 const SCEVConstant *ConstCoeff = dyn_cast<SCEVConstant>(Coeff);
1393 if (!ConstCoeff)
1394 return false;
1395
1396 if (SE->isKnownNegative(ConstCoeff)) {
1397 ConstCoeff = dyn_cast<SCEVConstant>(SE->getNegativeSCEV(ConstCoeff));
1398 assert(ConstCoeff &&
1399 "dynamic cast of negative of ConstCoeff should yield constant");
1400 Delta = SE->getNegativeSCEV(Delta);
1401 }
1402 assert(SE->isKnownPositive(ConstCoeff) && "ConstCoeff should be positive");
1403
1404 const SCEVConstant *ConstDelta = dyn_cast<SCEVConstant>(Delta);
1405 if (!ConstDelta)
1406 return false;
1407
1408 // We're certain that ConstCoeff > 0; therefore,
1409 // if Delta < 0, then no dependence.
1410 LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n");
1411 LLVM_DEBUG(dbgs() << "\t ConstCoeff = " << *ConstCoeff << "\n");
1412 if (SE->isKnownNegative(Delta)) {
1413 // No dependence, Delta < 0
1414 ++WeakCrossingSIVindependence;
1415 ++WeakCrossingSIVsuccesses;
1416 return true;
1417 }
1418
1419 ConstantRange SrcRange = SE->getSignedRange(Src);
1420 ConstantRange DstRange = SE->getSignedRange(Dst);
1421 LLVM_DEBUG(dbgs() << "\t SrcRange = " << SrcRange << "\n");
1422 LLVM_DEBUG(dbgs() << "\t DstRange = " << DstRange << "\n");
1423 if (SrcRange.intersectWith(DstRange).isSingleElement()) {
1424 // The ranges touch at exactly one value (i = i' = 0 or i = i' = BTC).
1425 Result.DV[Level].Direction &= ~Dependence::DVEntry::LT;
1426 Result.DV[Level].Direction &= ~Dependence::DVEntry::GT;
1427 ++WeakCrossingSIVsuccesses;
1428 if (!Result.DV[Level].Direction) {
1429 ++WeakCrossingSIVindependence;
1430 return true;
1431 }
1432 Result.DV[Level].Distance = SE->getZero(Delta->getType());
1433 return false;
1434 }
1435
1436 // check that Coeff divides Delta
1437 APInt APDelta = ConstDelta->getAPInt();
1438 APInt APCoeff = ConstCoeff->getAPInt();
1439 APInt Distance = APDelta; // these need to be initialzed
1440 APInt Remainder = APDelta;
1441 APInt::sdivrem(APDelta, APCoeff, Distance, Remainder);
1442 LLVM_DEBUG(dbgs() << "\t Remainder = " << Remainder << "\n");
1443 if (Remainder != 0) {
1444 // Coeff doesn't divide Delta, no dependence
1445 ++WeakCrossingSIVindependence;
1446 ++WeakCrossingSIVsuccesses;
1447 return true;
1448 }
1449 LLVM_DEBUG(dbgs() << "\t Distance = " << Distance << "\n");
1450
1451 // if 2*Coeff doesn't divide Delta, then the equal direction isn't possible
1452 if (Distance[0]) {
1453 // Equal direction isn't possible
1454 Result.DV[Level].Direction &= ~Dependence::DVEntry::EQ;
1455 ++WeakCrossingSIVsuccesses;
1456 }
1457 return false;
1458}
1459
1460// Kirch's algorithm, from
1461//
1462// Optimizing Supercompilers for Supercomputers
1463// Michael Wolfe
1464// MIT Press, 1989
1465//
1466// Program 2.1, page 29.
1467// Computes the GCD of AM and BM.
1468// Also finds a solution to the equation ax - by = gcd(a, b).
1469// Returns true if dependence disproved; i.e., gcd does not divide Delta.
1470//
1471// We don't use OverflowSafeSignedAPInt here because it's known that this
1472// algorithm doesn't overflow.
1473static bool findGCD(unsigned Bits, const APInt &AM, const APInt &BM,
1474 const APInt &Delta, APInt &G, APInt &X, APInt &Y) {
1475 APInt A0(Bits, 1, true), A1(Bits, 0, true);
1476 APInt B0(Bits, 0, true), B1(Bits, 1, true);
1477 APInt G0 = AM.abs();
1478 APInt G1 = BM.abs();
1479 APInt Q = G0; // these need to be initialized
1480 APInt R = G0;
1481 APInt::sdivrem(G0, G1, Q, R);
1482 while (R != 0) {
1483 // clang-format off
1484 APInt A2 = A0 - Q*A1; A0 = A1; A1 = A2;
1485 APInt B2 = B0 - Q*B1; B0 = B1; B1 = B2;
1486 G0 = G1; G1 = R;
1487 // clang-format on
1488 APInt::sdivrem(G0, G1, Q, R);
1489 }
1490 G = G1;
1491 LLVM_DEBUG(dbgs() << "\t GCD = " << G << "\n");
1492 X = AM.slt(0) ? -A1 : A1;
1493 Y = BM.slt(0) ? B1 : -B1;
1494
1495 // make sure gcd divides Delta
1496 R = Delta.srem(G);
1497 if (R != 0)
1498 return true; // gcd doesn't divide Delta, no dependence
1499 Q = Delta.sdiv(G);
1500 return false;
1501}
1502
1503static OverflowSafeSignedAPInt
1504floorOfQuotient(const OverflowSafeSignedAPInt &OA,
1505 const OverflowSafeSignedAPInt &OB) {
1506 if (!OA || !OB)
1507 return OverflowSafeSignedAPInt();
1508
1509 APInt A = *OA;
1510 APInt B = *OB;
1511 APInt Q = A; // these need to be initialized
1512 APInt R = A;
1513 APInt::sdivrem(A, B, Q, R);
1514 if (R == 0)
1515 return Q;
1516 if ((A.sgt(0) && B.sgt(0)) || (A.slt(0) && B.slt(0)))
1517 return Q;
1518 return OverflowSafeSignedAPInt(Q) - 1;
1519}
1520
1521static OverflowSafeSignedAPInt
1522ceilingOfQuotient(const OverflowSafeSignedAPInt &OA,
1523 const OverflowSafeSignedAPInt &OB) {
1524 if (!OA || !OB)
1525 return OverflowSafeSignedAPInt();
1526
1527 APInt A = *OA;
1528 APInt B = *OB;
1529 APInt Q = A; // these need to be initialized
1530 APInt R = A;
1531 APInt::sdivrem(A, B, Q, R);
1532 if (R == 0)
1533 return Q;
1534 if ((A.sgt(0) && B.sgt(0)) || (A.slt(0) && B.slt(0)))
1535 return OverflowSafeSignedAPInt(Q) + 1;
1536 return Q;
1537}
1538
1539/// Given an affine expression of the form A*k + B, where k is an arbitrary
1540/// integer, infer the possible range of k based on the known range of the
1541/// affine expression. If we know A*k + B is non-negative, i.e.,
1542///
1543/// A*k + B >=s 0
1544///
1545/// we can derive the following inequalities for k when A is positive:
1546///
1547/// k >=s -B / A
1548///
1549/// Since k is an integer, it means k is greater than or equal to the
1550/// ceil(-B / A).
1551///
1552/// If the upper bound of the affine expression \p UB is passed, the following
1553/// inequality can be derived as well:
1554///
1555/// A*k + B <=s UB
1556///
1557/// which leads to:
1558///
1559/// k <=s (UB - B) / A
1560///
1561/// Again, as k is an integer, it means k is less than or equal to the
1562/// floor((UB - B) / A).
1563///
1564/// The similar logic applies when A is negative, but the inequalities sign flip
1565/// while working with them.
1566///
1567/// Preconditions: \p A is non-zero, and we know A*k + B and \p UB are
1568/// non-negative.
1569static std::pair<OverflowSafeSignedAPInt, OverflowSafeSignedAPInt>
1570inferDomainOfAffine(OverflowSafeSignedAPInt A, OverflowSafeSignedAPInt B,
1571 OverflowSafeSignedAPInt UB) {
1572 assert(A && B && "A and B must be available");
1573 assert(*A != 0 && "A must be non-zero");
1574 assert((!UB || UB->isNonNegative()) && "UB must be non-negative");
1575 OverflowSafeSignedAPInt TL, TU;
1576 if (A->sgt(0)) {
1577 TL = ceilingOfQuotient(-B, A);
1578 LLVM_DEBUG(if (TL) dbgs() << "\t Possible TL = " << *TL << "\n");
1579
1580 // New bound check - modification to Banerjee's e3 check
1581 TU = floorOfQuotient(UB - B, A);
1582 LLVM_DEBUG(if (TU) dbgs() << "\t Possible TU = " << *TU << "\n");
1583 } else {
1584 TU = floorOfQuotient(-B, A);
1585 LLVM_DEBUG(if (TU) dbgs() << "\t Possible TU = " << *TU << "\n");
1586
1587 // New bound check - modification to Banerjee's e3 check
1588 TL = ceilingOfQuotient(UB - B, A);
1589 LLVM_DEBUG(if (TL) dbgs() << "\t Possible TL = " << *TL << "\n");
1590 }
1591 return std::make_pair(TL, TU);
1592}
1593
1594// exactSIVtest -
1595// When we have a pair of subscripts of the form [c1 + a1*i] and [c2 + a2*i],
1596// where i is an induction variable, c1 and c2 are loop invariant, and a1
1597// and a2 are constant, we can solve it exactly using an algorithm developed
1598// by Banerjee and Wolfe. See Algorithm 6.2.1 (case 2.5) in:
1599//
1600// Dependence Analysis for Supercomputing
1601// Utpal Banerjee
1602// Kluwer Academic Publishers, 1988
1603//
1604// It's slower than the specialized tests (strong SIV, weak-zero SIV, etc),
1605// so use them if possible. They're also a bit better with symbolics and,
1606// in the case of the strong SIV test, can compute Distances.
1607//
1608// Return true if dependence disproved.
1609//
1610// This is a modified version of the original Banerjee algorithm. The original
1611// only tested whether Dst depends on Src. This algorithm extends that and
1612// returns all the dependencies that exist between Dst and Src.
1613bool DependenceInfo::exactSIVtest(const SCEVAddRecExpr *Src,
1614 const SCEVAddRecExpr *Dst, unsigned Level,
1615 FullDependence &Result) const {
1616 if (!isDependenceTestEnabled(DependenceTestType::ExactSIV))
1617 return false;
1618
1619 const SCEV *SrcCoeff = Src->getStepRecurrence(*SE);
1620 const SCEV *SrcConst = Src->getStart();
1621 const SCEV *DstCoeff = Dst->getStepRecurrence(*SE);
1622 const SCEV *DstConst = Dst->getStart();
1623 LLVM_DEBUG(dbgs() << "\tExact SIV test\n");
1624 LLVM_DEBUG(dbgs() << "\t SrcCoeff = " << *SrcCoeff << " = AM\n");
1625 LLVM_DEBUG(dbgs() << "\t DstCoeff = " << *DstCoeff << " = BM\n");
1626 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");
1627 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n");
1628 ++ExactSIVapplications;
1629 assert(0 < Level && Level <= CommonLevels && "Level out of range");
1630 Level--;
1631
1632 if (!Src->hasNoSignedWrap() || !Dst->hasNoSignedWrap())
1633 return false;
1634
1635 const SCEV *Delta = minusSCEVNoSignedOverflow(DstConst, SrcConst, *SE);
1636 if (!Delta)
1637 return false;
1638 LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n");
1639 const SCEVConstant *ConstDelta = dyn_cast<SCEVConstant>(Delta);
1640 const SCEVConstant *ConstSrcCoeff = dyn_cast<SCEVConstant>(SrcCoeff);
1641 const SCEVConstant *ConstDstCoeff = dyn_cast<SCEVConstant>(DstCoeff);
1642 if (!ConstDelta || !ConstSrcCoeff || !ConstDstCoeff)
1643 return false;
1644
1645 // find gcd
1646 APInt G, X, Y;
1647 APInt AM = ConstSrcCoeff->getAPInt();
1648 APInt BM = ConstDstCoeff->getAPInt();
1649 APInt CM = ConstDelta->getAPInt();
1650 unsigned Bits = AM.getBitWidth();
1651 if (findGCD(Bits, AM, BM, CM, G, X, Y)) {
1652 // gcd doesn't divide Delta, no dependence
1653 ++ExactSIVindependence;
1654 ++ExactSIVsuccesses;
1655 return true;
1656 }
1657
1658 LLVM_DEBUG(dbgs() << "\t X = " << X << ", Y = " << Y << "\n");
1659
1660 // since SCEV construction normalizes, LM = 0
1661 std::optional<APInt> UM =
1662 collectNonNegativeConstantUpperBound(Src->getLoop(), Delta->getType());
1663 if (UM)
1664 LLVM_DEBUG(dbgs() << "\t UM = " << *UM << "\n");
1665
1666 APInt TU(APInt::getSignedMaxValue(Bits));
1667 APInt TL(APInt::getSignedMinValue(Bits));
1668 APInt TC = CM.sdiv(G);
1669 APInt TX = X * TC;
1670 APInt TY = Y * TC;
1671 LLVM_DEBUG(dbgs() << "\t TC = " << TC << "\n");
1672 LLVM_DEBUG(dbgs() << "\t TX = " << TX << "\n");
1673 LLVM_DEBUG(dbgs() << "\t TY = " << TY << "\n");
1674
1675 APInt TB = BM.sdiv(G);
1676 APInt TA = AM.sdiv(G);
1677
1678 // At this point, we have the following equations:
1679 //
1680 // TA*i0 - TB*i1 = TC
1681 //
1682 // Also, we know that the all pairs of (i0, i1) can be expressed as:
1683 //
1684 // (TX + k*TB, TY + k*TA)
1685 //
1686 // where k is an arbitrary integer.
1687 auto [TL0, TU0] = inferDomainOfAffine(TB, TX, UM);
1688 auto [TL1, TU1] = inferDomainOfAffine(TA, TY, UM);
1689
1690 auto GetMaxOrMin = [](const OverflowSafeSignedAPInt &V0,
1691 const OverflowSafeSignedAPInt &V1,
1692 bool IsMin) -> std::optional<APInt> {
1693 if (V0 && V1)
1694 return IsMin ? APIntOps::smin(*V0, *V1) : APIntOps::smax(*V0, *V1);
1695 if (V0)
1696 return *V0;
1697 if (V1)
1698 return *V1;
1699 return std::nullopt;
1700 };
1701
1702 LLVM_DEBUG(dbgs() << "\t TA = " << TA << "\n");
1703 LLVM_DEBUG(dbgs() << "\t TB = " << TB << "\n");
1704
1705 std::optional<APInt> OptTL = GetMaxOrMin(TL0, TL1, false);
1706 std::optional<APInt> OptTU = GetMaxOrMin(TU0, TU1, true);
1707 if (!OptTL || !OptTU)
1708 return false;
1709
1710 TL = std::move(*OptTL);
1711 TU = std::move(*OptTU);
1712 LLVM_DEBUG(dbgs() << "\t TL = " << TL << "\n");
1713 LLVM_DEBUG(dbgs() << "\t TU = " << TU << "\n");
1714
1715 if (TL.sgt(TU)) {
1716 ++ExactSIVindependence;
1717 ++ExactSIVsuccesses;
1718 return true;
1719 }
1720
1721 // explore directions
1722 unsigned NewDirection = Dependence::DVEntry::NONE;
1723 OverflowSafeSignedAPInt LowerDistance, UpperDistance;
1724 OverflowSafeSignedAPInt OTY(TY), OTX(TX), OTA(TA), OTB(TB), OTL(TL), OTU(TU);
1725 // NOTE: It's unclear whether these calculations can overflow. At the moment,
1726 // we conservatively assume they can.
1727 if (TA.sgt(TB)) {
1728 LowerDistance = (OTY - OTX) + (OTA - OTB) * OTL;
1729 UpperDistance = (OTY - OTX) + (OTA - OTB) * OTU;
1730 } else {
1731 LowerDistance = (OTY - OTX) + (OTA - OTB) * OTU;
1732 UpperDistance = (OTY - OTX) + (OTA - OTB) * OTL;
1733 }
1734
1735 if (!LowerDistance || !UpperDistance)
1736 return false;
1737
1738 LLVM_DEBUG(dbgs() << "\t LowerDistance = " << *LowerDistance << "\n");
1739 LLVM_DEBUG(dbgs() << "\t UpperDistance = " << *UpperDistance << "\n");
1740
1741 if (LowerDistance->sle(0) && UpperDistance->sge(0)) {
1742 NewDirection |= Dependence::DVEntry::EQ;
1743 ++ExactSIVsuccesses;
1744 }
1745 if (LowerDistance->slt(0)) {
1746 NewDirection |= Dependence::DVEntry::GT;
1747 ++ExactSIVsuccesses;
1748 }
1749 if (UpperDistance->sgt(0)) {
1750 NewDirection |= Dependence::DVEntry::LT;
1751 ++ExactSIVsuccesses;
1752 }
1753
1754 // finished
1755 Result.DV[Level].Direction &= NewDirection;
1756 if (Result.DV[Level].Direction == Dependence::DVEntry::NONE)
1757 ++ExactSIVindependence;
1758 LLVM_DEBUG(dbgs() << "\t Result = ");
1759 LLVM_DEBUG(Result.dump(dbgs()));
1760 return Result.DV[Level].Direction == Dependence::DVEntry::NONE;
1761}
1762
1763// Return true if the divisor evenly divides the dividend.
1764static bool isRemainderZero(const SCEVConstant *Dividend,
1765 const SCEVConstant *Divisor) {
1766 const APInt &ConstDividend = Dividend->getAPInt();
1767 const APInt &ConstDivisor = Divisor->getAPInt();
1768 return ConstDividend.srem(ConstDivisor) == 0;
1769}
1770
1771bool DependenceInfo::weakZeroSIVtestImpl(const SCEVAddRecExpr *AR,
1772 const SCEV *Const, unsigned Level,
1773 FullDependence &Result) const {
1774 const SCEV *ARCoeff = AR->getStepRecurrence(*SE);
1775 const SCEV *ARConst = AR->getStart();
1776
1777 if (!AR->hasNoSignedWrap())
1778 return false;
1779
1780 if (Const == ARConst && SE->isKnownNonZero(ARCoeff)) {
1781 if (Level < CommonLevels) {
1782 Result.DV[Level].Direction &= Dependence::DVEntry::LE;
1783 ++WeakZeroSIVsuccesses;
1784 }
1785 return false; // dependences caused by first iteration
1786 }
1787
1788 const SCEV *Delta = minusSCEVNoSignedOverflow(Const, ARConst, *SE);
1789 if (!Delta)
1790 return false;
1791 const SCEVConstant *ConstCoeff = dyn_cast<SCEVConstant>(ARCoeff);
1792 if (!ConstCoeff)
1793 return false;
1794
1795 if (const SCEV *UpperBound =
1796 collectUpperBound(AR->getLoop(), Delta->getType())) {
1797 LLVM_DEBUG(dbgs() << "\t UpperBound = " << *UpperBound << "\n");
1798 bool OverlapAtLast = [&] {
1799 if (!SE->isKnownNonZero(ConstCoeff))
1800 return false;
1801 const SCEV *Last = AR->evaluateAtIteration(UpperBound, *SE);
1802 return Last == Const;
1803 }();
1804 if (OverlapAtLast) {
1805 // dependences caused by last iteration
1806 if (Level < CommonLevels) {
1807 Result.DV[Level].Direction &= Dependence::DVEntry::GE;
1808 ++WeakZeroSIVsuccesses;
1809 }
1810 return false;
1811 }
1812 }
1813
1814 // if ARCoeff doesn't divide Delta, then no dependence
1815 if (isa<SCEVConstant>(Delta) &&
1816 !isRemainderZero(cast<SCEVConstant>(Delta), ConstCoeff)) {
1817 ++WeakZeroSIVindependence;
1818 ++WeakZeroSIVsuccesses;
1819 return true;
1820 }
1821 return false;
1822}
1823
1824// weakZeroSrcSIVtest -
1825// From the paper, Practical Dependence Testing, Section 4.2.2
1826//
1827// When we have a pair of subscripts of the form [c1] and [c2 + a*i],
1828// where i is an induction variable, c1 and c2 are loop invariant,
1829// and a is a constant, we can solve it exactly using the
1830// Weak-Zero SIV test.
1831//
1832// Given
1833//
1834// c1 = c2 + a*i
1835//
1836// we get
1837//
1838// (c1 - c2)/a = i
1839//
1840// If i is not an integer, there's no dependence.
1841// If i < 0 or > UB, there's no dependence.
1842// If i = 0, the direction is >=.
1843// If i = UB, the direction is <=.
1844// Otherwise, the direction is *.
1845//
1846// Can prove independence. Failing that, we can sometimes refine
1847// the directions. Can sometimes show that first or last
1848// iteration carries all the dependences (so worth peeling).
1849//
1850// (see also weakZeroDstSIVtest)
1851//
1852// Return true if dependence disproved.
1853bool DependenceInfo::weakZeroSrcSIVtest(const SCEV *SrcConst,
1854 const SCEVAddRecExpr *Dst,
1855 unsigned Level,
1856 FullDependence &Result) const {
1857 if (!isDependenceTestEnabled(DependenceTestType::WeakZeroSIV))
1858 return false;
1859
1860 // For the WeakSIV test, it's possible the loop isn't common to
1861 // the Src and Dst loops. If it isn't, then there's no need to
1862 // record a direction.
1863 [[maybe_unused]] const SCEV *DstCoeff = Dst->getStepRecurrence(*SE);
1864 [[maybe_unused]] const SCEV *DstConst = Dst->getStart();
1865 LLVM_DEBUG(dbgs() << "\tWeak-Zero (src) SIV test\n");
1866 LLVM_DEBUG(dbgs() << "\t DstCoeff = " << *DstCoeff << "\n");
1867 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");
1868 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n");
1869 ++WeakZeroSIVapplications;
1870 assert(0 < Level && Level <= MaxLevels && "Level out of range");
1871 Level--;
1872
1873 // We have analyzed a dependence from Src to Dst, so \c Result may represent a
1874 // dependence in that direction. However, \c weakZeroSIVtestImpl will analyze
1875 // a dependence from \c Dst to \c SrcConst. To keep the consistency, we need
1876 // to negate the current result before passing it to \c weakZeroSIVtestImpl,
1877 // and negate it back after that.
1878 Result.negate(*SE);
1879 bool Res = weakZeroSIVtestImpl(Dst, SrcConst, Level, Result);
1880 Result.negate(*SE);
1881 return Res;
1882}
1883
1884// weakZeroDstSIVtest -
1885// From the paper, Practical Dependence Testing, Section 4.2.2
1886//
1887// When we have a pair of subscripts of the form [c1 + a*i] and [c2],
1888// where i is an induction variable, c1 and c2 are loop invariant,
1889// and a is a constant, we can solve it exactly using the
1890// Weak-Zero SIV test.
1891//
1892// Given
1893//
1894// c1 + a*i = c2
1895//
1896// we get
1897//
1898// i = (c2 - c1)/a
1899//
1900// If i is not an integer, there's no dependence.
1901// If i < 0 or > UB, there's no dependence.
1902// If i = 0, the direction is <=.
1903// If i = UB, the direction is >=.
1904// Otherwise, the direction is *.
1905//
1906// Can prove independence. Failing that, we can sometimes refine
1907// the directions. Can sometimes show that first or last
1908// iteration carries all the dependences (so worth peeling).
1909//
1910// (see also weakZeroSrcSIVtest)
1911//
1912// Return true if dependence disproved.
1913bool DependenceInfo::weakZeroDstSIVtest(const SCEVAddRecExpr *Src,
1914 const SCEV *DstConst, unsigned Level,
1915 FullDependence &Result) const {
1916 if (!isDependenceTestEnabled(DependenceTestType::WeakZeroSIV))
1917 return false;
1918
1919 // For the WeakSIV test, it's possible the loop isn't common to the
1920 // Src and Dst loops. If it isn't, then there's no need to record a direction.
1921 [[maybe_unused]] const SCEV *SrcCoeff = Src->getStepRecurrence(*SE);
1922 [[maybe_unused]] const SCEV *SrcConst = Src->getStart();
1923 LLVM_DEBUG(dbgs() << "\tWeak-Zero (dst) SIV test\n");
1924 LLVM_DEBUG(dbgs() << "\t SrcCoeff = " << *SrcCoeff << "\n");
1925 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");
1926 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n");
1927 ++WeakZeroSIVapplications;
1928 assert(0 < Level && Level <= SrcLevels && "Level out of range");
1929 Level--;
1930
1931 return weakZeroSIVtestImpl(Src, DstConst, Level, Result);
1932}
1933
1934// exactRDIVtest - Tests the RDIV subscript pair for dependence.
1935// Things of the form [c1 + a*i] and [c2 + b*j],
1936// where i and j are induction variable, c1 and c2 are loop invariant,
1937// and a and b are constants.
1938// Returns true if any possible dependence is disproved.
1939// Works in some cases that symbolicRDIVtest doesn't, and vice versa.
1940bool DependenceInfo::exactRDIVtest(const SCEVAddRecExpr *Src,
1941 const SCEVAddRecExpr *Dst,
1942 FullDependence &Result) const {
1943 if (!isDependenceTestEnabled(DependenceTestType::ExactRDIV))
1944 return false;
1945
1946 const SCEV *SrcCoeff = Src->getStepRecurrence(*SE);
1947 const SCEV *SrcConst = Src->getStart();
1948 const SCEV *DstCoeff = Dst->getStepRecurrence(*SE);
1949 const SCEV *DstConst = Dst->getStart();
1950 LLVM_DEBUG(dbgs() << "\tExact RDIV test\n");
1951 LLVM_DEBUG(dbgs() << "\t SrcCoeff = " << *SrcCoeff << " = AM\n");
1952 LLVM_DEBUG(dbgs() << "\t DstCoeff = " << *DstCoeff << " = BM\n");
1953 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");
1954 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n");
1955 ++ExactRDIVapplications;
1956
1957 if (!Src->hasNoSignedWrap() || !Dst->hasNoSignedWrap())
1958 return false;
1959
1960 const SCEV *Delta = minusSCEVNoSignedOverflow(DstConst, SrcConst, *SE);
1961 if (!Delta)
1962 return false;
1963 LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n");
1964 const SCEVConstant *ConstDelta = dyn_cast<SCEVConstant>(Delta);
1965 const SCEVConstant *ConstSrcCoeff = dyn_cast<SCEVConstant>(SrcCoeff);
1966 const SCEVConstant *ConstDstCoeff = dyn_cast<SCEVConstant>(DstCoeff);
1967 if (!ConstDelta || !ConstSrcCoeff || !ConstDstCoeff)
1968 return false;
1969
1970 // find gcd
1971 APInt G, X, Y;
1972 APInt AM = ConstSrcCoeff->getAPInt();
1973 APInt BM = ConstDstCoeff->getAPInt();
1974 APInt CM = ConstDelta->getAPInt();
1975 unsigned Bits = AM.getBitWidth();
1976 if (findGCD(Bits, AM, BM, CM, G, X, Y)) {
1977 // gcd doesn't divide Delta, no dependence
1978 ++ExactRDIVindependence;
1979 return true;
1980 }
1981
1982 LLVM_DEBUG(dbgs() << "\t X = " << X << ", Y = " << Y << "\n");
1983
1984 // since SCEV construction seems to normalize, LM = 0
1985 std::optional<APInt> SrcUM =
1986 collectNonNegativeConstantUpperBound(Src->getLoop(), Delta->getType());
1987 if (SrcUM)
1988 LLVM_DEBUG(dbgs() << "\t SrcUM = " << *SrcUM << "\n");
1989
1990 std::optional<APInt> DstUM =
1991 collectNonNegativeConstantUpperBound(Dst->getLoop(), Delta->getType());
1992 if (DstUM)
1993 LLVM_DEBUG(dbgs() << "\t DstUM = " << *DstUM << "\n");
1994
1995 APInt TU(APInt::getSignedMaxValue(Bits));
1996 APInt TL(APInt::getSignedMinValue(Bits));
1997 APInt TC = CM.sdiv(G);
1998 APInt TX = X * TC;
1999 APInt TY = Y * TC;
2000 LLVM_DEBUG(dbgs() << "\t TC = " << TC << "\n");
2001 LLVM_DEBUG(dbgs() << "\t TX = " << TX << "\n");
2002 LLVM_DEBUG(dbgs() << "\t TY = " << TY << "\n");
2003
2004 APInt TB = BM.sdiv(G);
2005 APInt TA = AM.sdiv(G);
2006
2007 // At this point, we have the following equations:
2008 //
2009 // TA*i - TB*j = TC
2010 //
2011 // Also, we know that the all pairs of (i, j) can be expressed as:
2012 //
2013 // (TX + k*TB, TY + k*TA)
2014 //
2015 // where k is an arbitrary integer.
2016 auto [TL0, TU0] = inferDomainOfAffine(TB, TX, SrcUM);
2017 auto [TL1, TU1] = inferDomainOfAffine(TA, TY, DstUM);
2018
2019 LLVM_DEBUG(dbgs() << "\t TA = " << TA << "\n");
2020 LLVM_DEBUG(dbgs() << "\t TB = " << TB << "\n");
2021
2022 auto GetMaxOrMin = [](const OverflowSafeSignedAPInt &V0,
2023 const OverflowSafeSignedAPInt &V1,
2024 bool IsMin) -> std::optional<APInt> {
2025 if (V0 && V1)
2026 return IsMin ? APIntOps::smin(*V0, *V1) : APIntOps::smax(*V0, *V1);
2027 if (V0)
2028 return *V0;
2029 if (V1)
2030 return *V1;
2031 return std::nullopt;
2032 };
2033
2034 std::optional<APInt> OptTL = GetMaxOrMin(TL0, TL1, false);
2035 std::optional<APInt> OptTU = GetMaxOrMin(TU0, TU1, true);
2036 if (!OptTL || !OptTU)
2037 return false;
2038
2039 TL = std::move(*OptTL);
2040 TU = std::move(*OptTU);
2041 LLVM_DEBUG(dbgs() << "\t TL = " << TL << "\n");
2042 LLVM_DEBUG(dbgs() << "\t TU = " << TU << "\n");
2043
2044 if (TL.sgt(TU))
2045 ++ExactRDIVindependence;
2046 return TL.sgt(TU);
2047}
2048
2049// testSIV -
2050// When we have a pair of subscripts of the form [c1 + a1*i] and [c2 - a2*i]
2051// where i is an induction variable, c1 and c2 are loop invariant, and a1 and
2052// a2 are constant, we attack it with an SIV test. While they can all be
2053// solved with the Exact SIV test, it's worthwhile to use simpler tests when
2054// they apply; they're cheaper and sometimes more precise.
2055//
2056// Return true if dependence disproved.
2057bool DependenceInfo::testSIV(const SCEV *Src, const SCEV *Dst, unsigned &Level,
2058 FullDependence &Result,
2059 bool UnderRuntimeAssumptions) {
2060 LLVM_DEBUG(dbgs() << " src = " << *Src << "\n");
2061 LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n");
2062 const SCEVAddRecExpr *SrcAddRec = dyn_cast<SCEVAddRecExpr>(Src);
2063 const SCEVAddRecExpr *DstAddRec = dyn_cast<SCEVAddRecExpr>(Dst);
2064 if (SrcAddRec && DstAddRec) {
2065 const SCEV *SrcCoeff = SrcAddRec->getStepRecurrence(*SE);
2066 const SCEV *DstCoeff = DstAddRec->getStepRecurrence(*SE);
2067 const Loop *CurSrcLoop = SrcAddRec->getLoop();
2068 [[maybe_unused]] const Loop *CurDstLoop = DstAddRec->getLoop();
2069 assert(haveSameSD(CurSrcLoop, CurDstLoop) &&
2070 "Loops in the SIV test should have the same iteration space and "
2071 "depth");
2072 Level = mapSrcLoop(CurSrcLoop);
2073 bool disproven = false;
2074 if (SrcCoeff == DstCoeff)
2075 disproven = strongSIVtest(SrcAddRec, DstAddRec, Level, Result,
2076 UnderRuntimeAssumptions);
2077 else if (SrcCoeff == SE->getNegativeSCEV(DstCoeff))
2078 disproven = weakCrossingSIVtest(SrcAddRec, DstAddRec, Level, Result);
2079 return disproven || exactSIVtest(SrcAddRec, DstAddRec, Level, Result);
2080 }
2081 if (SrcAddRec) {
2082 const Loop *CurSrcLoop = SrcAddRec->getLoop();
2083 Level = mapSrcLoop(CurSrcLoop);
2084 return weakZeroDstSIVtest(SrcAddRec, Dst, Level, Result);
2085 }
2086 if (DstAddRec) {
2087 const Loop *CurDstLoop = DstAddRec->getLoop();
2088 Level = mapDstLoop(CurDstLoop);
2089 return weakZeroSrcSIVtest(Src, DstAddRec, Level, Result);
2090 }
2091 llvm_unreachable("SIV test expected at least one AddRec");
2092 return false;
2093}
2094
2095// testRDIV -
2096// When we have a pair of subscripts of the form [c1 + a1*i] and [c2 + a2*j]
2097// where i and j are induction variables, c1 and c2 are loop invariant,
2098// and a1 and a2 are constant, we can solve it exactly with an easy adaptation
2099// of the Exact SIV test, the Restricted Double Index Variable (RDIV) test.
2100// It doesn't make sense to talk about distance or direction in this case,
2101// so there's no point in making special versions of the Strong SIV test or
2102// the Weak-crossing SIV test.
2103//
2104// Return true if dependence disproved.
2105bool DependenceInfo::testRDIV(const SCEV *Src, const SCEV *Dst,
2106 FullDependence &Result) const {
2107 LLVM_DEBUG(dbgs() << " src = " << *Src << "\n");
2108 LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n");
2109 const SCEVAddRecExpr *SrcAddRec = dyn_cast<SCEVAddRecExpr>(Src);
2110 const SCEVAddRecExpr *DstAddRec = dyn_cast<SCEVAddRecExpr>(Dst);
2111 assert(SrcAddRec && DstAddRec && "Unexpected non-addrec input");
2112 return exactRDIVtest(SrcAddRec, DstAddRec, Result) ||
2113 gcdMIVtest(Src, Dst, Result);
2114}
2115
2116// Tests the single-subscript MIV pair (Src and Dst) for dependence.
2117// Return true if dependence disproved.
2118// Can sometimes refine direction vectors.
2119bool DependenceInfo::testMIV(const SCEV *Src, const SCEV *Dst,
2120 const SmallBitVector &Loops,
2121 FullDependence &Result) const {
2122 LLVM_DEBUG(dbgs() << " src = " << *Src << "\n");
2123 LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n");
2124 return gcdMIVtest(Src, Dst, Result) ||
2125 banerjeeMIVtest(Src, Dst, Loops, Result);
2126}
2127
2128/// Given a SCEVMulExpr, returns its first operand if its first operand is a
2129/// constant and the product doesn't overflow in a signed sense. Otherwise,
2130/// returns std::nullopt. For example, given (10 * X * Y)<nsw>, it returns 10.
2131/// Notably, if it doesn't have nsw, the multiplication may overflow, and if
2132/// so, it may not a multiple of 10.
2133static std::optional<APInt> getConstantCoefficient(const SCEV *Expr) {
2134 if (const auto *Constant = dyn_cast<SCEVConstant>(Expr))
2135 return Constant->getAPInt();
2136 if (const auto *Product = dyn_cast<SCEVMulExpr>(Expr))
2137 if (const auto *Constant = dyn_cast<SCEVConstant>(Product->getOperand(0)))
2138 if (Product->hasNoSignedWrap())
2139 return Constant->getAPInt();
2140 return std::nullopt;
2141}
2142
2143bool DependenceInfo::accumulateCoefficientsGCD(const SCEV *Expr,
2144 const Loop *CurLoop,
2145 const SCEV *&CurLoopCoeff,
2146 APInt &RunningGCD) const {
2147 // If RunningGCD is already 1, exit early.
2148 // TODO: It might be better to continue the recursion to find CurLoopCoeff.
2149 if (RunningGCD == 1)
2150 return true;
2151
2152 const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Expr);
2153 if (!AddRec) {
2154 assert(isLoopInvariant(Expr, CurLoop) &&
2155 "Expected loop invariant expression");
2156 return true;
2157 }
2158
2159 assert(AddRec->isAffine() && "Unexpected Expr");
2160 const SCEV *Start = AddRec->getStart();
2161 const SCEV *Step = AddRec->getStepRecurrence(*SE);
2162 if (AddRec->getLoop() == CurLoop) {
2163 CurLoopCoeff = Step;
2164 } else {
2165 std::optional<APInt> ConstCoeff = getConstantCoefficient(Step);
2166
2167 // If the coefficient is the product of a constant and other stuff, we can
2168 // use the constant in the GCD computation.
2169 if (!ConstCoeff)
2170 return false;
2171
2172 // TODO: What happens if ConstCoeff is the "most negative" signed number
2173 // (e.g. -128 for 8 bit wide APInt)?
2174 RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff->abs());
2175 }
2176
2177 return accumulateCoefficientsGCD(Start, CurLoop, CurLoopCoeff, RunningGCD);
2178}
2179
2180//===----------------------------------------------------------------------===//
2181// gcdMIVtest -
2182// Tests an MIV subscript pair for dependence.
2183// Returns true if any possible dependence is disproved.
2184// Can sometimes disprove the equal direction for 1 or more loops,
2185// as discussed in Michael Wolfe's book,
2186// High Performance Compilers for Parallel Computing, page 235.
2187//
2188// We spend some effort (code!) to handle cases like
2189// [10*i + 5*N*j + 15*M + 6], where i and j are induction variables,
2190// but M and N are just loop-invariant variables.
2191// This should help us handle linearized subscripts;
2192// also makes this test a useful backup to the various SIV tests.
2193//
2194// It occurs to me that the presence of loop-invariant variables
2195// changes the nature of the test from "greatest common divisor"
2196// to "a common divisor".
2197bool DependenceInfo::gcdMIVtest(const SCEV *Src, const SCEV *Dst,
2198 FullDependence &Result) const {
2199 if (!isDependenceTestEnabled(DependenceTestType::GCDMIV))
2200 return false;
2201
2202 LLVM_DEBUG(dbgs() << "starting gcd\n");
2203 ++GCDapplications;
2204 unsigned BitWidth = SE->getTypeSizeInBits(Src->getType());
2205 APInt RunningGCD = APInt::getZero(BitWidth);
2206
2207 // Examine Src coefficients.
2208 // Compute running GCD and record source constant.
2209 // Because we're looking for the constant at the end of the chain,
2210 // we can't quit the loop just because the GCD == 1.
2211 const SCEV *Coefficients = Src;
2212 while (const SCEVAddRecExpr *AddRec =
2213 dyn_cast<SCEVAddRecExpr>(Coefficients)) {
2214 const SCEV *Coeff = AddRec->getStepRecurrence(*SE);
2215 // If the coefficient is the product of a constant and other stuff,
2216 // we can use the constant in the GCD computation.
2217 std::optional<APInt> ConstCoeff = getConstantCoefficient(Coeff);
2218 if (!ConstCoeff)
2219 return false;
2220 RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff->abs());
2221 Coefficients = AddRec->getStart();
2222 }
2223 const SCEV *SrcConst = Coefficients;
2224
2225 // Examine Dst coefficients.
2226 // Compute running GCD and record destination constant.
2227 // Because we're looking for the constant at the end of the chain,
2228 // we can't quit the loop just because the GCD == 1.
2229 Coefficients = Dst;
2230 while (const SCEVAddRecExpr *AddRec =
2231 dyn_cast<SCEVAddRecExpr>(Coefficients)) {
2232 const SCEV *Coeff = AddRec->getStepRecurrence(*SE);
2233 // If the coefficient is the product of a constant and other stuff,
2234 // we can use the constant in the GCD computation.
2235 std::optional<APInt> ConstCoeff = getConstantCoefficient(Coeff);
2236 if (!ConstCoeff)
2237 return false;
2238 RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff->abs());
2239 Coefficients = AddRec->getStart();
2240 }
2241 const SCEV *DstConst = Coefficients;
2242
2243 const SCEV *Delta = minusSCEVNoSignedOverflow(DstConst, SrcConst, *SE);
2244 if (!Delta)
2245 return false;
2246 LLVM_DEBUG(dbgs() << " Delta = " << *Delta << "\n");
2247 const SCEVConstant *Constant = dyn_cast<SCEVConstant>(Delta);
2248 if (!Constant)
2249 return false;
2250 APInt ConstDelta = cast<SCEVConstant>(Constant)->getAPInt();
2251 LLVM_DEBUG(dbgs() << " ConstDelta = " << ConstDelta << "\n");
2252 if (ConstDelta == 0)
2253 return false;
2254 LLVM_DEBUG(dbgs() << " RunningGCD = " << RunningGCD << "\n");
2255 APInt Remainder = ConstDelta.srem(RunningGCD);
2256 if (Remainder != 0) {
2257 ++GCDindependence;
2258 return true;
2259 }
2260
2261 // Try to disprove equal directions.
2262 // For example, given a subscript pair [3*i + 2*j] and [i' + 2*j' - 1],
2263 // the code above can't disprove the dependence because the GCD = 1.
2264 // So we consider what happen if i = i' and what happens if j = j'.
2265 // If i = i', we can simplify the subscript to [2*i + 2*j] and [2*j' - 1],
2266 // which is infeasible, so we can disallow the = direction for the i level.
2267 // Setting j = j' doesn't help matters, so we end up with a direction vector
2268 // of [<>, *]
2269
2270 bool Improved = false;
2271 Coefficients = Src;
2272 while (const SCEVAddRecExpr *AddRec =
2273 dyn_cast<SCEVAddRecExpr>(Coefficients)) {
2274 Coefficients = AddRec->getStart();
2275 const Loop *CurLoop = AddRec->getLoop();
2276 RunningGCD = 0;
2277 const SCEV *SrcCoeff = AddRec->getStepRecurrence(*SE);
2278 const SCEV *DstCoeff = SE->getMinusSCEV(SrcCoeff, SrcCoeff);
2279
2280 if (!accumulateCoefficientsGCD(Src, CurLoop, SrcCoeff, RunningGCD) ||
2281 !accumulateCoefficientsGCD(Dst, CurLoop, DstCoeff, RunningGCD))
2282 return false;
2283
2284 Delta = minusSCEVNoSignedOverflow(DstCoeff, SrcCoeff, *SE);
2285 if (!Delta)
2286 continue;
2287 // If the coefficient is the product of a constant and other stuff,
2288 // we can use the constant in the GCD computation.
2289 std::optional<APInt> ConstCoeff = getConstantCoefficient(Delta);
2290 if (!ConstCoeff)
2291 // The difference of the two coefficients might not be a product
2292 // or constant, in which case we give up on this direction.
2293 continue;
2294 RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff->abs());
2295 LLVM_DEBUG(dbgs() << "\tRunningGCD = " << RunningGCD << "\n");
2296 if (RunningGCD != 0) {
2297 Remainder = ConstDelta.srem(RunningGCD);
2298 LLVM_DEBUG(dbgs() << "\tRemainder = " << Remainder << "\n");
2299 if (Remainder != 0) {
2300 unsigned Level = mapSrcLoop(CurLoop);
2301 Result.DV[Level - 1].Direction &= ~Dependence::DVEntry::EQ;
2302 Improved = true;
2303 }
2304 }
2305 }
2306 if (Improved)
2307 ++GCDsuccesses;
2308 LLVM_DEBUG(dbgs() << "all done\n");
2309 return false;
2310}
2311
2312//===----------------------------------------------------------------------===//
2313// banerjeeMIVtest -
2314// Use Banerjee's Inequalities to test an MIV subscript pair.
2315// (Wolfe, in the race-car book, calls this the Extreme Value Test.)
2316// Generally follows the discussion in Section 2.5.2 of
2317//
2318// Optimizing Supercompilers for Supercomputers
2319// Michael Wolfe
2320//
2321// The inequalities given on page 25 are simplified in that loops are
2322// normalized so that the lower bound is always 0 and the stride is always 1.
2323// For example, Wolfe gives
2324//
2325// LB^<_k = (A^-_k - B_k)^- (U_k - L_k - N_k) + (A_k - B_k)L_k - B_k N_k
2326//
2327// where A_k is the coefficient of the kth index in the source subscript,
2328// B_k is the coefficient of the kth index in the destination subscript,
2329// U_k is the upper bound of the kth index, L_k is the lower bound of the Kth
2330// index, and N_k is the stride of the kth index. Since all loops are normalized
2331// by the SCEV package, N_k = 1 and L_k = 0, allowing us to simplify the
2332// equation to
2333//
2334// LB^<_k = (A^-_k - B_k)^- (U_k - 0 - 1) + (A_k - B_k)0 - B_k 1
2335// = (A^-_k - B_k)^- (U_k - 1) - B_k
2336//
2337// Similar simplifications are possible for the other equations.
2338//
2339// When we can't determine the number of iterations for a loop,
2340// we use NULL as an indicator for the worst case, infinity.
2341// When computing the upper bound, NULL denotes +inf;
2342// for the lower bound, NULL denotes -inf.
2343//
2344// Return true if dependence disproved.
2345bool DependenceInfo::banerjeeMIVtest(const SCEV *Src, const SCEV *Dst,
2346 const SmallBitVector &Loops,
2347 FullDependence &Result) const {
2348 if (!isDependenceTestEnabled(DependenceTestType::BanerjeeMIV))
2349 return false;
2350
2351 LLVM_DEBUG(dbgs() << "starting Banerjee\n");
2352 ++BanerjeeApplications;
2353 LLVM_DEBUG(dbgs() << " Src = " << *Src << '\n');
2354 const SCEV *A0;
2355 CoefficientInfo *A = collectCoeffInfo(Src, true, A0);
2356 LLVM_DEBUG(dbgs() << " Dst = " << *Dst << '\n');
2357 const SCEV *B0;
2358 CoefficientInfo *B = collectCoeffInfo(Dst, false, B0);
2359 BoundInfo *Bound = new BoundInfo[MaxLevels + 1];
2360 const SCEV *Delta = SE->getMinusSCEV(B0, A0);
2361 LLVM_DEBUG(dbgs() << "\tDelta = " << *Delta << '\n');
2362
2363 // Compute bounds for all the * directions.
2364 LLVM_DEBUG(dbgs() << "\tBounds[*]\n");
2365 for (unsigned K = 1; K <= MaxLevels; ++K) {
2366 Bound[K].Iterations = A[K].Iterations ? A[K].Iterations : B[K].Iterations;
2367 Bound[K].Direction = Dependence::DVEntry::ALL;
2368 Bound[K].DirSet = Dependence::DVEntry::NONE;
2369 findBoundsALL(A, B, Bound, K);
2370#ifndef NDEBUG
2371 LLVM_DEBUG(dbgs() << "\t " << K << '\t');
2372 if (Bound[K].Lower[Dependence::DVEntry::ALL])
2373 LLVM_DEBUG(dbgs() << *Bound[K].Lower[Dependence::DVEntry::ALL] << '\t');
2374 else
2375 LLVM_DEBUG(dbgs() << "-inf\t");
2376 if (Bound[K].Upper[Dependence::DVEntry::ALL])
2377 LLVM_DEBUG(dbgs() << *Bound[K].Upper[Dependence::DVEntry::ALL] << '\n');
2378 else
2379 LLVM_DEBUG(dbgs() << "+inf\n");
2380#endif
2381 }
2382
2383 // Test the *, *, *, ... case.
2384 bool Disproved = false;
2385 if (testBounds(Dependence::DVEntry::ALL, 0, Bound, Delta)) {
2386 // Explore the direction vector hierarchy.
2387 unsigned DepthExpanded = 0;
2388 unsigned NewDeps =
2389 exploreDirections(1, A, B, Bound, Loops, DepthExpanded, Delta);
2390 if (NewDeps > 0) {
2391 bool Improved = false;
2392 for (unsigned K = 1; K <= CommonLevels; ++K) {
2393 if (Loops[K]) {
2394 unsigned Old = Result.DV[K - 1].Direction;
2395 Result.DV[K - 1].Direction = Old & Bound[K].DirSet;
2396 Improved |= Old != Result.DV[K - 1].Direction;
2397 if (!Result.DV[K - 1].Direction) {
2398 Improved = false;
2399 Disproved = true;
2400 break;
2401 }
2402 }
2403 }
2404 if (Improved)
2405 ++BanerjeeSuccesses;
2406 } else {
2407 ++BanerjeeIndependence;
2408 Disproved = true;
2409 }
2410 } else {
2411 ++BanerjeeIndependence;
2412 Disproved = true;
2413 }
2414 delete[] Bound;
2415 delete[] A;
2416 delete[] B;
2417 return Disproved;
2418}
2419
2420// Hierarchically expands the direction vector
2421// search space, combining the directions of discovered dependences
2422// in the DirSet field of Bound. Returns the number of distinct
2423// dependences discovered. If the dependence is disproved,
2424// it will return 0.
2425unsigned DependenceInfo::exploreDirections(unsigned Level, CoefficientInfo *A,
2426 CoefficientInfo *B, BoundInfo *Bound,
2427 const SmallBitVector &Loops,
2428 unsigned &DepthExpanded,
2429 const SCEV *Delta) const {
2430 // This algorithm has worst case complexity of O(3^n), where 'n' is the number
2431 // of common loop levels. To avoid excessive compile-time, pessimize all the
2432 // results and immediately return when the number of common levels is beyond
2433 // the given threshold.
2434 if (CommonLevels > MIVMaxLevelThreshold) {
2435 LLVM_DEBUG(dbgs() << "Number of common levels exceeded the threshold. MIV "
2436 "direction exploration is terminated.\n");
2437 for (unsigned K = 1; K <= CommonLevels; ++K)
2438 if (Loops[K])
2439 Bound[K].DirSet = Dependence::DVEntry::ALL;
2440 return 1;
2441 }
2442
2443 if (Level > CommonLevels) {
2444 // record result
2445 LLVM_DEBUG(dbgs() << "\t[");
2446 for (unsigned K = 1; K <= CommonLevels; ++K) {
2447 if (Loops[K]) {
2448 Bound[K].DirSet |= Bound[K].Direction;
2449#ifndef NDEBUG
2450 switch (Bound[K].Direction) {
2452 LLVM_DEBUG(dbgs() << " <");
2453 break;
2455 LLVM_DEBUG(dbgs() << " =");
2456 break;
2458 LLVM_DEBUG(dbgs() << " >");
2459 break;
2461 LLVM_DEBUG(dbgs() << " *");
2462 break;
2463 default:
2464 llvm_unreachable("unexpected Bound[K].Direction");
2465 }
2466#endif
2467 }
2468 }
2469 LLVM_DEBUG(dbgs() << " ]\n");
2470 return 1;
2471 }
2472 if (Loops[Level]) {
2473 if (Level > DepthExpanded) {
2474 DepthExpanded = Level;
2475 // compute bounds for <, =, > at current level
2476 findBoundsLT(A, B, Bound, Level);
2477 findBoundsGT(A, B, Bound, Level);
2478 findBoundsEQ(A, B, Bound, Level);
2479#ifndef NDEBUG
2480 LLVM_DEBUG(dbgs() << "\tBound for level = " << Level << '\n');
2481 LLVM_DEBUG(dbgs() << "\t <\t");
2482 if (Bound[Level].Lower[Dependence::DVEntry::LT])
2483 LLVM_DEBUG(dbgs() << *Bound[Level].Lower[Dependence::DVEntry::LT]
2484 << '\t');
2485 else
2486 LLVM_DEBUG(dbgs() << "-inf\t");
2487 if (Bound[Level].Upper[Dependence::DVEntry::LT])
2488 LLVM_DEBUG(dbgs() << *Bound[Level].Upper[Dependence::DVEntry::LT]
2489 << '\n');
2490 else
2491 LLVM_DEBUG(dbgs() << "+inf\n");
2492 LLVM_DEBUG(dbgs() << "\t =\t");
2493 if (Bound[Level].Lower[Dependence::DVEntry::EQ])
2494 LLVM_DEBUG(dbgs() << *Bound[Level].Lower[Dependence::DVEntry::EQ]
2495 << '\t');
2496 else
2497 LLVM_DEBUG(dbgs() << "-inf\t");
2498 if (Bound[Level].Upper[Dependence::DVEntry::EQ])
2499 LLVM_DEBUG(dbgs() << *Bound[Level].Upper[Dependence::DVEntry::EQ]
2500 << '\n');
2501 else
2502 LLVM_DEBUG(dbgs() << "+inf\n");
2503 LLVM_DEBUG(dbgs() << "\t >\t");
2504 if (Bound[Level].Lower[Dependence::DVEntry::GT])
2505 LLVM_DEBUG(dbgs() << *Bound[Level].Lower[Dependence::DVEntry::GT]
2506 << '\t');
2507 else
2508 LLVM_DEBUG(dbgs() << "-inf\t");
2509 if (Bound[Level].Upper[Dependence::DVEntry::GT])
2510 LLVM_DEBUG(dbgs() << *Bound[Level].Upper[Dependence::DVEntry::GT]
2511 << '\n');
2512 else
2513 LLVM_DEBUG(dbgs() << "+inf\n");
2514#endif
2515 }
2516
2517 unsigned NewDeps = 0;
2518
2519 // test bounds for <, *, *, ...
2520 if (testBounds(Dependence::DVEntry::LT, Level, Bound, Delta))
2521 NewDeps += exploreDirections(Level + 1, A, B, Bound, Loops, DepthExpanded,
2522 Delta);
2523
2524 // Test bounds for =, *, *, ...
2525 if (testBounds(Dependence::DVEntry::EQ, Level, Bound, Delta))
2526 NewDeps += exploreDirections(Level + 1, A, B, Bound, Loops, DepthExpanded,
2527 Delta);
2528
2529 // test bounds for >, *, *, ...
2530 if (testBounds(Dependence::DVEntry::GT, Level, Bound, Delta))
2531 NewDeps += exploreDirections(Level + 1, A, B, Bound, Loops, DepthExpanded,
2532 Delta);
2533
2534 Bound[Level].Direction = Dependence::DVEntry::ALL;
2535 return NewDeps;
2536 } else
2537 return exploreDirections(Level + 1, A, B, Bound, Loops, DepthExpanded,
2538 Delta);
2539}
2540
2541// Returns true iff the current bounds are plausible.
2542bool DependenceInfo::testBounds(unsigned char DirKind, unsigned Level,
2543 BoundInfo *Bound, const SCEV *Delta) const {
2544 Bound[Level].Direction = DirKind;
2545 if (const SCEV *LowerBound = getLowerBound(Bound))
2546 if (SE->isKnownPredicate(CmpInst::ICMP_SGT, LowerBound, Delta))
2547 return false;
2548 if (const SCEV *UpperBound = getUpperBound(Bound))
2549 if (SE->isKnownPredicate(CmpInst::ICMP_SGT, Delta, UpperBound))
2550 return false;
2551 return true;
2552}
2553
2554// Computes the upper and lower bounds for level K
2555// using the * direction. Records them in Bound.
2556// Wolfe gives the equations
2557//
2558// LB^*_k = (A^-_k - B^+_k)(U_k - L_k) + (A_k - B_k)L_k
2559// UB^*_k = (A^+_k - B^-_k)(U_k - L_k) + (A_k - B_k)L_k
2560//
2561// Since we normalize loops, we can simplify these equations to
2562//
2563// LB^*_k = (A^-_k - B^+_k)U_k
2564// UB^*_k = (A^+_k - B^-_k)U_k
2565//
2566// We must be careful to handle the case where the upper bound is unknown.
2567// Note that the lower bound is always <= 0
2568// and the upper bound is always >= 0.
2569void DependenceInfo::findBoundsALL(CoefficientInfo *A, CoefficientInfo *B,
2570 BoundInfo *Bound, unsigned K) const {
2571 Bound[K].Lower[Dependence::DVEntry::ALL] =
2572 nullptr; // Default value = -infinity.
2573 Bound[K].Upper[Dependence::DVEntry::ALL] =
2574 nullptr; // Default value = +infinity.
2575 if (Bound[K].Iterations) {
2576 Bound[K].Lower[Dependence::DVEntry::ALL] = SE->getMulExpr(
2577 SE->getMinusSCEV(A[K].NegPart, B[K].PosPart), Bound[K].Iterations);
2578 Bound[K].Upper[Dependence::DVEntry::ALL] = SE->getMulExpr(
2579 SE->getMinusSCEV(A[K].PosPart, B[K].NegPart), Bound[K].Iterations);
2580 } else {
2581 // If the difference is 0, we won't need to know the number of iterations.
2582 if (SE->isKnownPredicate(CmpInst::ICMP_EQ, A[K].NegPart, B[K].PosPart))
2583 Bound[K].Lower[Dependence::DVEntry::ALL] =
2584 SE->getZero(A[K].Coeff->getType());
2585 if (SE->isKnownPredicate(CmpInst::ICMP_EQ, A[K].PosPart, B[K].NegPart))
2586 Bound[K].Upper[Dependence::DVEntry::ALL] =
2587 SE->getZero(A[K].Coeff->getType());
2588 }
2589}
2590
2591// Computes the upper and lower bounds for level K
2592// using the = direction. Records them in Bound.
2593// Wolfe gives the equations
2594//
2595// LB^=_k = (A_k - B_k)^- (U_k - L_k) + (A_k - B_k)L_k
2596// UB^=_k = (A_k - B_k)^+ (U_k - L_k) + (A_k - B_k)L_k
2597//
2598// Since we normalize loops, we can simplify these equations to
2599//
2600// LB^=_k = (A_k - B_k)^- U_k
2601// UB^=_k = (A_k - B_k)^+ U_k
2602//
2603// We must be careful to handle the case where the upper bound is unknown.
2604// Note that the lower bound is always <= 0
2605// and the upper bound is always >= 0.
2606void DependenceInfo::findBoundsEQ(CoefficientInfo *A, CoefficientInfo *B,
2607 BoundInfo *Bound, unsigned K) const {
2608 Bound[K].Lower[Dependence::DVEntry::EQ] =
2609 nullptr; // Default value = -infinity.
2610 Bound[K].Upper[Dependence::DVEntry::EQ] =
2611 nullptr; // Default value = +infinity.
2612 if (Bound[K].Iterations) {
2613 const SCEV *Delta = SE->getMinusSCEV(A[K].Coeff, B[K].Coeff);
2614 const SCEV *NegativePart = getNegativePart(Delta);
2615 Bound[K].Lower[Dependence::DVEntry::EQ] =
2616 SE->getMulExpr(NegativePart, Bound[K].Iterations);
2617 const SCEV *PositivePart = getPositivePart(Delta);
2618 Bound[K].Upper[Dependence::DVEntry::EQ] =
2619 SE->getMulExpr(PositivePart, Bound[K].Iterations);
2620 } else {
2621 // If the positive/negative part of the difference is 0,
2622 // we won't need to know the number of iterations.
2623 const SCEV *Delta = SE->getMinusSCEV(A[K].Coeff, B[K].Coeff);
2624 const SCEV *NegativePart = getNegativePart(Delta);
2625 if (NegativePart->isZero())
2626 Bound[K].Lower[Dependence::DVEntry::EQ] = NegativePart; // Zero
2627 const SCEV *PositivePart = getPositivePart(Delta);
2628 if (PositivePart->isZero())
2629 Bound[K].Upper[Dependence::DVEntry::EQ] = PositivePart; // Zero
2630 }
2631}
2632
2633// Computes the upper and lower bounds for level K
2634// using the < direction. Records them in Bound.
2635// Wolfe gives the equations
2636//
2637// LB^<_k = (A^-_k - B_k)^- (U_k - L_k - N_k) + (A_k - B_k)L_k - B_k N_k
2638// UB^<_k = (A^+_k - B_k)^+ (U_k - L_k - N_k) + (A_k - B_k)L_k - B_k N_k
2639//
2640// Since we normalize loops, we can simplify these equations to
2641//
2642// LB^<_k = (A^-_k - B_k)^- (U_k - 1) - B_k
2643// UB^<_k = (A^+_k - B_k)^+ (U_k - 1) - B_k
2644//
2645// We must be careful to handle the case where the upper bound is unknown.
2646void DependenceInfo::findBoundsLT(CoefficientInfo *A, CoefficientInfo *B,
2647 BoundInfo *Bound, unsigned K) const {
2648 Bound[K].Lower[Dependence::DVEntry::LT] =
2649 nullptr; // Default value = -infinity.
2650 Bound[K].Upper[Dependence::DVEntry::LT] =
2651 nullptr; // Default value = +infinity.
2652 if (Bound[K].Iterations) {
2653 const SCEV *Iter_1 = SE->getMinusSCEV(
2654 Bound[K].Iterations, SE->getOne(Bound[K].Iterations->getType()));
2655 const SCEV *NegPart =
2656 getNegativePart(SE->getMinusSCEV(A[K].NegPart, B[K].Coeff));
2657 Bound[K].Lower[Dependence::DVEntry::LT] =
2658 SE->getMinusSCEV(SE->getMulExpr(NegPart, Iter_1), B[K].Coeff);
2659 const SCEV *PosPart =
2660 getPositivePart(SE->getMinusSCEV(A[K].PosPart, B[K].Coeff));
2661 Bound[K].Upper[Dependence::DVEntry::LT] =
2662 SE->getMinusSCEV(SE->getMulExpr(PosPart, Iter_1), B[K].Coeff);
2663 } else {
2664 // If the positive/negative part of the difference is 0,
2665 // we won't need to know the number of iterations.
2666 const SCEV *NegPart =
2667 getNegativePart(SE->getMinusSCEV(A[K].NegPart, B[K].Coeff));
2668 if (NegPart->isZero())
2669 Bound[K].Lower[Dependence::DVEntry::LT] = SE->getNegativeSCEV(B[K].Coeff);
2670 const SCEV *PosPart =
2671 getPositivePart(SE->getMinusSCEV(A[K].PosPart, B[K].Coeff));
2672 if (PosPart->isZero())
2673 Bound[K].Upper[Dependence::DVEntry::LT] = SE->getNegativeSCEV(B[K].Coeff);
2674 }
2675}
2676
2677// Computes the upper and lower bounds for level K
2678// using the > direction. Records them in Bound.
2679// Wolfe gives the equations
2680//
2681// LB^>_k = (A_k - B^+_k)^- (U_k - L_k - N_k) + (A_k - B_k)L_k + A_k N_k
2682// UB^>_k = (A_k - B^-_k)^+ (U_k - L_k - N_k) + (A_k - B_k)L_k + A_k N_k
2683//
2684// Since we normalize loops, we can simplify these equations to
2685//
2686// LB^>_k = (A_k - B^+_k)^- (U_k - 1) + A_k
2687// UB^>_k = (A_k - B^-_k)^+ (U_k - 1) + A_k
2688//
2689// We must be careful to handle the case where the upper bound is unknown.
2690void DependenceInfo::findBoundsGT(CoefficientInfo *A, CoefficientInfo *B,
2691 BoundInfo *Bound, unsigned K) const {
2692 Bound[K].Lower[Dependence::DVEntry::GT] =
2693 nullptr; // Default value = -infinity.
2694 Bound[K].Upper[Dependence::DVEntry::GT] =
2695 nullptr; // Default value = +infinity.
2696 if (Bound[K].Iterations) {
2697 const SCEV *Iter_1 = SE->getMinusSCEV(
2698 Bound[K].Iterations, SE->getOne(Bound[K].Iterations->getType()));
2699 const SCEV *NegPart =
2700 getNegativePart(SE->getMinusSCEV(A[K].Coeff, B[K].PosPart));
2701 Bound[K].Lower[Dependence::DVEntry::GT] =
2702 SE->getAddExpr(SE->getMulExpr(NegPart, Iter_1), A[K].Coeff);
2703 const SCEV *PosPart =
2704 getPositivePart(SE->getMinusSCEV(A[K].Coeff, B[K].NegPart));
2705 Bound[K].Upper[Dependence::DVEntry::GT] =
2706 SE->getAddExpr(SE->getMulExpr(PosPart, Iter_1), A[K].Coeff);
2707 } else {
2708 // If the positive/negative part of the difference is 0,
2709 // we won't need to know the number of iterations.
2710 const SCEV *NegPart =
2711 getNegativePart(SE->getMinusSCEV(A[K].Coeff, B[K].PosPart));
2712 if (NegPart->isZero())
2713 Bound[K].Lower[Dependence::DVEntry::GT] = A[K].Coeff;
2714 const SCEV *PosPart =
2715 getPositivePart(SE->getMinusSCEV(A[K].Coeff, B[K].NegPart));
2716 if (PosPart->isZero())
2717 Bound[K].Upper[Dependence::DVEntry::GT] = A[K].Coeff;
2718 }
2719}
2720
2721// X^+ = max(X, 0)
2722const SCEV *DependenceInfo::getPositivePart(const SCEV *X) const {
2723 return SE->getSMaxExpr(X, SE->getZero(X->getType()));
2724}
2725
2726// X^- = min(X, 0)
2727const SCEV *DependenceInfo::getNegativePart(const SCEV *X) const {
2728 return SE->getSMinExpr(X, SE->getZero(X->getType()));
2729}
2730
2731// Walks through the subscript,
2732// collecting each coefficient, the associated loop bounds,
2733// and recording its positive and negative parts for later use.
2734DependenceInfo::CoefficientInfo *
2735DependenceInfo::collectCoeffInfo(const SCEV *Subscript, bool SrcFlag,
2736 const SCEV *&Constant) const {
2737 const SCEV *Zero = SE->getZero(Subscript->getType());
2738 CoefficientInfo *CI = new CoefficientInfo[MaxLevels + 1];
2739 for (unsigned K = 1; K <= MaxLevels; ++K) {
2740 CI[K].Coeff = Zero;
2741 CI[K].PosPart = Zero;
2742 CI[K].NegPart = Zero;
2743 CI[K].Iterations = nullptr;
2744 }
2745 while (const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Subscript)) {
2746 const Loop *L = AddRec->getLoop();
2747 unsigned K = SrcFlag ? mapSrcLoop(L) : mapDstLoop(L);
2748 CI[K].Coeff = AddRec->getStepRecurrence(*SE);
2749 CI[K].PosPart = getPositivePart(CI[K].Coeff);
2750 CI[K].NegPart = getNegativePart(CI[K].Coeff);
2751 CI[K].Iterations = collectUpperBound(L, Subscript->getType());
2752 Subscript = AddRec->getStart();
2753 }
2754 Constant = Subscript;
2755#ifndef NDEBUG
2756 LLVM_DEBUG(dbgs() << "\tCoefficient Info\n");
2757 for (unsigned K = 1; K <= MaxLevels; ++K) {
2758 LLVM_DEBUG(dbgs() << "\t " << K << "\t" << *CI[K].Coeff);
2759 LLVM_DEBUG(dbgs() << "\tPos Part = ");
2760 LLVM_DEBUG(dbgs() << *CI[K].PosPart);
2761 LLVM_DEBUG(dbgs() << "\tNeg Part = ");
2762 LLVM_DEBUG(dbgs() << *CI[K].NegPart);
2763 LLVM_DEBUG(dbgs() << "\tUpper Bound = ");
2764 if (CI[K].Iterations)
2765 LLVM_DEBUG(dbgs() << *CI[K].Iterations);
2766 else
2767 LLVM_DEBUG(dbgs() << "+inf");
2768 LLVM_DEBUG(dbgs() << '\n');
2769 }
2770 LLVM_DEBUG(dbgs() << "\t Constant = " << *Subscript << '\n');
2771#endif
2772 return CI;
2773}
2774
2775// Looks through all the bounds info and
2776// computes the lower bound given the current direction settings
2777// at each level. If the lower bound for any level is -inf,
2778// the result is -inf.
2779const SCEV *DependenceInfo::getLowerBound(BoundInfo *Bound) const {
2780 const SCEV *Sum = Bound[1].Lower[Bound[1].Direction];
2781 for (unsigned K = 2; Sum && K <= MaxLevels; ++K) {
2782 if (Bound[K].Lower[Bound[K].Direction])
2783 Sum = SE->getAddExpr(Sum, Bound[K].Lower[Bound[K].Direction]);
2784 else
2785 Sum = nullptr;
2786 }
2787 return Sum;
2788}
2789
2790// Looks through all the bounds info and
2791// computes the upper bound given the current direction settings
2792// at each level. If the upper bound at any level is +inf,
2793// the result is +inf.
2794const SCEV *DependenceInfo::getUpperBound(BoundInfo *Bound) const {
2795 const SCEV *Sum = Bound[1].Upper[Bound[1].Direction];
2796 for (unsigned K = 2; Sum && K <= MaxLevels; ++K) {
2797 if (Bound[K].Upper[Bound[K].Direction])
2798 Sum = SE->getAddExpr(Sum, Bound[K].Upper[Bound[K].Direction]);
2799 else
2800 Sum = nullptr;
2801 }
2802 return Sum;
2803}
2804
2805/// Check if we can delinearize the subscripts. If the SCEVs representing the
2806/// source and destination array references are recurrences on a nested loop,
2807/// this function flattens the nested recurrences into separate recurrences
2808/// for each loop level.
2809bool DependenceInfo::tryDelinearize(Instruction *Src, Instruction *Dst,
2811 assert(isLoadOrStore(Src) && "instruction is not load or store");
2812 assert(isLoadOrStore(Dst) && "instruction is not load or store");
2813 Value *SrcPtr = getLoadStorePointerOperand(Src);
2814 Value *DstPtr = getLoadStorePointerOperand(Dst);
2815 Loop *SrcLoop = LI->getLoopFor(Src->getParent());
2816 Loop *DstLoop = LI->getLoopFor(Dst->getParent());
2817 const SCEV *SrcAccessFn = SE->getSCEVAtScope(SrcPtr, SrcLoop);
2818 const SCEV *DstAccessFn = SE->getSCEVAtScope(DstPtr, DstLoop);
2819 const SCEVUnknown *SrcBase =
2820 dyn_cast<SCEVUnknown>(SE->getPointerBase(SrcAccessFn));
2821 const SCEVUnknown *DstBase =
2822 dyn_cast<SCEVUnknown>(SE->getPointerBase(DstAccessFn));
2823
2824 if (!SrcBase || !DstBase || SrcBase != DstBase)
2825 return false;
2826
2827 SmallVector<const SCEV *, 4> SrcSubscripts, DstSubscripts;
2828
2829 if (!tryDelinearizeFixedSize(Src, Dst, SrcAccessFn, DstAccessFn,
2830 SrcSubscripts, DstSubscripts) &&
2831 !tryDelinearizeParametricSize(Src, Dst, SrcAccessFn, DstAccessFn,
2832 SrcSubscripts, DstSubscripts))
2833 return false;
2834
2835 assert(isLoopInvariant(SrcBase, SrcLoop) &&
2836 isLoopInvariant(DstBase, DstLoop) &&
2837 "Expected SrcBase and DstBase to be loop invariant");
2838
2839 int Size = SrcSubscripts.size();
2840 LLVM_DEBUG({
2841 dbgs() << "\nSrcSubscripts: ";
2842 for (int I = 0; I < Size; I++)
2843 dbgs() << *SrcSubscripts[I];
2844 dbgs() << "\nDstSubscripts: ";
2845 for (int I = 0; I < Size; I++)
2846 dbgs() << *DstSubscripts[I];
2847 dbgs() << "\n";
2848 });
2849
2850 // The delinearization transforms a single-subscript MIV dependence test into
2851 // a multi-subscript SIV dependence test that is easier to compute. So we
2852 // resize Pair to contain as many pairs of subscripts as the delinearization
2853 // has found, and then initialize the pairs following the delinearization.
2854 Pair.resize(Size);
2855 SCEVMonotonicityChecker MonChecker(SE);
2856 const Loop *OutermostLoop = SrcLoop ? SrcLoop->getOutermostLoop() : nullptr;
2857 for (int I = 0; I < Size; ++I) {
2858 Pair[I].Src = SrcSubscripts[I];
2859 Pair[I].Dst = DstSubscripts[I];
2860
2861 assert(Pair[I].Src->getType() == Pair[I].Dst->getType() &&
2862 "Unexpected different types for the subscripts");
2863
2865 if (MonChecker.checkMonotonicity(Pair[I].Src, OutermostLoop).isUnknown())
2866 return false;
2867 if (MonChecker.checkMonotonicity(Pair[I].Dst, OutermostLoop).isUnknown())
2868 return false;
2869 }
2870 }
2871
2872 return true;
2873}
2874
2875/// Try to delinearize \p SrcAccessFn and \p DstAccessFn if the underlying
2876/// arrays accessed are fixed-size arrays. Return true if delinearization was
2877/// successful.
2878bool DependenceInfo::tryDelinearizeFixedSize(
2879 Instruction *Src, Instruction *Dst, const SCEV *SrcAccessFn,
2880 const SCEV *DstAccessFn, SmallVectorImpl<const SCEV *> &SrcSubscripts,
2881 SmallVectorImpl<const SCEV *> &DstSubscripts) {
2882 LLVM_DEBUG({
2883 const SCEVUnknown *SrcBase =
2884 dyn_cast<SCEVUnknown>(SE->getPointerBase(SrcAccessFn));
2885 const SCEVUnknown *DstBase =
2886 dyn_cast<SCEVUnknown>(SE->getPointerBase(DstAccessFn));
2887 assert(SrcBase && DstBase && SrcBase == DstBase &&
2888 "expected src and dst scev unknowns to be equal");
2889 });
2890
2891 const SCEV *ElemSize = SE->getElementSize(Src);
2892 assert(ElemSize == SE->getElementSize(Dst) && "Different element sizes");
2893 SmallVector<const SCEV *, 4> SrcSizes, DstSizes;
2894 if (!delinearizeFixedSizeArray(*SE, SE->removePointerBase(SrcAccessFn),
2895 SrcSubscripts, SrcSizes, ElemSize) ||
2896 !delinearizeFixedSizeArray(*SE, SE->removePointerBase(DstAccessFn),
2897 DstSubscripts, DstSizes, ElemSize))
2898 return false;
2899
2900 // Check that the two size arrays are non-empty and equal in length and
2901 // value. SCEV expressions are uniqued, so we can compare pointers.
2902 if (SrcSizes.size() != DstSizes.size() ||
2903 !std::equal(SrcSizes.begin(), SrcSizes.end(), DstSizes.begin())) {
2904 SrcSubscripts.clear();
2905 DstSubscripts.clear();
2906 return false;
2907 }
2908
2909 assert(SrcSubscripts.size() == DstSubscripts.size() &&
2910 "Expected equal number of entries in the list of SrcSubscripts and "
2911 "DstSubscripts.");
2912
2913 // In general we cannot safely assume that the subscripts recovered from GEPs
2914 // are in the range of values defined for their corresponding array
2915 // dimensions. For example some C language usage/interpretation make it
2916 // impossible to verify this at compile-time. As such we can only delinearize
2917 // iff the subscripts are positive and are less than the range of the
2918 // dimension.
2920 if (!validateDelinearizationResult(*SE, SrcSizes, SrcSubscripts) ||
2921 !validateDelinearizationResult(*SE, DstSizes, DstSubscripts)) {
2922 SrcSubscripts.clear();
2923 DstSubscripts.clear();
2924 return false;
2925 }
2926 }
2927 LLVM_DEBUG({
2928 dbgs() << "Delinearized subscripts of fixed-size array\n"
2929 << "SrcGEP:" << *getLoadStorePointerOperand(Src) << "\n"
2930 << "DstGEP:" << *getLoadStorePointerOperand(Dst) << "\n";
2931 });
2932 return true;
2933}
2934
2935bool DependenceInfo::tryDelinearizeParametricSize(
2936 Instruction *Src, Instruction *Dst, const SCEV *SrcAccessFn,
2937 const SCEV *DstAccessFn, SmallVectorImpl<const SCEV *> &SrcSubscripts,
2938 SmallVectorImpl<const SCEV *> &DstSubscripts) {
2939
2940 const SCEVUnknown *SrcBase =
2941 dyn_cast<SCEVUnknown>(SE->getPointerBase(SrcAccessFn));
2942 const SCEVUnknown *DstBase =
2943 dyn_cast<SCEVUnknown>(SE->getPointerBase(DstAccessFn));
2944 assert(SrcBase && DstBase && SrcBase == DstBase &&
2945 "expected src and dst scev unknowns to be equal");
2946
2947 const SCEV *ElementSize = SE->getElementSize(Src);
2948 if (ElementSize != SE->getElementSize(Dst))
2949 return false;
2950
2951 const SCEV *SrcSCEV = SE->getMinusSCEV(SrcAccessFn, SrcBase);
2952 const SCEV *DstSCEV = SE->getMinusSCEV(DstAccessFn, DstBase);
2953
2954 const SCEVAddRecExpr *SrcAR = dyn_cast<SCEVAddRecExpr>(SrcSCEV);
2955 const SCEVAddRecExpr *DstAR = dyn_cast<SCEVAddRecExpr>(DstSCEV);
2956 if (!SrcAR || !DstAR || !SrcAR->isAffine() || !DstAR->isAffine())
2957 return false;
2958
2959 // First step: collect parametric terms in both array references.
2961 collectParametricTerms(*SE, SrcAR, Terms);
2962 collectParametricTerms(*SE, DstAR, Terms);
2963
2964 // Second step: find subscript sizes.
2966 findArrayDimensions(*SE, Terms, Sizes, ElementSize);
2967
2968 // Third step: compute the access functions for each subscript.
2969 computeAccessFunctions(*SE, SrcAR, SrcSubscripts, Sizes);
2970 computeAccessFunctions(*SE, DstAR, DstSubscripts, Sizes);
2971
2972 // Fail when there is only a subscript: that's a linearized access function.
2973 if (SrcSubscripts.size() < 2 || DstSubscripts.size() < 2 ||
2974 SrcSubscripts.size() != DstSubscripts.size())
2975 return false;
2976
2977 // Statically check that the array bounds are in-range. The first subscript we
2978 // don't have a size for and it cannot overflow into another subscript, so is
2979 // always safe. The others need to be 0 <= subscript[i] < bound, for both src
2980 // and dst.
2981 // FIXME: It may be better to record these sizes and add them as constraints
2982 // to the dependency checks.
2984 if (!validateDelinearizationResult(*SE, Sizes, SrcSubscripts) ||
2985 !validateDelinearizationResult(*SE, Sizes, DstSubscripts))
2986 return false;
2987
2988 return true;
2989}
2990
2991//===----------------------------------------------------------------------===//
2992
2993#ifndef NDEBUG
2994// For debugging purposes, dump a small bit vector to dbgs().
2996 dbgs() << "{";
2997 for (unsigned VI : BV.set_bits()) {
2998 dbgs() << VI;
2999 if (BV.find_next(VI) >= 0)
3000 dbgs() << ' ';
3001 }
3002 dbgs() << "}\n";
3003}
3004#endif
3005
3007 FunctionAnalysisManager::Invalidator &Inv) {
3008 // Check if the analysis itself has been invalidated.
3009 auto PAC = PA.getChecker<DependenceAnalysis>();
3010 if (!PAC.preserved() && !PAC.preservedSet<AllAnalysesOn<Function>>())
3011 return true;
3012
3013 // Check transitive dependencies.
3014 return Inv.invalidate<AAManager>(F, PA) ||
3015 Inv.invalidate<ScalarEvolutionAnalysis>(F, PA) ||
3016 Inv.invalidate<LoopAnalysis>(F, PA);
3017}
3018
3019// depends -
3020// Returns NULL if there is no dependence.
3021// Otherwise, return a Dependence with as many details as possible.
3022// Corresponds to Section 3.1 in the paper
3023//
3024// Practical Dependence Testing
3025// Goff, Kennedy, Tseng
3026// PLDI 1991
3027//
3028std::unique_ptr<Dependence>
3030 bool UnderRuntimeAssumptions) {
3032 bool PossiblyLoopIndependent = true;
3033 if (Src == Dst)
3034 PossiblyLoopIndependent = false;
3035
3036 if (!(Src->mayReadOrWriteMemory() && Dst->mayReadOrWriteMemory()))
3037 // if both instructions don't reference memory, there's no dependence
3038 return nullptr;
3039
3040 if (!isLoadOrStore(Src) || !isLoadOrStore(Dst)) {
3041 // can only analyze simple loads and stores, i.e., no calls, invokes, etc.
3042 LLVM_DEBUG(dbgs() << "can only handle simple loads and stores\n");
3043 return std::make_unique<Dependence>(Src, Dst,
3044 SCEVUnionPredicate(Assume, *SE));
3045 }
3046
3047 const MemoryLocation &DstLoc = MemoryLocation::get(Dst);
3048 const MemoryLocation &SrcLoc = MemoryLocation::get(Src);
3049
3050 switch (underlyingObjectsAlias(AA, F->getDataLayout(), DstLoc, SrcLoc)) {
3053 // cannot analyse objects if we don't understand their aliasing.
3054 LLVM_DEBUG(dbgs() << "can't analyze may or partial alias\n");
3055 return std::make_unique<Dependence>(Src, Dst,
3056 SCEVUnionPredicate(Assume, *SE));
3058 // If the objects noalias, they are distinct, accesses are independent.
3059 LLVM_DEBUG(dbgs() << "no alias\n");
3060 return nullptr;
3062 break; // The underlying objects alias; test accesses for dependence.
3063 }
3064
3065 if (DstLoc.Size != SrcLoc.Size || !DstLoc.Size.isPrecise() ||
3066 !SrcLoc.Size.isPrecise()) {
3067 // The dependence test gets confused if the size of the memory accesses
3068 // differ.
3069 LLVM_DEBUG(dbgs() << "can't analyze must alias with different sizes\n");
3070 return std::make_unique<Dependence>(Src, Dst,
3071 SCEVUnionPredicate(Assume, *SE));
3072 }
3073
3074 Value *SrcPtr = getLoadStorePointerOperand(Src);
3075 Value *DstPtr = getLoadStorePointerOperand(Dst);
3076 const SCEV *SrcSCEV = SE->getSCEV(SrcPtr);
3077 const SCEV *DstSCEV = SE->getSCEV(DstPtr);
3078 LLVM_DEBUG(dbgs() << " SrcSCEV = " << *SrcSCEV << "\n");
3079 LLVM_DEBUG(dbgs() << " DstSCEV = " << *DstSCEV << "\n");
3080 const SCEV *SrcBase = SE->getPointerBase(SrcSCEV);
3081 const SCEV *DstBase = SE->getPointerBase(DstSCEV);
3082 if (SrcBase != DstBase) {
3083 // If two pointers have different bases, trying to analyze indexes won't
3084 // work; we can't compare them to each other. This can happen, for example,
3085 // if one is produced by an LCSSA PHI node.
3086 //
3087 // We check this upfront so we don't crash in cases where getMinusSCEV()
3088 // returns a SCEVCouldNotCompute.
3089 LLVM_DEBUG(dbgs() << "can't analyze SCEV with different pointer base\n");
3090 return std::make_unique<Dependence>(Src, Dst,
3091 SCEVUnionPredicate(Assume, *SE));
3092 }
3093
3094 // Even if the base pointers are the same, they may not be loop-invariant. It
3095 // could lead to incorrect results, as we're analyzing loop-carried
3096 // dependencies. Src and Dst can be in different loops, so we need to check
3097 // the base pointer is invariant in both loops.
3098 Loop *SrcLoop = LI->getLoopFor(Src->getParent());
3099 Loop *DstLoop = LI->getLoopFor(Dst->getParent());
3100 if (!isLoopInvariant(SrcBase, SrcLoop) ||
3101 !isLoopInvariant(DstBase, DstLoop)) {
3102 LLVM_DEBUG(dbgs() << "The base pointer is not loop invariant.\n");
3103 return std::make_unique<Dependence>(Src, Dst,
3104 SCEVUnionPredicate(Assume, *SE));
3105 }
3106
3107 uint64_t EltSize = SrcLoc.Size.toRaw();
3108 const SCEV *SrcEv = SE->getMinusSCEV(SrcSCEV, SrcBase);
3109 const SCEV *DstEv = SE->getMinusSCEV(DstSCEV, DstBase);
3110
3111 // Check that memory access offsets are multiples of element sizes.
3112 if (!SE->isKnownMultipleOf(SrcEv, EltSize, Assume) ||
3113 !SE->isKnownMultipleOf(DstEv, EltSize, Assume)) {
3114 LLVM_DEBUG(dbgs() << "can't analyze SCEV with different offsets\n");
3115 return std::make_unique<Dependence>(Src, Dst,
3116 SCEVUnionPredicate(Assume, *SE));
3117 }
3118
3119 // Runtime assumptions needed but not allowed.
3120 if (!Assume.empty() && !UnderRuntimeAssumptions)
3121 return std::make_unique<Dependence>(Src, Dst,
3122 SCEVUnionPredicate(Assume, *SE));
3123
3124 unsigned Pairs = 1;
3125 SmallVector<Subscript, 2> Pair(Pairs);
3126 Pair[0].Src = SrcEv;
3127 Pair[0].Dst = DstEv;
3128
3129 SCEVMonotonicityChecker MonChecker(SE);
3130 const Loop *OutermostLoop = SrcLoop ? SrcLoop->getOutermostLoop() : nullptr;
3132 if (MonChecker.checkMonotonicity(Pair[0].Src, OutermostLoop).isUnknown() ||
3133 MonChecker.checkMonotonicity(Pair[0].Dst, OutermostLoop).isUnknown())
3134 return std::make_unique<Dependence>(Src, Dst,
3135 SCEVUnionPredicate(Assume, *SE));
3136
3137 if (Delinearize) {
3138 if (tryDelinearize(Src, Dst, Pair)) {
3139 LLVM_DEBUG(dbgs() << " delinearized\n");
3140 Pairs = Pair.size();
3141 }
3142 }
3143
3144 // Establish loop nesting levels considering SameSD loops as common
3145 establishNestingLevels(Src, Dst);
3146
3147 LLVM_DEBUG(dbgs() << " common nesting levels = " << CommonLevels << "\n");
3148 LLVM_DEBUG(dbgs() << " maximum nesting levels = " << MaxLevels << "\n");
3149 LLVM_DEBUG(dbgs() << " SameSD nesting levels = " << SameSDLevels << "\n");
3150
3151 // Modify common levels to consider the SameSD levels in the tests
3152 CommonLevels += SameSDLevels;
3153 MaxLevels -= SameSDLevels;
3154 if (SameSDLevels > 0) {
3155 // Not all tests are handled yet over SameSD loops
3156 // Revoke if there are any tests other than ZIV, SIV or RDIV
3157 for (unsigned P = 0; P < Pairs; ++P) {
3159 Subscript::ClassificationKind TestClass =
3160 classifyPair(Pair[P].Src, LI->getLoopFor(Src->getParent()),
3161 Pair[P].Dst, LI->getLoopFor(Dst->getParent()), Loops);
3162
3163 if (TestClass != Subscript::ZIV && TestClass != Subscript::SIV &&
3164 TestClass != Subscript::RDIV) {
3165 // Revert the levels to not consider the SameSD levels
3166 CommonLevels -= SameSDLevels;
3167 MaxLevels += SameSDLevels;
3168 SameSDLevels = 0;
3169 break;
3170 }
3171 }
3172 }
3173
3174 if (SameSDLevels > 0)
3175 SameSDLoopsCount++;
3176
3177 FullDependence Result(Src, Dst, SCEVUnionPredicate(Assume, *SE),
3178 PossiblyLoopIndependent, CommonLevels);
3179 ++TotalArrayPairs;
3180
3181 for (unsigned P = 0; P < Pairs; ++P) {
3182 assert(Pair[P].Src->getType()->isIntegerTy() && "Src must be an integer");
3183 assert(Pair[P].Dst->getType()->isIntegerTy() && "Dst must be an integer");
3184 Pair[P].Loops.resize(MaxLevels + 1);
3185 Pair[P].GroupLoops.resize(MaxLevels + 1);
3186 Pair[P].Group.resize(Pairs);
3187 Pair[P].Classification =
3188 classifyPair(Pair[P].Src, LI->getLoopFor(Src->getParent()), Pair[P].Dst,
3189 LI->getLoopFor(Dst->getParent()), Pair[P].Loops);
3190 Pair[P].GroupLoops = Pair[P].Loops;
3191 Pair[P].Group.set(P);
3192 LLVM_DEBUG(dbgs() << " subscript " << P << "\n");
3193 LLVM_DEBUG(dbgs() << "\tsrc = " << *Pair[P].Src << "\n");
3194 LLVM_DEBUG(dbgs() << "\tdst = " << *Pair[P].Dst << "\n");
3195 LLVM_DEBUG(dbgs() << "\tclass = " << Pair[P].Classification << "\n");
3196 LLVM_DEBUG(dbgs() << "\tloops = ");
3198 }
3199
3200 // Test each subscript individually
3201 for (unsigned SI = 0; SI < Pairs; ++SI) {
3202 LLVM_DEBUG(dbgs() << "testing subscript " << SI);
3203
3204 // Attempt signed range test first.
3205 ConstantRange SrcRange = SE->getSignedRange(Pair[SI].Src);
3206 ConstantRange DstRange = SE->getSignedRange(Pair[SI].Dst);
3207 if (SrcRange.intersectWith(DstRange).isEmptySet())
3208 return nullptr;
3209
3210 switch (Pair[SI].Classification) {
3211 case Subscript::NonLinear:
3212 // ignore these, but collect loops for later
3213 ++NonlinearSubscriptPairs;
3214 collectCommonLoops(Pair[SI].Src, LI->getLoopFor(Src->getParent()),
3215 Pair[SI].Loops);
3216 collectCommonLoops(Pair[SI].Dst, LI->getLoopFor(Dst->getParent()),
3217 Pair[SI].Loops);
3218 break;
3219 case Subscript::ZIV:
3220 LLVM_DEBUG(dbgs() << ", ZIV\n");
3221 if (testZIV(Pair[SI].Src, Pair[SI].Dst, Result))
3222 return nullptr;
3223 break;
3224 case Subscript::SIV: {
3225 LLVM_DEBUG(dbgs() << ", SIV\n");
3226 unsigned Level;
3227 if (testSIV(Pair[SI].Src, Pair[SI].Dst, Level, Result,
3228 UnderRuntimeAssumptions))
3229 return nullptr;
3230 break;
3231 }
3232 case Subscript::RDIV:
3233 LLVM_DEBUG(dbgs() << ", RDIV\n");
3234 if (testRDIV(Pair[SI].Src, Pair[SI].Dst, Result))
3235 return nullptr;
3236 break;
3237 case Subscript::MIV:
3238 LLVM_DEBUG(dbgs() << ", MIV\n");
3239 if (testMIV(Pair[SI].Src, Pair[SI].Dst, Pair[SI].Loops, Result))
3240 return nullptr;
3241 break;
3242 }
3243 }
3244
3245 // Make sure the Scalar flags are set correctly.
3246 SmallBitVector CompleteLoops(MaxLevels + 1);
3247 for (unsigned SI = 0; SI < Pairs; ++SI)
3248 CompleteLoops |= Pair[SI].Loops;
3249 for (unsigned II = 1; II <= CommonLevels; ++II)
3250 if (CompleteLoops[II])
3251 Result.DV[II - 1].Scalar = false;
3252
3253 // Set the distance to zero if the direction is EQ.
3254 // TODO: Ideally, the distance should be set to 0 immediately simultaneously
3255 // with the corresponding direction being set to EQ.
3256 for (unsigned II = 1; II <= Result.getLevels(); ++II) {
3257 if (Result.getDirection(II) == Dependence::DVEntry::EQ) {
3258 if (Result.DV[II - 1].Distance == nullptr)
3259 Result.DV[II - 1].Distance = SE->getZero(SrcSCEV->getType());
3260 else
3261 assert(Result.DV[II - 1].Distance->isZero() &&
3262 "Inconsistency between distance and direction");
3263 }
3264
3265#ifndef NDEBUG
3266 // Check that the converse (i.e., if the distance is zero, then the
3267 // direction is EQ) holds.
3268 const SCEV *Distance = Result.getDistance(II);
3269 if (Distance && Distance->isZero())
3270 assert(Result.getDirection(II) == Dependence::DVEntry::EQ &&
3271 "Distance is zero, but direction is not EQ");
3272#endif
3273 }
3274
3275 if (SameSDLevels > 0) {
3276 // Extracting SameSD levels from the common levels
3277 // Reverting CommonLevels and MaxLevels to their original values
3278 assert(CommonLevels >= SameSDLevels);
3279 CommonLevels -= SameSDLevels;
3280 MaxLevels += SameSDLevels;
3281 std::unique_ptr<FullDependence::DVEntry[]> DV, DVSameSD;
3282 DV = std::make_unique<FullDependence::DVEntry[]>(CommonLevels);
3283 DVSameSD = std::make_unique<FullDependence::DVEntry[]>(SameSDLevels);
3284 for (unsigned Level = 0; Level < CommonLevels; ++Level)
3285 DV[Level] = Result.DV[Level];
3286 for (unsigned Level = 0; Level < SameSDLevels; ++Level)
3287 DVSameSD[Level] = Result.DV[CommonLevels + Level];
3288 Result.DV = std::move(DV);
3289 Result.DVSameSD = std::move(DVSameSD);
3290 Result.Levels = CommonLevels;
3291 Result.SameSDLevels = SameSDLevels;
3292 }
3293
3294 if (PossiblyLoopIndependent) {
3295 // Make sure the LoopIndependent flag is set correctly.
3296 // All directions must include equal, otherwise no
3297 // loop-independent dependence is possible.
3298 for (unsigned II = 1; II <= CommonLevels; ++II) {
3299 if (!(Result.getDirection(II) & Dependence::DVEntry::EQ)) {
3300 Result.LoopIndependent = false;
3301 break;
3302 }
3303 }
3304 } else {
3305 // On the other hand, if all directions are equal and there's no
3306 // loop-independent dependence possible, then no dependence exists.
3307 // However, if there are runtime assumptions, we must return the result.
3308 bool AllEqual = true;
3309 for (unsigned II = 1; II <= CommonLevels; ++II) {
3310 if (Result.getDirection(II) != Dependence::DVEntry::EQ) {
3311 AllEqual = false;
3312 break;
3313 }
3314 }
3315 if (AllEqual && Result.Assumptions.getPredicates().empty())
3316 return nullptr;
3317 }
3318
3319 return std::make_unique<FullDependence>(std::move(Result));
3320}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
Expand Atomic instructions
#define X(NUM, ENUM, NAME)
Definition ELF.h:849
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
static bool isLoadOrStore(const Instruction *I)
static OverflowSafeSignedAPInt floorOfQuotient(const OverflowSafeSignedAPInt &OA, const OverflowSafeSignedAPInt &OB)
static void dumpExampleDependence(raw_ostream &OS, DependenceInfo *DA, ScalarEvolution &SE, LoopInfo &LI, bool NormalizeResults)
static OverflowSafeSignedAPInt ceilingOfQuotient(const OverflowSafeSignedAPInt &OA, const OverflowSafeSignedAPInt &OB)
static bool isDependenceTestEnabled(DependenceTestType Test)
Returns true iff Test is enabled.
static bool findGCD(unsigned Bits, const APInt &AM, const APInt &BM, const APInt &Delta, APInt &G, APInt &X, APInt &Y)
static void dumpSmallBitVector(SmallBitVector &BV)
static std::pair< OverflowSafeSignedAPInt, OverflowSafeSignedAPInt > inferDomainOfAffine(OverflowSafeSignedAPInt A, OverflowSafeSignedAPInt B, OverflowSafeSignedAPInt UB)
Given an affine expression of the form A*k + B, where k is an arbitrary integer, infer the possible r...
static const SCEV * minusSCEVNoSignedOverflow(const SCEV *A, const SCEV *B, ScalarEvolution &SE)
Returns A - B if it guaranteed not to signed wrap.
static AliasResult underlyingObjectsAlias(AAResults *AA, const DataLayout &DL, const MemoryLocation &LocA, const MemoryLocation &LocB)
static std::optional< APInt > getConstantCoefficient(const SCEV *Expr)
Given a SCEVMulExpr, returns its first operand if its first operand is a constant and the product doe...
static bool isRemainderZero(const SCEVConstant *Dividend, const SCEVConstant *Divisor)
static cl::opt< DependenceTestType > EnableDependenceTest("da-enable-dependence-test", cl::init(DependenceTestType::All), cl::ReallyHidden, cl::desc("Run only specified dependence test routine and disable others. " "The purpose is mainly to exclude the influence of other " "dependence test routines in regression tests. If set to All, all " "dependence test routines are enabled."), cl::values(clEnumValN(DependenceTestType::All, "all", "Enable all dependence test routines."), clEnumValN(DependenceTestType::StrongSIV, "strong-siv", "Enable only Strong SIV test."), clEnumValN(DependenceTestType::WeakCrossingSIV, "weak-crossing-siv", "Enable only Weak-Crossing SIV test."), clEnumValN(DependenceTestType::ExactSIV, "exact-siv", "Enable only Exact SIV test."), clEnumValN(DependenceTestType::WeakZeroSIV, "weak-zero-siv", "Enable only Weak-Zero SIV test."), clEnumValN(DependenceTestType::ExactRDIV, "exact-rdiv", "Enable only Exact RDIV test."), clEnumValN(DependenceTestType::GCDMIV, "gcd-miv", "Enable only GCD MIV test."), clEnumValN(DependenceTestType::BanerjeeMIV, "banerjee-miv", "Enable only Banerjee MIV test.")))
static cl::opt< bool > Delinearize("da-delinearize", cl::init(true), cl::Hidden, cl::desc("Try to delinearize array references."))
static cl::opt< bool > EnableMonotonicityCheck("da-enable-monotonicity-check", cl::init(false), cl::Hidden, cl::desc("Check if the subscripts are monotonic. If it's not, dependence " "is reported as unknown."))
static cl::opt< bool > DumpMonotonicityReport("da-dump-monotonicity-report", cl::init(false), cl::Hidden, cl::desc("When printing analysis, dump the results of monotonicity checks."))
static cl::opt< unsigned > MIVMaxLevelThreshold("da-miv-max-level-threshold", cl::init(7), cl::Hidden, cl::desc("Maximum depth allowed for the recursive algorithm used to " "explore MIV direction vectors."))
static cl::opt< bool > DisableDelinearizationChecks("da-disable-delinearization-checks", cl::Hidden, cl::desc("Disable checks that try to statically verify validity of " "delinearized subscripts. Enabling this option may result in incorrect " "dependence vectors for languages that allow the subscript of one " "dimension to underflow or overflow into another dimension."))
Hexagon Hardware Loops
Module.h This file contains the declarations for the Module class.
Loop::LoopBounds::Direction Direction
Definition LoopInfo.cpp:253
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
#define T
uint64_t IntrinsicInst * II
#define P(N)
FunctionAnalysisManager FAM
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
static void visit(BasicBlock &Start, std::function< bool(BasicBlock *)> op)
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:114
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
Value * RHS
A manager for alias analyses.
A wrapper pass to provide the legacy pass manager access to a suitably prepared AAResults object.
Class for arbitrary precision integers.
Definition APInt.h:78
static LLVM_ABI void sdivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Definition APInt.cpp:1930
APInt abs() const
Get the absolute value.
Definition APInt.h:1810
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition APInt.h:1208
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1503
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1675
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition APInt.cpp:1776
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:335
bool slt(const APInt &RHS) const
Signed less than comparison.
Definition APInt.h:1137
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
The possible results of an alias query.
@ MayAlias
The two locations may or may not alias.
@ NoAlias
The two locations do not alias at all.
@ PartialAlias
The two locations alias, but only due to a partial overlap.
@ MustAlias
The two locations precisely alias each other.
This templated class represents "all analyses that operate over <aparticular IR unit>" (e....
Definition Analysis.h:50
Represent the analysis usage information of a pass.
void setPreservesAll()
Set by analyses that do not transform their input at all.
AnalysisUsage & addRequiredTransitive()
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
void enableCrossIterationMode()
Assume that values may come from different cycle iterations.
bool isNoAlias(const MemoryLocation &LocA, const MemoryLocation &LocB)
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:703
@ ICMP_NE
not equal
Definition InstrTypes.h:698
This class represents a range of values.
LLVM_ABI bool isEmptySet() const
Return true if this set contains no members.
bool isSingleElement() const
Return true if this set contains exactly one member.
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Legacy pass manager pass to access dependence information.
void getAnalysisUsage(AnalysisUsage &) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
bool runOnFunction(Function &F) override
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
void print(raw_ostream &, const Module *=nullptr) const override
print - Print out the internal state of the pass.
void releaseMemory() override
releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memo...
AnalysisPass to compute dependence information in a function.
LLVM_ABI Result run(Function &F, FunctionAnalysisManager &FAM)
DependenceInfo - This class is the main dependence-analysis driver.
LLVM_ABI bool invalidate(Function &F, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &Inv)
Handle transitive invalidation when the cached analysis results go away.
LLVM_ABI std::unique_ptr< Dependence > depends(Instruction *Src, Instruction *Dst, bool UnderRuntimeAssumptions=false)
depends - Tests for a dependence between the Src and Dst instructions.
void dumpImp(raw_ostream &OS, bool IsSameSD=false) const
dumpImp - For debugging purposes.
Dependence(Dependence &&)=default
SCEVUnionPredicate getRuntimeAssumptions() const
getRuntimeAssumptions - Returns the runtime assumptions under which this Dependence relation is valid...
virtual bool isConfused() const
isConfused - Returns true if this dependence is confused (the compiler understands nothing and makes ...
virtual unsigned getSameSDLevels() const
getSameSDLevels - Returns the number of separate SameSD loops surrounding the source and destination ...
virtual const SCEV * getDistance(unsigned Level, bool SameSD=false) const
getDistance - Returns the distance (or NULL) associated with a particular common or SameSD level.
virtual unsigned getLevels() const
getLevels - Returns the number of common loops surrounding the source and destination of the dependen...
virtual unsigned getDirection(unsigned Level, bool SameSD=false) const
getDirection - Returns the direction associated with a particular common or SameSD level.
virtual bool isScalar(unsigned Level, bool SameSD=false) const
isScalar - Returns true if a particular regular or SameSD level is scalar; that is,...
bool isFlow() const
isFlow - Returns true if this is a flow (aka true) dependence.
bool isInput() const
isInput - Returns true if this is an input dependence.
bool isAnti() const
isAnti - Returns true if this is an anti dependence.
virtual bool isLoopIndependent() const
isLoopIndependent - Returns true if this is a loop-independent dependence.
bool isOutput() const
isOutput - Returns true if this is an output dependence.
void dump(raw_ostream &OS) const
dump - For debugging purposes, dumps a dependence to OS.
virtual bool inSameSDLoops(unsigned Level) const
inSameSDLoops - Returns true if this level is an SameSD level, i.e., performed across two separate lo...
Class representing an expression and its matching format.
FullDependence - This class represents a dependence between two memory references in a function.
FullDependence(Instruction *Source, Instruction *Destination, const SCEVUnionPredicate &Assumes, bool PossiblyLoopIndependent, unsigned Levels)
unsigned getDirection(unsigned Level, bool SameSD=false) const override
getDirection - Returns the direction associated with a particular common or SameSD level.
bool isScalar(unsigned Level, bool SameSD=false) const override
isScalar - Returns true if a particular regular or SameSD level is scalar; that is,...
bool isDirectionNegative() const override
Check if the direction vector is negative.
void negate(ScalarEvolution &SE) override
Negate the dependence by swapping the source and destination, and reversing the direction and distanc...
const SCEV * getDistance(unsigned Level, bool SameSD=false) const override
getDistance - Returns the distance (or NULL) associated with a particular common or SameSD level.
DVEntry getDVEntry(unsigned Level, bool IsSameSD) const
getDVEntry - Returns the DV entry associated with a regular or a SameSD level.
bool inSameSDLoops(unsigned Level) const override
inSameSDLoops - Returns true if this level is an SameSD level, i.e., performed across two separate lo...
bool normalize(ScalarEvolution *SE) override
If the direction vector is negative, normalize the direction vector to make it non-negative.
FunctionPass class - This class is used to implement most global optimizations.
Definition Pass.h:314
FunctionPass(char &pid)
Definition Pass.h:316
An instruction for reading from memory.
bool isPrecise() const
uint64_t toRaw() const
Analysis pass that exposes the LoopInfo for a function.
Definition LoopInfo.h:569
bool isOutermost() const
Return true if the loop does not have a parent (natural) loop.
BlockT * getLoopLatch() const
If there is a single latch block for this loop, return it.
const LoopT * getOutermostLoop() const
Get the outermost loop in which this loop is contained.
unsigned getLoopDepth() const
Return the nesting level of this loop.
LoopT * getParentLoop() const
Return the parent loop if it exists or nullptr for top level loops.
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
The legacy pass manager's analysis pass to compute loop information.
Definition LoopInfo.h:596
This class represents a loop nest and can be used to query its properties.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
Representation for a specific memory location.
static LLVM_ABI MemoryLocation get(const LoadInst *LI)
Return a location with information about the memory reference by the given instruction.
LocationSize Size
The maximum size of the location, in address-units, or UnknownSize if the size is not known.
static MemoryLocation getBeforeOrAfter(const Value *Ptr, const AAMDNodes &AATags=AAMDNodes())
Return a location that may access any location before or after Ptr, while remaining within the underl...
AAMDNodes AATags
The metadata nodes which describes the aliasing of the location (each member is null if that kind of ...
const Value * Ptr
The address of the start of the location.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalysisChecker getChecker() const
Build a checker for this PreservedAnalyses and the specified analysis type.
Definition Analysis.h:275
This node represents a polynomial recurrence on the trip count of the specified loop.
LLVM_ABI const SCEV * evaluateAtIteration(const SCEV *It, ScalarEvolution &SE) const
Return the value of this chain of recurrences at the specified iteration number.
bool isAffine() const
Return true if this represents an expression A + B*x where A and B are loop invariant values.
SCEVUse getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
This class represents a constant integer value.
const APInt & getAPInt() const
This class represents a composition of other SCEV predicates, and is the class that most clients will...
This class represents an analyzed expression in the program.
LLVM_ABI bool isOne() const
Return true if the expression is a constant one.
LLVM_ABI bool isZero() const
Return true if the expression is a constant zero.
LLVM_ABI Type * getType() const
Return the LLVM type of this SCEV expression.
Analysis pass that exposes the ScalarEvolution for a function.
The main scalar evolution driver.
LLVM_ABI const SCEV * getNegativeSCEV(const SCEV *V, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap)
Return the SCEV object corresponding to -V.
LLVM_ABI const SCEV * removePointerBase(const SCEV *S)
Compute an expression equivalent to S - getPointerBase(S).
LLVM_ABI const SCEV * getSCEVAtScope(const SCEV *S, const Loop *L)
Return a SCEV expression for the specified value at the specified scope in the program.
LLVM_ABI bool willNotOverflow(Instruction::BinaryOps BinOp, bool Signed, const SCEV *LHS, const SCEV *RHS, const Instruction *CtxI=nullptr)
Is operation BinOp between LHS and RHS provably does not have a signed/unsigned overflow (Signed)?
LLVM_ABI const SCEV * getMinusSCEV(SCEVUse LHS, SCEVUse RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Return LHS-RHS.
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
iterator_range< const_set_bits_iterator > set_bits() const
int find_next(unsigned Prev) const
Returns the index of the next set bit following the "Prev" bit.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void resize(size_type N)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:257
LLVM Value Representation.
Definition Value.h:75
LLVM_ABI Value(Type *Ty, unsigned scid)
Definition Value.cpp:53
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Abstract Attribute helper functions.
Definition Attributor.h:165
const APInt & smin(const APInt &A, const APInt &B)
Determine the smaller of two APInts considered to be signed.
Definition APInt.h:2266
const APInt & smax(const APInt &A, const APInt &B)
Determine the larger of two APInts considered to be signed.
Definition APInt.h:2271
LLVM_ABI APInt GreatestCommonDivisor(APInt A, APInt B)
Compute GCD of two unsigned APInt values.
Definition APInt.cpp:818
constexpr bool operator!(E Val)
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ TB
TB - TwoByte - Set if this instruction has a two byte opcode, which starts with a 0x0F byte before th...
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
InstIterator< SymbolTableList< BasicBlock >, Function::iterator, BasicBlock::iterator, Instruction > inst_iterator
void collectParametricTerms(ScalarEvolution &SE, const SCEV *Expr, SmallVectorImpl< const SCEV * > &Terms)
Collect parametric terms occurring in step expressions (first step of delinearization).
void findArrayDimensions(ScalarEvolution &SE, SmallVectorImpl< const SCEV * > &Terms, SmallVectorImpl< const SCEV * > &Sizes, const SCEV *ElementSize)
Compute the array dimensions Sizes from the set of Terms extracted from the memory access function of...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
APInt operator*(APInt a, uint64_t RHS)
Definition APInt.h:2253
const Value * getLoadStorePointerOperand(const Value *V)
A helper function that returns the pointer operand of a load or store instruction.
inst_iterator inst_begin(Function *F)
bool validateDelinearizationResult(ScalarEvolution &SE, ArrayRef< const SCEV * > Sizes, ArrayRef< const SCEV * > Subscripts)
Check that each subscript in Subscripts is within the corresponding size in Sizes.
void computeAccessFunctions(ScalarEvolution &SE, const SCEV *Expr, SmallVectorImpl< const SCEV * > &Subscripts, SmallVectorImpl< const SCEV * > &Sizes)
Return in Subscripts the access functions for each dimension in Sizes (third step of delinearization)...
bool delinearizeFixedSizeArray(ScalarEvolution &SE, const SCEV *Expr, SmallVectorImpl< const SCEV * > &Subscripts, SmallVectorImpl< const SCEV * > &Sizes, const SCEV *ElementSize)
Split this SCEVAddRecExpr into two vectors of SCEVs representing the subscripts and sizes of an acces...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
inst_iterator inst_end(Function *F)
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
APInt operator-(APInt)
Definition APInt.h:2206
APInt operator+(APInt a, const APInt &b)
Definition APInt.h:2211
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
LLVM_ABI bool isIdentifiedObject(const Value *V)
Return true if this pointer refers to a distinct and identifiable object.
LLVM_ABI FunctionPass * createDependenceAnalysisWrapperPass()
createDependenceAnalysisPass - This creates an instance of the DependenceAnalysis wrapper pass.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:872
#define N
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM)
Dependence::DVEntry - Each level in the distance/direction vector has a direction (or perhaps a union...
This class defines a simple visitor class that may be used for various SCEV analysis purposes.