LLVM 24.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 Default, ///< All tests except BanerjeeMIV
117 All,
118 StrongSIV,
119 WeakCrossingSIV,
120 ExactSIV,
121 WeakZeroSIV,
122 ExactRDIV,
123 GCDMIV,
124 BanerjeeMIV,
125};
126
127} // anonymous namespace
128
130 "da-enable-dependence-test", cl::init(DependenceTestType::Default),
132 cl::desc("Run only specified dependence test routine and disable others. "
133 "The purpose is mainly to exclude the influence of other "
134 "dependence test routines in regression tests. If set to All, all "
135 "dependence test routines are enabled."),
136 cl::values(clEnumValN(DependenceTestType::Default, "default",
137 "Enable all dependence test routines except "
138 "Banerjee MIV (default)."),
139 clEnumValN(DependenceTestType::All, "all",
140 "Enable all dependence test routines."),
141 clEnumValN(DependenceTestType::StrongSIV, "strong-siv",
142 "Enable only Strong SIV test."),
143 clEnumValN(DependenceTestType::WeakCrossingSIV,
144 "weak-crossing-siv",
145 "Enable only Weak-Crossing SIV test."),
146 clEnumValN(DependenceTestType::ExactSIV, "exact-siv",
147 "Enable only Exact SIV test."),
148 clEnumValN(DependenceTestType::WeakZeroSIV, "weak-zero-siv",
149 "Enable only Weak-Zero SIV test."),
150 clEnumValN(DependenceTestType::ExactRDIV, "exact-rdiv",
151 "Enable only Exact RDIV test."),
152 clEnumValN(DependenceTestType::GCDMIV, "gcd-miv",
153 "Enable only GCD MIV test."),
154 clEnumValN(DependenceTestType::BanerjeeMIV, "banerjee-miv",
155 "Enable only Banerjee MIV test.")));
156
157//===----------------------------------------------------------------------===//
158// basics
159
162 auto &AA = FAM.getResult<AAManager>(F);
163 auto &SE = FAM.getResult<ScalarEvolutionAnalysis>(F);
164 auto &LI = FAM.getResult<LoopAnalysis>(F);
165 return DependenceInfo(&F, &AA, &SE, &LI);
166}
167
168AnalysisKey DependenceAnalysis::Key;
169
171 "Dependence Analysis", true, true)
177
179
182
186
188 auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults();
189 auto &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE();
190 auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
191 info.reset(new DependenceInfo(&F, &AA, &SE, &LI));
192 return false;
193}
194
196
198
205
206namespace {
207
208/// A wrapper class for std::optional<APInt> that provides arithmetic operators
209/// with overflow checking in a signed sense. This allows us to omit inserting
210/// an overflow check at every arithmetic operation, which simplifies the code
211/// if the operations are chained like `a + b + c + ...`.
212///
213/// If an calculation overflows, the result becomes "invalid" which is
214/// internally represented by std::nullopt. If any operand of an arithmetic
215/// operation is "invalid", the result will also be "invalid".
216struct OverflowSafeSignedAPInt {
217 OverflowSafeSignedAPInt() : Value(std::nullopt) {}
218 OverflowSafeSignedAPInt(const APInt &V) : Value(V) {}
219 OverflowSafeSignedAPInt(const std::optional<APInt> &V) : Value(V) {}
220
221 OverflowSafeSignedAPInt operator+(const OverflowSafeSignedAPInt &RHS) const {
222 if (!Value || !RHS.Value)
223 return OverflowSafeSignedAPInt();
224 bool Overflow;
225 APInt Result = Value->sadd_ov(*RHS.Value, Overflow);
226 if (Overflow)
227 return OverflowSafeSignedAPInt();
228 return OverflowSafeSignedAPInt(Result);
229 }
230
231 OverflowSafeSignedAPInt operator+(int RHS) const {
232 if (!Value)
233 return OverflowSafeSignedAPInt();
234 return *this + fromInt(RHS);
235 }
236
237 OverflowSafeSignedAPInt operator-(const OverflowSafeSignedAPInt &RHS) const {
238 if (!Value || !RHS.Value)
239 return OverflowSafeSignedAPInt();
240 bool Overflow;
241 APInt Result = Value->ssub_ov(*RHS.Value, Overflow);
242 if (Overflow)
243 return OverflowSafeSignedAPInt();
244 return OverflowSafeSignedAPInt(Result);
245 }
246
247 OverflowSafeSignedAPInt operator-(int RHS) const {
248 if (!Value)
249 return OverflowSafeSignedAPInt();
250 return *this - fromInt(RHS);
251 }
252
253 OverflowSafeSignedAPInt operator*(const OverflowSafeSignedAPInt &RHS) const {
254 if (!Value || !RHS.Value)
255 return OverflowSafeSignedAPInt();
256 bool Overflow;
257 APInt Result = Value->smul_ov(*RHS.Value, Overflow);
258 if (Overflow)
259 return OverflowSafeSignedAPInt();
260 return OverflowSafeSignedAPInt(Result);
261 }
262
263 OverflowSafeSignedAPInt operator-() const {
264 if (!Value)
265 return OverflowSafeSignedAPInt();
266 if (Value->isMinSignedValue())
267 return OverflowSafeSignedAPInt();
268 return OverflowSafeSignedAPInt(-*Value);
269 }
270
271 operator bool() const { return Value.has_value(); }
272
273 bool operator!() const { return !Value.has_value(); }
274
275 const APInt &operator*() const {
276 assert(Value && "Value is not available.");
277 return *Value;
278 }
279
280 const APInt *operator->() const {
281 assert(Value && "Value is not available.");
282 return &*Value;
283 }
284
285private:
286 /// Underlying value. std::nullopt means "unknown". An arithmetic operation on
287 /// "unknown" always produces "unknown".
288 std::optional<APInt> Value;
289
290 OverflowSafeSignedAPInt fromInt(uint64_t V) const {
291 assert(Value && "Value is not available.");
292 return OverflowSafeSignedAPInt(
293 APInt(Value->getBitWidth(), V, /*isSigned=*/true));
294 }
295};
296
297} // anonymous namespace
298
299// Used to test the dependence analyzer.
300// Looks through the function, noting instructions that may access memory.
301// Calls depends() on every possible pair and prints out the result.
302// Ignores all other instructions.
304 ScalarEvolution &SE, LoopInfo &LI,
305 bool NormalizeResults) {
306 auto *F = DA->getFunction();
307
308 for (inst_iterator SrcI = inst_begin(F), SrcE = inst_end(F); SrcI != SrcE;
309 ++SrcI) {
310 if (SrcI->mayReadOrWriteMemory()) {
311 for (inst_iterator DstI = SrcI, DstE = inst_end(F); DstI != DstE;
312 ++DstI) {
313 if (DstI->mayReadOrWriteMemory()) {
314 OS << "Src:" << *SrcI << " --> Dst:" << *DstI << "\n";
315 OS << " da analyze - ";
316 if (auto D = DA->depends(&*SrcI, &*DstI,
317 /*UnderRuntimeAssumptions=*/true)) {
318
319#ifndef NDEBUG
320 // Verify that the distance being zero is equivalent to the
321 // direction being EQ.
322 for (unsigned Level = 1; Level <= D->getLevels(); Level++) {
323 const SCEV *Distance = D->getDistance(Level);
324 bool IsDistanceZero = Distance && Distance->isZero();
325 bool IsDirectionEQ =
326 D->getDirection(Level) == Dependence::DVEntry::EQ;
327 assert(IsDistanceZero == IsDirectionEQ &&
328 "Inconsistent distance and direction.");
329 }
330#endif
331
332 // Normalize negative direction vectors if required by clients.
333 if (NormalizeResults && D->normalize(&SE))
334 OS << "normalized - ";
335 D->dump(OS);
336 } else
337 OS << "none!\n";
338 }
339 }
340 }
341 }
342}
343
345 const Module *) const {
347 OS, info.get(), getAnalysis<ScalarEvolutionWrapperPass>().getSE(),
348 getAnalysis<LoopInfoWrapperPass>().getLoopInfo(), false);
349}
350
353 OS << "Printing analysis 'Dependence Analysis' for function '" << F.getName()
354 << "':\n";
356 FAM.getResult<ScalarEvolutionAnalysis>(F),
357 FAM.getResult<LoopAnalysis>(F), NormalizeResults);
358 return PreservedAnalyses::all();
359}
360
361//===----------------------------------------------------------------------===//
362// Dependence methods
363
364// Returns true if this is an input dependence.
366 return Src->mayReadFromMemory() && Dst->mayReadFromMemory();
367}
368
369// Returns true if this is an output dependence.
371 return Src->mayWriteToMemory() && Dst->mayWriteToMemory();
372}
373
374// Returns true if this is an flow (aka true) dependence.
375bool Dependence::isFlow() const {
376 return Src->mayWriteToMemory() && Dst->mayReadFromMemory();
377}
378
379// Returns true if this is an anti dependence.
380bool Dependence::isAnti() const {
381 return Src->mayReadFromMemory() && Dst->mayWriteToMemory();
382}
383
384// Returns true if a particular level is scalar; that is,
385// if no subscript in the source or destination mention the induction
386// variable associated with the loop at this level.
387// Leave this out of line, so it will serve as a virtual method anchor
388bool Dependence::isScalar(unsigned level, bool IsSameSD) const { return false; }
389
390//===----------------------------------------------------------------------===//
391// FullDependence methods
392
394 const SCEVUnionPredicate &Assumes,
395 bool PossiblyLoopIndependent,
396 unsigned CommonLevels)
397 : Dependence(Source, Destination, Assumes), Levels(CommonLevels),
398 LoopIndependent(PossiblyLoopIndependent) {
399 SameSDLevels = 0;
400 if (CommonLevels)
401 DV = std::make_unique<DVEntry[]>(CommonLevels);
402}
403
404// FIXME: in some cases the meaning of a negative direction vector
405// may not be straightforward, e.g.,
406// for (int i = 0; i < 32; ++i) {
407// Src: A[i] = ...;
408// Dst: use(A[31 - i]);
409// }
410// The dependency is
411// flow { Src[i] -> Dst[31 - i] : when i >= 16 } and
412// anti { Dst[i] -> Src[31 - i] : when i < 16 },
413// -- hence a [<>].
414// As long as a dependence result contains '>' ('<>', '<=>', "*"), it
415// means that a reversed/normalized dependence needs to be considered
416// as well. Nevertheless, current isDirectionNegative() only returns
417// true with a '>' or '>=' dependency for ease of canonicalizing the
418// dependency vector, since the reverse of '<>', '<=>' and "*" is itself.
420 for (unsigned Level = 1; Level <= Levels; ++Level) {
421 unsigned char Direction = DV[Level - 1].Direction;
422 if (Direction == Dependence::DVEntry::EQ)
423 continue;
424 if (Direction == Dependence::DVEntry::GT ||
425 Direction == Dependence::DVEntry::GE)
426 return true;
427 return false;
428 }
429 return false;
430}
431
433 std::swap(Src, Dst);
434 for (unsigned Level = 1; Level <= Levels; ++Level) {
435 unsigned char Direction = DV[Level - 1].Direction;
436 // Reverse the direction vector, this means LT becomes GT
437 // and GT becomes LT.
438 unsigned char RevDirection = Direction & Dependence::DVEntry::EQ;
439 if (Direction & Dependence::DVEntry::LT)
440 RevDirection |= Dependence::DVEntry::GT;
441 if (Direction & Dependence::DVEntry::GT)
442 RevDirection |= Dependence::DVEntry::LT;
443 DV[Level - 1].Direction = RevDirection;
444 // Reverse the dependence distance as well.
445 if (DV[Level - 1].Distance != nullptr)
446 DV[Level - 1].Distance = SE.getNegativeSCEV(DV[Level - 1].Distance);
447 }
448}
449
451 if (!isDirectionNegative())
452 return false;
453
454 LLVM_DEBUG(dbgs() << "Before normalizing negative direction vectors:\n";
455 dump(dbgs()););
456 negate(*SE);
457 LLVM_DEBUG(dbgs() << "After normalizing negative direction vectors:\n";
458 dump(dbgs()););
459 return true;
460}
461
462// The rest are simple getters that hide the implementation.
463
464// getDirection - Returns the direction associated with a particular common or
465// SameSD level.
466unsigned FullDependence::getDirection(unsigned Level, bool IsSameSD) const {
467 return getDVEntry(Level, IsSameSD).Direction;
468}
469
470// Returns the distance (or NULL) associated with a particular common or
471// SameSD level.
472const SCEV *FullDependence::getDistance(unsigned Level, bool IsSameSD) const {
473 return getDVEntry(Level, IsSameSD).Distance;
474}
475
476// Returns true if a particular regular or SameSD level is scalar; that is,
477// if no subscript in the source or destination mention the induction variable
478// associated with the loop at this level.
479bool FullDependence::isScalar(unsigned Level, bool IsSameSD) const {
480 return getDVEntry(Level, IsSameSD).Scalar;
481}
482
483// inSameSDLoops - Returns true if this level is an SameSD level, i.e.,
484// performed across two separate loop nests that have the Same iteration space
485// and Depth.
486bool FullDependence::inSameSDLoops(unsigned Level) const {
487 assert(0 < Level && Level <= static_cast<unsigned>(Levels) + SameSDLevels &&
488 "Level out of range");
489 return Level > Levels;
490}
491
492//===----------------------------------------------------------------------===//
493// DependenceInfo methods
494
495// For debugging purposes. Dumps a dependence to OS.
497 if (isConfused())
498 OS << "confused";
499 else {
500 if (isFlow())
501 OS << "flow";
502 else if (isOutput())
503 OS << "output";
504 else if (isAnti())
505 OS << "anti";
506 else if (isInput())
507 OS << "input";
508 dumpImp(OS);
509 unsigned SameSDLevels = getSameSDLevels();
510 if (SameSDLevels > 0) {
511 OS << " / assuming " << SameSDLevels << " loop level(s) fused: ";
512 dumpImp(OS, true);
513 }
514 }
515 OS << "!\n";
516
518 if (!Assumptions.isAlwaysTrue()) {
519 OS << " Runtime Assumptions:\n";
520 Assumptions.print(OS, 2);
521 }
522}
523
524// For debugging purposes. Dumps a dependence to OS with or without considering
525// the SameSD levels.
526void Dependence::dumpImp(raw_ostream &OS, bool IsSameSD) const {
527 unsigned Levels = getLevels();
528 unsigned SameSDLevels = getSameSDLevels();
529 bool OnSameSD = false;
530 unsigned LevelNum = Levels;
531 if (IsSameSD)
532 LevelNum += SameSDLevels;
533 OS << " [";
534 for (unsigned II = 1; II <= LevelNum; ++II) {
535 if (!OnSameSD && inSameSDLoops(II))
536 OnSameSD = true;
537 const SCEV *Distance = getDistance(II, OnSameSD);
538 if (Distance)
539 OS << *Distance;
540 else if (isScalar(II, OnSameSD))
541 OS << "S";
542 else {
543 unsigned Direction = getDirection(II, OnSameSD);
544 if (Direction == DVEntry::ALL)
545 OS << "*";
546 else {
547 if (Direction & DVEntry::LT)
548 OS << "<";
549 if (Direction & DVEntry::EQ)
550 OS << "=";
551 if (Direction & DVEntry::GT)
552 OS << ">";
553 }
554 }
555 if (II < LevelNum)
556 OS << " ";
557 }
558 if (isLoopIndependent())
559 OS << "|<";
560 OS << "]";
561}
562
563// Returns NoAlias/MayAliass/MustAlias for two memory locations based upon their
564// underlaying objects. If LocA and LocB are known to not alias (for any reason:
565// tbaa, non-overlapping regions etc), then it is known there is no dependecy.
566// Otherwise the underlying objects are checked to see if they point to
567// different identifiable objects.
569 const MemoryLocation &LocA,
570 const MemoryLocation &LocB) {
571 // Check the original locations (minus size) for noalias, which can happen for
572 // tbaa, incompatible underlying object locations, etc.
573 MemoryLocation LocAS =
575 MemoryLocation LocBS =
577 BatchAAResults BAA(*AA);
579
580 if (BAA.isNoAlias(LocAS, LocBS))
582
583 // Check the underlying objects are the same
584 const Value *AObj = getUnderlyingObject(LocA.Ptr);
585 const Value *BObj = getUnderlyingObject(LocB.Ptr);
586
587 // If the underlying objects are the same, they must alias
588 if (AObj == BObj)
590
591 // We may have hit the recursion limit for underlying objects, or have
592 // underlying objects where we don't know they will alias.
593 if (!isIdentifiedObject(AObj) || !isIdentifiedObject(BObj))
595
596 // Otherwise we know the objects are different and both identified objects so
597 // must not alias.
599}
600
601// Returns true if the load or store can be analyzed. Atomic and volatile
602// operations have properties which this analysis does not understand.
603static bool isLoadOrStore(const Instruction *I) {
604 if (const LoadInst *LI = dyn_cast<LoadInst>(I))
605 return LI->isUnordered();
606 else if (const StoreInst *SI = dyn_cast<StoreInst>(I))
607 return SI->isUnordered();
608 return false;
609}
610
611// Returns true if two loops have the Same iteration Space and Depth. To be
612// more specific, two loops have SameSD if they are in the same nesting
613// depth and have the same backedge count. SameSD stands for Same iteration
614// Space and Depth.
615bool DependenceInfo::haveSameSD(const Loop *SrcLoop,
616 const Loop *DstLoop) const {
617 if (SrcLoop == DstLoop)
618 return true;
619
620 if (SrcLoop->getLoopDepth() != DstLoop->getLoopDepth())
621 return false;
622
623 if (!SrcLoop || !SrcLoop->getLoopLatch() || !DstLoop ||
624 !DstLoop->getLoopLatch())
625 return false;
626
627 const SCEV *SrcUB = SE->getBackedgeTakenCount(SrcLoop);
628 const SCEV *DstUB = SE->getBackedgeTakenCount(DstLoop);
630 return false;
631
632 Type *WiderType = SE->getWiderType(SrcUB->getType(), DstUB->getType());
633 SrcUB = SE->getNoopOrZeroExtend(SrcUB, WiderType);
634 DstUB = SE->getNoopOrZeroExtend(DstUB, WiderType);
635
636 if (SrcUB == DstUB)
637 return true;
638
639 return false;
640}
641
642// Examines the loop nesting of the Src and Dst
643// instructions and establishes their shared loops. Sets the variables
644// CommonLevels, SrcLevels, and MaxLevels.
645// The source and destination instructions needn't be contained in the same
646// loop. The routine establishNestingLevels finds the level of most deeply
647// nested loop that contains them both, CommonLevels. An instruction that's
648// not contained in a loop is at level = 0. MaxLevels is equal to the level
649// of the source plus the level of the destination, minus CommonLevels.
650// This lets us allocate vectors MaxLevels in length, with room for every
651// distinct loop referenced in both the source and destination subscripts.
652// The variable SrcLevels is the nesting depth of the source instruction.
653// It's used to help calculate distinct loops referenced by the destination.
654// Here's the map from loops to levels:
655// 0 - unused
656// 1 - outermost common loop
657// ... - other common loops
658// CommonLevels - innermost common loop
659// ... - loops containing Src but not Dst
660// SrcLevels - innermost loop containing Src but not Dst
661// ... - loops containing Dst but not Src
662// MaxLevels - innermost loops containing Dst but not Src
663// Consider the follow code fragment:
664// for (a = ...) {
665// for (b = ...) {
666// for (c = ...) {
667// for (d = ...) {
668// A[] = ...;
669// }
670// }
671// for (e = ...) {
672// for (f = ...) {
673// for (g = ...) {
674// ... = A[];
675// }
676// }
677// }
678// }
679// }
680// If we're looking at the possibility of a dependence between the store
681// to A (the Src) and the load from A (the Dst), we'll note that they
682// have 2 loops in common, so CommonLevels will equal 2 and the direction
683// vector for Result will have 2 entries. SrcLevels = 4 and MaxLevels = 7.
684// A map from loop names to loop numbers would look like
685// a - 1
686// b - 2 = CommonLevels
687// c - 3
688// d - 4 = SrcLevels
689// e - 5
690// f - 6
691// g - 7 = MaxLevels
692// SameSDLevels counts the number of levels after common levels that are
693// not common but have the same iteration space and depth. Internally this
694// is checked using haveSameSD. Currently we only need to check for SameSD
695// levels up to one level after the common levels, and therefore SameSDLevels
696// will be either 0 or 1.
697// 1. Assume that in this code fragment, levels c and e have the same iteration
698// space and depth, but levels d and f does not. Then SameSDLevels is set to 1.
699// In that case the level numbers for the previous code look like
700// a - 1
701// b - 2
702// c,e - 3 = CommonLevels
703// d - 4 = SrcLevels
704// f - 5
705// g - 6 = MaxLevels
706void DependenceInfo::establishNestingLevels(const Instruction *Src,
707 const Instruction *Dst) {
708 const BasicBlock *SrcBlock = Src->getParent();
709 const BasicBlock *DstBlock = Dst->getParent();
710 unsigned SrcLevel = LI->getLoopDepth(SrcBlock);
711 unsigned DstLevel = LI->getLoopDepth(DstBlock);
712 const Loop *SrcLoop = LI->getLoopFor(SrcBlock);
713 const Loop *DstLoop = LI->getLoopFor(DstBlock);
714 SrcLevels = SrcLevel;
715 MaxLevels = SrcLevel + DstLevel;
716 SameSDLevels = 0;
717 while (SrcLevel > DstLevel) {
718 SrcLoop = SrcLoop->getParentLoop();
719 SrcLevel--;
720 }
721 while (DstLevel > SrcLevel) {
722 DstLoop = DstLoop->getParentLoop();
723 DstLevel--;
724 }
725
726 const Loop *SrcUncommonFrontier = nullptr, *DstUncommonFrontier = nullptr;
727 // Find the first uncommon level pair and check if the associated levels have
728 // the SameSD.
729 while (SrcLoop != DstLoop) {
730 SrcUncommonFrontier = SrcLoop;
731 DstUncommonFrontier = DstLoop;
732 SrcLoop = SrcLoop->getParentLoop();
733 DstLoop = DstLoop->getParentLoop();
734 SrcLevel--;
735 }
736 if (SrcUncommonFrontier && DstUncommonFrontier &&
737 haveSameSD(SrcUncommonFrontier, DstUncommonFrontier))
738 SameSDLevels = 1;
739 CommonLevels = SrcLevel;
740 MaxLevels -= CommonLevels;
741}
742
743// Given one of the loops containing the source, return
744// its level index in our numbering scheme.
745unsigned DependenceInfo::mapSrcLoop(const Loop *SrcLoop) const {
746 return SrcLoop->getLoopDepth();
747}
748
749// Given one of the loops containing the destination,
750// return its level index in our numbering scheme.
751unsigned DependenceInfo::mapDstLoop(const Loop *DstLoop) const {
752 unsigned D = DstLoop->getLoopDepth();
753 if (D > CommonLevels)
754 // This tries to make sure that we assign unique numbers to src and dst when
755 // the memory accesses reside in different loops that have the same depth.
756 return D - CommonLevels + SrcLevels;
757 else
758 return D;
759}
760
761// Returns true if Expression is loop invariant in LoopNest.
762bool DependenceInfo::isLoopInvariant(const SCEV *Expression,
763 const Loop *LoopNest) const {
764 // Unlike ScalarEvolution::isLoopInvariant() we consider an access outside of
765 // any loop as invariant, because we only consier expression evaluation at a
766 // specific position (where the array access takes place), and not across the
767 // entire function.
768 if (!LoopNest)
769 return true;
770
771 // If the expression is invariant in the outermost loop of the loop nest, it
772 // is invariant anywhere in the loop nest.
773 return SE->isLoopInvariant(Expression, LoopNest->getOutermostLoop());
774}
775
776// Finds the set of loops from the LoopNest that
777// have a level <= CommonLevels and are referred to by the SCEV Expression.
778void DependenceInfo::collectCommonLoops(const SCEV *Expression,
779 const Loop *LoopNest,
780 SmallBitVector &Loops) const {
781 while (LoopNest) {
782 unsigned Level = LoopNest->getLoopDepth();
783 if (Level <= CommonLevels && !SE->isLoopInvariant(Expression, LoopNest))
784 Loops.set(Level);
785 LoopNest = LoopNest->getParentLoop();
786 }
787}
788
789// Examine the scev and return true iff it's affine.
790// Collect any loops mentioned in the set of "Loops".
791bool DependenceInfo::checkSubscript(const SCEV *Expr, const Loop *LoopNest,
792 SmallBitVector &Loops, bool IsSrc) {
793 const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Expr);
794 if (!AddRec)
795 return isLoopInvariant(Expr, LoopNest);
796
797 // The AddRec must depend on one of the containing loops. Otherwise,
798 // mapSrcLoop and mapDstLoop return indices outside the intended range. This
799 // can happen when a subscript in one loop references an IV from a sibling
800 // loop that could not be replaced with a concrete exit value by
801 // getSCEVAtScope.
802 const Loop *L = LoopNest;
803 while (L && AddRec->getLoop() != L)
804 L = L->getParentLoop();
805 if (!L)
806 return false;
807
808 if (!AddRec->hasNoSignedWrap())
809 return false;
810
811 const SCEV *Start = AddRec->getStart();
812 const SCEV *Step = AddRec->getStepRecurrence(*SE);
813 if (!isLoopInvariant(Step, LoopNest))
814 return false;
815 if (IsSrc)
816 Loops.set(mapSrcLoop(AddRec->getLoop()));
817 else
818 Loops.set(mapDstLoop(AddRec->getLoop()));
819 return checkSubscript(Start, LoopNest, Loops, IsSrc);
820}
821
822// Examine the scev and return true iff it's linear.
823// Collect any loops mentioned in the set of "Loops".
824bool DependenceInfo::checkSrcSubscript(const SCEV *Src, const Loop *LoopNest,
826 return checkSubscript(Src, LoopNest, Loops, true);
827}
828
829// Examine the scev and return true iff it's linear.
830// Collect any loops mentioned in the set of "Loops".
831bool DependenceInfo::checkDstSubscript(const SCEV *Dst, const Loop *LoopNest,
833 return checkSubscript(Dst, LoopNest, Loops, false);
834}
835
836// Examines the subscript pair (the Src and Dst SCEVs)
837// and classifies it as either ZIV, SIV, RDIV, MIV, or Nonlinear.
838// Collects the associated loops in a set.
839DependenceInfo::Subscript::ClassificationKind
840DependenceInfo::classifyPair(const SCEV *Src, const Loop *SrcLoopNest,
841 const SCEV *Dst, const Loop *DstLoopNest,
843 SmallBitVector SrcLoops(MaxLevels + 1);
844 SmallBitVector DstLoops(MaxLevels + 1);
845 if (!checkSrcSubscript(Src, SrcLoopNest, SrcLoops))
846 return Subscript::NonLinear;
847 if (!checkDstSubscript(Dst, DstLoopNest, DstLoops))
848 return Subscript::NonLinear;
849 Loops = SrcLoops;
850 Loops |= DstLoops;
851 unsigned N = Loops.count();
852 if (N == 0)
853 return Subscript::ZIV;
854 if (N == 1)
855 return Subscript::SIV;
856 if (N == 2 && SrcLoops.count() == 1 && DstLoops.count() == 1)
857 return Subscript::RDIV;
858 return Subscript::MIV;
859}
860
861// All subscripts are all the same type.
862// Loop bound may be smaller (e.g., a char).
863// Should zero extend loop bound, since it's always >= 0.
864// This routine collects upper bound and extends or truncates if needed.
865// Truncating is safe when subscripts are known not to wrap. Cases without
866// nowrap flags should have been rejected earlier.
867// Return null if no bound available.
868const SCEV *DependenceInfo::collectUpperBound(const Loop *L, Type *T) const {
869 if (SE->hasLoopInvariantBackedgeTakenCount(L)) {
870 const SCEV *UB = SE->getBackedgeTakenCount(L);
871 return SE->getTruncateOrZeroExtend(UB, T);
872 }
873 return nullptr;
874}
875
876// Calls collectUpperBound(), then attempts to cast it to APInt.
877// If the cast fails, returns std::nullopt.
878std::optional<APInt>
879DependenceInfo::collectNonNegativeConstantUpperBound(const Loop *L,
880 Type *T) const {
881 if (const SCEV *UB = collectUpperBound(L, T))
882 if (auto *C = dyn_cast<SCEVConstant>(UB)) {
883 APInt Res = C->getAPInt();
884 if (Res.isNonNegative())
885 return Res;
886 }
887 return std::nullopt;
888}
889
890/// Returns \p A - \p B if it guaranteed not to signed wrap. Otherwise returns
891/// nullptr. \p A and \p B must have the same integer type.
892static const SCEV *minusSCEVNoSignedOverflow(const SCEV *A, const SCEV *B,
893 ScalarEvolution &SE) {
894 if (SE.willNotOverflow(Instruction::Sub, /*Signed=*/true, A, B))
895 return SE.getMinusSCEV(A, B);
896 return nullptr;
897}
898
899/// Returns true iff \p Test is enabled.
900static bool isDependenceTestEnabled(DependenceTestType Test) {
901 if (EnableDependenceTest == DependenceTestType::All)
902 return true;
903 // The Banerjee test is disabled by default because of correctness issues,
904 // but can be enabled with -da-enable-dependence-test=banerjee-miv or
905 // -da-enable-dependence-test=all.
906 if (EnableDependenceTest == DependenceTestType::Default)
907 return Test != DependenceTestType::BanerjeeMIV;
908 return EnableDependenceTest == Test;
909}
910
911// testZIV -
912// When we have a pair of subscripts of the form [c1] and [c2],
913// where c1 and c2 are both loop invariant, we attack it using
914// the ZIV test. Basically, we test by comparing the two values,
915// but there are actually three possible results:
916// 1) the values are equal, so there's a dependence
917// 2) the values are different, so there's no dependence
918// 3) the values might be equal, so we have to assume a dependence.
919//
920// Return true if dependence disproved.
921bool DependenceInfo::testZIV(const SCEV *Src, const SCEV *Dst,
922 FullDependence &Result) const {
923 LLVM_DEBUG(dbgs() << " src = " << *Src << "\n");
924 LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n");
925 ++ZIVapplications;
926 if (SE->isKnownPredicate(CmpInst::ICMP_EQ, Src, Dst)) {
927 LLVM_DEBUG(dbgs() << " provably dependent\n");
928 return false; // provably dependent
929 }
930 if (SE->isKnownPredicate(CmpInst::ICMP_NE, Src, Dst)) {
931 LLVM_DEBUG(dbgs() << " provably independent\n");
932 ++ZIVindependence;
933 return true; // provably independent
934 }
935 LLVM_DEBUG(dbgs() << " possibly dependent\n");
936 return false; // possibly dependent
937}
938
939// strongSIVtest -
940// From the paper, Practical Dependence Testing, Section 4.2.1
941//
942// When we have a pair of subscripts of the form [c1 + a*i] and [c2 + a*i],
943// where i is an induction variable, c1 and c2 are loop invariant,
944// and a is a constant, we can solve it exactly using the Strong SIV test.
945//
946// Can prove independence. Failing that, can compute distance (and direction).
947// In the presence of symbolic terms, we can sometimes make progress.
948//
949// If there's a dependence,
950//
951// c1 + a*i = c2 + a*i'
952//
953// The dependence distance is
954//
955// d = i' - i = (c1 - c2)/a
956//
957// A dependence only exists if d is an integer and abs(d) <= U, where U is the
958// loop's upper bound. If a dependence exists, the dependence direction is
959// defined as
960//
961// { < if d > 0
962// direction = { = if d = 0
963// { > if d < 0
964//
965// Return true if dependence disproved.
966bool DependenceInfo::strongSIVtest(const SCEVAddRecExpr *Src,
967 const SCEVAddRecExpr *Dst, unsigned Level,
968 FullDependence &Result,
969 bool UnderRuntimeAssumptions) {
970 if (!isDependenceTestEnabled(DependenceTestType::StrongSIV))
971 return false;
972
973 const SCEV *Coeff = Src->getStepRecurrence(*SE);
974 assert(Coeff == Dst->getStepRecurrence(*SE) &&
975 "Expecting same coefficient in Strong SIV test");
976 const SCEV *SrcConst = Src->getStart();
977 const SCEV *DstConst = Dst->getStart();
978 LLVM_DEBUG(dbgs() << "\tStrong SIV test\n");
979 LLVM_DEBUG(dbgs() << "\t Coeff = " << *Coeff);
980 LLVM_DEBUG(dbgs() << ", " << *Coeff->getType() << "\n");
981 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst);
982 LLVM_DEBUG(dbgs() << ", " << *SrcConst->getType() << "\n");
983 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst);
984 LLVM_DEBUG(dbgs() << ", " << *DstConst->getType() << "\n");
985 ++StrongSIVapplications;
986 assert(0 < Level && Level <= CommonLevels && "level out of range");
987 Level--;
988
989 const SCEV *Delta = minusSCEVNoSignedOverflow(SrcConst, DstConst, *SE);
990 if (!Delta)
991 return false;
992 LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta);
993 LLVM_DEBUG(dbgs() << ", " << *Delta->getType() << "\n");
994
995 // Can we compute distance?
996 if (isa<SCEVConstant>(Delta) && isa<SCEVConstant>(Coeff)) {
997 APInt ConstDelta = cast<SCEVConstant>(Delta)->getAPInt();
998 APInt ConstCoeff = cast<SCEVConstant>(Coeff)->getAPInt();
999 APInt Distance = ConstDelta; // these need to be initialized
1000 APInt Remainder = ConstDelta;
1001 APInt::sdivrem(ConstDelta, ConstCoeff, Distance, Remainder);
1002 LLVM_DEBUG(dbgs() << "\t Distance = " << Distance << "\n");
1003 LLVM_DEBUG(dbgs() << "\t Remainder = " << Remainder << "\n");
1004 // Make sure Coeff divides Delta exactly
1005 if (Remainder != 0) {
1006 // Coeff doesn't divide Distance, no dependence
1007 ++StrongSIVindependence;
1008 ++StrongSIVsuccesses;
1009 return true;
1010 }
1011 Result.DV[Level].Distance = SE->getConstant(Distance);
1012 if (Distance.sgt(0))
1013 Result.DV[Level].Direction &= Dependence::DVEntry::LT;
1014 else if (Distance.slt(0))
1015 Result.DV[Level].Direction &= Dependence::DVEntry::GT;
1016 else
1017 Result.DV[Level].Direction &= Dependence::DVEntry::EQ;
1018 ++StrongSIVsuccesses;
1019 } else if (Delta->isZero()) {
1020 // Check if coefficient could be zero. If so, 0/0 is undefined and we
1021 // cannot conclude that only same-iteration dependencies exist.
1022 // When coeff=0, all iterations access the same location.
1023 if (SE->isKnownNonZero(Coeff)) {
1024 LLVM_DEBUG(
1025 dbgs() << "\t Coefficient proven non-zero by SCEV analysis\n");
1026 } else {
1027 // Cannot prove at compile time, would need runtime assumption.
1028 if (UnderRuntimeAssumptions) {
1029 const SCEVPredicate *Pred = SE->getComparePredicate(
1030 ICmpInst::ICMP_NE, Coeff, SE->getZero(Coeff->getType()));
1031 Result.Assumptions = Result.Assumptions.getUnionWith(Pred, *SE);
1032 LLVM_DEBUG(dbgs() << "\t Added runtime assumption: " << *Coeff
1033 << " != 0\n");
1034 } else {
1035 // Cannot add runtime assumptions, this test cannot handle this case.
1036 // Let more complex tests try.
1037 LLVM_DEBUG(dbgs() << "\t Would need runtime assumption " << *Coeff
1038 << " != 0, but not allowed. Failing this test.\n");
1039 return false;
1040 }
1041 }
1042 // Since 0/X == 0 (where X is known non-zero or assumed non-zero).
1043 Result.DV[Level].Distance = Delta;
1044 Result.DV[Level].Direction &= Dependence::DVEntry::EQ;
1045 ++StrongSIVsuccesses;
1046 } else {
1047 if (Coeff->isOne()) {
1048 LLVM_DEBUG(dbgs() << "\t Distance = " << *Delta << "\n");
1049 Result.DV[Level].Distance = Delta; // since X/1 == X
1050 }
1051
1052 // maybe we can get a useful direction
1053 bool DeltaMaybeZero = !SE->isKnownNonZero(Delta);
1054 bool DeltaMaybePositive = !SE->isKnownNonPositive(Delta);
1055 bool DeltaMaybeNegative = !SE->isKnownNonNegative(Delta);
1056 bool CoeffMaybePositive = !SE->isKnownNonPositive(Coeff);
1057 bool CoeffMaybeNegative = !SE->isKnownNonNegative(Coeff);
1058 // The double negatives above are confusing.
1059 // It helps to read !SE->isKnownNonZero(Delta)
1060 // as "Delta might be Zero"
1061 unsigned NewDirection = Dependence::DVEntry::NONE;
1062 if ((DeltaMaybePositive && CoeffMaybePositive) ||
1063 (DeltaMaybeNegative && CoeffMaybeNegative))
1064 NewDirection = Dependence::DVEntry::LT;
1065 if (DeltaMaybeZero)
1066 NewDirection |= Dependence::DVEntry::EQ;
1067 if ((DeltaMaybeNegative && CoeffMaybePositive) ||
1068 (DeltaMaybePositive && CoeffMaybeNegative))
1069 NewDirection |= Dependence::DVEntry::GT;
1070 if (NewDirection < Result.DV[Level].Direction)
1071 ++StrongSIVsuccesses;
1072 Result.DV[Level].Direction &= NewDirection;
1073 }
1074 return false;
1075}
1076
1077// weakCrossingSIVtest -
1078// From the paper, Practical Dependence Testing, Section 4.2.2
1079//
1080// When we have a pair of subscripts of the form [c1 + a*i] and [c2 - a*i],
1081// where i is an induction variable, c1 and c2 are loop invariant,
1082// and a is a constant, we can solve it exactly using the
1083// Weak-Crossing SIV test.
1084//
1085// Given c1 + a*i = c2 - a*i', we can look for the intersection of
1086// the two lines, where i = i', yielding
1087//
1088// c1 + a*i = c2 - a*i
1089// 2a*i = c2 - c1
1090// i = (c2 - c1)/2a
1091//
1092// If i < 0, there is no dependence.
1093// If i > upperbound, there is no dependence.
1094// If i = 0 (i.e., if c1 = c2), there's a dependence with distance = 0.
1095// If i = upperbound, there's a dependence with distance = 0.
1096// If i is integral, there's a dependence (all directions).
1097// If the non-integer part = 1/2, there's a dependence (<> directions).
1098// Otherwise, there's no dependence.
1099//
1100// Can prove independence. Failing that,
1101// can sometimes refine the directions.
1102// Can determine iteration for splitting.
1103//
1104// Return true if dependence disproved.
1105bool DependenceInfo::weakCrossingSIVtest(const SCEVAddRecExpr *Src,
1106 const SCEVAddRecExpr *Dst,
1107 unsigned Level,
1108 FullDependence &Result) const {
1109 if (!isDependenceTestEnabled(DependenceTestType::WeakCrossingSIV))
1110 return false;
1111
1112 const SCEV *Coeff = Src->getStepRecurrence(*SE);
1113 const SCEV *SrcConst = Src->getStart();
1114 const SCEV *DstConst = Dst->getStart();
1115
1116 assert(Coeff == SE->getNegativeSCEV(Dst->getStepRecurrence(*SE)) &&
1117 "Unexpected input for weakCrossingSIVtest");
1118
1119 LLVM_DEBUG(dbgs() << "\tWeak-Crossing SIV test\n");
1120 LLVM_DEBUG(dbgs() << "\t Coeff = " << *Coeff << "\n");
1121 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");
1122 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n");
1123 ++WeakCrossingSIVapplications;
1124 assert(0 < Level && Level <= CommonLevels && "Level out of range");
1125 Level--;
1126 const SCEV *Delta = minusSCEVNoSignedOverflow(DstConst, SrcConst, *SE);
1127 if (!Delta)
1128 return false;
1129
1130 LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n");
1131 const SCEVConstant *ConstCoeff = dyn_cast<SCEVConstant>(Coeff);
1132 if (!ConstCoeff)
1133 return false;
1134
1135 const SCEVConstant *ConstDelta = dyn_cast<SCEVConstant>(Delta);
1136 if (!ConstDelta)
1137 return false;
1138
1139 ConstantRange SrcRange = SE->getSignedRange(Src);
1140 ConstantRange DstRange = SE->getSignedRange(Dst);
1141 LLVM_DEBUG(dbgs() << "\t SrcRange = " << SrcRange << "\n");
1142 LLVM_DEBUG(dbgs() << "\t DstRange = " << DstRange << "\n");
1143 if (SrcRange.intersectWith(DstRange).isSingleElement()) {
1144 // The ranges touch at exactly one value (i = i' = 0 or i = i' = BTC).
1145 Result.DV[Level].Direction &= ~Dependence::DVEntry::LT;
1146 Result.DV[Level].Direction &= ~Dependence::DVEntry::GT;
1147 ++WeakCrossingSIVsuccesses;
1148 if (!Result.DV[Level].Direction) {
1149 ++WeakCrossingSIVindependence;
1150 return true;
1151 }
1152 Result.DV[Level].Distance = SE->getZero(Delta->getType());
1153 return false;
1154 }
1155
1156 // check that Coeff divides Delta
1157 APInt APDelta = ConstDelta->getAPInt();
1158 APInt APCoeff = ConstCoeff->getAPInt();
1159 APInt Distance = APDelta; // these need to be initialzed
1160 APInt Remainder = APDelta;
1161 APInt::sdivrem(APDelta, APCoeff, Distance, Remainder);
1162 LLVM_DEBUG(dbgs() << "\t Remainder = " << Remainder << "\n");
1163 if (Remainder != 0) {
1164 // Coeff doesn't divide Delta, no dependence
1165 ++WeakCrossingSIVindependence;
1166 ++WeakCrossingSIVsuccesses;
1167 return true;
1168 }
1169 LLVM_DEBUG(dbgs() << "\t Distance = " << Distance << "\n");
1170
1171 // if 2*Coeff doesn't divide Delta, then the equal direction isn't possible
1172 if (Distance[0]) {
1173 // Equal direction isn't possible
1174 Result.DV[Level].Direction &= ~Dependence::DVEntry::EQ;
1175 ++WeakCrossingSIVsuccesses;
1176 }
1177 return false;
1178}
1179
1180// Kirch's algorithm, from
1181//
1182// Optimizing Supercompilers for Supercomputers
1183// Michael Wolfe
1184// MIT Press, 1989
1185//
1186// Program 2.1, page 29.
1187// Computes the GCD of AM and BM.
1188// Also finds a solution to the equation ax - by = gcd(a, b).
1189// Returns true if dependence disproved; i.e., gcd does not divide Delta.
1190//
1191// We don't use OverflowSafeSignedAPInt here because it's known that this
1192// algorithm doesn't overflow.
1193static std::optional<bool> findGCD(unsigned Bits, const APInt &AM,
1194 const APInt &BM, const APInt &Delta,
1195 APInt &G, APInt &X, APInt &Y) {
1196 LLVM_DEBUG(dbgs() << "\t AM = " << AM << "\n");
1197 LLVM_DEBUG(dbgs() << "\t BM = " << BM << "\n");
1198 LLVM_DEBUG(dbgs() << "\t Delta = " << Delta << "\n");
1199 APInt A0(Bits, 1, true), A1(Bits, 0, true);
1200 APInt B0(Bits, 0, true), B1(Bits, 1, true);
1201
1202 // APInt::abs will overflow. In that case, bail out early.
1203 if (AM.isMinSignedValue() || BM.isMinSignedValue())
1204 return std::nullopt;
1205
1206 APInt G0 = AM.abs();
1207 APInt G1 = BM.abs();
1208 APInt Q = G0; // these need to be initialized
1209 APInt R = G0;
1210 APInt::sdivrem(G0, G1, Q, R);
1211 while (R != 0) {
1212 // clang-format off
1213 APInt A2 = A0 - Q*A1; A0 = A1; A1 = A2;
1214 APInt B2 = B0 - Q*B1; B0 = B1; B1 = B2;
1215 G0 = G1; G1 = R;
1216 // clang-format on
1217 APInt::sdivrem(G0, G1, Q, R);
1218 }
1219 G = G1;
1220 LLVM_DEBUG(dbgs() << "\t GCD = " << G << "\n");
1221 X = AM.slt(0) ? -A1 : A1;
1222 Y = BM.slt(0) ? B1 : -B1;
1223
1224 // make sure gcd divides Delta
1225 R = Delta.srem(G);
1226 if (R != 0)
1227 return true; // gcd doesn't divide Delta, no dependence
1228 Q = Delta.sdiv(G);
1229 return false;
1230}
1231
1232static OverflowSafeSignedAPInt
1233floorOfQuotient(const OverflowSafeSignedAPInt &OA,
1234 const OverflowSafeSignedAPInt &OB) {
1235 if (!OA || !OB)
1236 return OverflowSafeSignedAPInt();
1237
1238 APInt A = *OA;
1239 APInt B = *OB;
1240 APInt Q = A; // these need to be initialized
1241 APInt R = A;
1242 APInt::sdivrem(A, B, Q, R);
1243 if (R == 0)
1244 return Q;
1245 if ((A.sgt(0) && B.sgt(0)) || (A.slt(0) && B.slt(0)))
1246 return Q;
1247 return OverflowSafeSignedAPInt(Q) - 1;
1248}
1249
1250static OverflowSafeSignedAPInt
1251ceilingOfQuotient(const OverflowSafeSignedAPInt &OA,
1252 const OverflowSafeSignedAPInt &OB) {
1253 if (!OA || !OB)
1254 return OverflowSafeSignedAPInt();
1255
1256 APInt A = *OA;
1257 APInt B = *OB;
1258 APInt Q = A; // these need to be initialized
1259 APInt R = A;
1260 APInt::sdivrem(A, B, Q, R);
1261 if (R == 0)
1262 return Q;
1263 if ((A.sgt(0) && B.sgt(0)) || (A.slt(0) && B.slt(0)))
1264 return OverflowSafeSignedAPInt(Q) + 1;
1265 return Q;
1266}
1267
1268/// Given an affine expression of the form A*k + B, where k is an arbitrary
1269/// integer, infer the possible range of k based on the known range of the
1270/// affine expression. If we know A*k + B is non-negative, i.e.,
1271///
1272/// A*k + B >=s 0
1273///
1274/// we can derive the following inequalities for k when A is positive:
1275///
1276/// k >=s -B / A
1277///
1278/// Since k is an integer, it means k is greater than or equal to the
1279/// ceil(-B / A).
1280///
1281/// If the upper bound of the affine expression \p UB is passed, the following
1282/// inequality can be derived as well:
1283///
1284/// A*k + B <=s UB
1285///
1286/// which leads to:
1287///
1288/// k <=s (UB - B) / A
1289///
1290/// Again, as k is an integer, it means k is less than or equal to the
1291/// floor((UB - B) / A).
1292///
1293/// The similar logic applies when A is negative, but the inequalities sign flip
1294/// while working with them.
1295///
1296/// Preconditions: \p A is non-zero, and we know A*k + B and \p UB are
1297/// non-negative.
1298static std::pair<OverflowSafeSignedAPInt, OverflowSafeSignedAPInt>
1299inferDomainOfAffine(OverflowSafeSignedAPInt A, OverflowSafeSignedAPInt B,
1300 OverflowSafeSignedAPInt UB) {
1301 assert(A && B && "A and B must be available");
1302 assert(*A != 0 && "A must be non-zero");
1303 assert((!UB || UB->isNonNegative()) && "UB must be non-negative");
1304 OverflowSafeSignedAPInt TL, TU;
1305 if (A->sgt(0)) {
1306 TL = ceilingOfQuotient(-B, A);
1307 LLVM_DEBUG(if (TL) dbgs() << "\t Possible TL = " << *TL << "\n");
1308
1309 // New bound check - modification to Banerjee's e3 check
1310 TU = floorOfQuotient(UB - B, A);
1311 LLVM_DEBUG(if (TU) dbgs() << "\t Possible TU = " << *TU << "\n");
1312 } else {
1313 TU = floorOfQuotient(-B, A);
1314 LLVM_DEBUG(if (TU) dbgs() << "\t Possible TU = " << *TU << "\n");
1315
1316 // New bound check - modification to Banerjee's e3 check
1317 TL = ceilingOfQuotient(UB - B, A);
1318 LLVM_DEBUG(if (TL) dbgs() << "\t Possible TL = " << *TL << "\n");
1319 }
1320 return std::make_pair(TL, TU);
1321}
1322
1323// exactSIVtest -
1324// When we have a pair of subscripts of the form [c1 + a1*i] and [c2 + a2*i],
1325// where i is an induction variable, c1 and c2 are loop invariant, and a1
1326// and a2 are constant, we can solve it exactly using an algorithm developed
1327// by Banerjee and Wolfe. See Algorithm 6.2.1 (case 2.5) in:
1328//
1329// Dependence Analysis for Supercomputing
1330// Utpal Banerjee
1331// Kluwer Academic Publishers, 1988
1332//
1333// It's slower than the specialized tests (strong SIV, weak-zero SIV, etc),
1334// so use them if possible. They're also a bit better with symbolics and,
1335// in the case of the strong SIV test, can compute Distances.
1336//
1337// Return true if dependence disproved.
1338//
1339// This is a modified version of the original Banerjee algorithm. The original
1340// only tested whether Dst depends on Src. This algorithm extends that and
1341// returns all the dependencies that exist between Dst and Src.
1342bool DependenceInfo::exactSIVtest(const SCEVAddRecExpr *Src,
1343 const SCEVAddRecExpr *Dst, unsigned Level,
1344 FullDependence &Result) const {
1345 if (!isDependenceTestEnabled(DependenceTestType::ExactSIV))
1346 return false;
1347
1348 LLVM_DEBUG(dbgs() << "\tExact SIV test\n");
1349 ++ExactSIVapplications;
1350 assert(0 < Level && Level <= CommonLevels && "Level out of range");
1351 Level--;
1352 bool Res = exactTestImpl(Src, Dst, Result, Level);
1353 if (Res) {
1354 ++ExactSIVsuccesses;
1355 ++ExactSIVindependence;
1356 }
1357 return Res;
1358}
1359
1360// Return true if the divisor evenly divides the dividend.
1361static bool isRemainderZero(const SCEVConstant *Dividend,
1362 const SCEVConstant *Divisor) {
1363 const APInt &ConstDividend = Dividend->getAPInt();
1364 const APInt &ConstDivisor = Divisor->getAPInt();
1365 return ConstDividend.srem(ConstDivisor) == 0;
1366}
1367
1368bool DependenceInfo::weakZeroSIVtestImpl(const SCEVAddRecExpr *AR,
1369 const SCEV *Const, unsigned Level,
1370 FullDependence &Result) const {
1371 const SCEV *ARCoeff = AR->getStepRecurrence(*SE);
1372 const SCEV *ARConst = AR->getStart();
1373
1374 if (Const == ARConst && SE->isKnownNonZero(ARCoeff)) {
1375 if (Level < CommonLevels) {
1376 Result.DV[Level].Direction &= Dependence::DVEntry::LE;
1377 ++WeakZeroSIVsuccesses;
1378 }
1379 return false; // dependences caused by first iteration
1380 }
1381
1382 const SCEV *Delta = minusSCEVNoSignedOverflow(Const, ARConst, *SE);
1383 if (!Delta)
1384 return false;
1385 const SCEVConstant *ConstCoeff = dyn_cast<SCEVConstant>(ARCoeff);
1386 if (!ConstCoeff)
1387 return false;
1388
1389 if (const SCEV *UpperBound =
1390 collectUpperBound(AR->getLoop(), Delta->getType())) {
1391 LLVM_DEBUG(dbgs() << "\t UpperBound = " << *UpperBound << "\n");
1392 bool OverlapAtLast = [&] {
1393 if (!SE->isKnownNonZero(ConstCoeff))
1394 return false;
1395 const SCEV *Last = AR->evaluateAtIteration(UpperBound, *SE);
1396 return Last == Const;
1397 }();
1398 if (OverlapAtLast) {
1399 // dependences caused by last iteration
1400 if (Level < CommonLevels) {
1401 Result.DV[Level].Direction &= Dependence::DVEntry::GE;
1402 ++WeakZeroSIVsuccesses;
1403 }
1404 return false;
1405 }
1406 }
1407
1408 // if ARCoeff doesn't divide Delta, then no dependence
1409 if (isa<SCEVConstant>(Delta) &&
1410 !isRemainderZero(cast<SCEVConstant>(Delta), ConstCoeff)) {
1411 ++WeakZeroSIVindependence;
1412 ++WeakZeroSIVsuccesses;
1413 return true;
1414 }
1415 return false;
1416}
1417
1418// weakZeroSrcSIVtest -
1419// From the paper, Practical Dependence Testing, Section 4.2.2
1420//
1421// When we have a pair of subscripts of the form [c1] and [c2 + a*i],
1422// where i is an induction variable, c1 and c2 are loop invariant,
1423// and a is a constant, we can solve it exactly using the
1424// Weak-Zero SIV test.
1425//
1426// Given
1427//
1428// c1 = c2 + a*i
1429//
1430// we get
1431//
1432// (c1 - c2)/a = i
1433//
1434// If i is not an integer, there's no dependence.
1435// If i < 0 or > UB, there's no dependence.
1436// If i = 0, the direction is >=.
1437// If i = UB, the direction is <=.
1438// Otherwise, the direction is *.
1439//
1440// Can prove independence. Failing that, we can sometimes refine
1441// the directions. Can sometimes show that first or last
1442// iteration carries all the dependences (so worth peeling).
1443//
1444// (see also weakZeroDstSIVtest)
1445//
1446// Return true if dependence disproved.
1447bool DependenceInfo::weakZeroSrcSIVtest(const SCEV *SrcConst,
1448 const SCEVAddRecExpr *Dst,
1449 unsigned Level,
1450 FullDependence &Result) const {
1451 if (!isDependenceTestEnabled(DependenceTestType::WeakZeroSIV))
1452 return false;
1453
1454 // For the WeakSIV test, it's possible the loop isn't common to
1455 // the Src and Dst loops. If it isn't, then there's no need to
1456 // record a direction.
1457 [[maybe_unused]] const SCEV *DstCoeff = Dst->getStepRecurrence(*SE);
1458 [[maybe_unused]] const SCEV *DstConst = Dst->getStart();
1459 LLVM_DEBUG(dbgs() << "\tWeak-Zero (src) SIV test\n");
1460 LLVM_DEBUG(dbgs() << "\t DstCoeff = " << *DstCoeff << "\n");
1461 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");
1462 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n");
1463 ++WeakZeroSIVapplications;
1464 assert(0 < Level && Level <= MaxLevels && "Level out of range");
1465 Level--;
1466
1467 // We have analyzed a dependence from Src to Dst, so \c Result may represent a
1468 // dependence in that direction. However, \c weakZeroSIVtestImpl will analyze
1469 // a dependence from \c Dst to \c SrcConst. To keep the consistency, we need
1470 // to negate the current result before passing it to \c weakZeroSIVtestImpl,
1471 // and negate it back after that.
1472 Result.negate(*SE);
1473 bool Res = weakZeroSIVtestImpl(Dst, SrcConst, Level, Result);
1474 Result.negate(*SE);
1475 return Res;
1476}
1477
1478// weakZeroDstSIVtest -
1479// From the paper, Practical Dependence Testing, Section 4.2.2
1480//
1481// When we have a pair of subscripts of the form [c1 + a*i] and [c2],
1482// where i is an induction variable, c1 and c2 are loop invariant,
1483// and a is a constant, we can solve it exactly using the
1484// Weak-Zero SIV test.
1485//
1486// Given
1487//
1488// c1 + a*i = c2
1489//
1490// we get
1491//
1492// i = (c2 - c1)/a
1493//
1494// If i is not an integer, there's no dependence.
1495// If i < 0 or > UB, there's no dependence.
1496// If i = 0, the direction is <=.
1497// If i = UB, the direction is >=.
1498// Otherwise, the direction is *.
1499//
1500// Can prove independence. Failing that, we can sometimes refine
1501// the directions. Can sometimes show that first or last
1502// iteration carries all the dependences (so worth peeling).
1503//
1504// (see also weakZeroSrcSIVtest)
1505//
1506// Return true if dependence disproved.
1507bool DependenceInfo::weakZeroDstSIVtest(const SCEVAddRecExpr *Src,
1508 const SCEV *DstConst, unsigned Level,
1509 FullDependence &Result) const {
1510 if (!isDependenceTestEnabled(DependenceTestType::WeakZeroSIV))
1511 return false;
1512
1513 // For the WeakSIV test, it's possible the loop isn't common to the
1514 // Src and Dst loops. If it isn't, then there's no need to record a direction.
1515 [[maybe_unused]] const SCEV *SrcCoeff = Src->getStepRecurrence(*SE);
1516 [[maybe_unused]] const SCEV *SrcConst = Src->getStart();
1517 LLVM_DEBUG(dbgs() << "\tWeak-Zero (dst) SIV test\n");
1518 LLVM_DEBUG(dbgs() << "\t SrcCoeff = " << *SrcCoeff << "\n");
1519 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");
1520 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n");
1521 ++WeakZeroSIVapplications;
1522 assert(0 < Level && Level <= SrcLevels && "Level out of range");
1523 Level--;
1524
1525 return weakZeroSIVtestImpl(Src, DstConst, Level, Result);
1526}
1527
1528// exactRDIVtest - Tests the RDIV subscript pair for dependence.
1529// Things of the form [c1 + a*i] and [c2 + b*j],
1530// where i and j are induction variable, c1 and c2 are loop invariant,
1531// and a and b are constants.
1532// Returns true if any possible dependence is disproved.
1533// Works in some cases that symbolicRDIVtest doesn't, and vice versa.
1534bool DependenceInfo::exactRDIVtest(const SCEVAddRecExpr *Src,
1535 const SCEVAddRecExpr *Dst,
1536 FullDependence &Result) const {
1537 if (!isDependenceTestEnabled(DependenceTestType::ExactRDIV))
1538 return false;
1539
1540 LLVM_DEBUG(dbgs() << "\tExact RDIV test\n");
1541 ++ExactRDIVapplications;
1542 bool Res = exactTestImpl(Src, Dst, Result, std::nullopt);
1543 if (Res)
1544 ++ExactRDIVindependence;
1545 return Res;
1546}
1547
1548bool DependenceInfo::exactTestImpl(const SCEVAddRecExpr *Src,
1549 const SCEVAddRecExpr *Dst,
1550 FullDependence &Result,
1551 std::optional<unsigned> Level) const {
1552 const SCEV *SrcCoeff = Src->getStepRecurrence(*SE);
1553 const SCEV *SrcConst = Src->getStart();
1554 const SCEV *DstCoeff = Dst->getStepRecurrence(*SE);
1555 const SCEV *DstConst = Dst->getStart();
1556 LLVM_DEBUG(dbgs() << "\t SrcCoeff = " << *SrcCoeff << "\n");
1557 LLVM_DEBUG(dbgs() << "\t DstCoeff = " << *DstCoeff << "\n");
1558 LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");
1559 LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n");
1560
1561 const SCEV *Delta = minusSCEVNoSignedOverflow(DstConst, SrcConst, *SE);
1562 if (!Delta)
1563 return false;
1564 LLVM_DEBUG(dbgs() << "\t Delta = " << *Delta << "\n");
1565 const SCEVConstant *ConstDelta = dyn_cast<SCEVConstant>(Delta);
1566 const SCEVConstant *ConstSrcCoeff = dyn_cast<SCEVConstant>(SrcCoeff);
1567 const SCEVConstant *ConstDstCoeff = dyn_cast<SCEVConstant>(DstCoeff);
1568 if (!ConstDelta || !ConstSrcCoeff || !ConstDstCoeff)
1569 return false;
1570
1571 // find gcd
1572 APInt G, X, Y;
1573 APInt AM = ConstSrcCoeff->getAPInt();
1574 APInt BM = ConstDstCoeff->getAPInt();
1575 APInt CM = ConstDelta->getAPInt();
1576 unsigned Bits = AM.getBitWidth();
1577 std::optional<bool> GCDRes = findGCD(Bits, AM, BM, CM, G, X, Y);
1578
1579 // GCD calculation failed so we cannot proceed with this test.
1580 if (!GCDRes)
1581 return false;
1582 if (*GCDRes) {
1583 // gcd doesn't divide Delta, no dependence
1584 return true;
1585 }
1586
1587 LLVM_DEBUG(dbgs() << "\t X = " << X << ", Y = " << Y << "\n");
1588
1589 // since SCEV construction seems to normalize, LM = 0
1590 std::optional<APInt> SrcUM =
1591 collectNonNegativeConstantUpperBound(Src->getLoop(), Delta->getType());
1592 if (SrcUM)
1593 LLVM_DEBUG(dbgs() << "\t SrcUM = " << *SrcUM << "\n");
1594
1595 std::optional<APInt> DstUM =
1596 collectNonNegativeConstantUpperBound(Dst->getLoop(), Delta->getType());
1597 if (DstUM)
1598 LLVM_DEBUG(dbgs() << "\t DstUM = " << *DstUM << "\n");
1599
1600 APInt TU(APInt::getSignedMaxValue(Bits));
1601 APInt TL(APInt::getSignedMinValue(Bits));
1602 OverflowSafeSignedAPInt TC = CM.sdiv(G);
1603 OverflowSafeSignedAPInt TX = OverflowSafeSignedAPInt(X) * TC;
1604 OverflowSafeSignedAPInt TY = OverflowSafeSignedAPInt(Y) * TC;
1605 if (!TC || !TX || !TY)
1606 return false;
1607 LLVM_DEBUG(dbgs() << "\t TC = " << *TC << "\n");
1608 LLVM_DEBUG(dbgs() << "\t TX = " << *TX << "\n");
1609 LLVM_DEBUG(dbgs() << "\t TY = " << *TY << "\n");
1610
1611 APInt TB = BM.sdiv(G);
1612 APInt TA = AM.sdiv(G);
1613
1614 // At this point, we have the following equations:
1615 //
1616 // TA*i - TB*j = TC
1617 //
1618 // Also, we know that the all pairs of (i, j) can be expressed as:
1619 //
1620 // (TX + k*TB, TY + k*TA)
1621 //
1622 // where k is an arbitrary integer.
1623 auto [TL0, TU0] = inferDomainOfAffine(TB, TX, SrcUM);
1624 auto [TL1, TU1] = inferDomainOfAffine(TA, TY, DstUM);
1625
1626 LLVM_DEBUG(dbgs() << "\t TA = " << TA << "\n");
1627 LLVM_DEBUG(dbgs() << "\t TB = " << TB << "\n");
1628
1629 auto GetMaxOrMin = [](const OverflowSafeSignedAPInt &V0,
1630 const OverflowSafeSignedAPInt &V1,
1631 bool IsMin) -> std::optional<APInt> {
1632 if (V0 && V1)
1633 return IsMin ? APIntOps::smin(*V0, *V1) : APIntOps::smax(*V0, *V1);
1634 if (V0)
1635 return *V0;
1636 if (V1)
1637 return *V1;
1638 return std::nullopt;
1639 };
1640
1641 std::optional<APInt> OptTL = GetMaxOrMin(TL0, TL1, false);
1642 std::optional<APInt> OptTU = GetMaxOrMin(TU0, TU1, true);
1643 if (!OptTL || !OptTU)
1644 return false;
1645
1646 TL = std::move(*OptTL);
1647 TU = std::move(*OptTU);
1648 LLVM_DEBUG(dbgs() << "\t TL = " << TL << "\n");
1649 LLVM_DEBUG(dbgs() << "\t TU = " << TU << "\n");
1650
1651 if (TL.sgt(TU))
1652 return true;
1653
1654 if (!Level)
1655 return false;
1656 assert(SrcUM == DstUM && "Expecting same upper bound for Src and Dst");
1657
1658 // explore directions
1659 unsigned NewDirection = Dependence::DVEntry::NONE;
1660 OverflowSafeSignedAPInt LowerDistance, UpperDistance;
1661 OverflowSafeSignedAPInt OTY(TY), OTX(TX), OTA(TA), OTB(TB), OTL(TL), OTU(TU);
1662 // NOTE: It's unclear whether these calculations can overflow. At the moment,
1663 // we conservatively assume they can.
1664 if (TA.sgt(TB)) {
1665 LowerDistance = (OTY - OTX) + (OTA - OTB) * OTL;
1666 UpperDistance = (OTY - OTX) + (OTA - OTB) * OTU;
1667 } else {
1668 LowerDistance = (OTY - OTX) + (OTA - OTB) * OTU;
1669 UpperDistance = (OTY - OTX) + (OTA - OTB) * OTL;
1670 }
1671
1672 if (!LowerDistance || !UpperDistance)
1673 return false;
1674
1675 LLVM_DEBUG(dbgs() << "\t LowerDistance = " << *LowerDistance << "\n");
1676 LLVM_DEBUG(dbgs() << "\t UpperDistance = " << *UpperDistance << "\n");
1677
1678 if (LowerDistance->sle(0) && UpperDistance->sge(0))
1679 NewDirection |= Dependence::DVEntry::EQ;
1680 if (LowerDistance->slt(0))
1681 NewDirection |= Dependence::DVEntry::GT;
1682 if (UpperDistance->sgt(0))
1683 NewDirection |= Dependence::DVEntry::LT;
1684
1685 // finished
1686 Result.DV[*Level].Direction &= NewDirection;
1687 LLVM_DEBUG(dbgs() << "\t Result = ");
1688 LLVM_DEBUG(Result.dump(dbgs()));
1689 return Result.DV[*Level].Direction == Dependence::DVEntry::NONE;
1690}
1691
1692// testSIV -
1693// When we have a pair of subscripts of the form [c1 + a1*i] and [c2 - a2*i]
1694// where i is an induction variable, c1 and c2 are loop invariant, and a1 and
1695// a2 are constant, we attack it with an SIV test. While they can all be
1696// solved with the Exact SIV test, it's worthwhile to use simpler tests when
1697// they apply; they're cheaper and sometimes more precise.
1698//
1699// Return true if dependence disproved.
1700bool DependenceInfo::testSIV(const SCEV *Src, const SCEV *Dst, unsigned &Level,
1701 FullDependence &Result,
1702 bool UnderRuntimeAssumptions) {
1703 LLVM_DEBUG(dbgs() << " src = " << *Src << "\n");
1704 LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n");
1705 const SCEVAddRecExpr *SrcAddRec = dyn_cast<SCEVAddRecExpr>(Src);
1706 const SCEVAddRecExpr *DstAddRec = dyn_cast<SCEVAddRecExpr>(Dst);
1707 if (SrcAddRec && DstAddRec) {
1708 const SCEV *SrcCoeff = SrcAddRec->getStepRecurrence(*SE);
1709 const SCEV *DstCoeff = DstAddRec->getStepRecurrence(*SE);
1710 const Loop *CurSrcLoop = SrcAddRec->getLoop();
1711 [[maybe_unused]] const Loop *CurDstLoop = DstAddRec->getLoop();
1712 assert(haveSameSD(CurSrcLoop, CurDstLoop) &&
1713 "Loops in the SIV test should have the same iteration space and "
1714 "depth");
1715 Level = mapSrcLoop(CurSrcLoop);
1716 bool disproven = false;
1717 if (SrcCoeff == DstCoeff)
1718 disproven = strongSIVtest(SrcAddRec, DstAddRec, Level, Result,
1719 UnderRuntimeAssumptions);
1720 else if (SrcCoeff == SE->getNegativeSCEV(DstCoeff))
1721 disproven = weakCrossingSIVtest(SrcAddRec, DstAddRec, Level, Result);
1722 return disproven || exactSIVtest(SrcAddRec, DstAddRec, Level, Result);
1723 }
1724 if (SrcAddRec) {
1725 const Loop *CurSrcLoop = SrcAddRec->getLoop();
1726 Level = mapSrcLoop(CurSrcLoop);
1727 return weakZeroDstSIVtest(SrcAddRec, Dst, Level, Result);
1728 }
1729 if (DstAddRec) {
1730 const Loop *CurDstLoop = DstAddRec->getLoop();
1731 Level = mapDstLoop(CurDstLoop);
1732 return weakZeroSrcSIVtest(Src, DstAddRec, Level, Result);
1733 }
1734 llvm_unreachable("SIV test expected at least one AddRec");
1735 return false;
1736}
1737
1738// testRDIV -
1739// When we have a pair of subscripts of the form [c1 + a1*i] and [c2 + a2*j]
1740// where i and j are induction variables, c1 and c2 are loop invariant,
1741// and a1 and a2 are constant, we can solve it exactly with an easy adaptation
1742// of the Exact SIV test, the Restricted Double Index Variable (RDIV) test.
1743// It doesn't make sense to talk about distance or direction in this case,
1744// so there's no point in making special versions of the Strong SIV test or
1745// the Weak-crossing SIV test.
1746//
1747// Return true if dependence disproved.
1748bool DependenceInfo::testRDIV(const SCEV *Src, const SCEV *Dst,
1749 FullDependence &Result) const {
1750 LLVM_DEBUG(dbgs() << " src = " << *Src << "\n");
1751 LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n");
1752 const SCEVAddRecExpr *SrcAddRec = dyn_cast<SCEVAddRecExpr>(Src);
1753 const SCEVAddRecExpr *DstAddRec = dyn_cast<SCEVAddRecExpr>(Dst);
1754 assert(SrcAddRec && DstAddRec && "Unexpected non-addrec input");
1755 return exactRDIVtest(SrcAddRec, DstAddRec, Result) ||
1756 gcdMIVtest(Src, Dst, Result);
1757}
1758
1759// Tests the single-subscript MIV pair (Src and Dst) for dependence.
1760// Return true if dependence disproved.
1761// Can sometimes refine direction vectors.
1762bool DependenceInfo::testMIV(const SCEV *Src, const SCEV *Dst,
1763 const SmallBitVector &Loops,
1764 FullDependence &Result) const {
1765 LLVM_DEBUG(dbgs() << " src = " << *Src << "\n");
1766 LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n");
1767 return gcdMIVtest(Src, Dst, Result) ||
1768 banerjeeMIVtest(Src, Dst, Loops, Result);
1769}
1770
1771/// Given a SCEVMulExpr, returns its first operand if its first operand is a
1772/// constant and the product doesn't overflow in a signed sense. Otherwise,
1773/// returns std::nullopt. For example, given (10 * X * Y)<nsw>, it returns 10.
1774/// Notably, if it doesn't have nsw, the multiplication may overflow, and if
1775/// so, it may not a multiple of 10.
1776static std::optional<APInt> getConstantCoefficient(const SCEV *Expr) {
1777 if (const auto *Constant = dyn_cast<SCEVConstant>(Expr))
1778 return Constant->getAPInt();
1779 if (const auto *Product = dyn_cast<SCEVMulExpr>(Expr))
1780 if (const auto *Constant = dyn_cast<SCEVConstant>(Product->getOperand(0)))
1781 if (Product->hasNoSignedWrap())
1782 return Constant->getAPInt();
1783 return std::nullopt;
1784}
1785
1786const SCEV *DependenceInfo::accumulateCoefficientsGCD(const SCEV *Expr,
1787 const Loop *CurLoop,
1788 const SCEV *&CurLoopCoeff,
1789 APInt &RunningGCD) const {
1790 const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Expr);
1791 if (!AddRec) {
1792 assert(isLoopInvariant(Expr, CurLoop) &&
1793 "Expected loop invariant expression");
1794 return Expr;
1795 }
1796
1797 assert(AddRec->isAffine() && "Unexpected Expr");
1798 const SCEV *Start = AddRec->getStart();
1799 const SCEV *Step = AddRec->getStepRecurrence(*SE);
1800 if (AddRec->getLoop() == CurLoop) {
1801 CurLoopCoeff = Step;
1802 } else {
1803 std::optional<APInt> ConstCoeff = getConstantCoefficient(Step);
1804
1805 // If the coefficient is the product of a constant and other stuff, we can
1806 // use the constant in the GCD computation.
1807 if (!ConstCoeff)
1808 return nullptr;
1809
1810 // TODO: What happens if ConstCoeff is the "most negative" signed number
1811 // (e.g. -128 for 8 bit wide APInt)?
1812 RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff->abs());
1813 }
1814
1815 return accumulateCoefficientsGCD(Start, CurLoop, CurLoopCoeff, RunningGCD);
1816}
1817
1818//===----------------------------------------------------------------------===//
1819// gcdMIVtest -
1820// Tests an MIV subscript pair for dependence.
1821// Returns true if any possible dependence is disproved.
1822// Can sometimes disprove the equal direction for 1 or more loops,
1823// as discussed in Michael Wolfe's book,
1824// High Performance Compilers for Parallel Computing, page 235.
1825//
1826// We spend some effort (code!) to handle cases like
1827// [10*i + 5*N*j + 15*M + 6], where i and j are induction variables,
1828// but M and N are just loop-invariant variables.
1829// This should help us handle linearized subscripts;
1830// also makes this test a useful backup to the various SIV tests.
1831//
1832// It occurs to me that the presence of loop-invariant variables
1833// changes the nature of the test from "greatest common divisor"
1834// to "a common divisor".
1835bool DependenceInfo::gcdMIVtest(const SCEV *Src, const SCEV *Dst,
1836 FullDependence &Result) const {
1837 if (!isDependenceTestEnabled(DependenceTestType::GCDMIV))
1838 return false;
1839
1840 LLVM_DEBUG(dbgs() << "starting gcd\n");
1841 ++GCDapplications;
1842 unsigned BitWidth = SE->getTypeSizeInBits(Src->getType());
1843 APInt RunningGCD = APInt::getZero(BitWidth);
1844
1845 const SCEV *Dummy = nullptr;
1846 const SCEV *SrcConst =
1847 accumulateCoefficientsGCD(Src, nullptr, Dummy, RunningGCD);
1848 if (!SrcConst)
1849 return false;
1850 const SCEV *DstConst =
1851 accumulateCoefficientsGCD(Dst, nullptr, Dummy, RunningGCD);
1852 if (!DstConst)
1853 return false;
1854
1855 const SCEV *Delta = minusSCEVNoSignedOverflow(DstConst, SrcConst, *SE);
1856 if (!Delta)
1857 return false;
1858 LLVM_DEBUG(dbgs() << " Delta = " << *Delta << "\n");
1859 const SCEVConstant *Constant = dyn_cast<SCEVConstant>(Delta);
1860 if (!Constant)
1861 return false;
1862 APInt ConstDelta = cast<SCEVConstant>(Constant)->getAPInt();
1863 LLVM_DEBUG(dbgs() << " ConstDelta = " << ConstDelta << "\n");
1864 if (ConstDelta == 0)
1865 return false;
1866 LLVM_DEBUG(dbgs() << " RunningGCD = " << RunningGCD << "\n");
1867 APInt Remainder = ConstDelta.srem(RunningGCD);
1868 if (Remainder != 0) {
1869 ++GCDindependence;
1870 return true;
1871 }
1872
1873 // Try to disprove equal directions.
1874 // For example, given a subscript pair [3*i + 2*j] and [i' + 2*j' - 1],
1875 // the code above can't disprove the dependence because the GCD = 1.
1876 // So we consider what happen if i = i' and what happens if j = j'.
1877 // If i = i', we can simplify the subscript to [2*i + 2*j] and [2*j' - 1],
1878 // which is infeasible, so we can disallow the = direction for the i level.
1879 // Setting j = j' doesn't help matters, so we end up with a direction vector
1880 // of [<>, *]
1881
1882 bool Improved = false;
1883 const SCEV *Coefficients = Src;
1884 while (const SCEVAddRecExpr *AddRec =
1885 dyn_cast<SCEVAddRecExpr>(Coefficients)) {
1886 Coefficients = AddRec->getStart();
1887 const Loop *CurLoop = AddRec->getLoop();
1888 RunningGCD = 0;
1889 const SCEV *SrcCoeff = AddRec->getStepRecurrence(*SE);
1890 const SCEV *DstCoeff = SE->getMinusSCEV(SrcCoeff, SrcCoeff);
1891
1892 if (!accumulateCoefficientsGCD(Src, CurLoop, SrcCoeff, RunningGCD) ||
1893 !accumulateCoefficientsGCD(Dst, CurLoop, DstCoeff, RunningGCD))
1894 return false;
1895
1896 Delta = minusSCEVNoSignedOverflow(DstCoeff, SrcCoeff, *SE);
1897 if (!Delta)
1898 continue;
1899 // If the coefficient is the product of a constant and other stuff,
1900 // we can use the constant in the GCD computation.
1901 std::optional<APInt> ConstCoeff = getConstantCoefficient(Delta);
1902 if (!ConstCoeff)
1903 // The difference of the two coefficients might not be a product
1904 // or constant, in which case we give up on this direction.
1905 continue;
1906 RunningGCD = APIntOps::GreatestCommonDivisor(RunningGCD, ConstCoeff->abs());
1907 LLVM_DEBUG(dbgs() << "\tRunningGCD = " << RunningGCD << "\n");
1908 if (RunningGCD != 0) {
1909 Remainder = ConstDelta.srem(RunningGCD);
1910 LLVM_DEBUG(dbgs() << "\tRemainder = " << Remainder << "\n");
1911 if (Remainder != 0) {
1912 unsigned Level = mapSrcLoop(CurLoop);
1913 Result.DV[Level - 1].Direction &= ~Dependence::DVEntry::EQ;
1914 Improved = true;
1915 }
1916 }
1917 }
1918 if (Improved)
1919 ++GCDsuccesses;
1920 LLVM_DEBUG(dbgs() << "all done\n");
1921 return false;
1922}
1923
1924//===----------------------------------------------------------------------===//
1925
1926namespace {
1927/// A closed signed interval containing the possible values of part of the
1928/// Banerjee subscript-difference expression.
1929/// A null Lower denotes -infinity, and a null Upper denotes +infinity. If
1930/// both finite endpoints are in reverse signed order (Lower >s Upper), the
1931/// interval is empty.
1932struct BanerjeeInterval {
1933 const SCEV *Lower;
1934 const SCEV *Upper;
1935
1936 BanerjeeInterval(const SCEV *Lower, const SCEV *Upper)
1937 : Lower(Lower), Upper(Upper) {}
1938
1939 bool isEmpty(ScalarEvolution &SE) const {
1940 return Lower && Upper &&
1942 }
1943};
1944} // namespace
1945
1946/// Add two intervals. A missing endpoint propagates the corresponding
1947/// infinity.
1948static BanerjeeInterval addIntervals(const BanerjeeInterval &A,
1949 const BanerjeeInterval &B,
1950 ScalarEvolution &SE) {
1951 const SCEV *Lower = nullptr;
1952 const SCEV *Upper = nullptr;
1953 if (A.Lower && B.Lower)
1954 Lower = SE.getAddExpr(A.Lower, B.Lower);
1955 if (A.Upper && B.Upper)
1956 Upper = SE.getAddExpr(A.Upper, B.Upper);
1957 return BanerjeeInterval(Lower, Upper);
1958}
1959
1960/// Intersect two intervals. Both inputs conservatively contain the feasible
1961/// values, so their intersection does too and may provide tighter one-sided
1962/// bounds.
1963static BanerjeeInterval intersectIntervals(const BanerjeeInterval &A,
1964 const BanerjeeInterval &B,
1965 ScalarEvolution &SE) {
1966 const SCEV *Lower = A.Lower;
1967 const SCEV *Upper = A.Upper;
1968 if (B.Lower)
1969 Lower = Lower ? SE.getSMaxExpr(Lower, B.Lower) : B.Lower;
1970 if (B.Upper)
1971 Upper = Upper ? SE.getSMinExpr(Upper, B.Upper) : B.Upper;
1972 return BanerjeeInterval(Lower, Upper);
1973}
1974
1975/// Return the singleton interval containing \p C.
1976static BanerjeeInterval constantInterval(const SCEV *C) {
1977 return BanerjeeInterval(C, C);
1978}
1979
1980/// Return the canonical empty interval [1, 0].
1981static BanerjeeInterval emptyInterval(Type *Ty, ScalarEvolution &SE) {
1982 return BanerjeeInterval(SE.getOne(Ty), SE.getZero(Ty));
1983}
1984
1985/// Compute the range of \p Coeff * X for \p Lower <=s X <=s \p Upper.
1986static BanerjeeInterval signedRangeInterval(const SCEV *Coeff,
1987 const SCEV *Lower,
1988 const SCEV *Upper,
1989 ScalarEvolution &SE) {
1990 // Coeff and the endpoints have already been extended to WideType. The
1991 // width proof in banerjeeMIVtest guarantees that these multiplications do
1992 // not wrap, so their SCEV values match mathematical signed integers.
1993 const SCEV *LowerValue = SE.getMulExpr(Coeff, Lower);
1994 const SCEV *UpperValue = SE.getMulExpr(Coeff, Upper);
1995 return BanerjeeInterval(SE.getSMinExpr(LowerValue, UpperValue),
1996 SE.getSMaxExpr(LowerValue, UpperValue));
1997}
1998
1999/// Compute the range of Coeff * X for 0 <= X <= Upper. A null Upper denotes
2000/// an unbounded nonnegative X.
2001static BanerjeeInterval variableInterval(const SCEV *Coeff, const SCEV *Upper,
2002 ScalarEvolution &SE) {
2003 const SCEV *Zero = SE.getZero(Coeff->getType());
2004 if (Coeff->isZero())
2005 return constantInterval(Zero);
2006 if (!Upper) {
2007 if (SE.isKnownNegative(Coeff))
2008 return BanerjeeInterval(nullptr, Zero);
2009 if (SE.isKnownNonNegative(Coeff))
2010 return BanerjeeInterval(Zero, nullptr);
2011 return BanerjeeInterval(nullptr, nullptr);
2012 }
2013 return signedRangeInterval(Coeff, Zero, Upper, SE);
2014}
2015
2016/// Compute any finite one-sided bound on
2017///
2018/// A * SrcIndex - B * DstIndex
2019///
2020/// for a strict direction when no upper bound is known for the nonnegative
2021/// normalized indices.
2022///
2023/// For SrcIndex < DstIndex, write DstIndex = SrcIndex + D, where D >= 1:
2024///
2025/// A * SrcIndex - B * DstIndex
2026/// = (A - B) * SrcIndex + (-B) * D.
2027///
2028/// If A - B >= 0 and B <= 0, both terms increase with their nonnegative
2029/// variables (SrcIndex and D), so the expression is bounded below by -B.
2030/// If A - B <= 0 and B >= 0, it is bounded above by -B.
2031///
2032/// For SrcIndex > DstIndex, write SrcIndex = DstIndex + D:
2033///
2034/// A * SrcIndex - B * DstIndex
2035/// = (A - B) * DstIndex + A * D.
2036///
2037/// If A - B >= 0 and A >= 0, the expression is bounded below by A.
2038/// If A - B <= 0 and A <= 0, it is bounded above by A.
2040 const SCEV *ACoeff, const SCEV *BCoeff, unsigned char Direction,
2041 ScalarEvolution &SE) {
2042 const SCEV *DeltaCoeff = SE.getMinusSCEV(ACoeff, BCoeff);
2043
2044 switch (Direction) {
2046 const SCEV *Boundary = SE.getNegativeSCEV(BCoeff);
2047 const SCEV *Lower = nullptr;
2048 const SCEV *Upper = nullptr;
2049 if (SE.isKnownNonNegative(DeltaCoeff) && SE.isKnownNonPositive(BCoeff))
2050 Lower = Boundary;
2051 if (SE.isKnownNonPositive(DeltaCoeff) && SE.isKnownNonNegative(BCoeff))
2052 Upper = Boundary;
2053 return BanerjeeInterval(Lower, Upper);
2054 }
2056 const SCEV *Lower = nullptr;
2057 const SCEV *Upper = nullptr;
2058 if (SE.isKnownNonNegative(ACoeff) && SE.isKnownNonNegative(DeltaCoeff))
2059 Lower = ACoeff;
2060 if (SE.isKnownNonPositive(ACoeff) && SE.isKnownNonPositive(DeltaCoeff))
2061 Upper = ACoeff;
2062 return BanerjeeInterval(Lower, Upper);
2063 }
2064 default:
2065 llvm_unreachable("unexpected direction");
2066 }
2067}
2068
2069/// Return the smallest closed interval containing Values.
2071 ScalarEvolution &SE) {
2072 assert(!Values.empty() && "expected at least one value");
2073 const SCEV *Lower = Values.front();
2074 const SCEV *Upper = Values.front();
2075 for (const SCEV *Value : Values.drop_front()) {
2078 }
2079 return BanerjeeInterval(Lower, Upper);
2080}
2081
2082/// Evaluate one loop level's contribution A * SrcIndex - B * DstIndex to the
2083/// complete source-minus-destination subscript difference.
2084static const SCEV *
2085evaluateSubscriptDifference(const SCEV *A, const SCEV *SrcIndex, const SCEV *B,
2086 const SCEV *DstIndex, ScalarEvolution &SE) {
2087 return SE.getMinusSCEV(SE.getMulExpr(A, SrcIndex),
2088 SE.getMulExpr(B, DstIndex));
2089}
2090
2091/// Return the widest type used by a subscript or by an exact backedge-taken
2092/// count of one of its recurrences.
2093static Type *getBanerjeeBaseType(const SCEV *Src, const SCEV *Dst,
2094 ScalarEvolution &SE) {
2095 Type *BaseType = SE.getWiderType(Src->getType(), Dst->getType());
2096 for (const SCEV *Subscript : {Src, Dst}) {
2097 while (const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Subscript)) {
2098 const SCEV *MaxIterIndex = SE.getBackedgeTakenCount(AddRec->getLoop());
2099 if (!isa<SCEVCouldNotCompute>(MaxIterIndex))
2100 BaseType = SE.getWiderType(BaseType, MaxIterIndex->getType());
2101 Subscript = AddRec->getStart();
2102 }
2103 }
2104 return BaseType;
2105}
2106
2107/// banerjeeMIVtest -
2108/// Use Banerjee's Inequalities to test an MIV subscript pair.
2109/// (Wolfe calls this the Extreme Value Test; see Section 2.5.2 of
2110/// Optimizing Supercompilers for Supercomputers, Michael Wolfe.)
2111///
2112/// The original Wolfe formulae are algebraically simplified for normalized
2113/// loops (L_k=0, N_k=1); we now evaluate the subscript difference directly
2114/// at the vertices of the constraint polytope for each direction (e.g., (0,1),
2115/// (0,U), (U-1,U) for <). All operands are extended to a sufficiently wide
2116/// SCEV integer type before the arithmetic, so symbolic expressions remain
2117/// available to ScalarEvolution without wrapping intermediate results.
2118///
2119/// Loop bounds are backedge-taken counts (maximum normalized iteration
2120/// index). A single-iteration loop has bound 0, making < and > impossible.
2121/// Unknown interval endpoints are treated conservatively as infinities.
2122///
2123/// Return true if dependence disproved.
2124bool DependenceInfo::banerjeeMIVtest(const SCEV *Src, const SCEV *Dst,
2125 const SmallBitVector &Loops,
2126 FullDependence &Result) const {
2127 if (!isDependenceTestEnabled(DependenceTestType::BanerjeeMIV))
2128 return false;
2129
2130 LLVM_DEBUG(dbgs() << "starting Banerjee\n");
2131 ++BanerjeeApplications;
2132
2133 Type *BaseType = getBanerjeeBaseType(Src, Dst, *SE);
2134 unsigned BaseBits = SE->getTypeSizeInBits(BaseType);
2135 // Let B be the maximum bit width among the source and destination
2136 // subscripts and the exact backedge-taken counts of the loops appearing
2137 // in their recurrences. Let L = MaxLevels. A coefficient C is a signed
2138 // B-bit value, so |C| <= 2^(B-1). A normalized iteration index I is a
2139 // nonnegative B-bit value, so I < 2^B. Therefore |C*I| < 2^(2B-1), and one
2140 // level's contribution |A*I-B*J| < 2^(2B). The accumulated
2141 // subscript-difference bound across L levels is less than
2142 // L*2^(2B) <= 2^(2B+L). One additional bit holds the sign, so 2B+L+1 bits
2143 // are sufficient for every intermediate Banerjee computation.
2144 unsigned WideBits = 2 * BaseBits + MaxLevels + 1;
2145 Type *WideType = IntegerType::get(F->getContext(), WideBits);
2146 const SCEV *Zero = SE->getZero(WideType);
2147
2148 CoefficientInfo EmptyCoeff{Zero, Zero, nullptr};
2149 SmallVector<CoefficientInfo, 4> CI(MaxLevels + 1, EmptyCoeff);
2150 assert(Loops.size() > MaxLevels && "loop bit vector is too small");
2151 assert(Result.Levels >= CommonLevels &&
2152 "direction vector is too small for common levels");
2153
2154 const SCEV *A0 = collectCoeffInfo(Src, true, WideType, CI);
2155 const SCEV *B0 = collectCoeffInfo(Dst, false, WideType, CI);
2156 const SCEV *Delta = SE->getMinusSCEV(B0, A0);
2157 LLVM_DEBUG(dbgs() << "\tDelta = " << *Delta << '\n');
2158
2159 SmallVector<BoundInfo, 4> Bound(MaxLevels + 1);
2160 for (unsigned K = 0; K <= MaxLevels; ++K) {
2161 Bound[K].Direction = Dependence::DVEntry::ALL;
2162 Bound[K].DirSet = Dependence::DVEntry::NONE;
2163 }
2164 for (unsigned K = 1; K <= MaxLevels; ++K) {
2165 findBoundsALL(CI, Bound, K);
2166 findBoundsLT(CI, Bound, K);
2167 findBoundsEQ(CI, Bound, K);
2168 findBoundsGT(CI, Bound, K);
2169 }
2170
2171 if (!testBounds(Dependence::DVEntry::ALL, 0, Bound, Delta)) {
2172 ++BanerjeeIndependence;
2173 return true;
2174 }
2175
2176 unsigned NewDeps = exploreDirections(1, Bound, Loops, Delta, Result);
2177 if (NewDeps == 0) {
2178 ++BanerjeeIndependence;
2179 return true;
2180 }
2181
2182 bool Improved = false;
2183 for (unsigned K = 1; K <= CommonLevels; ++K) {
2184 if (!Loops[K])
2185 continue;
2186 unsigned Old = Result.DV[K - 1].Direction;
2187 Result.DV[K - 1].Direction = Old & Bound[K].DirSet;
2188 Improved |= Old != Result.DV[K - 1].Direction;
2189 if (!Result.DV[K - 1].Direction) {
2190 ++BanerjeeIndependence;
2191 return true;
2192 }
2193 }
2194
2195 if (Improved)
2196 ++BanerjeeSuccesses;
2197 return false;
2198}
2199
2200/// Walks through the subscript and collects its coefficient at each loop
2201/// level. Each level has one maximum iteration index shared by the source and
2202/// destination coefficients. All collected values and the returned constant
2203/// term are extended to the widened analysis type before Banerjee arithmetic.
2204const SCEV *
2205DependenceInfo::collectCoeffInfo(const SCEV *Subscript, bool SrcFlag,
2206 Type *WideType,
2208 SmallBitVector SeenLevels(MaxLevels + 1);
2209 while (const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Subscript)) {
2210 unsigned K =
2211 SrcFlag ? mapSrcLoop(AddRec->getLoop()) : mapDstLoop(AddRec->getLoop());
2212 assert(K > 0 && K <= MaxLevels && "invalid mapped loop level");
2213 assert(!SeenLevels[K] && "duplicate recurrence for loop level");
2214 SeenLevels.set(K);
2215
2216 const SCEV *Step = AddRec->getStepRecurrence(*SE);
2217 const SCEV *&Coeff = SrcFlag ? CI[K].SrcCoeff : CI[K].DstCoeff;
2218 Coeff = SE->getNoopOrSignExtend(Step, WideType);
2219
2220 const SCEV *MaxIterIndex = SE->getBackedgeTakenCount(AddRec->getLoop());
2221 if (!isa<SCEVCouldNotCompute>(MaxIterIndex)) {
2222 // A backedge-taken count is semantically an unsigned, nonnegative
2223 // iteration index. When its signed nonnegativity is also known, sign
2224 // extension preserves more symbolic relationships. Otherwise use zero
2225 // extension; this fallback does not assume that the value is negative.
2226 CI[K].MaxIterIndex =
2227 SE->isKnownNonNegative(MaxIterIndex)
2228 ? SE->getNoopOrSignExtend(MaxIterIndex, WideType)
2229 : SE->getNoopOrZeroExtend(MaxIterIndex, WideType);
2230 }
2231
2232 Subscript = AddRec->getStart();
2233 }
2234 return SE->getNoopOrSignExtend(Subscript, WideType);
2235}
2236
2237/// Looks through all the bounds info and computes the selected lower bound.
2238const SCEV *DependenceInfo::getLowerBound(ArrayRef<BoundInfo> Bound) const {
2239 const SCEV *Sum = Bound[1].Lower[Bound[1].Direction];
2240 for (unsigned K = 2; Sum && K <= MaxLevels; ++K) {
2241 if (!Bound[K].Lower[Bound[K].Direction])
2242 return nullptr;
2243 Sum = SE->getAddExpr(Sum, Bound[K].Lower[Bound[K].Direction]);
2244 }
2245 return Sum;
2246}
2247
2248/// Looks through all the bounds info and computes the selected upper bound.
2249const SCEV *DependenceInfo::getUpperBound(ArrayRef<BoundInfo> Bound) const {
2250 const SCEV *Sum = Bound[1].Upper[Bound[1].Direction];
2251 for (unsigned K = 2; Sum && K <= MaxLevels; ++K) {
2252 if (!Bound[K].Upper[Bound[K].Direction])
2253 return nullptr;
2254 Sum = SE->getAddExpr(Sum, Bound[K].Upper[Bound[K].Direction]);
2255 }
2256 return Sum;
2257}
2258
2259/// Returns false when the selected bounds are proven infeasible. Returns true
2260/// when they may be feasible or ScalarEvolution cannot decide.
2261bool DependenceInfo::testBounds(unsigned char DirKind, unsigned Level,
2263 const SCEV *Delta) const {
2264 Bound[Level].Direction = DirKind;
2265 for (unsigned K = 1; K <= MaxLevels; ++K) {
2266 unsigned char Direction = Bound[K].Direction;
2267 BanerjeeInterval Interval(Bound[K].Lower[Direction],
2268 Bound[K].Upper[Direction]);
2269 if (Interval.isEmpty(*SE))
2270 return false;
2271 }
2272 if (const SCEV *Lower = getLowerBound(Bound))
2273 if (SE->isKnownPredicate(CmpInst::ICMP_SGT, Lower, Delta))
2274 return false;
2275 if (const SCEV *Upper = getUpperBound(Bound))
2276 if (SE->isKnownPredicate(CmpInst::ICMP_SGT, Delta, Upper))
2277 return false;
2278 return true;
2279}
2280
2281/// Hierarchically expands the direction-vector search space.
2282unsigned DependenceInfo::exploreDirections(unsigned Level,
2284 const SmallBitVector &Loops,
2285 const SCEV *Delta,
2286 const FullDependence &Result) const {
2287 if (CommonLevels > MIVMaxLevelThreshold) {
2288 LLVM_DEBUG(dbgs() << "Number of common levels exceeded the threshold. MIV "
2289 "direction exploration is terminated.\n");
2290 for (unsigned K = 1; K <= CommonLevels; ++K)
2291 if (Loops[K])
2292 Bound[K].DirSet = Dependence::DVEntry::ALL;
2293 return 1;
2294 }
2295
2296 if (Level > CommonLevels) {
2297 for (unsigned K = 1; K <= CommonLevels; ++K)
2298 if (Loops[K])
2299 Bound[K].DirSet |= Bound[K].Direction;
2300 return 1;
2301 }
2302
2303 if (!Loops[Level])
2304 return exploreDirections(Level + 1, Bound, Loops, Delta, Result);
2305
2306 unsigned NewDeps = 0;
2307 unsigned OldDirections = Result.DV[Level - 1].Direction;
2308 for (unsigned char Dir : {Dependence::DVEntry::LT, Dependence::DVEntry::EQ,
2310 if (!(OldDirections & Dir))
2311 continue;
2312 if (testBounds(Dir, Level, Bound, Delta))
2313 NewDeps += exploreDirections(Level + 1, Bound, Loops, Delta, Result);
2314 }
2315 Bound[Level].Direction = Dependence::DVEntry::ALL;
2316 return NewDeps;
2317}
2318
2319/// Computes the lower and upper bounds for level K using the * direction.
2320///
2321/// At this level the contribution to the subscript difference is
2322///
2323/// F_k(i, j) = A_k i - B_k j.
2324///
2325/// The * direction imposes no relation between i and j, so the feasible domain
2326/// is the rectangle [0, U_A] x [0, U_B]. The extrema of this affine expression
2327/// occur at its corners. Equivalently, when U_A = U_B = U, Wolfe's normalized
2328/// bounds are
2329///
2330/// LB^*_k = (A^-_k - B^+_k) U
2331/// UB^*_k = (A^+_k - B^-_k) U,
2332///
2333/// where X^+ = max(X, 0) and X^- = min(X, 0).
2334void DependenceInfo::findBoundsALL(ArrayRef<CoefficientInfo> CI,
2336 unsigned K) const {
2337 BanerjeeInterval SrcInterval =
2338 variableInterval(CI[K].SrcCoeff, CI[K].MaxIterIndex, *SE);
2339 BanerjeeInterval DstInterval = variableInterval(
2340 SE->getNegativeSCEV(CI[K].DstCoeff), CI[K].MaxIterIndex, *SE);
2341 BanerjeeInterval Interval = addIntervals(SrcInterval, DstInterval, *SE);
2342 Bound[K].Lower[Dependence::DVEntry::ALL] = Interval.Lower;
2343 Bound[K].Upper[Dependence::DVEntry::ALL] = Interval.Upper;
2344}
2345
2346/// Computes the lower and upper bounds for level K using the = direction.
2347///
2348/// Here i = j, so F_k(i, i) = (A_k - B_k)i over the common range
2349/// [0, min(U_A, U_B)]. The extrema therefore occur at the two endpoints.
2350/// When the common upper bound is U, Wolfe's normalized bounds are
2351///
2352/// LB^=_k = (A_k - B_k)^- U
2353/// UB^=_k = (A_k - B_k)^+ U.
2354void DependenceInfo::findBoundsEQ(ArrayRef<CoefficientInfo> CI,
2356 unsigned K) const {
2357 BanerjeeInterval Interval =
2358 variableInterval(SE->getMinusSCEV(CI[K].SrcCoeff, CI[K].DstCoeff),
2359 CI[K].MaxIterIndex, *SE);
2360 Bound[K].Lower[Dependence::DVEntry::EQ] = Interval.Lower;
2361 Bound[K].Upper[Dependence::DVEntry::EQ] = Interval.Upper;
2362}
2363
2364/// Computes the lower and upper bounds for level K using the < direction.
2365///
2366/// For a known common upper bound U, the feasible domain is
2367/// 0 <= i < j <= U. Its vertices are (0, 1), (0, U), and (U - 1, U), so
2368/// evaluating F_k at those points gives the exact extrema. Equivalently,
2369/// Wolfe's normalized bounds are
2370///
2371/// LB^<_k = (A^-_k - B_k)^- (U - 1) - B_k
2372/// UB^<_k = (A^+_k - B_k)^+ (U - 1) - B_k.
2373///
2374/// If U is zero the domain is empty. If no common upper bound is known, the
2375/// implementation computes any finite one-sided bound it can prove and leaves
2376/// the other side unbounded.
2377void DependenceInfo::findBoundsLT(ArrayRef<CoefficientInfo> CI,
2379 unsigned K) const {
2380 const SCEV *ACoeff = CI[K].SrcCoeff;
2381 const SCEV *BCoeff = CI[K].DstCoeff;
2382 const SCEV *MaxIterIndex = CI[K].MaxIterIndex;
2383
2385 ACoeff, BCoeff, Dependence::DVEntry::LT, *SE);
2386 if (MaxIterIndex && MaxIterIndex->isZero()) {
2387 Interval = emptyInterval(ACoeff->getType(), *SE);
2388 } else if (MaxIterIndex) {
2389 const SCEV *Zero = SE->getZero(ACoeff->getType());
2390 const SCEV *One = SE->getOne(ACoeff->getType());
2391 const SCEV *MaxMinusOne = SE->getMinusSCEV(MaxIterIndex, One);
2393 Values.push_back(
2394 evaluateSubscriptDifference(ACoeff, Zero, BCoeff, One, *SE));
2395 Values.push_back(
2396 evaluateSubscriptDifference(ACoeff, Zero, BCoeff, MaxIterIndex, *SE));
2397 Values.push_back(evaluateSubscriptDifference(ACoeff, MaxMinusOne, BCoeff,
2398 MaxIterIndex, *SE));
2399 Interval =
2401 }
2402 Bound[K].Lower[Dependence::DVEntry::LT] = Interval.Lower;
2403 Bound[K].Upper[Dependence::DVEntry::LT] = Interval.Upper;
2404}
2405
2406/// Computes the lower and upper bounds for level K using the > direction.
2407///
2408/// For a known common upper bound U, the feasible domain is
2409/// 0 <= j < i <= U. Its vertices are (1, 0), (U, 0), and (U, U - 1), so
2410/// evaluating F_k at those points gives the exact extrema. Equivalently,
2411/// Wolfe's normalized bounds are
2412///
2413/// LB^>_k = (A_k - B^+_k)^- (U - 1) + A_k
2414/// UB^>_k = (A_k - B^-_k)^+ (U - 1) + A_k.
2415///
2416/// If U is zero the domain is empty. If no common upper bound is known, the
2417/// implementation computes any finite one-sided bound it can prove and leaves
2418/// the other side unbounded.
2419void DependenceInfo::findBoundsGT(ArrayRef<CoefficientInfo> CI,
2421 unsigned K) const {
2422 const SCEV *ACoeff = CI[K].SrcCoeff;
2423 const SCEV *BCoeff = CI[K].DstCoeff;
2424 const SCEV *MaxIterIndex = CI[K].MaxIterIndex;
2425
2427 ACoeff, BCoeff, Dependence::DVEntry::GT, *SE);
2428 if (MaxIterIndex && MaxIterIndex->isZero()) {
2429 Interval = emptyInterval(ACoeff->getType(), *SE);
2430 } else if (MaxIterIndex) {
2431 const SCEV *Zero = SE->getZero(ACoeff->getType());
2432 const SCEV *One = SE->getOne(ACoeff->getType());
2433 const SCEV *MaxMinusOne = SE->getMinusSCEV(MaxIterIndex, One);
2435 Values.push_back(
2436 evaluateSubscriptDifference(ACoeff, One, BCoeff, Zero, *SE));
2437 Values.push_back(
2438 evaluateSubscriptDifference(ACoeff, MaxIterIndex, BCoeff, Zero, *SE));
2439 Values.push_back(evaluateSubscriptDifference(ACoeff, MaxIterIndex, BCoeff,
2440 MaxMinusOne, *SE));
2441 Interval =
2443 }
2444 Bound[K].Lower[Dependence::DVEntry::GT] = Interval.Lower;
2445 Bound[K].Upper[Dependence::DVEntry::GT] = Interval.Upper;
2446}
2447
2448/// Check if we can delinearize the subscripts. If the SCEVs representing the
2449/// source and destination array references are recurrences on a nested loop,
2450/// this function flattens the nested recurrences into separate recurrences
2451/// for each loop level.
2452bool DependenceInfo::tryDelinearize(Instruction *Src, Instruction *Dst,
2454 assert(isLoadOrStore(Src) && "instruction is not load or store");
2455 assert(isLoadOrStore(Dst) && "instruction is not load or store");
2456 Value *SrcPtr = getLoadStorePointerOperand(Src);
2457 Value *DstPtr = getLoadStorePointerOperand(Dst);
2458 Loop *SrcLoop = LI->getLoopFor(Src->getParent());
2459 Loop *DstLoop = LI->getLoopFor(Dst->getParent());
2460 const SCEV *SrcAccessFn = SE->getSCEVAtScope(SrcPtr, SrcLoop);
2461 const SCEV *DstAccessFn = SE->getSCEVAtScope(DstPtr, DstLoop);
2462 const SCEVUnknown *SrcBase =
2463 dyn_cast<SCEVUnknown>(SE->getPointerBase(SrcAccessFn));
2464 const SCEVUnknown *DstBase =
2465 dyn_cast<SCEVUnknown>(SE->getPointerBase(DstAccessFn));
2466
2467 if (!SrcBase || !DstBase || SrcBase != DstBase)
2468 return false;
2469
2470 SmallVector<const SCEV *, 4> SrcSubscripts, DstSubscripts;
2471
2472 if (!tryDelinearizeFixedSize(Src, Dst, SrcAccessFn, DstAccessFn,
2473 SrcSubscripts, DstSubscripts) &&
2474 !tryDelinearizeParametricSize(Src, Dst, SrcAccessFn, DstAccessFn,
2475 SrcSubscripts, DstSubscripts))
2476 return false;
2477
2478 assert(isLoopInvariant(SrcBase, SrcLoop) &&
2479 isLoopInvariant(DstBase, DstLoop) &&
2480 "Expected SrcBase and DstBase to be loop invariant");
2481
2482 int Size = SrcSubscripts.size();
2483 LLVM_DEBUG({
2484 dbgs() << "\nSrcSubscripts: ";
2485 for (int I = 0; I < Size; I++)
2486 dbgs() << *SrcSubscripts[I];
2487 dbgs() << "\nDstSubscripts: ";
2488 for (int I = 0; I < Size; I++)
2489 dbgs() << *DstSubscripts[I];
2490 dbgs() << "\n";
2491 });
2492
2493 // The delinearization transforms a single-subscript MIV dependence test into
2494 // a multi-subscript SIV dependence test that is easier to compute. So we
2495 // resize Pair to contain as many pairs of subscripts as the delinearization
2496 // has found, and then initialize the pairs following the delinearization.
2497 Pair.resize(Size);
2498 for (int I = 0; I < Size; ++I) {
2499 Pair[I].Src = SrcSubscripts[I];
2500 Pair[I].Dst = DstSubscripts[I];
2501
2502 assert(Pair[I].Src->getType() == Pair[I].Dst->getType() &&
2503 "Unexpected different types for the subscripts");
2504 }
2505
2506 return true;
2507}
2508
2509/// Try to delinearize \p SrcAccessFn and \p DstAccessFn if the underlying
2510/// arrays accessed are fixed-size arrays. Return true if delinearization was
2511/// successful.
2512bool DependenceInfo::tryDelinearizeFixedSize(
2513 Instruction *Src, Instruction *Dst, const SCEV *SrcAccessFn,
2514 const SCEV *DstAccessFn, SmallVectorImpl<const SCEV *> &SrcSubscripts,
2515 SmallVectorImpl<const SCEV *> &DstSubscripts) {
2516 LLVM_DEBUG({
2517 const SCEVUnknown *SrcBase =
2518 dyn_cast<SCEVUnknown>(SE->getPointerBase(SrcAccessFn));
2519 const SCEVUnknown *DstBase =
2520 dyn_cast<SCEVUnknown>(SE->getPointerBase(DstAccessFn));
2521 assert(SrcBase && DstBase && SrcBase == DstBase &&
2522 "expected src and dst scev unknowns to be equal");
2523 });
2524
2525 const SCEV *ElemSize = SE->getElementSize(Src);
2526 assert(ElemSize == SE->getElementSize(Dst) && "Different element sizes");
2527 SmallVector<const SCEV *, 4> SrcSizes, DstSizes;
2528 if (!delinearizeFixedSizeArray(*SE, SE->removePointerBase(SrcAccessFn),
2529 SrcSubscripts, SrcSizes, ElemSize) ||
2530 !delinearizeFixedSizeArray(*SE, SE->removePointerBase(DstAccessFn),
2531 DstSubscripts, DstSizes, ElemSize))
2532 return false;
2533
2534 // Check that the two size arrays are non-empty and equal in length and
2535 // value. SCEV expressions are uniqued, so we can compare pointers.
2536 if (SrcSizes.size() != DstSizes.size() ||
2537 !std::equal(SrcSizes.begin(), SrcSizes.end(), DstSizes.begin())) {
2538 SrcSubscripts.clear();
2539 DstSubscripts.clear();
2540 return false;
2541 }
2542
2543 assert(SrcSubscripts.size() == DstSubscripts.size() &&
2544 "Expected equal number of entries in the list of SrcSubscripts and "
2545 "DstSubscripts.");
2546
2547 // In general we cannot safely assume that the subscripts recovered from GEPs
2548 // are in the range of values defined for their corresponding array
2549 // dimensions. For example some C language usage/interpretation make it
2550 // impossible to verify this at compile-time. As such we can only delinearize
2551 // iff the subscripts are positive and are less than the range of the
2552 // dimension.
2554 if (!validateDelinearizationResult(*SE, SrcSizes, SrcSubscripts) ||
2555 !validateDelinearizationResult(*SE, DstSizes, DstSubscripts)) {
2556 SrcSubscripts.clear();
2557 DstSubscripts.clear();
2558 return false;
2559 }
2560 }
2561 LLVM_DEBUG({
2562 dbgs() << "Delinearized subscripts of fixed-size array\n"
2563 << "SrcGEP:" << *getLoadStorePointerOperand(Src) << "\n"
2564 << "DstGEP:" << *getLoadStorePointerOperand(Dst) << "\n";
2565 });
2566 return true;
2567}
2568
2569bool DependenceInfo::tryDelinearizeParametricSize(
2570 Instruction *Src, Instruction *Dst, const SCEV *SrcAccessFn,
2571 const SCEV *DstAccessFn, SmallVectorImpl<const SCEV *> &SrcSubscripts,
2572 SmallVectorImpl<const SCEV *> &DstSubscripts) {
2573
2574 const SCEVUnknown *SrcBase =
2575 dyn_cast<SCEVUnknown>(SE->getPointerBase(SrcAccessFn));
2576 const SCEVUnknown *DstBase =
2577 dyn_cast<SCEVUnknown>(SE->getPointerBase(DstAccessFn));
2578 assert(SrcBase && DstBase && SrcBase == DstBase &&
2579 "expected src and dst scev unknowns to be equal");
2580
2581 const SCEV *ElementSize = SE->getElementSize(Src);
2582 if (ElementSize != SE->getElementSize(Dst))
2583 return false;
2584
2585 const SCEV *SrcSCEV = SE->getMinusSCEV(SrcAccessFn, SrcBase);
2586 const SCEV *DstSCEV = SE->getMinusSCEV(DstAccessFn, DstBase);
2587
2588 const SCEVAddRecExpr *SrcAR = dyn_cast<SCEVAddRecExpr>(SrcSCEV);
2589 const SCEVAddRecExpr *DstAR = dyn_cast<SCEVAddRecExpr>(DstSCEV);
2590 if (!SrcAR || !DstAR || !SrcAR->isAffine() || !DstAR->isAffine())
2591 return false;
2592
2593 // First step: collect parametric terms in both array references.
2595 collectParametricTerms(*SE, SrcAR, Terms);
2596 collectParametricTerms(*SE, DstAR, Terms);
2597
2598 // Second step: find subscript sizes.
2600 findArrayDimensions(*SE, Terms, Sizes, ElementSize);
2601
2602 // Third step: compute the access functions for each subscript.
2603 computeAccessFunctions(*SE, SrcAR, SrcSubscripts, Sizes);
2604 computeAccessFunctions(*SE, DstAR, DstSubscripts, Sizes);
2605
2606 // Fail when there is only a subscript: that's a linearized access function.
2607 if (SrcSubscripts.size() < 2 || DstSubscripts.size() < 2 ||
2608 SrcSubscripts.size() != DstSubscripts.size())
2609 return false;
2610
2611 // Statically check that the array bounds are in-range. The first subscript we
2612 // don't have a size for and it cannot overflow into another subscript, so is
2613 // always safe. The others need to be 0 <= subscript[i] < bound, for both src
2614 // and dst.
2615 // FIXME: It may be better to record these sizes and add them as constraints
2616 // to the dependency checks.
2618 if (!validateDelinearizationResult(*SE, Sizes, SrcSubscripts) ||
2619 !validateDelinearizationResult(*SE, Sizes, DstSubscripts))
2620 return false;
2621
2622 return true;
2623}
2624
2625//===----------------------------------------------------------------------===//
2626
2627#ifndef NDEBUG
2628// For debugging purposes, dump a small bit vector to dbgs().
2630 dbgs() << "{";
2631 for (unsigned VI : BV.set_bits()) {
2632 dbgs() << VI;
2633 if (BV.find_next(VI) >= 0)
2634 dbgs() << ' ';
2635 }
2636 dbgs() << "}\n";
2637}
2638#endif
2639
2641 FunctionAnalysisManager::Invalidator &Inv) {
2642 // Check if the analysis itself has been invalidated.
2643 auto PAC = PA.getChecker<DependenceAnalysis>();
2644 if (!PAC.preserved() && !PAC.preservedSet<AllAnalysesOn<Function>>())
2645 return true;
2646
2647 // Check transitive dependencies.
2648 return Inv.invalidate<AAManager>(F, PA) ||
2649 Inv.invalidate<ScalarEvolutionAnalysis>(F, PA) ||
2650 Inv.invalidate<LoopAnalysis>(F, PA);
2651}
2652
2653// depends -
2654// Returns NULL if there is no dependence.
2655// Otherwise, return a Dependence with as many details as possible.
2656// Corresponds to Section 3.1 in the paper
2657//
2658// Practical Dependence Testing
2659// Goff, Kennedy, Tseng
2660// PLDI 1991
2661//
2662std::unique_ptr<Dependence>
2664 bool UnderRuntimeAssumptions) {
2666 bool PossiblyLoopIndependent = true;
2667 if (Src == Dst)
2668 PossiblyLoopIndependent = false;
2669
2670 if (!(Src->mayReadOrWriteMemory() && Dst->mayReadOrWriteMemory()))
2671 // if both instructions don't reference memory, there's no dependence
2672 return nullptr;
2673
2674 if (!isLoadOrStore(Src) || !isLoadOrStore(Dst)) {
2675 // can only analyze simple loads and stores, i.e., no calls, invokes, etc.
2676 LLVM_DEBUG(dbgs() << "can only handle simple loads and stores\n");
2677 return std::make_unique<Dependence>(Src, Dst,
2678 SCEVUnionPredicate(Assume, *SE));
2679 }
2680
2681 const MemoryLocation &DstLoc = MemoryLocation::get(Dst);
2682 const MemoryLocation &SrcLoc = MemoryLocation::get(Src);
2683
2684 switch (underlyingObjectsAlias(AA, F->getDataLayout(), DstLoc, SrcLoc)) {
2687 // cannot analyse objects if we don't understand their aliasing.
2688 LLVM_DEBUG(dbgs() << "can't analyze may or partial alias\n");
2689 return std::make_unique<Dependence>(Src, Dst,
2690 SCEVUnionPredicate(Assume, *SE));
2692 // If the objects noalias, they are distinct, accesses are independent.
2693 LLVM_DEBUG(dbgs() << "no alias\n");
2694 return nullptr;
2696 break; // The underlying objects alias; test accesses for dependence.
2697 }
2698
2699 if (DstLoc.Size != SrcLoc.Size || !DstLoc.Size.isPrecise() ||
2700 !SrcLoc.Size.isPrecise()) {
2701 // The dependence test gets confused if the size of the memory accesses
2702 // differ.
2703 LLVM_DEBUG(dbgs() << "can't analyze must alias with different sizes\n");
2704 return std::make_unique<Dependence>(Src, Dst,
2705 SCEVUnionPredicate(Assume, *SE));
2706 }
2707
2708 Value *SrcPtr = getLoadStorePointerOperand(Src);
2709 Value *DstPtr = getLoadStorePointerOperand(Dst);
2710 const SCEV *SrcSCEV = SE->getSCEV(SrcPtr);
2711 const SCEV *DstSCEV = SE->getSCEV(DstPtr);
2712 LLVM_DEBUG(dbgs() << " SrcSCEV = " << *SrcSCEV << "\n");
2713 LLVM_DEBUG(dbgs() << " DstSCEV = " << *DstSCEV << "\n");
2714 const SCEV *SrcBase = SE->getPointerBase(SrcSCEV);
2715 const SCEV *DstBase = SE->getPointerBase(DstSCEV);
2716 if (SrcBase != DstBase) {
2717 // If two pointers have different bases, trying to analyze indexes won't
2718 // work; we can't compare them to each other. This can happen, for example,
2719 // if one is produced by an LCSSA PHI node.
2720 //
2721 // We check this upfront so we don't crash in cases where getMinusSCEV()
2722 // returns a SCEVCouldNotCompute.
2723 LLVM_DEBUG(dbgs() << "can't analyze SCEV with different pointer base\n");
2724 return std::make_unique<Dependence>(Src, Dst,
2725 SCEVUnionPredicate(Assume, *SE));
2726 }
2727
2728 // Even if the base pointers are the same, they may not be loop-invariant. It
2729 // could lead to incorrect results, as we're analyzing loop-carried
2730 // dependencies. Src and Dst can be in different loops, so we need to check
2731 // the base pointer is invariant in both loops.
2732 Loop *SrcLoop = LI->getLoopFor(Src->getParent());
2733 Loop *DstLoop = LI->getLoopFor(Dst->getParent());
2734 if (!isLoopInvariant(SrcBase, SrcLoop) ||
2735 !isLoopInvariant(DstBase, DstLoop)) {
2736 LLVM_DEBUG(dbgs() << "The base pointer is not loop invariant.\n");
2737 return std::make_unique<Dependence>(Src, Dst,
2738 SCEVUnionPredicate(Assume, *SE));
2739 }
2740
2741 uint64_t EltSize = SrcLoc.Size.toRaw();
2742 const SCEV *SrcEv = SE->getMinusSCEV(SrcSCEV, SrcBase);
2743 const SCEV *DstEv = SE->getMinusSCEV(DstSCEV, DstBase);
2744
2745 // Check that memory access offsets are multiples of element sizes.
2746 if (!SE->isKnownMultipleOf(SrcEv, EltSize, Assume) ||
2747 !SE->isKnownMultipleOf(DstEv, EltSize, Assume)) {
2748 LLVM_DEBUG(dbgs() << "can't analyze SCEV with different offsets\n");
2749 return std::make_unique<Dependence>(Src, Dst,
2750 SCEVUnionPredicate(Assume, *SE));
2751 }
2752
2753 // Runtime assumptions needed but not allowed.
2754 if (!Assume.empty() && !UnderRuntimeAssumptions)
2755 return std::make_unique<Dependence>(Src, Dst,
2756 SCEVUnionPredicate(Assume, *SE));
2757
2758 unsigned Pairs = 1;
2759 SmallVector<Subscript, 2> Pair(Pairs);
2760 Pair[0].Src = SrcEv;
2761 Pair[0].Dst = DstEv;
2762 if (Delinearize) {
2763 if (tryDelinearize(Src, Dst, Pair)) {
2764 LLVM_DEBUG(dbgs() << " delinearized\n");
2765 Pairs = Pair.size();
2766 }
2767 }
2768
2769 // Establish loop nesting levels considering SameSD loops as common
2770 establishNestingLevels(Src, Dst);
2771
2772 LLVM_DEBUG(dbgs() << " common nesting levels = " << CommonLevels << "\n");
2773 LLVM_DEBUG(dbgs() << " maximum nesting levels = " << MaxLevels << "\n");
2774 LLVM_DEBUG(dbgs() << " SameSD nesting levels = " << SameSDLevels << "\n");
2775
2776 // Modify common levels to consider the SameSD levels in the tests
2777 CommonLevels += SameSDLevels;
2778 MaxLevels -= SameSDLevels;
2779 if (SameSDLevels > 0) {
2780 // Not all tests are handled yet over SameSD loops
2781 // Revoke if there are any tests other than ZIV, SIV or RDIV
2782 for (unsigned P = 0; P < Pairs; ++P) {
2784 Subscript::ClassificationKind TestClass =
2785 classifyPair(Pair[P].Src, LI->getLoopFor(Src->getParent()),
2786 Pair[P].Dst, LI->getLoopFor(Dst->getParent()), Loops);
2787
2788 if (TestClass != Subscript::ZIV && TestClass != Subscript::SIV &&
2789 TestClass != Subscript::RDIV) {
2790 // Revert the levels to not consider the SameSD levels
2791 CommonLevels -= SameSDLevels;
2792 MaxLevels += SameSDLevels;
2793 SameSDLevels = 0;
2794 break;
2795 }
2796 }
2797 }
2798
2799 if (SameSDLevels > 0)
2800 SameSDLoopsCount++;
2801
2802 FullDependence Result(Src, Dst, SCEVUnionPredicate(Assume, *SE),
2803 PossiblyLoopIndependent, CommonLevels);
2804 ++TotalArrayPairs;
2805
2806 for (unsigned P = 0; P < Pairs; ++P) {
2807 assert(Pair[P].Src->getType()->isIntegerTy() && "Src must be an integer");
2808 assert(Pair[P].Dst->getType()->isIntegerTy() && "Dst must be an integer");
2809 Pair[P].Loops.resize(MaxLevels + 1);
2810 Pair[P].GroupLoops.resize(MaxLevels + 1);
2811 Pair[P].Group.resize(Pairs);
2812 Pair[P].Classification =
2813 classifyPair(Pair[P].Src, LI->getLoopFor(Src->getParent()), Pair[P].Dst,
2814 LI->getLoopFor(Dst->getParent()), Pair[P].Loops);
2815 Pair[P].GroupLoops = Pair[P].Loops;
2816 Pair[P].Group.set(P);
2817 LLVM_DEBUG(dbgs() << " subscript " << P << "\n");
2818 LLVM_DEBUG(dbgs() << "\tsrc = " << *Pair[P].Src << "\n");
2819 LLVM_DEBUG(dbgs() << "\tdst = " << *Pair[P].Dst << "\n");
2820 LLVM_DEBUG(dbgs() << "\tclass = " << Pair[P].Classification << "\n");
2821 LLVM_DEBUG(dbgs() << "\tloops = ");
2823 }
2824
2825 // Test each subscript individually
2826 for (unsigned SI = 0; SI < Pairs; ++SI) {
2827 LLVM_DEBUG(dbgs() << "testing subscript " << SI);
2828
2829 // Attempt signed range test first.
2830 ConstantRange SrcRange = SE->getSignedRange(Pair[SI].Src);
2831 ConstantRange DstRange = SE->getSignedRange(Pair[SI].Dst);
2832 if (SrcRange.intersectWith(DstRange).isEmptySet())
2833 return nullptr;
2834
2835 switch (Pair[SI].Classification) {
2836 case Subscript::NonLinear:
2837 // ignore these, but collect loops for later
2838 ++NonlinearSubscriptPairs;
2839 collectCommonLoops(Pair[SI].Src, LI->getLoopFor(Src->getParent()),
2840 Pair[SI].Loops);
2841 collectCommonLoops(Pair[SI].Dst, LI->getLoopFor(Dst->getParent()),
2842 Pair[SI].Loops);
2843 break;
2844 case Subscript::ZIV:
2845 LLVM_DEBUG(dbgs() << ", ZIV\n");
2846 if (testZIV(Pair[SI].Src, Pair[SI].Dst, Result))
2847 return nullptr;
2848 break;
2849 case Subscript::SIV: {
2850 LLVM_DEBUG(dbgs() << ", SIV\n");
2851 unsigned Level;
2852 if (testSIV(Pair[SI].Src, Pair[SI].Dst, Level, Result,
2853 UnderRuntimeAssumptions))
2854 return nullptr;
2855 break;
2856 }
2857 case Subscript::RDIV:
2858 LLVM_DEBUG(dbgs() << ", RDIV\n");
2859 if (testRDIV(Pair[SI].Src, Pair[SI].Dst, Result))
2860 return nullptr;
2861 break;
2862 case Subscript::MIV:
2863 LLVM_DEBUG(dbgs() << ", MIV\n");
2864 if (testMIV(Pair[SI].Src, Pair[SI].Dst, Pair[SI].Loops, Result))
2865 return nullptr;
2866 break;
2867 }
2868 }
2869
2870 // Make sure the Scalar flags are set correctly.
2871 SmallBitVector CompleteLoops(MaxLevels + 1);
2872 for (unsigned SI = 0; SI < Pairs; ++SI)
2873 CompleteLoops |= Pair[SI].Loops;
2874 for (unsigned II = 1; II <= CommonLevels; ++II)
2875 if (CompleteLoops[II])
2876 Result.DV[II - 1].Scalar = false;
2877
2878 // Set the distance to zero if the direction is EQ.
2879 // TODO: Ideally, the distance should be set to 0 immediately simultaneously
2880 // with the corresponding direction being set to EQ.
2881 for (unsigned II = 1; II <= Result.getLevels(); ++II) {
2882 if (Result.getDirection(II) == Dependence::DVEntry::EQ) {
2883 if (Result.DV[II - 1].Distance == nullptr)
2884 Result.DV[II - 1].Distance = SE->getZero(SrcSCEV->getType());
2885 else
2886 assert(Result.DV[II - 1].Distance->isZero() &&
2887 "Inconsistency between distance and direction");
2888 }
2889
2890#ifndef NDEBUG
2891 // Check that the converse (i.e., if the distance is zero, then the
2892 // direction is EQ) holds.
2893 const SCEV *Distance = Result.getDistance(II);
2894 if (Distance && Distance->isZero())
2895 assert(Result.getDirection(II) == Dependence::DVEntry::EQ &&
2896 "Distance is zero, but direction is not EQ");
2897#endif
2898 }
2899
2900 if (SameSDLevels > 0) {
2901 // Extracting SameSD levels from the common levels
2902 // Reverting CommonLevels and MaxLevels to their original values
2903 assert(CommonLevels >= SameSDLevels);
2904 CommonLevels -= SameSDLevels;
2905 MaxLevels += SameSDLevels;
2906 std::unique_ptr<FullDependence::DVEntry[]> DV, DVSameSD;
2907 DV = std::make_unique<FullDependence::DVEntry[]>(CommonLevels);
2908 DVSameSD = std::make_unique<FullDependence::DVEntry[]>(SameSDLevels);
2909 for (unsigned Level = 0; Level < CommonLevels; ++Level)
2910 DV[Level] = Result.DV[Level];
2911 for (unsigned Level = 0; Level < SameSDLevels; ++Level)
2912 DVSameSD[Level] = Result.DV[CommonLevels + Level];
2913 Result.DV = std::move(DV);
2914 Result.DVSameSD = std::move(DVSameSD);
2915 Result.Levels = CommonLevels;
2916 Result.SameSDLevels = SameSDLevels;
2917 }
2918
2919 if (PossiblyLoopIndependent) {
2920 // Make sure the LoopIndependent flag is set correctly.
2921 // All directions must include equal, otherwise no
2922 // loop-independent dependence is possible.
2923 for (unsigned II = 1; II <= CommonLevels; ++II) {
2924 if (!(Result.getDirection(II) & Dependence::DVEntry::EQ)) {
2925 Result.LoopIndependent = false;
2926 break;
2927 }
2928 }
2929 } else {
2930 // On the other hand, if all directions are equal and there's no
2931 // loop-independent dependence possible, then no dependence exists.
2932 // However, if there are runtime assumptions, we must return the result.
2933 bool AllEqual = true;
2934 for (unsigned II = 1; II <= CommonLevels; ++II) {
2935 if (Result.getDirection(II) != Dependence::DVEntry::EQ) {
2936 AllEqual = false;
2937 break;
2938 }
2939 }
2940 if (AllEqual && Result.Assumptions.getPredicates().empty())
2941 return nullptr;
2942 }
2943
2944 return std::make_unique<FullDependence>(std::move(Result));
2945}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:856
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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 std::optional< bool > findGCD(unsigned Bits, const APInt &AM, const APInt &BM, const APInt &Delta, APInt &G, APInt &X, APInt &Y)
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 void dumpSmallBitVector(SmallBitVector &BV)
static BanerjeeInterval emptyInterval(Type *Ty, ScalarEvolution &SE)
Return the canonical empty interval [1, 0].
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 BanerjeeInterval constantInterval(const SCEV *C)
Return the singleton interval containing C.
static Type * getBanerjeeBaseType(const SCEV *Src, const SCEV *Dst, ScalarEvolution &SE)
Return the widest type used by a subscript or by an exact backedge-taken count of one of its recurren...
static BanerjeeInterval variableInterval(const SCEV *Coeff, const SCEV *Upper, ScalarEvolution &SE)
Compute the range of Coeff * X for 0 <= X <= Upper.
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 BanerjeeInterval strictDirectionIntervalWithUnknownUpperBound(const SCEV *ACoeff, const SCEV *BCoeff, unsigned char Direction, ScalarEvolution &SE)
Compute any finite one-sided bound on.
static const SCEV * evaluateSubscriptDifference(const SCEV *A, const SCEV *SrcIndex, const SCEV *B, const SCEV *DstIndex, ScalarEvolution &SE)
Evaluate one loop level's contribution A * SrcIndex - B * DstIndex to the complete source-minus-desti...
static bool isRemainderZero(const SCEVConstant *Dividend, const SCEVConstant *Divisor)
static BanerjeeInterval signedRangeInterval(const SCEV *Coeff, const SCEV *Lower, const SCEV *Upper, ScalarEvolution &SE)
Compute the range of Coeff * X for Lower <=s X <=s Upper.
static BanerjeeInterval intervalFromValues(ArrayRef< const SCEV * > Values, ScalarEvolution &SE)
Return the smallest closed interval containing Values.
static cl::opt< bool > Delinearize("da-delinearize", cl::init(true), cl::Hidden, cl::desc("Try to delinearize array references."))
static BanerjeeInterval addIntervals(const BanerjeeInterval &A, const BanerjeeInterval &B, ScalarEvolution &SE)
Add two intervals.
static cl::opt< DependenceTestType > EnableDependenceTest("da-enable-dependence-test", cl::init(DependenceTestType::Default), 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::Default, "default", "Enable all dependence test routines except " "Banerjee MIV (default)."), 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< 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 BanerjeeInterval intersectIntervals(const BanerjeeInterval &A, const BanerjeeInterval &B, ScalarEvolution &SE)
Intersect two intervals.
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."))
@ Default
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
std::pair< uint64_t, uint64_t > Interval
#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
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
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:119
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
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
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:424
static LLVM_ABI void sdivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Definition APInt.cpp:1925
APInt abs() const
Get the absolute value.
Definition APInt.h:1820
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition APInt.h:1210
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1513
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:1670
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:1771
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:1139
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()
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
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:767
@ ICMP_NE
not equal
Definition InstrTypes.h:762
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
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:348
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:587
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.
The legacy pass manager's analysis pass to compute loop information.
Definition LoopInfo.h:612
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
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
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.
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 bool isKnownNonNegative(const SCEV *S)
Test if the given expression is known to be non-negative.
LLVM_ABI const SCEV * getNegativeSCEV(const SCEV *V, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap)
Return the SCEV object corresponding to -V.
LLVM_ABI Type * getWiderType(Type *Ty1, Type *Ty2) const
LLVM_ABI bool isKnownNonPositive(const SCEV *S)
Test if the given expression is known to be non-positive.
LLVM_ABI bool isKnownNegative(const SCEV *S)
Test if the given expression is known to be negative.
LLVM_ABI const SCEV * getBackedgeTakenCount(const Loop *L, ExitCountKind Kind=Exact)
If the specified loop has a predictable backedge-taken count, return it, otherwise return a SCEVCould...
LLVM_ABI const SCEV * getSMinExpr(SCEVUse LHS, SCEVUse RHS)
const SCEV * getZero(Type *Ty)
Return a SCEV for the constant 0 of a specific type.
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.
const SCEV * getOne(Type *Ty)
Return a SCEV for the constant 1 of a specific type.
LLVM_ABI const SCEV * getMulExpr(SmallVectorImpl< SCEVUse > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Get a canonical multiply expression, or something simpler if possible.
LLVM_ABI const SCEV * getAddExpr(SmallVectorImpl< SCEVUse > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Get a canonical add expression, or something simpler if possible.
LLVM_ABI bool isKnownPredicate(CmpPredicate Pred, SCEVUse LHS, SCEVUse RHS)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
LLVM_ABI const SCEV * getSMaxExpr(SCEVUse LHS, SCEVUse 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
LLVM Value Representation.
Definition Value.h:75
LLVM_ABI Value(Type *Ty, unsigned scid)
Definition Value.cpp:54
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
#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:2279
const APInt & smax(const APInt &A, const APInt &B)
Determine the larger of two APInts considered to be signed.
Definition APInt.h:2284
LLVM_ABI APInt GreatestCommonDivisor(APInt A, APInt B)
Compute GCD of two unsigned APInt values.
Definition APInt.cpp:830
constexpr bool operator!(E Val)
@ 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.
InstIterator< SymbolTableList< BasicBlock >, Function::iterator, BasicBlock::iterator, Instruction > inst_iterator
LLVM_ABI void collectParametricTerms(ScalarEvolution &SE, const SCEV *Expr, SmallVectorImpl< const SCEV * > &Terms)
Collect parametric terms occurring in step expressions (first step of delinearization).
LLVM_ABI 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...
RelativeUniformCounterPtr Values
Definition InstrProf.h:91
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:2266
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)
LLVM_ABI 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.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
LLVM_ABI 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)...
LLVM_ABI 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:209
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:2219
APInt operator+(APInt a, const APInt &b)
Definition APInt.h:2224
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.
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#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...