LLVM 23.0.0git
DependenceAnalysis.h
Go to the documentation of this file.
1//===-- llvm/Analysis/DependenceAnalysis.h -------------------- -*- 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 implementation of the approach described in
11//
12// Practical Dependence Testing
13// Goff, Kennedy, Tseng
14// PLDI 1991
15//
16// There's a single entry point that analyzes the dependence between a pair
17// of memory references in a function, returning either NULL, for no dependence,
18// or a more-or-less detailed description of the dependence between them.
19//
20// This pass exists to support the DependenceGraph pass. There are two separate
21// passes because there's a useful separation of concerns. A dependence exists
22// if two conditions are met:
23//
24// 1) Two instructions reference the same memory location, and
25// 2) There is a flow of control leading from one instruction to the other.
26//
27// DependenceAnalysis attacks the first condition; DependenceGraph will attack
28// the second (it's not yet ready).
29//
30// Please note that this is work in progress and the interface is subject to
31// change.
32//
33// Plausible changes:
34// Return a set of more precise dependences instead of just one dependence
35// summarizing all.
36//
37//===----------------------------------------------------------------------===//
38
39#ifndef LLVM_ANALYSIS_DEPENDENCEANALYSIS_H
40#define LLVM_ANALYSIS_DEPENDENCEANALYSIS_H
41
45#include "llvm/IR/PassManager.h"
46#include "llvm/Pass.h"
48
49namespace llvm {
50class AAResults;
51template <typename T> class ArrayRef;
52class Loop;
53class LoopInfo;
54class SCEVConstant;
55class raw_ostream;
56
57/// Dependence - This class represents a dependence between two memory
58/// memory references in a function. It contains minimal information and
59/// is used in the very common situation where the compiler is unable to
60/// determine anything beyond the existence of a dependence; that is, it
61/// represents a confused dependence (see also FullDependence). In most
62/// cases (for output, flow, and anti dependences), the dependence implies
63/// an ordering, where the source must precede the destination; in contrast,
64/// input dependences are unordered.
65///
66/// When a dependence graph is built, each Dependence will be a member of
67/// the set of predecessor edges for its destination instruction and a set
68/// if successor edges for its source instruction. These sets are represented
69/// as singly-linked lists, with the "next" fields stored in the dependence
70/// itelf.
72protected:
73 Dependence(Dependence &&) = default;
75
76public:
77 Dependence(Instruction *Source, Instruction *Destination,
78 const SCEVUnionPredicate &A)
79 : Src(Source), Dst(Destination), Assumptions(A) {}
80 virtual ~Dependence() = default;
81
82 /// Dependence::DVEntry - Each level in the distance/direction vector
83 /// has a direction (or perhaps a union of several directions), and
84 /// perhaps a distance.
85 /// The dependency information could be across a single loop level or across
86 /// two separate levels that have the same trip count and nesting depth,
87 /// which helps to provide information for loop fusion candidation.
88 /// For example, loops b and c have the same iteration count and depth:
89 /// for (a = ...) {
90 /// for (b = 0; b < 10; b++) {
91 /// }
92 /// for (c = 0; c < 10; c++) {
93 /// }
94 /// }
95 struct DVEntry {
96 enum : unsigned char {
97 NONE = 0,
98 LT = 1,
99 EQ = 2,
100 LE = 3,
101 GT = 4,
102 NE = 5,
103 GE = 6,
104 ALL = 7
105 };
106 unsigned char Direction : 3; // Init to ALL, then refine.
107 bool Scalar : 1; // Init to true.
108 const SCEV *Distance = nullptr; // NULL implies no distance available.
110 };
111
112 /// getSrc - Returns the source instruction for this dependence.
113 Instruction *getSrc() const { return Src; }
114
115 /// getDst - Returns the destination instruction for this dependence.
116 Instruction *getDst() const { return Dst; }
117
118 /// isInput - Returns true if this is an input dependence.
119 bool isInput() const;
120
121 /// isOutput - Returns true if this is an output dependence.
122 bool isOutput() const;
123
124 /// isFlow - Returns true if this is a flow (aka true) dependence.
125 bool isFlow() const;
126
127 /// isAnti - Returns true if this is an anti dependence.
128 bool isAnti() const;
129
130 /// isOrdered - Returns true if dependence is Output, Flow, or Anti
131 bool isOrdered() const { return isOutput() || isFlow() || isAnti(); }
132
133 /// isUnordered - Returns true if dependence is Input
134 bool isUnordered() const { return isInput(); }
135
136 /// isLoopIndependent - Returns true if this is a loop-independent
137 /// dependence.
138 virtual bool isLoopIndependent() const { return true; }
139
140 /// isConfused - Returns true if this dependence is confused
141 /// (the compiler understands nothing and makes worst-case assumptions).
142 virtual bool isConfused() const { return true; }
143
144 /// getLevels - Returns the number of common loops surrounding the
145 /// source and destination of the dependence.
146 virtual unsigned getLevels() const { return 0; }
147
148 /// getSameSDLevels - Returns the number of separate SameSD loops surrounding
149 /// the source and destination of the dependence.
150 virtual unsigned getSameSDLevels() const { return 0; }
151
152 /// getDVEntry - Returns the DV entry associated with a regular or a
153 /// SameSD level
154 DVEntry getDVEntry(unsigned Level, bool IsSameSD) const;
155
156 /// getDirection - Returns the direction associated with a particular
157 /// common or SameSD level.
158 virtual unsigned getDirection(unsigned Level, bool SameSD = false) const {
159 return DVEntry::ALL;
160 }
161
162 /// getDistance - Returns the distance (or NULL) associated with a
163 /// particular common or SameSD level.
164 virtual const SCEV *getDistance(unsigned Level, bool SameSD = false) const {
165 return nullptr;
166 }
167
168 /// Check if the direction vector is negative. A negative direction
169 /// vector means Src and Dst are reversed in the actual program.
170 virtual bool isDirectionNegative() const { return false; }
171
172 /// If the direction vector is negative, normalize the direction
173 /// vector to make it non-negative. Normalization is done by reversing
174 /// Src and Dst, plus reversing the dependence directions and distances
175 /// in the vector.
176 virtual bool normalize(ScalarEvolution *SE) { return false; }
177
178 /// inSameSDLoops - Returns true if this level is an SameSD level, i.e.,
179 /// performed across two separate loop nests that have the Same Iteration and
180 /// Depth.
181 virtual bool inSameSDLoops(unsigned Level) const { return false; }
182
183 /// isScalar - Returns true if a particular regular or SameSD level is
184 /// scalar; that is, if no subscript in the source or destination mention
185 /// the induction variable associated with the loop at this level.
186 virtual bool isScalar(unsigned Level, bool SameSD = false) const;
187
188 /// getNextPredecessor - Returns the value of the NextPredecessor field.
189 const Dependence *getNextPredecessor() const { return NextPredecessor; }
190
191 /// getNextSuccessor - Returns the value of the NextSuccessor field.
192 const Dependence *getNextSuccessor() const { return NextSuccessor; }
193
194 /// setNextPredecessor - Sets the value of the NextPredecessor
195 /// field.
196 void setNextPredecessor(const Dependence *pred) { NextPredecessor = pred; }
197
198 /// setNextSuccessor - Sets the value of the NextSuccessor field.
199 void setNextSuccessor(const Dependence *succ) { NextSuccessor = succ; }
200
201 /// getRuntimeAssumptions - Returns the runtime assumptions under which this
202 /// Dependence relation is valid.
203 SCEVUnionPredicate getRuntimeAssumptions() const { return Assumptions; }
204
205 /// dump - For debugging purposes, dumps a dependence to OS.
206 void dump(raw_ostream &OS) const;
207
208 /// dumpImp - For debugging purposes. Dumps a dependence to OS with or
209 /// without considering the SameSD levels.
210 void dumpImp(raw_ostream &OS, bool IsSameSD = false) const;
211
212protected:
214
215private:
216 SCEVUnionPredicate Assumptions;
217 const Dependence *NextPredecessor = nullptr, *NextSuccessor = nullptr;
218 friend class DependenceInfo;
219};
220
221/// FullDependence - This class represents a dependence between two memory
222/// references in a function. It contains detailed information about the
223/// dependence (direction vectors, etc.) and is used when the compiler is
224/// able to accurately analyze the interaction of the references; that is,
225/// it is not a confused dependence (see Dependence). In most cases
226/// (for output, flow, and anti dependences), the dependence implies an
227/// ordering, where the source must precede the destination; in contrast,
228/// input dependences are unordered.
229class LLVM_ABI FullDependence final : public Dependence {
230public:
231 FullDependence(Instruction *Source, Instruction *Destination,
232 const SCEVUnionPredicate &Assumes,
233 bool PossiblyLoopIndependent, unsigned Levels);
234
235 /// isLoopIndependent - Returns true if this is a loop-independent
236 /// dependence.
237 bool isLoopIndependent() const override { return LoopIndependent; }
238
239 /// isConfused - Returns true if this dependence is confused
240 /// (the compiler understands nothing and makes worst-case
241 /// assumptions).
242 bool isConfused() const override { return false; }
243
244 /// getLevels - Returns the number of common loops surrounding the
245 /// source and destination of the dependence.
246 unsigned getLevels() const override { return Levels; }
247
248 /// getSameSDLevels - Returns the number of separate SameSD loops surrounding
249 /// the source and destination of the dependence.
250 unsigned getSameSDLevels() const override { return SameSDLevels; }
251
252 /// getDVEntry - Returns the DV entry associated with a regular or a
253 /// SameSD level.
254 DVEntry getDVEntry(unsigned Level, bool IsSameSD) const {
255 if (!IsSameSD) {
256 assert(0 < Level && Level <= Levels && "Level out of range");
257 return DV[Level - 1];
258 } else {
259 assert(Levels < Level &&
260 Level <= static_cast<unsigned>(Levels) + SameSDLevels &&
261 "isSameSD level out of range");
262 return DVSameSD[Level - Levels - 1];
263 }
264 }
265
266 /// getDirection - Returns the direction associated with a particular
267 /// common or SameSD level.
268 unsigned getDirection(unsigned Level, bool SameSD = false) const override;
269
270 /// getDistance - Returns the distance (or NULL) associated with a
271 /// particular common or SameSD level.
272 const SCEV *getDistance(unsigned Level, bool SameSD = false) const override;
273
274 /// Check if the direction vector is negative. A negative direction
275 /// vector means Src and Dst are reversed in the actual program.
276 bool isDirectionNegative() const override;
277
278 /// If the direction vector is negative, normalize the direction
279 /// vector to make it non-negative. Normalization is done by reversing
280 /// Src and Dst, plus reversing the dependence directions and distances
281 /// in the vector.
282 bool normalize(ScalarEvolution *SE) override;
283
284 /// inSameSDLoops - Returns true if this level is an SameSD level, i.e.,
285 /// performed across two separate loop nests that have the Same Iteration and
286 /// Depth.
287 bool inSameSDLoops(unsigned Level) const override;
288
289 /// isScalar - Returns true if a particular regular or SameSD level is
290 /// scalar; that is, if no subscript in the source or destination mention
291 /// the induction variable associated with the loop at this level.
292 bool isScalar(unsigned Level, bool SameSD = false) const override;
293
294private:
295 unsigned short Levels;
296 unsigned short SameSDLevels;
297 bool LoopIndependent;
298 std::unique_ptr<DVEntry[]> DV;
299 std::unique_ptr<DVEntry[]> DVSameSD; // DV entries on SameSD levels
300 friend class DependenceInfo;
301};
302
303/// DependenceInfo - This class is the main dependence-analysis driver.
305public:
307 : AA(AA), SE(SE), LI(LI), F(F) {}
308
309 /// Handle transitive invalidation when the cached analysis results go away.
311 FunctionAnalysisManager::Invalidator &Inv);
312
313 /// depends - Tests for a dependence between the Src and Dst instructions.
314 /// Returns NULL if no dependence; otherwise, returns a Dependence (or a
315 /// FullDependence) with as much information as can be gleaned. By default,
316 /// the dependence test collects a set of runtime assumptions that cannot be
317 /// solved at compilation time. By default UnderRuntimeAssumptions is false
318 /// for a safe approximation of the dependence relation that does not
319 /// require runtime checks.
320 LLVM_ABI std::unique_ptr<Dependence>
322 bool UnderRuntimeAssumptions = false);
323
324 Function *getFunction() const { return F; }
325
326private:
327 AAResults *AA;
328 ScalarEvolution *SE;
329 LoopInfo *LI;
330 Function *F;
331
332 /// Subscript - This private struct represents a pair of subscripts from
333 /// a pair of potentially multi-dimensional array references. We use a
334 /// vector of them to guide subscript partitioning.
335 struct Subscript {
336 const SCEV *Src;
337 const SCEV *Dst;
338 enum ClassificationKind { ZIV, SIV, RDIV, MIV, NonLinear } Classification;
339 SmallBitVector Loops;
340 SmallBitVector GroupLoops;
341 SmallBitVector Group;
342 };
343
344 struct CoefficientInfo {
345 const SCEV *Coeff;
346 const SCEV *PosPart;
347 const SCEV *NegPart;
348 const SCEV *Iterations;
349 };
350
351 struct BoundInfo {
352 const SCEV *Iterations;
353 const SCEV *Upper[8];
354 const SCEV *Lower[8];
355 unsigned char Direction;
356 unsigned char DirSet;
357 };
358
359 /// Returns true if two loops have the Same iteration Space and Depth. To be
360 /// more specific, two loops have SameSD if they are in the same nesting
361 /// depth and have the same backedge count. SameSD stands for Same iteration
362 /// Space and Depth.
363 bool haveSameSD(const Loop *SrcLoop, const Loop *DstLoop) const;
364
365 /// establishNestingLevels - Examines the loop nesting of the Src and Dst
366 /// instructions and establishes their shared loops. Sets the variables
367 /// CommonLevels, SrcLevels, and MaxLevels.
368 /// The source and destination instructions needn't be contained in the same
369 /// loop. The routine establishNestingLevels finds the level of most deeply
370 /// nested loop that contains them both, CommonLevels. An instruction that's
371 /// not contained in a loop is at level = 0. MaxLevels is equal to the level
372 /// of the source plus the level of the destination, minus CommonLevels.
373 /// This lets us allocate vectors MaxLevels in length, with room for every
374 /// distinct loop referenced in both the source and destination subscripts.
375 /// The variable SrcLevels is the nesting depth of the source instruction.
376 /// It's used to help calculate distinct loops referenced by the destination.
377 /// Here's the map from loops to levels:
378 /// 0 - unused
379 /// 1 - outermost common loop
380 /// ... - other common loops
381 /// CommonLevels - innermost common loop
382 /// ... - loops containing Src but not Dst
383 /// SrcLevels - innermost loop containing Src but not Dst
384 /// ... - loops containing Dst but not Src
385 /// MaxLevels - innermost loop containing Dst but not Src
386 /// Consider the follow code fragment:
387 /// for (a = ...) {
388 /// for (b = ...) {
389 /// for (c = ...) {
390 /// for (d = ...) {
391 /// A[] = ...;
392 /// }
393 /// }
394 /// for (e = ...) {
395 /// for (f = ...) {
396 /// for (g = ...) {
397 /// ... = A[];
398 /// }
399 /// }
400 /// }
401 /// }
402 /// }
403 /// If we're looking at the possibility of a dependence between the store
404 /// to A (the Src) and the load from A (the Dst), we'll note that they
405 /// have 2 loops in common, so CommonLevels will equal 2 and the direction
406 /// vector for Result will have 2 entries. SrcLevels = 4 and MaxLevels = 7.
407 /// A map from loop names to level indices would look like
408 /// a - 1
409 /// b - 2 = CommonLevels
410 /// c - 3
411 /// d - 4 = SrcLevels
412 /// e - 5
413 /// f - 6
414 /// g - 7 = MaxLevels
415 /// SameSDLevels counts the number of levels after common levels that are
416 /// not common but have the same iteration space and depth. Internally this
417 /// is checked using haveSameSD. Assume that in this code fragment, levels c
418 /// and e have the same iteration space and depth, but levels d and f does
419 /// not. Then SameSDLevels is set to 1. In that case the level numbers for the
420 /// previous code look like
421 /// a - 1
422 /// b - 2
423 /// c,e - 3 = CommonLevels
424 /// d - 4 = SrcLevels
425 /// f - 5
426 /// g - 6 = MaxLevels
427 void establishNestingLevels(const Instruction *Src, const Instruction *Dst);
428
429 unsigned CommonLevels, SrcLevels, MaxLevels, SameSDLevels;
430
431 /// mapSrcLoop - Given one of the loops containing the source, return
432 /// its level index in our numbering scheme.
433 unsigned mapSrcLoop(const Loop *SrcLoop) const;
434
435 /// mapDstLoop - Given one of the loops containing the destination,
436 /// return its level index in our numbering scheme.
437 unsigned mapDstLoop(const Loop *DstLoop) const;
438
439 /// isLoopInvariant - Returns true if Expression is loop invariant
440 /// in LoopNest.
441 bool isLoopInvariant(const SCEV *Expression, const Loop *LoopNest) const;
442
443 /// collectCommonLoops - Finds the set of loops from the LoopNest that
444 /// have a level <= CommonLevels and are referred to by the SCEV Expression.
445 void collectCommonLoops(const SCEV *Expression, const Loop *LoopNest,
446 SmallBitVector &Loops) const;
447
448 /// checkSrcSubscript - Examines the SCEV Src, returning true iff it's
449 /// linear. Collect the set of loops mentioned by Src.
450 bool checkSrcSubscript(const SCEV *Src, const Loop *LoopNest,
451 SmallBitVector &Loops);
452
453 /// checkDstSubscript - Examines the SCEV Dst, returning true iff it's
454 /// linear. Collect the set of loops mentioned by Dst.
455 bool checkDstSubscript(const SCEV *Dst, const Loop *LoopNest,
456 SmallBitVector &Loops);
457
458 /// collectUpperBound - All subscripts are the same type (on my machine,
459 /// an i64). The loop bound may be a smaller type. collectUpperBound
460 /// find the bound, if available, and zero extends it to the Type T.
461 /// (I zero extend since the bound should always be >= 0.)
462 /// If no upper bound is available, return NULL.
463 const SCEV *collectUpperBound(const Loop *l, Type *T) const;
464
465 /// collectConstantUpperBound - Calls collectUpperBound(), then
466 /// attempts to cast it to SCEVConstant. If the cast fails,
467 /// returns NULL.
468 const SCEVConstant *collectConstantUpperBound(const Loop *l, Type *T) const;
469
470 /// classifyPair - Examines the subscript pair (the Src and Dst SCEVs)
471 /// and classifies it as either ZIV, SIV, RDIV, MIV, or Nonlinear.
472 /// Collects the associated loops in a set.
473 Subscript::ClassificationKind
474 classifyPair(const SCEV *Src, const Loop *SrcLoopNest, const SCEV *Dst,
475 const Loop *DstLoopNest, SmallBitVector &Loops);
476
477 /// testZIV - Tests the ZIV subscript pair (Src and Dst) for dependence.
478 /// Returns true if any possible dependence is disproved.
479 /// If there might be a dependence, returns false.
480 /// If the dependence isn't proven to exist,
481 bool testZIV(const SCEV *Src, const SCEV *Dst, FullDependence &Result) const;
482
483 /// testSIV - Tests the SIV subscript pair (Src and Dst) for dependence.
484 /// Things of the form [c1 + a1*i] and [c2 + a2*j], where
485 /// i and j are induction variables, c1 and c2 are loop invariant,
486 /// and a1 and a2 are constant.
487 /// Returns true if any possible dependence is disproved.
488 /// If there might be a dependence, returns false.
489 /// Sets appropriate direction vector entry and, when possible,
490 /// the distance vector entry.
491 /// If the dependence isn't proven to exist,
492 bool testSIV(const SCEV *Src, const SCEV *Dst, unsigned &Level,
493 FullDependence &Result, bool UnderRuntimeAssumptions);
494
495 /// testRDIV - Tests the RDIV subscript pair (Src and Dst) for dependence.
496 /// Things of the form [c1 + a1*i] and [c2 + a2*j]
497 /// where i and j are induction variables, c1 and c2 are loop invariant,
498 /// and a1 and a2 are constant.
499 /// With minor algebra, this test can also be used for things like
500 /// [c1 + a1*i + a2*j][c2].
501 /// Returns true if any possible dependence is disproved.
502 /// If there might be a dependence, returns false.
503 bool testRDIV(const SCEV *Src, const SCEV *Dst, FullDependence &Result) const;
504
505 /// testMIV - Tests the MIV subscript pair (Src and Dst) for dependence.
506 /// Returns true if dependence disproved.
507 /// Can sometimes refine direction vectors.
508 bool testMIV(const SCEV *Src, const SCEV *Dst, const SmallBitVector &Loops,
509 FullDependence &Result) const;
510
511 /// strongSIVtest - Tests the strong SIV subscript pair (\p Src and \p Dst)
512 /// for dependence.
513 /// Things of the form [c1 + a*i] and [c2 + a*i],
514 /// where i is an induction variable, c1 and c2 are loop invariant,
515 /// and a is a constant
516 /// Returns true if any possible dependence is disproved.
517 /// If there might be a dependence, returns false.
518 /// Sets appropriate direction and distance.
519 bool strongSIVtest(const SCEVAddRecExpr *Src, const SCEVAddRecExpr *Dst,
520 unsigned Level, FullDependence &Result,
521 bool UnderRuntimeAssumptions);
522
523 /// weakCrossingSIVtest - Tests the weak-crossing SIV subscript pair
524 /// (Src and Dst) for dependence.
525 /// Things of the form [c1 + a*i] and [c2 - a*i],
526 /// where i is an induction variable, c1 and c2 are loop invariant,
527 /// and a is a constant.
528 /// Returns true if any possible dependence is disproved.
529 /// If there might be a dependence, returns false.
530 /// Sets appropriate direction entry.
531 bool weakCrossingSIVtest(const SCEV *SrcCoeff, const SCEV *SrcConst,
532 const SCEV *DstConst, const Loop *CurrentSrcLoop,
533 const Loop *CurrentDstLoop, unsigned Level,
534 FullDependence &Result) const;
535
536 /// ExactSIVtest - Tests the SIV subscript pair
537 /// (Src and Dst) for dependence.
538 /// Things of the form [c1 + a1*i] and [c2 + a2*i],
539 /// where i is an induction variable, c1 and c2 are loop invariant,
540 /// and a1 and a2 are constant.
541 /// Returns true if any possible dependence is disproved.
542 /// If there might be a dependence, returns false.
543 /// Sets appropriate direction entry.
544 bool exactSIVtest(const SCEV *SrcCoeff, const SCEV *DstCoeff,
545 const SCEV *SrcConst, const SCEV *DstConst,
546 const Loop *CurrentSrcLoop, const Loop *CurrentDstLoop,
547 unsigned Level, FullDependence &Result) const;
548
549 /// weakZeroSrcSIVtest - Tests the weak-zero SIV subscript pair
550 /// (Src and Dst) for dependence.
551 /// Things of the form [c1] and [c2 + a*i],
552 /// where i is an induction variable, c1 and c2 are loop invariant,
553 /// and a is a constant. See also weakZeroDstSIVtest.
554 /// Returns true if any possible dependence is disproved.
555 /// If there might be a dependence, returns false.
556 /// Sets appropriate direction entry.
557 bool weakZeroSrcSIVtest(const SCEV *DstCoeff, const SCEV *SrcConst,
558 const SCEV *DstConst, const Loop *CurrentSrcLoop,
559 const Loop *CurrentDstLoop, unsigned Level,
560 FullDependence &Result) const;
561
562 /// weakZeroDstSIVtest - Tests the weak-zero SIV subscript pair
563 /// (Src and Dst) for dependence.
564 /// Things of the form [c1 + a*i] and [c2],
565 /// where i is an induction variable, c1 and c2 are loop invariant,
566 /// and a is a constant. See also weakZeroSrcSIVtest.
567 /// Returns true if any possible dependence is disproved.
568 /// If there might be a dependence, returns false.
569 /// Sets appropriate direction entry.
570 bool weakZeroDstSIVtest(const SCEV *SrcCoeff, const SCEV *SrcConst,
571 const SCEV *DstConst, const Loop *CurrentSrcLoop,
572 const Loop *CurrentDstLoop, unsigned Level,
573 FullDependence &Result) const;
574
575 /// exactRDIVtest - Tests the RDIV subscript pair for dependence.
576 /// Things of the form [c1 + a*i] and [c2 + b*j],
577 /// where i and j are induction variable, c1 and c2 are loop invariant,
578 /// and a and b are constants.
579 /// Returns true if any possible dependence is disproved.
580 /// Works in some cases that symbolicRDIVtest doesn't,
581 /// and vice versa.
582 bool exactRDIVtest(const SCEV *SrcCoeff, const SCEV *DstCoeff,
583 const SCEV *SrcConst, const SCEV *DstConst,
584 const Loop *SrcLoop, const Loop *DstLoop,
585 FullDependence &Result) const;
586
587 /// symbolicRDIVtest - Tests the RDIV subscript pair for dependence.
588 /// Things of the form [c1 + a*i] and [c2 + b*j],
589 /// where i and j are induction variable, c1 and c2 are loop invariant,
590 /// and a and b are constants.
591 /// Returns true if any possible dependence is disproved.
592 /// Works in some cases that exactRDIVtest doesn't,
593 /// and vice versa. Can also be used as a backup for
594 /// ordinary SIV tests.
595 bool symbolicRDIVtest(const SCEV *SrcCoeff, const SCEV *DstCoeff,
596 const SCEV *SrcConst, const SCEV *DstConst,
597 const Loop *SrcLoop, const Loop *DstLoop) const;
598
599 /// gcdMIVtest - Tests an MIV subscript pair for dependence.
600 /// Returns true if any possible dependence is disproved.
601 /// Can sometimes disprove the equal direction for 1 or more loops.
602 // Can handle some symbolics that even the SIV tests don't get,
603 /// so we use it as a backup for everything.
604 bool gcdMIVtest(const SCEV *Src, const SCEV *Dst,
605 FullDependence &Result) const;
606
607 /// banerjeeMIVtest - Tests an MIV subscript pair for dependence.
608 /// Returns true if any possible dependence is disproved.
609 /// Computes directions.
610 bool banerjeeMIVtest(const SCEV *Src, const SCEV *Dst,
611 const SmallBitVector &Loops,
612 FullDependence &Result) const;
613
614 /// collectCoeffInfo - Walks through the subscript, collecting each
615 /// coefficient, the associated loop bounds, and recording its positive and
616 /// negative parts for later use.
617 CoefficientInfo *collectCoeffInfo(const SCEV *Subscript, bool SrcFlag,
618 const SCEV *&Constant) const;
619
620 /// Given \p Expr of the form
621 ///
622 /// c_0*X_0*i_0 + c_1*X_1*i_1 + ...c_n*X_n*i_n + C
623 ///
624 /// compute
625 ///
626 /// RunningGCD = gcd(RunningGCD, c_0, c_1, ..., c_n)
627 ///
628 /// where c_0, c_1, ..., and c_n are the constant values. The result is stored
629 /// in \p RunningGCD. Also, the initial value of \p RunningGCD affects the
630 /// result. If we find a term like (c_k * X_k * i_k), where i_k is the
631 /// induction variable of \p CurLoop, c_k is stored in \p CurLoopCoeff and not
632 /// included in the GCD computation. Returns false if we fail to find a
633 /// constant coefficient for some loop, e.g., when a term like (X+Y)*i is
634 /// present. Otherwise returns true.
635 bool accumulateCoefficientsGCD(const SCEV *Expr, const Loop *CurLoop,
636 const SCEV *&CurLoopCoeff,
637 APInt &RunningGCD) const;
638
639 /// getPositivePart - X^+ = max(X, 0).
640 const SCEV *getPositivePart(const SCEV *X) const;
641
642 /// getNegativePart - X^- = min(X, 0).
643 const SCEV *getNegativePart(const SCEV *X) const;
644
645 /// getLowerBound - Looks through all the bounds info and
646 /// computes the lower bound given the current direction settings
647 /// at each level.
648 const SCEV *getLowerBound(BoundInfo *Bound) const;
649
650 /// getUpperBound - Looks through all the bounds info and
651 /// computes the upper bound given the current direction settings
652 /// at each level.
653 const SCEV *getUpperBound(BoundInfo *Bound) const;
654
655 /// exploreDirections - Hierarchically expands the direction vector
656 /// search space, combining the directions of discovered dependences
657 /// in the DirSet field of Bound. Returns the number of distinct
658 /// dependences discovered. If the dependence is disproved,
659 /// it will return 0.
660 unsigned exploreDirections(unsigned Level, CoefficientInfo *A,
661 CoefficientInfo *B, BoundInfo *Bound,
662 const SmallBitVector &Loops,
663 unsigned &DepthExpanded, const SCEV *Delta) const;
664
665 /// testBounds - Returns true iff the current bounds are plausible.
666 bool testBounds(unsigned char DirKind, unsigned Level, BoundInfo *Bound,
667 const SCEV *Delta) const;
668
669 /// findBoundsALL - Computes the upper and lower bounds for level K
670 /// using the * direction. Records them in Bound.
671 void findBoundsALL(CoefficientInfo *A, CoefficientInfo *B, BoundInfo *Bound,
672 unsigned K) const;
673
674 /// findBoundsLT - Computes the upper and lower bounds for level K
675 /// using the < direction. Records them in Bound.
676 void findBoundsLT(CoefficientInfo *A, CoefficientInfo *B, BoundInfo *Bound,
677 unsigned K) const;
678
679 /// findBoundsGT - Computes the upper and lower bounds for level K
680 /// using the > direction. Records them in Bound.
681 void findBoundsGT(CoefficientInfo *A, CoefficientInfo *B, BoundInfo *Bound,
682 unsigned K) const;
683
684 /// findBoundsEQ - Computes the upper and lower bounds for level K
685 /// using the = direction. Records them in Bound.
686 void findBoundsEQ(CoefficientInfo *A, CoefficientInfo *B, BoundInfo *Bound,
687 unsigned K) const;
688
689 /// Given a linear access function, tries to recover subscripts
690 /// for each dimension of the array element access.
691 bool tryDelinearize(Instruction *Src, Instruction *Dst,
692 SmallVectorImpl<Subscript> &Pair);
693
694 /// Tries to delinearize \p Src and \p Dst access functions for a fixed size
695 /// multi-dimensional array. Calls delinearizeFixedSizeArray() to delinearize
696 /// \p Src and \p Dst separately,
697 bool tryDelinearizeFixedSize(Instruction *Src, Instruction *Dst,
698 const SCEV *SrcAccessFn, const SCEV *DstAccessFn,
699 SmallVectorImpl<const SCEV *> &SrcSubscripts,
700 SmallVectorImpl<const SCEV *> &DstSubscripts);
701
702 /// Tries to delinearize access function for a multi-dimensional array with
703 /// symbolic runtime sizes.
704 /// Returns true upon success and false otherwise.
705 bool
706 tryDelinearizeParametricSize(Instruction *Src, Instruction *Dst,
707 const SCEV *SrcAccessFn, const SCEV *DstAccessFn,
708 SmallVectorImpl<const SCEV *> &SrcSubscripts,
709 SmallVectorImpl<const SCEV *> &DstSubscripts);
710
711 /// checkSubscript - Helper function for checkSrcSubscript and
712 /// checkDstSubscript to avoid duplicate code
713 bool checkSubscript(const SCEV *Expr, const Loop *LoopNest,
714 SmallBitVector &Loops, bool IsSrc);
715}; // class DependenceInfo
716
717/// AnalysisPass to compute dependence information in a function
718class DependenceAnalysis : public AnalysisInfoMixin<DependenceAnalysis> {
719public:
722
723private:
726}; // class DependenceAnalysis
727
728/// Printer pass to dump DA results.
730 : public PassInfoMixin<DependenceAnalysisPrinterPass> {
731 DependenceAnalysisPrinterPass(raw_ostream &OS, bool NormalizeResults = false)
732 : OS(OS), NormalizeResults(NormalizeResults) {}
733
735
736 static bool isRequired() { return true; }
737
738private:
739 raw_ostream &OS;
740 bool NormalizeResults;
741}; // class DependenceAnalysisPrinterPass
742
743/// Legacy pass manager pass to access dependence information
745public:
746 static char ID; // Class identification, replacement for typeinfo
748
749 bool runOnFunction(Function &F) override;
750 void releaseMemory() override;
751 void getAnalysisUsage(AnalysisUsage &) const override;
752 void print(raw_ostream &, const Module * = nullptr) const override;
753 DependenceInfo &getDI() const;
754
755private:
756 std::unique_ptr<DependenceInfo> info;
757}; // class DependenceAnalysisWrapperPass
758
759/// createDependenceAnalysisPass - This creates an instance of the
760/// DependenceAnalysis wrapper pass.
762
763} // namespace llvm
764
765#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_ABI
Definition Compiler.h:213
static bool runOnFunction(Function &F, bool PostInlining)
Hexagon Hardware Loops
This header defines various interfaces for pass management in LLVM.
#define F(x, y, z)
Definition MD5.cpp:54
#define T
static bool isInput(const ArrayRef< StringRef > &Prefixes, StringRef Arg)
Definition OptTable.cpp:148
FunctionAnalysisManager FAM
This file implements the SmallBitVector class.
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
Represent the analysis usage information of a pass.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
void getAnalysisUsage(AnalysisUsage &) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
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.
Function * getFunction() const
DependenceInfo(Function *F, AAResults *AA, ScalarEvolution *SE, LoopInfo *LI)
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.
Instruction * getDst() const
getDst - Returns the destination instruction for this dependence.
Dependence & operator=(Dependence &&)=default
bool isOrdered() const
isOrdered - Returns true if dependence is Output, Flow, or Anti
void setNextSuccessor(const Dependence *succ)
setNextSuccessor - Sets the value of the NextSuccessor field.
friend class DependenceInfo
Dependence(Instruction *Source, Instruction *Destination, const SCEVUnionPredicate &A)
Dependence(Dependence &&)=default
bool isUnordered() const
isUnordered - Returns true if dependence is Input
SCEVUnionPredicate getRuntimeAssumptions() const
getRuntimeAssumptions - Returns the runtime assumptions under which this Dependence relation is valid...
DVEntry getDVEntry(unsigned Level, bool IsSameSD) const
getDVEntry - Returns the DV entry associated with a regular or a SameSD level
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...
const Dependence * getNextPredecessor() const
getNextPredecessor - Returns the value of the NextPredecessor field.
virtual unsigned getDirection(unsigned Level, bool SameSD=false) const
getDirection - Returns the direction associated with a particular common or SameSD level.
bool isFlow() const
isFlow - Returns true if this is a flow (aka true) dependence.
virtual ~Dependence()=default
virtual bool normalize(ScalarEvolution *SE)
If the direction vector is negative, normalize the direction vector to make it non-negative.
bool isAnti() const
isAnti - Returns true if this is an anti dependence.
const Dependence * getNextSuccessor() const
getNextSuccessor - Returns the value of the NextSuccessor field.
virtual bool isDirectionNegative() const
Check if the direction vector is negative.
Instruction * getSrc() const
getSrc - Returns the source instruction for this 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 setNextPredecessor(const Dependence *pred)
setNextPredecessor - Sets the value of the NextPredecessor field.
virtual bool inSameSDLoops(unsigned Level) const
inSameSDLoops - Returns true if this level is an SameSD level, i.e., performed across two separate lo...
FullDependence(Instruction *Source, Instruction *Destination, const SCEVUnionPredicate &Assumes, bool PossiblyLoopIndependent, unsigned Levels)
bool isConfused() const override
isConfused - Returns true if this dependence is confused (the compiler understands nothing and makes ...
DVEntry getDVEntry(unsigned Level, bool IsSameSD) const
getDVEntry - Returns the DV entry associated with a regular or a SameSD level.
bool isLoopIndependent() const override
isLoopIndependent - Returns true if this is a loop-independent dependence.
unsigned getSameSDLevels() const override
getSameSDLevels - Returns the number of separate SameSD loops surrounding the source and destination ...
unsigned getLevels() const override
getLevels - Returns the number of common loops surrounding the source and destination of the dependen...
FunctionPass class - This class is used to implement most global optimizations.
Definition Pass.h:314
FunctionPass(char &pid)
Definition Pass.h:316
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
This class represents a constant integer value.
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.
The main scalar evolution driver.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
Abstract Attribute helper functions.
Definition Attributor.h:165
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI FunctionPass * createDependenceAnalysisWrapperPass()
createDependenceAnalysisPass - This creates an instance of the DependenceAnalysis wrapper pass.
A CRTP mix-in that provides informational APIs needed for analysis passes.
Definition PassManager.h:93
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
DependenceAnalysisPrinterPass(raw_ostream &OS, bool NormalizeResults=false)
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM)
Dependence::DVEntry - Each level in the distance/direction vector has a direction (or perhaps a union...
A CRTP mix-in to automatically provide informational APIs needed for passes.
Definition PassManager.h:70