LLVM 23.0.0git
ScalarEvolution.h
Go to the documentation of this file.
1//===- llvm/Analysis/ScalarEvolution.h - Scalar Evolution -------*- 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// The ScalarEvolution class is an LLVM pass which can be used to analyze and
10// categorize scalar expressions in loops. It specializes in recognizing
11// general induction variables, representing them with the abstract and opaque
12// SCEV class. Given this analysis, trip counts of loops and other important
13// properties can be obtained.
14//
15// This analysis is primarily useful for induction variable substitution and
16// strength reduction.
17//
18//===----------------------------------------------------------------------===//
19
20#ifndef LLVM_ANALYSIS_SCALAREVOLUTION_H
21#define LLVM_ANALYSIS_SCALAREVOLUTION_H
22
23#include "llvm/ADT/APInt.h"
24#include "llvm/ADT/ArrayRef.h"
25#include "llvm/ADT/DenseMap.h"
27#include "llvm/ADT/FoldingSet.h"
29#include "llvm/ADT/SetVector.h"
34#include "llvm/IR/PassManager.h"
35#include "llvm/IR/ValueHandle.h"
36#include "llvm/IR/ValueMap.h"
37#include "llvm/Pass.h"
39#include <cassert>
40#include <cstdint>
41#include <memory>
42#include <optional>
43#include <utility>
44
45namespace llvm {
46
48class AssumptionCache;
49class BasicBlock;
50class Constant;
51class ConstantInt;
52class DataLayout;
53class DominatorTree;
54class GEPOperator;
55class LLVMContext;
56class Loop;
57class LoopInfo;
58class raw_ostream;
59class ScalarEvolution;
60class SCEVAddRecExpr;
61class SCEVUnknown;
62class StructType;
64class Type;
65enum SCEVTypes : unsigned short;
66
67LLVM_ABI extern bool VerifySCEV;
68
69/// This class represents an analyzed expression in the program. These are
70/// opaque objects that the client is not allowed to do much with directly.
71///
72class SCEV : public FoldingSetNode {
73 friend struct FoldingSetTrait<SCEV>;
74
75 /// A reference to an Interned FoldingSetNodeID for this node. The
76 /// ScalarEvolution's BumpPtrAllocator holds the data.
78
79 // The SCEV baseclass this node corresponds to
80 const SCEVTypes SCEVType;
81
82protected:
83 // Estimated complexity of this node's expression tree size.
84 const unsigned short ExpressionSize;
85
86 /// This field is initialized to zero and may be used in subclasses to store
87 /// miscellaneous information.
88 unsigned short SubclassData = 0;
89
90public:
91 /// NoWrapFlags are bitfield indices into SubclassData.
92 ///
93 /// Add and Mul expressions may have no-unsigned-wrap <NUW> or
94 /// no-signed-wrap <NSW> properties, which are derived from the IR
95 /// operator. NSW is a misnomer that we use to mean no signed overflow or
96 /// underflow.
97 ///
98 /// AddRec expressions may have a no-self-wraparound <NW> property if, in
99 /// the integer domain, abs(step) * max-iteration(loop) <=
100 /// unsigned-max(bitwidth). This means that the recurrence will never reach
101 /// its start value if the step is non-zero. Computing the same value on
102 /// each iteration is not considered wrapping, and recurrences with step = 0
103 /// are trivially <NW>. <NW> is independent of the sign of step and the
104 /// value the add recurrence starts with.
105 ///
106 /// Note that NUW and NSW are also valid properties of a recurrence, and
107 /// either implies NW. For convenience, NW will be set for a recurrence
108 /// whenever either NUW or NSW are set.
109 ///
110 /// We require that the flag on a SCEV apply to the entire scope in which
111 /// that SCEV is defined. A SCEV's scope is set of locations dominated by
112 /// a defining location, which is in turn described by the following rules:
113 /// * A SCEVUnknown is at the point of definition of the Value.
114 /// * A SCEVConstant is defined at all points.
115 /// * A SCEVAddRec is defined starting with the header of the associated
116 /// loop.
117 /// * All other SCEVs are defined at the earlest point all operands are
118 /// defined.
119 ///
120 /// The above rules describe a maximally hoisted form (without regards to
121 /// potential control dependence). A SCEV is defined anywhere a
122 /// corresponding instruction could be defined in said maximally hoisted
123 /// form. Note that SCEVUDivExpr (currently the only expression type which
124 /// can trap) can be defined per these rules in regions where it would trap
125 /// at runtime. A SCEV being defined does not require the existence of any
126 /// instruction within the defined scope.
128 FlagAnyWrap = 0, // No guarantee.
129 FlagNW = (1 << 0), // No self-wrap.
130 FlagNUW = (1 << 1), // No unsigned wrap.
131 FlagNSW = (1 << 2), // No signed wrap.
132 NoWrapMask = (1 << 3) - 1
133 };
134
135 explicit SCEV(const FoldingSetNodeIDRef ID, SCEVTypes SCEVTy,
136 unsigned short ExpressionSize)
137 : FastID(ID), SCEVType(SCEVTy), ExpressionSize(ExpressionSize) {}
138 SCEV(const SCEV &) = delete;
139 SCEV &operator=(const SCEV &) = delete;
140
141 SCEVTypes getSCEVType() const { return SCEVType; }
142
143 /// Return the LLVM type of this SCEV expression.
144 LLVM_ABI Type *getType() const;
145
146 /// Return operands of this SCEV expression.
148
149 /// Return true if the expression is a constant zero.
150 LLVM_ABI bool isZero() const;
151
152 /// Return true if the expression is a constant one.
153 LLVM_ABI bool isOne() const;
154
155 /// Return true if the expression is a constant all-ones value.
156 LLVM_ABI bool isAllOnesValue() const;
157
158 /// Return true if the specified scev is negated, but not a constant.
159 LLVM_ABI bool isNonConstantNegative() const;
160
161 // Returns estimated size of the mathematical expression represented by this
162 // SCEV. The rules of its calculation are following:
163 // 1) Size of a SCEV without operands (like constants and SCEVUnknown) is 1;
164 // 2) Size SCEV with operands Op1, Op2, ..., OpN is calculated by formula:
165 // (1 + Size(Op1) + ... + Size(OpN)).
166 // This value gives us an estimation of time we need to traverse through this
167 // SCEV and all its operands recursively. We may use it to avoid performing
168 // heavy transformations on SCEVs of excessive size for sake of saving the
169 // compilation time.
170 unsigned short getExpressionSize() const {
171 return ExpressionSize;
172 }
173
174 /// Print out the internal representation of this scalar to the specified
175 /// stream. This should really only be used for debugging purposes.
176 LLVM_ABI void print(raw_ostream &OS) const;
177
178 /// This method is used for debugging.
179 LLVM_ABI void dump() const;
180};
181
182// Specialize FoldingSetTrait for SCEV to avoid needing to compute
183// temporary FoldingSetNodeID values.
184template <> struct FoldingSetTrait<SCEV> : DefaultFoldingSetTrait<SCEV> {
185 static void Profile(const SCEV &X, FoldingSetNodeID &ID) { ID = X.FastID; }
186
187 static bool Equals(const SCEV &X, const FoldingSetNodeID &ID, unsigned IDHash,
188 FoldingSetNodeID &TempID) {
189 return ID == X.FastID;
190 }
191
192 static unsigned ComputeHash(const SCEV &X, FoldingSetNodeID &TempID) {
193 return X.FastID.ComputeHash();
194 }
195};
196
197inline raw_ostream &operator<<(raw_ostream &OS, const SCEV &S) {
198 S.print(OS);
199 return OS;
200}
201
202/// An object of this class is returned by queries that could not be answered.
203/// For example, if you ask for the number of iterations of a linked-list
204/// traversal loop, you will get one of these. None of the standard SCEV
205/// operations are valid on this class, it is just a marker.
206struct SCEVCouldNotCompute : public SCEV {
208
209 /// Methods for support type inquiry through isa, cast, and dyn_cast:
210 LLVM_ABI static bool classof(const SCEV *S);
211};
212
213/// This class represents an assumption made using SCEV expressions which can
214/// be checked at run-time.
216 friend struct FoldingSetTrait<SCEVPredicate>;
217
218 /// A reference to an Interned FoldingSetNodeID for this node. The
219 /// ScalarEvolution's BumpPtrAllocator holds the data.
220 FoldingSetNodeIDRef FastID;
221
222public:
224
225protected:
227 ~SCEVPredicate() = default;
228 SCEVPredicate(const SCEVPredicate &) = default;
230
231public:
233
234 SCEVPredicateKind getKind() const { return Kind; }
235
236 /// Returns the estimated complexity of this predicate. This is roughly
237 /// measured in the number of run-time checks required.
238 virtual unsigned getComplexity() const { return 1; }
239
240 /// Returns true if the predicate is always true. This means that no
241 /// assumptions were made and nothing needs to be checked at run-time.
242 virtual bool isAlwaysTrue() const = 0;
243
244 /// Returns true if this predicate implies \p N.
245 virtual bool implies(const SCEVPredicate *N, ScalarEvolution &SE) const = 0;
246
247 /// Prints a textual representation of this predicate with an indentation of
248 /// \p Depth.
249 virtual void print(raw_ostream &OS, unsigned Depth = 0) const = 0;
250};
251
253 P.print(OS);
254 return OS;
255}
256
257// Specialize FoldingSetTrait for SCEVPredicate to avoid needing to compute
258// temporary FoldingSetNodeID values.
259template <>
261 static void Profile(const SCEVPredicate &X, FoldingSetNodeID &ID) {
262 ID = X.FastID;
263 }
264
265 static bool Equals(const SCEVPredicate &X, const FoldingSetNodeID &ID,
266 unsigned IDHash, FoldingSetNodeID &TempID) {
267 return ID == X.FastID;
268 }
269
270 static unsigned ComputeHash(const SCEVPredicate &X,
271 FoldingSetNodeID &TempID) {
272 return X.FastID.ComputeHash();
273 }
274};
275
276/// This class represents an assumption that the expression LHS Pred RHS
277/// evaluates to true, and this can be checked at run-time.
279 /// We assume that LHS Pred RHS is true.
280 const ICmpInst::Predicate Pred;
281 const SCEV *LHS;
282 const SCEV *RHS;
283
284public:
286 const ICmpInst::Predicate Pred,
287 const SCEV *LHS, const SCEV *RHS);
288
289 /// Implementation of the SCEVPredicate interface
290 bool implies(const SCEVPredicate *N, ScalarEvolution &SE) const override;
291 void print(raw_ostream &OS, unsigned Depth = 0) const override;
292 bool isAlwaysTrue() const override;
293
294 ICmpInst::Predicate getPredicate() const { return Pred; }
295
296 /// Returns the left hand side of the predicate.
297 const SCEV *getLHS() const { return LHS; }
298
299 /// Returns the right hand side of the predicate.
300 const SCEV *getRHS() const { return RHS; }
301
302 /// Methods for support type inquiry through isa, cast, and dyn_cast:
303 static bool classof(const SCEVPredicate *P) {
304 return P->getKind() == P_Compare;
305 }
306};
307
308/// This class represents an assumption made on an AddRec expression. Given an
309/// affine AddRec expression {a,+,b}, we assume that it has the nssw or nusw
310/// flags (defined below) in the first X iterations of the loop, where X is a
311/// SCEV expression returned by getPredicatedBackedgeTakenCount).
312///
313/// Note that this does not imply that X is equal to the backedge taken
314/// count. This means that if we have a nusw predicate for i32 {0,+,1} with a
315/// predicated backedge taken count of X, we only guarantee that {0,+,1} has
316/// nusw in the first X iterations. {0,+,1} may still wrap in the loop if we
317/// have more than X iterations.
319public:
320 /// Similar to SCEV::NoWrapFlags, but with slightly different semantics
321 /// for FlagNUSW. The increment is considered to be signed, and a + b
322 /// (where b is the increment) is considered to wrap if:
323 /// zext(a + b) != zext(a) + sext(b)
324 ///
325 /// If Signed is a function that takes an n-bit tuple and maps to the
326 /// integer domain as the tuples value interpreted as twos complement,
327 /// and Unsigned a function that takes an n-bit tuple and maps to the
328 /// integer domain as the base two value of input tuple, then a + b
329 /// has IncrementNUSW iff:
330 ///
331 /// 0 <= Unsigned(a) + Signed(b) < 2^n
332 ///
333 /// The IncrementNSSW flag has identical semantics with SCEV::FlagNSW.
334 ///
335 /// Note that the IncrementNUSW flag is not commutative: if base + inc
336 /// has IncrementNUSW, then inc + base doesn't neccessarily have this
337 /// property. The reason for this is that this is used for sign/zero
338 /// extending affine AddRec SCEV expressions when a SCEVWrapPredicate is
339 /// assumed. A {base,+,inc} expression is already non-commutative with
340 /// regards to base and inc, since it is interpreted as:
341 /// (((base + inc) + inc) + inc) ...
343 IncrementAnyWrap = 0, // No guarantee.
344 IncrementNUSW = (1 << 0), // No unsigned with signed increment wrap.
345 IncrementNSSW = (1 << 1), // No signed with signed increment wrap
346 // (equivalent with SCEV::NSW)
347 IncrementNoWrapMask = (1 << 2) - 1
348 };
349
350 /// Convenient IncrementWrapFlags manipulation methods.
351 [[nodiscard]] static SCEVWrapPredicate::IncrementWrapFlags
354 assert((Flags & IncrementNoWrapMask) == Flags && "Invalid flags value!");
355 assert((OffFlags & IncrementNoWrapMask) == OffFlags &&
356 "Invalid flags value!");
357 return (SCEVWrapPredicate::IncrementWrapFlags)(Flags & ~OffFlags);
358 }
359
360 [[nodiscard]] static SCEVWrapPredicate::IncrementWrapFlags
362 assert((Flags & IncrementNoWrapMask) == Flags && "Invalid flags value!");
363 assert((Mask & IncrementNoWrapMask) == Mask && "Invalid mask value!");
364
365 return (SCEVWrapPredicate::IncrementWrapFlags)(Flags & Mask);
366 }
367
368 [[nodiscard]] static SCEVWrapPredicate::IncrementWrapFlags
371 assert((Flags & IncrementNoWrapMask) == Flags && "Invalid flags value!");
372 assert((OnFlags & IncrementNoWrapMask) == OnFlags &&
373 "Invalid flags value!");
374
375 return (SCEVWrapPredicate::IncrementWrapFlags)(Flags | OnFlags);
376 }
377
378 /// Returns the set of SCEVWrapPredicate no wrap flags implied by a
379 /// SCEVAddRecExpr.
380 [[nodiscard]] static SCEVWrapPredicate::IncrementWrapFlags
381 getImpliedFlags(const SCEVAddRecExpr *AR, ScalarEvolution &SE);
382
383private:
384 const SCEVAddRecExpr *AR;
385 IncrementWrapFlags Flags;
386
387public:
389 const SCEVAddRecExpr *AR,
390 IncrementWrapFlags Flags);
391
392 /// Returns the set assumed no overflow flags.
393 IncrementWrapFlags getFlags() const { return Flags; }
394
395 /// Implementation of the SCEVPredicate interface
396 const SCEVAddRecExpr *getExpr() const;
397 bool implies(const SCEVPredicate *N, ScalarEvolution &SE) const override;
398 void print(raw_ostream &OS, unsigned Depth = 0) const override;
399 bool isAlwaysTrue() const override;
400
401 /// Methods for support type inquiry through isa, cast, and dyn_cast:
402 static bool classof(const SCEVPredicate *P) {
403 return P->getKind() == P_Wrap;
404 }
405};
406
407/// This class represents a composition of other SCEV predicates, and is the
408/// class that most clients will interact with. This is equivalent to a
409/// logical "AND" of all the predicates in the union.
410///
411/// NB! Unlike other SCEVPredicate sub-classes this class does not live in the
412/// ScalarEvolution::Preds folding set. This is why the \c add function is sound.
414private:
415 using PredicateMap =
417
418 /// Vector with references to all predicates in this union.
420
421 /// Adds a predicate to this union.
422 void add(const SCEVPredicate *N, ScalarEvolution &SE);
423
424public:
426 ScalarEvolution &SE);
427
429
430 /// Returns a new SCEVUnionPredicate that is the union of this predicate
431 /// and the given predicate \p N.
433 ScalarEvolution &SE) const {
434 SCEVUnionPredicate Result(Preds, SE);
435 Result.add(N, SE);
436 return Result;
437 }
438
439 /// Implementation of the SCEVPredicate interface
440 bool isAlwaysTrue() const override;
441 bool implies(const SCEVPredicate *N, ScalarEvolution &SE) const override;
442 void print(raw_ostream &OS, unsigned Depth) const override;
443
444 /// We estimate the complexity of a union predicate as the size number of
445 /// predicates in the union.
446 unsigned getComplexity() const override { return Preds.size(); }
447
448 /// Methods for support type inquiry through isa, cast, and dyn_cast:
449 static bool classof(const SCEVPredicate *P) {
450 return P->getKind() == P_Union;
451 }
452};
453
454/// The main scalar evolution driver. Because client code (intentionally)
455/// can't do much with the SCEV objects directly, they must ask this class
456/// for services.
459
460public:
461 /// An enum describing the relationship between a SCEV and a loop.
463 LoopVariant, ///< The SCEV is loop-variant (unknown).
464 LoopInvariant, ///< The SCEV is loop-invariant.
465 LoopComputable ///< The SCEV varies predictably with the loop.
466 };
467
468 /// An enum describing the relationship between a SCEV and a basic block.
470 DoesNotDominateBlock, ///< The SCEV does not dominate the block.
471 DominatesBlock, ///< The SCEV dominates the block.
472 ProperlyDominatesBlock ///< The SCEV properly dominates the block.
473 };
474
475 /// Convenient NoWrapFlags manipulation that hides enum casts and is
476 /// visible in the ScalarEvolution name space.
478 int Mask) {
479 return (SCEV::NoWrapFlags)(Flags & Mask);
480 }
481 [[nodiscard]] static SCEV::NoWrapFlags setFlags(SCEV::NoWrapFlags Flags,
482 SCEV::NoWrapFlags OnFlags) {
483 return (SCEV::NoWrapFlags)(Flags | OnFlags);
484 }
485 [[nodiscard]] static SCEV::NoWrapFlags
487 return (SCEV::NoWrapFlags)(Flags & ~OffFlags);
488 }
489 [[nodiscard]] static bool hasFlags(SCEV::NoWrapFlags Flags,
490 SCEV::NoWrapFlags TestFlags) {
491 return TestFlags == maskFlags(Flags, TestFlags);
492 };
493
496 LoopInfo &LI);
499
500 LLVMContext &getContext() const { return F.getContext(); }
501
502 /// Test if values of the given type are analyzable within the SCEV
503 /// framework. This primarily includes integer types, and it can optionally
504 /// include pointer types if the ScalarEvolution class has access to
505 /// target-specific information.
506 LLVM_ABI bool isSCEVable(Type *Ty) const;
507
508 /// Return the size in bits of the specified type, for which isSCEVable must
509 /// return true.
511
512 /// Return a type with the same bitwidth as the given type and which
513 /// represents how SCEV will treat the given type, for which isSCEVable must
514 /// return true. For pointer types, this is the pointer-sized integer type.
516
517 // Returns a wider type among {Ty1, Ty2}.
518 LLVM_ABI Type *getWiderType(Type *Ty1, Type *Ty2) const;
519
520 /// Return true if there exists a point in the program at which both
521 /// A and B could be operands to the same instruction.
522 /// SCEV expressions are generally assumed to correspond to instructions
523 /// which could exists in IR. In general, this requires that there exists
524 /// a use point in the program where all operands dominate the use.
525 ///
526 /// Example:
527 /// loop {
528 /// if
529 /// loop { v1 = load @global1; }
530 /// else
531 /// loop { v2 = load @global2; }
532 /// }
533 /// No SCEV with operand V1, and v2 can exist in this program.
535
536 /// Return true if the SCEV is a scAddRecExpr or it contains
537 /// scAddRecExpr. The result will be cached in HasRecMap.
538 LLVM_ABI bool containsAddRecurrence(const SCEV *S);
539
540 /// Is operation \p BinOp between \p LHS and \p RHS provably does not have
541 /// a signed/unsigned overflow (\p Signed)? If \p CtxI is specified, the
542 /// no-overflow fact should be true in the context of this instruction.
544 const SCEV *LHS, const SCEV *RHS,
545 const Instruction *CtxI = nullptr);
546
547 /// Parse NSW/NUW flags from add/sub/mul IR binary operation \p Op into
548 /// SCEV no-wrap flags, and deduce flag[s] that aren't known yet.
549 /// Does not mutate the original instruction. Returns std::nullopt if it could
550 /// not deduce more precise flags than the instruction already has, otherwise
551 /// returns proven flags.
552 LLVM_ABI std::optional<SCEV::NoWrapFlags>
554
555 /// Notify this ScalarEvolution that \p User directly uses SCEVs in \p Ops.
557
558 /// Return true if the SCEV expression contains an undef value.
559 LLVM_ABI bool containsUndefs(const SCEV *S) const;
560
561 /// Return true if the SCEV expression contains a Value that has been
562 /// optimised out and is now a nullptr.
563 LLVM_ABI bool containsErasedValue(const SCEV *S) const;
564
565 /// Return a SCEV expression for the full generality of the specified
566 /// expression.
567 LLVM_ABI const SCEV *getSCEV(Value *V);
568
569 /// Return an existing SCEV for V if there is one, otherwise return nullptr.
571
573 LLVM_ABI const SCEV *getConstant(const APInt &Val);
574 LLVM_ABI const SCEV *getConstant(Type *Ty, uint64_t V, bool isSigned = false);
576
577 LLVM_ABI const SCEV *getPtrToAddrExpr(const SCEV *Op);
578 LLVM_ABI const SCEV *getPtrToIntExpr(const SCEV *Op, Type *Ty);
579 LLVM_ABI const SCEV *getTruncateExpr(const SCEV *Op, Type *Ty,
580 unsigned Depth = 0);
581 LLVM_ABI const SCEV *getVScale(Type *Ty);
582 LLVM_ABI const SCEV *
585 LLVM_ABI const SCEV *getZeroExtendExpr(const SCEV *Op, Type *Ty,
586 unsigned Depth = 0);
587 LLVM_ABI const SCEV *getZeroExtendExprImpl(const SCEV *Op, Type *Ty,
588 unsigned Depth = 0);
589 LLVM_ABI const SCEV *getSignExtendExpr(const SCEV *Op, Type *Ty,
590 unsigned Depth = 0);
591 LLVM_ABI const SCEV *getSignExtendExprImpl(const SCEV *Op, Type *Ty,
592 unsigned Depth = 0);
593 LLVM_ABI const SCEV *getCastExpr(SCEVTypes Kind, const SCEV *Op, Type *Ty);
594 LLVM_ABI const SCEV *getAnyExtendExpr(const SCEV *Op, Type *Ty);
597 unsigned Depth = 0);
598 const SCEV *getAddExpr(const SCEV *LHS, const SCEV *RHS,
600 unsigned Depth = 0) {
602 return getAddExpr(Ops, Flags, Depth);
603 }
604 const SCEV *getAddExpr(const SCEV *Op0, const SCEV *Op1, const SCEV *Op2,
606 unsigned Depth = 0) {
607 SmallVector<const SCEV *, 3> Ops = {Op0, Op1, Op2};
608 return getAddExpr(Ops, Flags, Depth);
609 }
612 unsigned Depth = 0);
613 const SCEV *getMulExpr(const SCEV *LHS, const SCEV *RHS,
615 unsigned Depth = 0) {
617 return getMulExpr(Ops, Flags, Depth);
618 }
619 const SCEV *getMulExpr(const SCEV *Op0, const SCEV *Op1, const SCEV *Op2,
621 unsigned Depth = 0) {
622 SmallVector<const SCEV *, 3> Ops = {Op0, Op1, Op2};
623 return getMulExpr(Ops, Flags, Depth);
624 }
625 LLVM_ABI const SCEV *getUDivExpr(const SCEV *LHS, const SCEV *RHS);
626 LLVM_ABI const SCEV *getUDivExactExpr(const SCEV *LHS, const SCEV *RHS);
627 LLVM_ABI const SCEV *getURemExpr(const SCEV *LHS, const SCEV *RHS);
628 LLVM_ABI const SCEV *getAddRecExpr(const SCEV *Start, const SCEV *Step,
629 const Loop *L, SCEV::NoWrapFlags Flags);
631 const Loop *L, SCEV::NoWrapFlags Flags);
633 const Loop *L, SCEV::NoWrapFlags Flags) {
634 SmallVector<const SCEV *, 4> NewOp(Operands.begin(), Operands.end());
635 return getAddRecExpr(NewOp, L, Flags);
636 }
637
638 /// Checks if \p SymbolicPHI can be rewritten as an AddRecExpr under some
639 /// Predicates. If successful return these <AddRecExpr, Predicates>;
640 /// The function is intended to be called from PSCEV (the caller will decide
641 /// whether to actually add the predicates and carry out the rewrites).
642 LLVM_ABI std::optional<
643 std::pair<const SCEV *, SmallVector<const SCEVPredicate *, 3>>>
644 createAddRecFromPHIWithCasts(const SCEVUnknown *SymbolicPHI);
645
646 /// Returns an expression for a GEP
647 ///
648 /// \p GEP The GEP. The indices contained in the GEP itself are ignored,
649 /// instead we use IndexExprs.
650 /// \p IndexExprs The expressions for the indices.
652 ArrayRef<const SCEV *> IndexExprs);
653 LLVM_ABI const SCEV *getGEPExpr(const SCEV *BaseExpr,
654 ArrayRef<const SCEV *> IndexExprs,
655 Type *SrcElementTy,
657 LLVM_ABI const SCEV *getAbsExpr(const SCEV *Op, bool IsNSW);
660 LLVM_ABI const SCEV *
663 LLVM_ABI const SCEV *getSMaxExpr(const SCEV *LHS, const SCEV *RHS);
665 LLVM_ABI const SCEV *getUMaxExpr(const SCEV *LHS, const SCEV *RHS);
667 LLVM_ABI const SCEV *getSMinExpr(const SCEV *LHS, const SCEV *RHS);
669 LLVM_ABI const SCEV *getUMinExpr(const SCEV *LHS, const SCEV *RHS,
670 bool Sequential = false);
672 bool Sequential = false);
673 LLVM_ABI const SCEV *getUnknown(Value *V);
675
676 /// Return a SCEV for the constant 0 of a specific type.
677 const SCEV *getZero(Type *Ty) { return getConstant(Ty, 0); }
678
679 /// Return a SCEV for the constant 1 of a specific type.
680 const SCEV *getOne(Type *Ty) { return getConstant(Ty, 1); }
681
682 /// Return a SCEV for the constant \p Power of two.
683 const SCEV *getPowerOfTwo(Type *Ty, unsigned Power) {
684 assert(Power < getTypeSizeInBits(Ty) && "Power out of range");
686 }
687
688 /// Return a SCEV for the constant -1 of a specific type.
689 const SCEV *getMinusOne(Type *Ty) {
690 return getConstant(Ty, -1, /*isSigned=*/true);
691 }
692
693 /// Return an expression for a TypeSize.
695
696 /// Return an expression for the alloc size of AllocTy that is type IntTy
697 LLVM_ABI const SCEV *getSizeOfExpr(Type *IntTy, Type *AllocTy);
698
699 /// Return an expression for the store size of StoreTy that is type IntTy
700 LLVM_ABI const SCEV *getStoreSizeOfExpr(Type *IntTy, Type *StoreTy);
701
702 /// Return an expression for offsetof on the given field with type IntTy
703 LLVM_ABI const SCEV *getOffsetOfExpr(Type *IntTy, StructType *STy,
704 unsigned FieldNo);
705
706 /// Return the SCEV object corresponding to -V.
707 LLVM_ABI const SCEV *
709
710 /// Return the SCEV object corresponding to ~V.
711 LLVM_ABI const SCEV *getNotSCEV(const SCEV *V);
712
713 /// Return LHS-RHS. Minus is represented in SCEV as A+B*-1.
714 ///
715 /// If the LHS and RHS are pointers which don't share a common base
716 /// (according to getPointerBase()), this returns a SCEVCouldNotCompute.
717 /// To compute the difference between two unrelated pointers, you can
718 /// explicitly convert the arguments using getPtrToIntExpr(), for pointer
719 /// types that support it.
720 LLVM_ABI const SCEV *getMinusSCEV(const SCEV *LHS, const SCEV *RHS,
722 unsigned Depth = 0);
723
724 /// Compute ceil(N / D). N and D are treated as unsigned values.
725 ///
726 /// Since SCEV doesn't have native ceiling division, this generates a
727 /// SCEV expression of the following form:
728 ///
729 /// umin(N, 1) + floor((N - umin(N, 1)) / D)
730 ///
731 /// A denominator of zero or poison is handled the same way as getUDivExpr().
732 LLVM_ABI const SCEV *getUDivCeilSCEV(const SCEV *N, const SCEV *D);
733
734 /// Return a SCEV corresponding to a conversion of the input value to the
735 /// specified type. If the type must be extended, it is zero extended.
736 LLVM_ABI const SCEV *getTruncateOrZeroExtend(const SCEV *V, Type *Ty,
737 unsigned Depth = 0);
738
739 /// Return a SCEV corresponding to a conversion of the input value to the
740 /// specified type. If the type must be extended, it is sign extended.
741 LLVM_ABI const SCEV *getTruncateOrSignExtend(const SCEV *V, Type *Ty,
742 unsigned Depth = 0);
743
744 /// Return a SCEV corresponding to a conversion of the input value to the
745 /// specified type. If the type must be extended, it is zero extended. The
746 /// conversion must not be narrowing.
747 LLVM_ABI const SCEV *getNoopOrZeroExtend(const SCEV *V, Type *Ty);
748
749 /// Return a SCEV corresponding to a conversion of the input value to the
750 /// specified type. If the type must be extended, it is sign extended. The
751 /// conversion must not be narrowing.
752 LLVM_ABI const SCEV *getNoopOrSignExtend(const SCEV *V, Type *Ty);
753
754 /// Return a SCEV corresponding to a conversion of the input value to the
755 /// specified type. If the type must be extended, it is extended with
756 /// unspecified bits. The conversion must not be narrowing.
757 LLVM_ABI const SCEV *getNoopOrAnyExtend(const SCEV *V, Type *Ty);
758
759 /// Return a SCEV corresponding to a conversion of the input value to the
760 /// specified type. The conversion must not be widening.
761 LLVM_ABI const SCEV *getTruncateOrNoop(const SCEV *V, Type *Ty);
762
763 /// Promote the operands to the wider of the types using zero-extension, and
764 /// then perform a umax operation with them.
766 const SCEV *RHS);
767
768 /// Promote the operands to the wider of the types using zero-extension, and
769 /// then perform a umin operation with them.
771 const SCEV *RHS,
772 bool Sequential = false);
773
774 /// Promote the operands to the wider of the types using zero-extension, and
775 /// then perform a umin operation with them. N-ary function.
776 LLVM_ABI const SCEV *
778 bool Sequential = false);
779
780 /// Transitively follow the chain of pointer-type operands until reaching a
781 /// SCEV that does not have a single pointer operand. This returns a
782 /// SCEVUnknown pointer for well-formed pointer-type expressions, but corner
783 /// cases do exist.
784 LLVM_ABI const SCEV *getPointerBase(const SCEV *V);
785
786 /// Compute an expression equivalent to S - getPointerBase(S).
787 LLVM_ABI const SCEV *removePointerBase(const SCEV *S);
788
789 /// Return a SCEV expression for the specified value at the specified scope
790 /// in the program. The L value specifies a loop nest to evaluate the
791 /// expression at, where null is the top-level or a specified loop is
792 /// immediately inside of the loop.
793 ///
794 /// This method can be used to compute the exit value for a variable defined
795 /// in a loop by querying what the value will hold in the parent loop.
796 ///
797 /// In the case that a relevant loop exit value cannot be computed, the
798 /// original value V is returned.
799 LLVM_ABI const SCEV *getSCEVAtScope(const SCEV *S, const Loop *L);
800
801 /// This is a convenience function which does getSCEVAtScope(getSCEV(V), L).
802 LLVM_ABI const SCEV *getSCEVAtScope(Value *V, const Loop *L);
803
804 /// Test whether entry to the loop is protected by a conditional between LHS
805 /// and RHS. This is used to help avoid max expressions in loop trip
806 /// counts, and to eliminate casts.
808 const SCEV *LHS, const SCEV *RHS);
809
810 /// Test whether entry to the basic block is protected by a conditional
811 /// between LHS and RHS.
813 CmpPredicate Pred,
814 const SCEV *LHS,
815 const SCEV *RHS);
816
817 /// Test whether the backedge of the loop is protected by a conditional
818 /// between LHS and RHS. This is used to eliminate casts.
820 const SCEV *LHS, const SCEV *RHS);
821
822 /// A version of getTripCountFromExitCount below which always picks an
823 /// evaluation type which can not result in overflow.
824 LLVM_ABI const SCEV *getTripCountFromExitCount(const SCEV *ExitCount);
825
826 /// Convert from an "exit count" (i.e. "backedge taken count") to a "trip
827 /// count". A "trip count" is the number of times the header of the loop
828 /// will execute if an exit is taken after the specified number of backedges
829 /// have been taken. (e.g. TripCount = ExitCount + 1). Note that the
830 /// expression can overflow if ExitCount = UINT_MAX. If EvalTy is not wide
831 /// enough to hold the result without overflow, result unsigned wraps with
832 /// 2s-complement semantics. ex: EC = 255 (i8), TC = 0 (i8)
833 LLVM_ABI const SCEV *getTripCountFromExitCount(const SCEV *ExitCount,
834 Type *EvalTy, const Loop *L);
835
836 /// Returns the exact trip count of the loop if we can compute it, and
837 /// the result is a small constant. '0' is used to represent an unknown
838 /// or non-constant trip count. Note that a trip count is simply one more
839 /// than the backedge taken count for the loop.
840 LLVM_ABI unsigned getSmallConstantTripCount(const Loop *L);
841
842 /// Return the exact trip count for this loop if we exit through ExitingBlock.
843 /// '0' is used to represent an unknown or non-constant trip count. Note
844 /// that a trip count is simply one more than the backedge taken count for
845 /// the same exit.
846 /// This "trip count" assumes that control exits via ExitingBlock. More
847 /// precisely, it is the number of times that control will reach ExitingBlock
848 /// before taking the branch. For loops with multiple exits, it may not be
849 /// the number times that the loop header executes if the loop exits
850 /// prematurely via another branch.
851 LLVM_ABI unsigned getSmallConstantTripCount(const Loop *L,
852 const BasicBlock *ExitingBlock);
853
854 /// Returns the upper bound of the loop trip count as a normal unsigned
855 /// value.
856 /// Returns 0 if the trip count is unknown, not constant or requires
857 /// SCEV predicates and \p Predicates is nullptr.
859 const Loop *L,
860 SmallVectorImpl<const SCEVPredicate *> *Predicates = nullptr);
861
862 /// Returns the largest constant divisor of the trip count as a normal
863 /// unsigned value, if possible. This means that the actual trip count is
864 /// always a multiple of the returned value. Returns 1 if the trip count is
865 /// unknown or not guaranteed to be the multiple of a constant., Will also
866 /// return 1 if the trip count is very large (>= 2^32).
867 /// Note that the argument is an exit count for loop L, NOT a trip count.
869 const SCEV *ExitCount);
870
871 /// Returns the largest constant divisor of the trip count of the
872 /// loop. Will return 1 if no trip count could be computed, or if a
873 /// divisor could not be found.
874 LLVM_ABI unsigned getSmallConstantTripMultiple(const Loop *L);
875
876 /// Returns the largest constant divisor of the trip count of this loop as a
877 /// normal unsigned value, if possible. This means that the actual trip
878 /// count is always a multiple of the returned value (don't forget the trip
879 /// count could very well be zero as well!). As explained in the comments
880 /// for getSmallConstantTripCount, this assumes that control exits the loop
881 /// via ExitingBlock.
882 LLVM_ABI unsigned
883 getSmallConstantTripMultiple(const Loop *L, const BasicBlock *ExitingBlock);
884
885 /// The terms "backedge taken count" and "exit count" are used
886 /// interchangeably to refer to the number of times the backedge of a loop
887 /// has executed before the loop is exited.
889 /// An expression exactly describing the number of times the backedge has
890 /// executed when a loop is exited.
892 /// A constant which provides an upper bound on the exact trip count.
894 /// An expression which provides an upper bound on the exact trip count.
896 };
897
898 /// Return the number of times the backedge executes before the given exit
899 /// would be taken; if not exactly computable, return SCEVCouldNotCompute.
900 /// For a single exit loop, this value is equivelent to the result of
901 /// getBackedgeTakenCount. The loop is guaranteed to exit (via *some* exit)
902 /// before the backedge is executed (ExitCount + 1) times. Note that there
903 /// is no guarantee about *which* exit is taken on the exiting iteration.
904 LLVM_ABI const SCEV *getExitCount(const Loop *L,
905 const BasicBlock *ExitingBlock,
906 ExitCountKind Kind = Exact);
907
908 /// Same as above except this uses the predicated backedge taken info and
909 /// may require predicates.
910 LLVM_ABI const SCEV *
911 getPredicatedExitCount(const Loop *L, const BasicBlock *ExitingBlock,
913 ExitCountKind Kind = Exact);
914
915 /// If the specified loop has a predictable backedge-taken count, return it,
916 /// otherwise return a SCEVCouldNotCompute object. The backedge-taken count is
917 /// the number of times the loop header will be branched to from within the
918 /// loop, assuming there are no abnormal exists like exception throws. This is
919 /// one less than the trip count of the loop, since it doesn't count the first
920 /// iteration, when the header is branched to from outside the loop.
921 ///
922 /// Note that it is not valid to call this method on a loop without a
923 /// loop-invariant backedge-taken count (see
924 /// hasLoopInvariantBackedgeTakenCount).
925 LLVM_ABI const SCEV *getBackedgeTakenCount(const Loop *L,
926 ExitCountKind Kind = Exact);
927
928 /// Similar to getBackedgeTakenCount, except it will add a set of
929 /// SCEV predicates to Predicates that are required to be true in order for
930 /// the answer to be correct. Predicates can be checked with run-time
931 /// checks and can be used to perform loop versioning.
933 const Loop *L, SmallVectorImpl<const SCEVPredicate *> &Predicates);
934
935 /// When successful, this returns a SCEVConstant that is greater than or equal
936 /// to (i.e. a "conservative over-approximation") of the value returend by
937 /// getBackedgeTakenCount. If such a value cannot be computed, it returns the
938 /// SCEVCouldNotCompute object.
942
943 /// Similar to getConstantMaxBackedgeTakenCount, except it will add a set of
944 /// SCEV predicates to Predicates that are required to be true in order for
945 /// the answer to be correct. Predicates can be checked with run-time
946 /// checks and can be used to perform loop versioning.
948 const Loop *L, SmallVectorImpl<const SCEVPredicate *> &Predicates);
949
950 /// When successful, this returns a SCEV that is greater than or equal
951 /// to (i.e. a "conservative over-approximation") of the value returend by
952 /// getBackedgeTakenCount. If such a value cannot be computed, it returns the
953 /// SCEVCouldNotCompute object.
957
958 /// Similar to getSymbolicMaxBackedgeTakenCount, except it will add a set of
959 /// SCEV predicates to Predicates that are required to be true in order for
960 /// the answer to be correct. Predicates can be checked with run-time
961 /// checks and can be used to perform loop versioning.
963 const Loop *L, SmallVectorImpl<const SCEVPredicate *> &Predicates);
964
965 /// Return true if the backedge taken count is either the value returned by
966 /// getConstantMaxBackedgeTakenCount or zero.
968
969 /// Return true if the specified loop has an analyzable loop-invariant
970 /// backedge-taken count.
972
973 // This method should be called by the client when it made any change that
974 // would invalidate SCEV's answers, and the client wants to remove all loop
975 // information held internally by ScalarEvolution. This is intended to be used
976 // when the alternative to forget a loop is too expensive (i.e. large loop
977 // bodies).
979
980 /// This method should be called by the client when it has changed a loop in
981 /// a way that may effect ScalarEvolution's ability to compute a trip count,
982 /// or if the loop is deleted. This call is potentially expensive for large
983 /// loop bodies.
984 LLVM_ABI void forgetLoop(const Loop *L);
985
986 // This method invokes forgetLoop for the outermost loop of the given loop
987 // \p L, making ScalarEvolution forget about all this subtree. This needs to
988 // be done whenever we make a transform that may affect the parameters of the
989 // outer loop, such as exit counts for branches.
990 LLVM_ABI void forgetTopmostLoop(const Loop *L);
991
992 /// This method should be called by the client when it has changed a value
993 /// in a way that may effect its value, or which may disconnect it from a
994 /// def-use chain linking it to a loop.
995 LLVM_ABI void forgetValue(Value *V);
996
997 /// Forget LCSSA phi node V of loop L to which a new predecessor was added,
998 /// such that it may no longer be trivial.
1000
1001 /// Called when the client has changed the disposition of values in
1002 /// this loop.
1003 ///
1004 /// We don't have a way to invalidate per-loop dispositions. Clear and
1005 /// recompute is simpler.
1007
1008 /// Called when the client has changed the disposition of values in
1009 /// a loop or block.
1010 ///
1011 /// We don't have a way to invalidate per-loop/per-block dispositions. Clear
1012 /// and recompute is simpler.
1014
1015 /// Determine the minimum number of zero bits that S is guaranteed to end in
1016 /// (at every loop iteration). It is, at the same time, the minimum number
1017 /// of times S is divisible by 2. For example, given {4,+,8} it returns 2.
1018 /// If S is guaranteed to be 0, it returns the bitwidth of S.
1019 /// If \p CtxI is not nullptr, return a constant multiple valid at \p CtxI.
1021 const Instruction *CtxI = nullptr);
1022
1023 /// Returns the max constant multiple of S. If \p CtxI is not nullptr, return
1024 /// a constant multiple valid at \p CtxI.
1026 const Instruction *CtxI = nullptr);
1027
1028 // Returns the max constant multiple of S. If S is exactly 0, return 1.
1030
1031 /// Determine the unsigned range for a particular SCEV.
1032 /// NOTE: This returns a copy of the reference returned by getRangeRef.
1034 return getRangeRef(S, HINT_RANGE_UNSIGNED);
1035 }
1036
1037 /// Determine the min of the unsigned range for a particular SCEV.
1039 return getRangeRef(S, HINT_RANGE_UNSIGNED).getUnsignedMin();
1040 }
1041
1042 /// Determine the max of the unsigned range for a particular SCEV.
1044 return getRangeRef(S, HINT_RANGE_UNSIGNED).getUnsignedMax();
1045 }
1046
1047 /// Determine the signed range for a particular SCEV.
1048 /// NOTE: This returns a copy of the reference returned by getRangeRef.
1050 return getRangeRef(S, HINT_RANGE_SIGNED);
1051 }
1052
1053 /// Determine the min of the signed range for a particular SCEV.
1055 return getRangeRef(S, HINT_RANGE_SIGNED).getSignedMin();
1056 }
1057
1058 /// Determine the max of the signed range for a particular SCEV.
1060 return getRangeRef(S, HINT_RANGE_SIGNED).getSignedMax();
1061 }
1062
1063 /// Test if the given expression is known to be negative.
1064 LLVM_ABI bool isKnownNegative(const SCEV *S);
1065
1066 /// Test if the given expression is known to be positive.
1067 LLVM_ABI bool isKnownPositive(const SCEV *S);
1068
1069 /// Test if the given expression is known to be non-negative.
1070 LLVM_ABI bool isKnownNonNegative(const SCEV *S);
1071
1072 /// Test if the given expression is known to be non-positive.
1073 LLVM_ABI bool isKnownNonPositive(const SCEV *S);
1074
1075 /// Test if the given expression is known to be non-zero.
1076 LLVM_ABI bool isKnownNonZero(const SCEV *S);
1077
1078 /// Test if the given expression is known to be a power of 2. OrNegative
1079 /// allows matching negative power of 2s, and OrZero allows matching 0.
1080 LLVM_ABI bool isKnownToBeAPowerOfTwo(const SCEV *S, bool OrZero = false,
1081 bool OrNegative = false);
1082
1083 /// Check that \p S is a multiple of \p M. When \p S is an AddRecExpr, \p S is
1084 /// a multiple of \p M if \p S starts with a multiple of \p M and at every
1085 /// iteration step \p S only adds multiples of \p M. \p Assumptions records
1086 /// the runtime predicates under which \p S is a multiple of \p M.
1087 LLVM_ABI bool
1088 isKnownMultipleOf(const SCEV *S, uint64_t M,
1090
1091 /// Return true if we know that S1 and S2 must have the same sign.
1092 LLVM_ABI bool haveSameSign(const SCEV *S1, const SCEV *S2);
1093
1094 /// Splits SCEV expression \p S into two SCEVs. One of them is obtained from
1095 /// \p S by substitution of all AddRec sub-expression related to loop \p L
1096 /// with initial value of that SCEV. The second is obtained from \p S by
1097 /// substitution of all AddRec sub-expressions related to loop \p L with post
1098 /// increment of this AddRec in the loop \p L. In both cases all other AddRec
1099 /// sub-expressions (not related to \p L) remain the same.
1100 /// If the \p S contains non-invariant unknown SCEV the function returns
1101 /// CouldNotCompute SCEV in both values of std::pair.
1102 /// For example, for SCEV S={0, +, 1}<L1> + {0, +, 1}<L2> and loop L=L1
1103 /// the function returns pair:
1104 /// first = {0, +, 1}<L2>
1105 /// second = {1, +, 1}<L1> + {0, +, 1}<L2>
1106 /// We can see that for the first AddRec sub-expression it was replaced with
1107 /// 0 (initial value) for the first element and to {1, +, 1}<L1> (post
1108 /// increment value) for the second one. In both cases AddRec expression
1109 /// related to L2 remains the same.
1110 LLVM_ABI std::pair<const SCEV *, const SCEV *>
1111 SplitIntoInitAndPostInc(const Loop *L, const SCEV *S);
1112
1113 /// We'd like to check the predicate on every iteration of the most dominated
1114 /// loop between loops used in LHS and RHS.
1115 /// To do this we use the following list of steps:
1116 /// 1. Collect set S all loops on which either LHS or RHS depend.
1117 /// 2. If S is non-empty
1118 /// a. Let PD be the element of S which is dominated by all other elements.
1119 /// b. Let E(LHS) be value of LHS on entry of PD.
1120 /// To get E(LHS), we should just take LHS and replace all AddRecs that are
1121 /// attached to PD on with their entry values.
1122 /// Define E(RHS) in the same way.
1123 /// c. Let B(LHS) be value of L on backedge of PD.
1124 /// To get B(LHS), we should just take LHS and replace all AddRecs that are
1125 /// attached to PD on with their backedge values.
1126 /// Define B(RHS) in the same way.
1127 /// d. Note that E(LHS) and E(RHS) are automatically available on entry of PD,
1128 /// so we can assert on that.
1129 /// e. Return true if isLoopEntryGuardedByCond(Pred, E(LHS), E(RHS)) &&
1130 /// isLoopBackedgeGuardedByCond(Pred, B(LHS), B(RHS))
1132 const SCEV *RHS);
1133
1134 /// Test if the given expression is known to satisfy the condition described
1135 /// by Pred, LHS, and RHS.
1136 LLVM_ABI bool isKnownPredicate(CmpPredicate Pred, const SCEV *LHS,
1137 const SCEV *RHS);
1138
1139 /// Check whether the condition described by Pred, LHS, and RHS is true or
1140 /// false. If we know it, return the evaluation of this condition. If neither
1141 /// is proved, return std::nullopt.
1142 LLVM_ABI std::optional<bool>
1143 evaluatePredicate(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS);
1144
1145 /// Test if the given expression is known to satisfy the condition described
1146 /// by Pred, LHS, and RHS in the given Context.
1148 const SCEV *RHS, const Instruction *CtxI);
1149
1150 /// Check whether the condition described by Pred, LHS, and RHS is true or
1151 /// false in the given \p Context. If we know it, return the evaluation of
1152 /// this condition. If neither is proved, return std::nullopt.
1153 LLVM_ABI std::optional<bool> evaluatePredicateAt(CmpPredicate Pred,
1154 const SCEV *LHS,
1155 const SCEV *RHS,
1156 const Instruction *CtxI);
1157
1158 /// Test if the condition described by Pred, LHS, RHS is known to be true on
1159 /// every iteration of the loop of the recurrency LHS.
1161 const SCEVAddRecExpr *LHS,
1162 const SCEV *RHS);
1163
1164 /// Information about the number of loop iterations for which a loop exit's
1165 /// branch condition evaluates to the not-taken path. This is a temporary
1166 /// pair of exact and max expressions that are eventually summarized in
1167 /// ExitNotTakenInfo and BackedgeTakenInfo.
1168 struct ExitLimit {
1169 const SCEV *ExactNotTaken; // The exit is not taken exactly this many times
1170 const SCEV *ConstantMaxNotTaken; // The exit is not taken at most this many
1171 // times
1173
1174 // Not taken either exactly ConstantMaxNotTaken or zero times
1175 bool MaxOrZero = false;
1176
1177 /// A vector of predicate guards for this ExitLimit. The result is only
1178 /// valid if all of the predicates in \c Predicates evaluate to 'true' at
1179 /// run-time.
1181
1182 /// Construct either an exact exit limit from a constant, or an unknown
1183 /// one from a SCEVCouldNotCompute. No other types of SCEVs are allowed
1184 /// as arguments and asserts enforce that internally.
1185 /*implicit*/ LLVM_ABI ExitLimit(const SCEV *E);
1186
1187 LLVM_ABI
1188 ExitLimit(const SCEV *E, const SCEV *ConstantMaxNotTaken,
1189 const SCEV *SymbolicMaxNotTaken, bool MaxOrZero,
1191
1193 const SCEV *SymbolicMaxNotTaken, bool MaxOrZero,
1195
1196 /// Test whether this ExitLimit contains any computed information, or
1197 /// whether it's all SCEVCouldNotCompute values.
1202
1203 /// Test whether this ExitLimit contains all information.
1204 bool hasFullInfo() const {
1206 }
1207 };
1208
1209 /// Compute the number of times the backedge of the specified loop will
1210 /// execute if its exit condition were a conditional branch of ExitCond.
1211 ///
1212 /// \p ControlsOnlyExit is true if ExitCond directly controls the only exit
1213 /// branch. In this case, we can assume that the loop exits only if the
1214 /// condition is true and can infer that failing to meet the condition prior
1215 /// to integer wraparound results in undefined behavior.
1216 ///
1217 /// If \p AllowPredicates is set, this call will try to use a minimal set of
1218 /// SCEV predicates in order to return an exact answer.
1219 LLVM_ABI ExitLimit computeExitLimitFromCond(const Loop *L, Value *ExitCond,
1220 bool ExitIfTrue,
1221 bool ControlsOnlyExit,
1222 bool AllowPredicates = false);
1223
1224 /// A predicate is said to be monotonically increasing if may go from being
1225 /// false to being true as the loop iterates, but never the other way
1226 /// around. A predicate is said to be monotonically decreasing if may go
1227 /// from being true to being false as the loop iterates, but never the other
1228 /// way around.
1233
1234 /// If, for all loop invariant X, the predicate "LHS `Pred` X" is
1235 /// monotonically increasing or decreasing, returns
1236 /// Some(MonotonicallyIncreasing) and Some(MonotonicallyDecreasing)
1237 /// respectively. If we could not prove either of these facts, returns
1238 /// std::nullopt.
1239 LLVM_ABI std::optional<MonotonicPredicateType>
1241 ICmpInst::Predicate Pred);
1242
1251 /// If the result of the predicate LHS `Pred` RHS is loop invariant with
1252 /// respect to L, return a LoopInvariantPredicate with LHS and RHS being
1253 /// invariants, available at L's entry. Otherwise, return std::nullopt.
1254 LLVM_ABI std::optional<LoopInvariantPredicate>
1256 const Loop *L, const Instruction *CtxI = nullptr);
1257
1258 /// If the result of the predicate LHS `Pred` RHS is loop invariant with
1259 /// respect to L at given Context during at least first MaxIter iterations,
1260 /// return a LoopInvariantPredicate with LHS and RHS being invariants,
1261 /// available at L's entry. Otherwise, return std::nullopt. The predicate
1262 /// should be the loop's exit condition.
1263 LLVM_ABI std::optional<LoopInvariantPredicate>
1265 const SCEV *LHS,
1266 const SCEV *RHS, const Loop *L,
1267 const Instruction *CtxI,
1268 const SCEV *MaxIter);
1269
1270 LLVM_ABI std::optional<LoopInvariantPredicate>
1272 CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const Loop *L,
1273 const Instruction *CtxI, const SCEV *MaxIter);
1274
1275 /// Simplify LHS and RHS in a comparison with predicate Pred. Return true
1276 /// iff any changes were made. If the operands are provably equal or
1277 /// unequal, LHS and RHS are set to the same value and Pred is set to either
1278 /// ICMP_EQ or ICMP_NE.
1280 const SCEV *&RHS, unsigned Depth = 0);
1281
1282 /// Return the "disposition" of the given SCEV with respect to the given
1283 /// loop.
1285
1286 /// Return true if the value of the given SCEV is unchanging in the
1287 /// specified loop.
1288 LLVM_ABI bool isLoopInvariant(const SCEV *S, const Loop *L);
1289
1290 /// Determine if the SCEV can be evaluated at loop's entry. It is true if it
1291 /// doesn't depend on a SCEVUnknown of an instruction which is dominated by
1292 /// the header of loop L.
1293 LLVM_ABI bool isAvailableAtLoopEntry(const SCEV *S, const Loop *L);
1294
1295 /// Return true if the given SCEV changes value in a known way in the
1296 /// specified loop. This property being true implies that the value is
1297 /// variant in the loop AND that we can emit an expression to compute the
1298 /// value of the expression at any particular loop iteration.
1299 LLVM_ABI bool hasComputableLoopEvolution(const SCEV *S, const Loop *L);
1300
1301 /// Return the "disposition" of the given SCEV with respect to the given
1302 /// block.
1304 const BasicBlock *BB);
1305
1306 /// Return true if elements that makes up the given SCEV dominate the
1307 /// specified basic block.
1308 LLVM_ABI bool dominates(const SCEV *S, const BasicBlock *BB);
1309
1310 /// Return true if elements that makes up the given SCEV properly dominate
1311 /// the specified basic block.
1312 LLVM_ABI bool properlyDominates(const SCEV *S, const BasicBlock *BB);
1313
1314 /// Test whether the given SCEV has Op as a direct or indirect operand.
1315 LLVM_ABI bool hasOperand(const SCEV *S, const SCEV *Op) const;
1316
1317 /// Return the size of an element read or written by Inst.
1319
1320 LLVM_ABI void print(raw_ostream &OS) const;
1321 LLVM_ABI void verify() const;
1323 FunctionAnalysisManager::Invalidator &Inv);
1324
1325 /// Return the DataLayout associated with the module this SCEV instance is
1326 /// operating on.
1327 const DataLayout &getDataLayout() const { return DL; }
1328
1330 const SCEV *RHS);
1332 const SCEV *LHS,
1333 const SCEV *RHS);
1334
1335 LLVM_ABI const SCEVPredicate *
1338
1339 /// Re-writes the SCEV according to the Predicates in \p A.
1340 LLVM_ABI const SCEV *rewriteUsingPredicate(const SCEV *S, const Loop *L,
1341 const SCEVPredicate &A);
1342 /// Tries to convert the \p S expression to an AddRec expression,
1343 /// adding additional predicates to \p Preds as required.
1345 const SCEV *S, const Loop *L,
1347
1348 /// Compute \p LHS - \p RHS and returns the result as an APInt if it is a
1349 /// constant, and std::nullopt if it isn't.
1350 ///
1351 /// This is intended to be a cheaper version of getMinusSCEV. We can be
1352 /// frugal here since we just bail out of actually constructing and
1353 /// canonicalizing an expression in the cases where the result isn't going
1354 /// to be a constant.
1355 LLVM_ABI std::optional<APInt> computeConstantDifference(const SCEV *LHS,
1356 const SCEV *RHS);
1357
1358 /// Update no-wrap flags of an AddRec. This may drop the cached info about
1359 /// this AddRec (such as range info) in case if new flags may potentially
1360 /// sharpen it.
1362
1363 class LoopGuards {
1366 bool PreserveNUW = false;
1367 bool PreserveNSW = false;
1368 ScalarEvolution &SE;
1369
1370 LoopGuards(ScalarEvolution &SE) : SE(SE) {}
1371
1372 /// Recursively collect loop guards in \p Guards, starting from
1373 /// block \p Block with predecessor \p Pred. The intended starting point
1374 /// is to collect from a loop header and its predecessor.
1375 static void
1376 collectFromBlock(ScalarEvolution &SE, ScalarEvolution::LoopGuards &Guards,
1377 const BasicBlock *Block, const BasicBlock *Pred,
1379 unsigned Depth = 0);
1380
1381 /// Collect loop guards in \p Guards, starting from PHINode \p
1382 /// Phi, by calling \p collectFromBlock on the incoming blocks of
1383 /// \Phi and trying to merge the found constraints into a single
1384 /// combined one for \p Phi.
1385 static void collectFromPHI(
1389 unsigned Depth);
1390
1391 public:
1392 /// Collect rewrite map for loop guards for loop \p L, together with flags
1393 /// indicating if NUW and NSW can be preserved during rewriting.
1394 LLVM_ABI static LoopGuards collect(const Loop *L, ScalarEvolution &SE);
1395
1396 /// Try to apply the collected loop guards to \p Expr.
1397 LLVM_ABI const SCEV *rewrite(const SCEV *Expr) const;
1398 };
1399
1400 /// Try to apply information from loop guards for \p L to \p Expr.
1401 LLVM_ABI const SCEV *applyLoopGuards(const SCEV *Expr, const Loop *L);
1402 LLVM_ABI const SCEV *applyLoopGuards(const SCEV *Expr,
1403 const LoopGuards &Guards);
1404
1405 /// Return true if the loop has no abnormal exits. That is, if the loop
1406 /// is not infinite, it must exit through an explicit edge in the CFG.
1407 /// (As opposed to either a) throwing out of the function or b) entering a
1408 /// well defined infinite loop in some callee.)
1410 return getLoopProperties(L).HasNoAbnormalExits;
1411 }
1412
1413 /// Return true if this loop is finite by assumption. That is,
1414 /// to be infinite, it must also be undefined.
1415 LLVM_ABI bool loopIsFiniteByAssumption(const Loop *L);
1416
1417 /// Return the set of Values that, if poison, will definitively result in S
1418 /// being poison as well. The returned set may be incomplete, i.e. there can
1419 /// be additional Values that also result in S being poison.
1420 LLVM_ABI void
1422 const SCEV *S);
1423
1424 /// Check whether it is poison-safe to represent the expression S using the
1425 /// instruction I. If such a replacement is performed, the poison flags of
1426 /// instructions in DropPoisonGeneratingInsts must be dropped.
1428 const SCEV *S, Instruction *I,
1429 SmallVectorImpl<Instruction *> &DropPoisonGeneratingInsts);
1430
1431 class FoldID {
1432 const SCEV *Op = nullptr;
1433 const Type *Ty = nullptr;
1434 unsigned short C;
1435
1436 public:
1437 FoldID(SCEVTypes C, const SCEV *Op, const Type *Ty) : Op(Op), Ty(Ty), C(C) {
1438 assert(Op);
1439 assert(Ty);
1440 }
1441
1442 FoldID(unsigned short C) : C(C) {}
1443
1444 unsigned computeHash() const {
1446 C, detail::combineHashValue(reinterpret_cast<uintptr_t>(Op),
1447 reinterpret_cast<uintptr_t>(Ty)));
1448 }
1449
1450 bool operator==(const FoldID &RHS) const {
1451 return std::tie(Op, Ty, C) == std::tie(RHS.Op, RHS.Ty, RHS.C);
1452 }
1453 };
1454
1455private:
1456 /// A CallbackVH to arrange for ScalarEvolution to be notified whenever a
1457 /// Value is deleted.
1458 class LLVM_ABI SCEVCallbackVH final : public CallbackVH {
1459 ScalarEvolution *SE;
1460
1461 void deleted() override;
1462 void allUsesReplacedWith(Value *New) override;
1463
1464 public:
1465 SCEVCallbackVH(Value *V, ScalarEvolution *SE = nullptr);
1466 };
1467
1468 friend class SCEVCallbackVH;
1469 friend class SCEVExpander;
1470 friend class SCEVUnknown;
1471
1472 /// The function we are analyzing.
1473 Function &F;
1474
1475 /// Data layout of the module.
1476 const DataLayout &DL;
1477
1478 /// Does the module have any calls to the llvm.experimental.guard intrinsic
1479 /// at all? If this is false, we avoid doing work that will only help if
1480 /// thare are guards present in the IR.
1481 bool HasGuards;
1482
1483 /// The target library information for the target we are targeting.
1484 TargetLibraryInfo &TLI;
1485
1486 /// The tracker for \@llvm.assume intrinsics in this function.
1487 AssumptionCache &AC;
1488
1489 /// The dominator tree.
1490 DominatorTree &DT;
1491
1492 /// The loop information for the function we are currently analyzing.
1493 LoopInfo &LI;
1494
1495 /// This SCEV is used to represent unknown trip counts and things.
1496 std::unique_ptr<SCEVCouldNotCompute> CouldNotCompute;
1497
1498 /// The type for HasRecMap.
1499 using HasRecMapType = DenseMap<const SCEV *, bool>;
1500
1501 /// This is a cache to record whether a SCEV contains any scAddRecExpr.
1502 HasRecMapType HasRecMap;
1503
1504 /// The type for ExprValueMap.
1505 using ValueSetVector = SmallSetVector<Value *, 4>;
1506 using ExprValueMapType = DenseMap<const SCEV *, ValueSetVector>;
1507
1508 /// ExprValueMap -- This map records the original values from which
1509 /// the SCEV expr is generated from.
1510 ExprValueMapType ExprValueMap;
1511
1512 /// The type for ValueExprMap.
1513 using ValueExprMapType =
1515
1516 /// This is a cache of the values we have analyzed so far.
1517 ValueExprMapType ValueExprMap;
1518
1519 /// This is a cache for expressions that got folded to a different existing
1520 /// SCEV.
1523
1524 /// Mark predicate values currently being processed by isImpliedCond.
1525 SmallPtrSet<const Value *, 6> PendingLoopPredicates;
1526
1527 /// Mark SCEVUnknown Phis currently being processed by getRangeRef.
1528 SmallPtrSet<const PHINode *, 6> PendingPhiRanges;
1529
1530 /// Mark SCEVUnknown Phis currently being processed by getRangeRefIter.
1531 SmallPtrSet<const PHINode *, 6> PendingPhiRangesIter;
1532
1533 // Mark SCEVUnknown Phis currently being processed by isImpliedViaMerge.
1534 SmallPtrSet<const PHINode *, 6> PendingMerges;
1535
1536 /// Set to true by isLoopBackedgeGuardedByCond when we're walking the set of
1537 /// conditions dominating the backedge of a loop.
1538 bool WalkingBEDominatingConds = false;
1539
1540 /// Set to true by isKnownPredicateViaSplitting when we're trying to prove a
1541 /// predicate by splitting it into a set of independent predicates.
1542 bool ProvingSplitPredicate = false;
1543
1544 /// Memoized values for the getConstantMultiple
1545 DenseMap<const SCEV *, APInt> ConstantMultipleCache;
1546
1547 /// Return the Value set from which the SCEV expr is generated.
1548 ArrayRef<Value *> getSCEVValues(const SCEV *S);
1549
1550 /// Private helper method for the getConstantMultiple method. If \p CtxI is
1551 /// not nullptr, return a constant multiple valid at \p CtxI.
1552 APInt getConstantMultipleImpl(const SCEV *S,
1553 const Instruction *Ctx = nullptr);
1554
1555 /// Information about the number of times a particular loop exit may be
1556 /// reached before exiting the loop.
1557 struct ExitNotTakenInfo {
1558 PoisoningVH<BasicBlock> ExitingBlock;
1559 const SCEV *ExactNotTaken;
1560 const SCEV *ConstantMaxNotTaken;
1561 const SCEV *SymbolicMaxNotTaken;
1563
1564 explicit ExitNotTakenInfo(PoisoningVH<BasicBlock> ExitingBlock,
1565 const SCEV *ExactNotTaken,
1566 const SCEV *ConstantMaxNotTaken,
1567 const SCEV *SymbolicMaxNotTaken,
1569 : ExitingBlock(ExitingBlock), ExactNotTaken(ExactNotTaken),
1570 ConstantMaxNotTaken(ConstantMaxNotTaken),
1571 SymbolicMaxNotTaken(SymbolicMaxNotTaken), Predicates(Predicates) {}
1572
1573 bool hasAlwaysTruePredicate() const {
1574 return Predicates.empty();
1575 }
1576 };
1577
1578 /// Information about the backedge-taken count of a loop. This currently
1579 /// includes an exact count and a maximum count.
1580 ///
1581 class BackedgeTakenInfo {
1582 friend class ScalarEvolution;
1583
1584 /// A list of computable exits and their not-taken counts. Loops almost
1585 /// never have more than one computable exit.
1586 SmallVector<ExitNotTakenInfo, 1> ExitNotTaken;
1587
1588 /// Expression indicating the least constant maximum backedge-taken count of
1589 /// the loop that is known, or a SCEVCouldNotCompute. This expression is
1590 /// only valid if the predicates associated with all loop exits are true.
1591 const SCEV *ConstantMax = nullptr;
1592
1593 /// Indicating if \c ExitNotTaken has an element for every exiting block in
1594 /// the loop.
1595 bool IsComplete = false;
1596
1597 /// Expression indicating the least maximum backedge-taken count of the loop
1598 /// that is known, or a SCEVCouldNotCompute. Lazily computed on first query.
1599 const SCEV *SymbolicMax = nullptr;
1600
1601 /// True iff the backedge is taken either exactly Max or zero times.
1602 bool MaxOrZero = false;
1603
1604 bool isComplete() const { return IsComplete; }
1605 const SCEV *getConstantMax() const { return ConstantMax; }
1606
1607 LLVM_ABI const ExitNotTakenInfo *getExitNotTaken(
1608 const BasicBlock *ExitingBlock,
1609 SmallVectorImpl<const SCEVPredicate *> *Predicates = nullptr) const;
1610
1611 public:
1612 BackedgeTakenInfo() = default;
1613 BackedgeTakenInfo(BackedgeTakenInfo &&) = default;
1614 BackedgeTakenInfo &operator=(BackedgeTakenInfo &&) = default;
1615
1616 using EdgeExitInfo = std::pair<BasicBlock *, ExitLimit>;
1617
1618 /// Initialize BackedgeTakenInfo from a list of exact exit counts.
1619 LLVM_ABI BackedgeTakenInfo(ArrayRef<EdgeExitInfo> ExitCounts,
1620 bool IsComplete, const SCEV *ConstantMax,
1621 bool MaxOrZero);
1622
1623 /// Test whether this BackedgeTakenInfo contains any computed information,
1624 /// or whether it's all SCEVCouldNotCompute values.
1625 bool hasAnyInfo() const {
1626 return !ExitNotTaken.empty() ||
1627 !isa<SCEVCouldNotCompute>(getConstantMax());
1628 }
1629
1630 /// Test whether this BackedgeTakenInfo contains complete information.
1631 bool hasFullInfo() const { return isComplete(); }
1632
1633 /// Return an expression indicating the exact *backedge-taken*
1634 /// count of the loop if it is known or SCEVCouldNotCompute
1635 /// otherwise. If execution makes it to the backedge on every
1636 /// iteration (i.e. there are no abnormal exists like exception
1637 /// throws and thread exits) then this is the number of times the
1638 /// loop header will execute minus one.
1639 ///
1640 /// If the SCEV predicate associated with the answer can be different
1641 /// from AlwaysTrue, we must add a (non null) Predicates argument.
1642 /// The SCEV predicate associated with the answer will be added to
1643 /// Predicates. A run-time check needs to be emitted for the SCEV
1644 /// predicate in order for the answer to be valid.
1645 ///
1646 /// Note that we should always know if we need to pass a predicate
1647 /// argument or not from the way the ExitCounts vector was computed.
1648 /// If we allowed SCEV predicates to be generated when populating this
1649 /// vector, this information can contain them and therefore a
1650 /// SCEVPredicate argument should be added to getExact.
1651 LLVM_ABI const SCEV *getExact(
1652 const Loop *L, ScalarEvolution *SE,
1653 SmallVectorImpl<const SCEVPredicate *> *Predicates = nullptr) const;
1654
1655 /// Return the number of times this loop exit may fall through to the back
1656 /// edge, or SCEVCouldNotCompute. The loop is guaranteed not to exit via
1657 /// this block before this number of iterations, but may exit via another
1658 /// block. If \p Predicates is null the function returns CouldNotCompute if
1659 /// predicates are required, otherwise it fills in the required predicates.
1660 const SCEV *getExact(
1661 const BasicBlock *ExitingBlock, ScalarEvolution *SE,
1662 SmallVectorImpl<const SCEVPredicate *> *Predicates = nullptr) const {
1663 if (auto *ENT = getExitNotTaken(ExitingBlock, Predicates))
1664 return ENT->ExactNotTaken;
1665 else
1666 return SE->getCouldNotCompute();
1667 }
1668
1669 /// Get the constant max backedge taken count for the loop.
1670 LLVM_ABI const SCEV *getConstantMax(
1671 ScalarEvolution *SE,
1672 SmallVectorImpl<const SCEVPredicate *> *Predicates = nullptr) const;
1673
1674 /// Get the constant max backedge taken count for the particular loop exit.
1675 const SCEV *getConstantMax(
1676 const BasicBlock *ExitingBlock, ScalarEvolution *SE,
1677 SmallVectorImpl<const SCEVPredicate *> *Predicates = nullptr) const {
1678 if (auto *ENT = getExitNotTaken(ExitingBlock, Predicates))
1679 return ENT->ConstantMaxNotTaken;
1680 else
1681 return SE->getCouldNotCompute();
1682 }
1683
1684 /// Get the symbolic max backedge taken count for the loop.
1685 LLVM_ABI const SCEV *getSymbolicMax(
1686 const Loop *L, ScalarEvolution *SE,
1687 SmallVectorImpl<const SCEVPredicate *> *Predicates = nullptr);
1688
1689 /// Get the symbolic max backedge taken count for the particular loop exit.
1690 const SCEV *getSymbolicMax(
1691 const BasicBlock *ExitingBlock, ScalarEvolution *SE,
1692 SmallVectorImpl<const SCEVPredicate *> *Predicates = nullptr) const {
1693 if (auto *ENT = getExitNotTaken(ExitingBlock, Predicates))
1694 return ENT->SymbolicMaxNotTaken;
1695 else
1696 return SE->getCouldNotCompute();
1697 }
1698
1699 /// Return true if the number of times this backedge is taken is either the
1700 /// value returned by getConstantMax or zero.
1701 LLVM_ABI bool isConstantMaxOrZero(ScalarEvolution *SE) const;
1702 };
1703
1704 /// Cache the backedge-taken count of the loops for this function as they
1705 /// are computed.
1706 DenseMap<const Loop *, BackedgeTakenInfo> BackedgeTakenCounts;
1707
1708 /// Cache the predicated backedge-taken count of the loops for this
1709 /// function as they are computed.
1710 DenseMap<const Loop *, BackedgeTakenInfo> PredicatedBackedgeTakenCounts;
1711
1712 /// Loops whose backedge taken counts directly use this non-constant SCEV.
1713 DenseMap<const SCEV *, SmallPtrSet<PointerIntPair<const Loop *, 1, bool>, 4>>
1714 BECountUsers;
1715
1716 /// This map contains entries for all of the PHI instructions that we
1717 /// attempt to compute constant evolutions for. This allows us to avoid
1718 /// potentially expensive recomputation of these properties. An instruction
1719 /// maps to null if we are unable to compute its exit value.
1720 DenseMap<PHINode *, Constant *> ConstantEvolutionLoopExitValue;
1721
1722 /// This map contains entries for all the expressions that we attempt to
1723 /// compute getSCEVAtScope information for, which can be expensive in
1724 /// extreme cases.
1725 DenseMap<const SCEV *, SmallVector<std::pair<const Loop *, const SCEV *>, 2>>
1726 ValuesAtScopes;
1727
1728 /// Reverse map for invalidation purposes: Stores of which SCEV and which
1729 /// loop this is the value-at-scope of.
1730 DenseMap<const SCEV *, SmallVector<std::pair<const Loop *, const SCEV *>, 2>>
1731 ValuesAtScopesUsers;
1732
1733 /// Memoized computeLoopDisposition results.
1734 DenseMap<const SCEV *,
1736 LoopDispositions;
1737
1738 struct LoopProperties {
1739 /// Set to true if the loop contains no instruction that can abnormally exit
1740 /// the loop (i.e. via throwing an exception, by terminating the thread
1741 /// cleanly or by infinite looping in a called function). Strictly
1742 /// speaking, the last one is not leaving the loop, but is identical to
1743 /// leaving the loop for reasoning about undefined behavior.
1744 bool HasNoAbnormalExits;
1745
1746 /// Set to true if the loop contains no instruction that can have side
1747 /// effects (i.e. via throwing an exception, volatile or atomic access).
1748 bool HasNoSideEffects;
1749 };
1750
1751 /// Cache for \c getLoopProperties.
1752 DenseMap<const Loop *, LoopProperties> LoopPropertiesCache;
1753
1754 /// Return a \c LoopProperties instance for \p L, creating one if necessary.
1755 LLVM_ABI LoopProperties getLoopProperties(const Loop *L);
1756
1757 bool loopHasNoSideEffects(const Loop *L) {
1758 return getLoopProperties(L).HasNoSideEffects;
1759 }
1760
1761 /// Compute a LoopDisposition value.
1762 LoopDisposition computeLoopDisposition(const SCEV *S, const Loop *L);
1763
1764 /// Memoized computeBlockDisposition results.
1765 DenseMap<
1766 const SCEV *,
1768 BlockDispositions;
1769
1770 /// Compute a BlockDisposition value.
1771 BlockDisposition computeBlockDisposition(const SCEV *S, const BasicBlock *BB);
1772
1773 /// Stores all SCEV that use a given SCEV as its direct operand.
1774 DenseMap<const SCEV *, SmallPtrSet<const SCEV *, 8> > SCEVUsers;
1775
1776 /// Memoized results from getRange
1777 DenseMap<const SCEV *, ConstantRange> UnsignedRanges;
1778
1779 /// Memoized results from getRange
1780 DenseMap<const SCEV *, ConstantRange> SignedRanges;
1781
1782 /// Used to parameterize getRange
1783 enum RangeSignHint { HINT_RANGE_UNSIGNED, HINT_RANGE_SIGNED };
1784
1785 /// Set the memoized range for the given SCEV.
1786 const ConstantRange &setRange(const SCEV *S, RangeSignHint Hint,
1787 ConstantRange CR) {
1788 DenseMap<const SCEV *, ConstantRange> &Cache =
1789 Hint == HINT_RANGE_UNSIGNED ? UnsignedRanges : SignedRanges;
1790
1791 auto Pair = Cache.insert_or_assign(S, std::move(CR));
1792 return Pair.first->second;
1793 }
1794
1795 /// Determine the range for a particular SCEV.
1796 /// NOTE: This returns a reference to an entry in a cache. It must be
1797 /// copied if its needed for longer.
1798 LLVM_ABI const ConstantRange &getRangeRef(const SCEV *S, RangeSignHint Hint,
1799 unsigned Depth = 0);
1800
1801 /// Determine the range for a particular SCEV, but evaluates ranges for
1802 /// operands iteratively first.
1803 const ConstantRange &getRangeRefIter(const SCEV *S, RangeSignHint Hint);
1804
1805 /// Determines the range for the affine SCEVAddRecExpr {\p Start,+,\p Step}.
1806 /// Helper for \c getRange.
1807 ConstantRange getRangeForAffineAR(const SCEV *Start, const SCEV *Step,
1808 const APInt &MaxBECount);
1809
1810 /// Determines the range for the affine non-self-wrapping SCEVAddRecExpr {\p
1811 /// Start,+,\p Step}<nw>.
1812 ConstantRange getRangeForAffineNoSelfWrappingAR(const SCEVAddRecExpr *AddRec,
1813 const SCEV *MaxBECount,
1814 unsigned BitWidth,
1815 RangeSignHint SignHint);
1816
1817 /// Try to compute a range for the affine SCEVAddRecExpr {\p Start,+,\p
1818 /// Step} by "factoring out" a ternary expression from the add recurrence.
1819 /// Helper called by \c getRange.
1820 ConstantRange getRangeViaFactoring(const SCEV *Start, const SCEV *Step,
1821 const APInt &MaxBECount);
1822
1823 /// If the unknown expression U corresponds to a simple recurrence, return
1824 /// a constant range which represents the entire recurrence. Note that
1825 /// *add* recurrences with loop invariant steps aren't represented by
1826 /// SCEVUnknowns and thus don't use this mechanism.
1827 ConstantRange getRangeForUnknownRecurrence(const SCEVUnknown *U);
1828
1829 /// We know that there is no SCEV for the specified value. Analyze the
1830 /// expression recursively.
1831 const SCEV *createSCEV(Value *V);
1832
1833 /// We know that there is no SCEV for the specified value. Create a new SCEV
1834 /// for \p V iteratively.
1835 const SCEV *createSCEVIter(Value *V);
1836 /// Collect operands of \p V for which SCEV expressions should be constructed
1837 /// first. Returns a SCEV directly if it can be constructed trivially for \p
1838 /// V.
1839 const SCEV *getOperandsToCreate(Value *V, SmallVectorImpl<Value *> &Ops);
1840
1841 /// Returns SCEV for the first operand of a phi if all phi operands have
1842 /// identical opcodes and operands.
1843 const SCEV *createNodeForPHIWithIdenticalOperands(PHINode *PN);
1844
1845 /// Provide the special handling we need to analyze PHI SCEVs.
1846 const SCEV *createNodeForPHI(PHINode *PN);
1847
1848 /// Helper function called from createNodeForPHI.
1849 const SCEV *createAddRecFromPHI(PHINode *PN);
1850
1851 /// A helper function for createAddRecFromPHI to handle simple cases.
1852 const SCEV *createSimpleAffineAddRec(PHINode *PN, Value *BEValueV,
1853 Value *StartValueV);
1854
1855 /// Helper function called from createNodeForPHI.
1856 const SCEV *createNodeFromSelectLikePHI(PHINode *PN);
1857
1858 /// Provide special handling for a select-like instruction (currently this
1859 /// is either a select instruction or a phi node). \p Ty is the type of the
1860 /// instruction being processed, that is assumed equivalent to
1861 /// "Cond ? TrueVal : FalseVal".
1862 std::optional<const SCEV *>
1863 createNodeForSelectOrPHIInstWithICmpInstCond(Type *Ty, ICmpInst *Cond,
1864 Value *TrueVal, Value *FalseVal);
1865
1866 /// See if we can model this select-like instruction via umin_seq expression.
1867 const SCEV *createNodeForSelectOrPHIViaUMinSeq(Value *I, Value *Cond,
1868 Value *TrueVal,
1869 Value *FalseVal);
1870
1871 /// Given a value \p V, which is a select-like instruction (currently this is
1872 /// either a select instruction or a phi node), which is assumed equivalent to
1873 /// Cond ? TrueVal : FalseVal
1874 /// see if we can model it as a SCEV expression.
1875 const SCEV *createNodeForSelectOrPHI(Value *V, Value *Cond, Value *TrueVal,
1876 Value *FalseVal);
1877
1878 /// Provide the special handling we need to analyze GEP SCEVs.
1879 const SCEV *createNodeForGEP(GEPOperator *GEP);
1880
1881 /// Implementation code for getSCEVAtScope; called at most once for each
1882 /// SCEV+Loop pair.
1883 const SCEV *computeSCEVAtScope(const SCEV *S, const Loop *L);
1884
1885 /// Return the BackedgeTakenInfo for the given loop, lazily computing new
1886 /// values if the loop hasn't been analyzed yet. The returned result is
1887 /// guaranteed not to be predicated.
1888 BackedgeTakenInfo &getBackedgeTakenInfo(const Loop *L);
1889
1890 /// Similar to getBackedgeTakenInfo, but will add predicates as required
1891 /// with the purpose of returning complete information.
1892 BackedgeTakenInfo &getPredicatedBackedgeTakenInfo(const Loop *L);
1893
1894 /// Compute the number of times the specified loop will iterate.
1895 /// If AllowPredicates is set, we will create new SCEV predicates as
1896 /// necessary in order to return an exact answer.
1897 BackedgeTakenInfo computeBackedgeTakenCount(const Loop *L,
1898 bool AllowPredicates = false);
1899
1900 /// Compute the number of times the backedge of the specified loop will
1901 /// execute if it exits via the specified block. If AllowPredicates is set,
1902 /// this call will try to use a minimal set of SCEV predicates in order to
1903 /// return an exact answer.
1904 ExitLimit computeExitLimit(const Loop *L, BasicBlock *ExitingBlock,
1905 bool IsOnlyExit, bool AllowPredicates = false);
1906
1907 // Helper functions for computeExitLimitFromCond to avoid exponential time
1908 // complexity.
1909
1910 class ExitLimitCache {
1911 // It may look like we need key on the whole (L, ExitIfTrue,
1912 // ControlsOnlyExit, AllowPredicates) tuple, but recursive calls to
1913 // computeExitLimitFromCondCached from computeExitLimitFromCondImpl only
1914 // vary the in \c ExitCond and \c ControlsOnlyExit parameters. We remember
1915 // the initial values of the other values to assert our assumption.
1916 SmallDenseMap<PointerIntPair<Value *, 1>, ExitLimit> TripCountMap;
1917
1918 const Loop *L;
1919 bool ExitIfTrue;
1920 bool AllowPredicates;
1921
1922 public:
1923 ExitLimitCache(const Loop *L, bool ExitIfTrue, bool AllowPredicates)
1924 : L(L), ExitIfTrue(ExitIfTrue), AllowPredicates(AllowPredicates) {}
1925
1926 LLVM_ABI std::optional<ExitLimit> find(const Loop *L, Value *ExitCond,
1927 bool ExitIfTrue,
1928 bool ControlsOnlyExit,
1929 bool AllowPredicates);
1930
1931 LLVM_ABI void insert(const Loop *L, Value *ExitCond, bool ExitIfTrue,
1932 bool ControlsOnlyExit, bool AllowPredicates,
1933 const ExitLimit &EL);
1934 };
1935
1936 using ExitLimitCacheTy = ExitLimitCache;
1937
1938 ExitLimit computeExitLimitFromCondCached(ExitLimitCacheTy &Cache,
1939 const Loop *L, Value *ExitCond,
1940 bool ExitIfTrue,
1941 bool ControlsOnlyExit,
1942 bool AllowPredicates);
1943 ExitLimit computeExitLimitFromCondImpl(ExitLimitCacheTy &Cache, const Loop *L,
1944 Value *ExitCond, bool ExitIfTrue,
1945 bool ControlsOnlyExit,
1946 bool AllowPredicates);
1947 std::optional<ScalarEvolution::ExitLimit> computeExitLimitFromCondFromBinOp(
1948 ExitLimitCacheTy &Cache, const Loop *L, Value *ExitCond, bool ExitIfTrue,
1949 bool ControlsOnlyExit, bool AllowPredicates);
1950
1951 /// Compute the number of times the backedge of the specified loop will
1952 /// execute if its exit condition were a conditional branch of the ICmpInst
1953 /// ExitCond and ExitIfTrue. If AllowPredicates is set, this call will try
1954 /// to use a minimal set of SCEV predicates in order to return an exact
1955 /// answer.
1956 ExitLimit computeExitLimitFromICmp(const Loop *L, ICmpInst *ExitCond,
1957 bool ExitIfTrue,
1958 bool IsSubExpr,
1959 bool AllowPredicates = false);
1960
1961 /// Variant of previous which takes the components representing an ICmp
1962 /// as opposed to the ICmpInst itself. Note that the prior version can
1963 /// return more precise results in some cases and is preferred when caller
1964 /// has a materialized ICmp.
1965 ExitLimit computeExitLimitFromICmp(const Loop *L, CmpPredicate Pred,
1966 const SCEV *LHS, const SCEV *RHS,
1967 bool IsSubExpr,
1968 bool AllowPredicates = false);
1969
1970 /// Compute the number of times the backedge of the specified loop will
1971 /// execute if its exit condition were a switch with a single exiting case
1972 /// to ExitingBB.
1973 ExitLimit computeExitLimitFromSingleExitSwitch(const Loop *L,
1974 SwitchInst *Switch,
1975 BasicBlock *ExitingBB,
1976 bool IsSubExpr);
1977
1978 /// Compute the exit limit of a loop that is controlled by a
1979 /// "(IV >> 1) != 0" type comparison. We cannot compute the exact trip
1980 /// count in these cases (since SCEV has no way of expressing them), but we
1981 /// can still sometimes compute an upper bound.
1982 ///
1983 /// Return an ExitLimit for a loop whose backedge is guarded by `LHS Pred
1984 /// RHS`.
1985 ExitLimit computeShiftCompareExitLimit(Value *LHS, Value *RHS, const Loop *L,
1986 ICmpInst::Predicate Pred);
1987
1988 /// If the loop is known to execute a constant number of times (the
1989 /// condition evolves only from constants), try to evaluate a few iterations
1990 /// of the loop until we get the exit condition gets a value of ExitWhen
1991 /// (true or false). If we cannot evaluate the exit count of the loop,
1992 /// return CouldNotCompute.
1993 const SCEV *computeExitCountExhaustively(const Loop *L, Value *Cond,
1994 bool ExitWhen);
1995
1996 /// Return the number of times an exit condition comparing the specified
1997 /// value to zero will execute. If not computable, return CouldNotCompute.
1998 /// If AllowPredicates is set, this call will try to use a minimal set of
1999 /// SCEV predicates in order to return an exact answer.
2000 ExitLimit howFarToZero(const SCEV *V, const Loop *L, bool IsSubExpr,
2001 bool AllowPredicates = false);
2002
2003 /// Return the number of times an exit condition checking the specified
2004 /// value for nonzero will execute. If not computable, return
2005 /// CouldNotCompute.
2006 ExitLimit howFarToNonZero(const SCEV *V, const Loop *L);
2007
2008 /// Return the number of times an exit condition containing the specified
2009 /// less-than comparison will execute. If not computable, return
2010 /// CouldNotCompute.
2011 ///
2012 /// \p isSigned specifies whether the less-than is signed.
2013 ///
2014 /// \p ControlsOnlyExit is true when the LHS < RHS condition directly controls
2015 /// the branch (loops exits only if condition is true). In this case, we can
2016 /// use NoWrapFlags to skip overflow checks.
2017 ///
2018 /// If \p AllowPredicates is set, this call will try to use a minimal set of
2019 /// SCEV predicates in order to return an exact answer.
2020 ExitLimit howManyLessThans(const SCEV *LHS, const SCEV *RHS, const Loop *L,
2021 bool isSigned, bool ControlsOnlyExit,
2022 bool AllowPredicates = false);
2023
2024 ExitLimit howManyGreaterThans(const SCEV *LHS, const SCEV *RHS, const Loop *L,
2025 bool isSigned, bool IsSubExpr,
2026 bool AllowPredicates = false);
2027
2028 /// Return a predecessor of BB (which may not be an immediate predecessor)
2029 /// which has exactly one successor from which BB is reachable, or null if
2030 /// no such block is found.
2031 std::pair<const BasicBlock *, const BasicBlock *>
2032 getPredecessorWithUniqueSuccessorForBB(const BasicBlock *BB) const;
2033
2034 /// Test whether the condition described by Pred, LHS, and RHS is true
2035 /// whenever the given FoundCondValue value evaluates to true in given
2036 /// Context. If Context is nullptr, then the found predicate is true
2037 /// everywhere. LHS and FoundLHS may have different type width.
2038 LLVM_ABI bool isImpliedCond(CmpPredicate Pred, const SCEV *LHS,
2039 const SCEV *RHS, const Value *FoundCondValue,
2040 bool Inverse,
2041 const Instruction *Context = nullptr);
2042
2043 /// Test whether the condition described by Pred, LHS, and RHS is true
2044 /// whenever the given FoundCondValue value evaluates to true in given
2045 /// Context. If Context is nullptr, then the found predicate is true
2046 /// everywhere. LHS and FoundLHS must have same type width.
2047 LLVM_ABI bool isImpliedCondBalancedTypes(CmpPredicate Pred, const SCEV *LHS,
2048 const SCEV *RHS,
2049 CmpPredicate FoundPred,
2050 const SCEV *FoundLHS,
2051 const SCEV *FoundRHS,
2052 const Instruction *CtxI);
2053
2054 /// Test whether the condition described by Pred, LHS, and RHS is true
2055 /// whenever the condition described by FoundPred, FoundLHS, FoundRHS is
2056 /// true in given Context. If Context is nullptr, then the found predicate is
2057 /// true everywhere.
2058 LLVM_ABI bool isImpliedCond(CmpPredicate Pred, const SCEV *LHS,
2059 const SCEV *RHS, CmpPredicate FoundPred,
2060 const SCEV *FoundLHS, const SCEV *FoundRHS,
2061 const Instruction *Context = nullptr);
2062
2063 /// Test whether the condition described by Pred, LHS, and RHS is true
2064 /// whenever the condition described by Pred, FoundLHS, and FoundRHS is
2065 /// true in given Context. If Context is nullptr, then the found predicate is
2066 /// true everywhere.
2067 bool isImpliedCondOperands(CmpPredicate Pred, const SCEV *LHS,
2068 const SCEV *RHS, const SCEV *FoundLHS,
2069 const SCEV *FoundRHS,
2070 const Instruction *Context = nullptr);
2071
2072 /// Test whether the condition described by Pred, LHS, and RHS is true
2073 /// whenever the condition described by Pred, FoundLHS, and FoundRHS is
2074 /// true. Here LHS is an operation that includes FoundLHS as one of its
2075 /// arguments.
2076 bool isImpliedViaOperations(CmpPredicate Pred, const SCEV *LHS,
2077 const SCEV *RHS, const SCEV *FoundLHS,
2078 const SCEV *FoundRHS, unsigned Depth = 0);
2079
2080 /// Test whether the condition described by Pred, LHS, and RHS is true.
2081 /// Use only simple non-recursive types of checks, such as range analysis etc.
2082 bool isKnownViaNonRecursiveReasoning(CmpPredicate Pred, const SCEV *LHS,
2083 const SCEV *RHS);
2084
2085 /// Test whether the condition described by Pred, LHS, and RHS is true
2086 /// whenever the condition described by Pred, FoundLHS, and FoundRHS is
2087 /// true.
2088 bool isImpliedCondOperandsHelper(CmpPredicate Pred, const SCEV *LHS,
2089 const SCEV *RHS, const SCEV *FoundLHS,
2090 const SCEV *FoundRHS);
2091
2092 /// Test whether the condition described by Pred, LHS, and RHS is true
2093 /// whenever the condition described by Pred, FoundLHS, and FoundRHS is
2094 /// true. Utility function used by isImpliedCondOperands. Tries to get
2095 /// cases like "X `sgt` 0 => X - 1 `sgt` -1".
2096 bool isImpliedCondOperandsViaRanges(CmpPredicate Pred, const SCEV *LHS,
2097 const SCEV *RHS, CmpPredicate FoundPred,
2098 const SCEV *FoundLHS,
2099 const SCEV *FoundRHS);
2100
2101 /// Return true if the condition denoted by \p LHS \p Pred \p RHS is implied
2102 /// by a call to @llvm.experimental.guard in \p BB.
2103 bool isImpliedViaGuard(const BasicBlock *BB, CmpPredicate Pred,
2104 const SCEV *LHS, const SCEV *RHS);
2105
2106 /// Test whether the condition described by Pred, LHS, and RHS is true
2107 /// whenever the condition described by Pred, FoundLHS, and FoundRHS is
2108 /// true.
2109 ///
2110 /// This routine tries to rule out certain kinds of integer overflow, and
2111 /// then tries to reason about arithmetic properties of the predicates.
2112 bool isImpliedCondOperandsViaNoOverflow(CmpPredicate Pred, const SCEV *LHS,
2113 const SCEV *RHS, const SCEV *FoundLHS,
2114 const SCEV *FoundRHS);
2115
2116 /// Test whether the condition described by Pred, LHS, and RHS is true
2117 /// whenever the condition described by Pred, FoundLHS, and FoundRHS is
2118 /// true.
2119 ///
2120 /// This routine tries to weaken the known condition basing on fact that
2121 /// FoundLHS is an AddRec.
2122 bool isImpliedCondOperandsViaAddRecStart(CmpPredicate Pred, const SCEV *LHS,
2123 const SCEV *RHS,
2124 const SCEV *FoundLHS,
2125 const SCEV *FoundRHS,
2126 const Instruction *CtxI);
2127
2128 /// Test whether the condition described by Pred, LHS, and RHS is true
2129 /// whenever the condition described by Pred, FoundLHS, and FoundRHS is
2130 /// true.
2131 ///
2132 /// This routine tries to figure out predicate for Phis which are SCEVUnknown
2133 /// if it is true for every possible incoming value from their respective
2134 /// basic blocks.
2135 bool isImpliedViaMerge(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS,
2136 const SCEV *FoundLHS, const SCEV *FoundRHS,
2137 unsigned Depth);
2138
2139 /// Test whether the condition described by Pred, LHS, and RHS is true
2140 /// whenever the condition described by Pred, FoundLHS, and FoundRHS is
2141 /// true.
2142 ///
2143 /// This routine tries to reason about shifts.
2144 bool isImpliedCondOperandsViaShift(CmpPredicate Pred, const SCEV *LHS,
2145 const SCEV *RHS, const SCEV *FoundLHS,
2146 const SCEV *FoundRHS);
2147
2148 /// If we know that the specified Phi is in the header of its containing
2149 /// loop, we know the loop executes a constant number of times, and the PHI
2150 /// node is just a recurrence involving constants, fold it.
2151 Constant *getConstantEvolutionLoopExitValue(PHINode *PN, const APInt &BEs,
2152 const Loop *L);
2153
2154 /// Test if the given expression is known to satisfy the condition described
2155 /// by Pred and the known constant ranges of LHS and RHS.
2156 bool isKnownPredicateViaConstantRanges(CmpPredicate Pred, const SCEV *LHS,
2157 const SCEV *RHS);
2158
2159 /// Try to prove the condition described by "LHS Pred RHS" by ruling out
2160 /// integer overflow.
2161 ///
2162 /// For instance, this will return true for "A s< (A + C)<nsw>" if C is
2163 /// positive.
2164 bool isKnownPredicateViaNoOverflow(CmpPredicate Pred, const SCEV *LHS,
2165 const SCEV *RHS);
2166
2167 /// Try to split Pred LHS RHS into logical conjunctions (and's) and try to
2168 /// prove them individually.
2169 bool isKnownPredicateViaSplitting(CmpPredicate Pred, const SCEV *LHS,
2170 const SCEV *RHS);
2171
2172 /// Try to match the Expr as "(L + R)<Flags>".
2173 bool splitBinaryAdd(const SCEV *Expr, const SCEV *&L, const SCEV *&R,
2174 SCEV::NoWrapFlags &Flags);
2175
2176 /// Forget predicated/non-predicated backedge taken counts for the given loop.
2177 void forgetBackedgeTakenCounts(const Loop *L, bool Predicated);
2178
2179 /// Drop memoized information for all \p SCEVs.
2180 void forgetMemoizedResults(ArrayRef<const SCEV *> SCEVs);
2181
2182 /// Helper for forgetMemoizedResults.
2183 void forgetMemoizedResultsImpl(const SCEV *S);
2184
2185 /// Iterate over instructions in \p Worklist and their users. Erase entries
2186 /// from ValueExprMap and collect SCEV expressions in \p ToForget
2187 void visitAndClearUsers(SmallVectorImpl<Instruction *> &Worklist,
2188 SmallPtrSetImpl<Instruction *> &Visited,
2189 SmallVectorImpl<const SCEV *> &ToForget);
2190
2191 /// Erase Value from ValueExprMap and ExprValueMap.
2192 void eraseValueFromMap(Value *V);
2193
2194 /// Insert V to S mapping into ValueExprMap and ExprValueMap.
2195 void insertValueToMap(Value *V, const SCEV *S);
2196
2197 /// Return false iff given SCEV contains a SCEVUnknown with NULL value-
2198 /// pointer.
2199 bool checkValidity(const SCEV *S) const;
2200
2201 /// Return true if `ExtendOpTy`({`Start`,+,`Step`}) can be proved to be
2202 /// equal to {`ExtendOpTy`(`Start`),+,`ExtendOpTy`(`Step`)}. This is
2203 /// equivalent to proving no signed (resp. unsigned) wrap in
2204 /// {`Start`,+,`Step`} if `ExtendOpTy` is `SCEVSignExtendExpr`
2205 /// (resp. `SCEVZeroExtendExpr`).
2206 template <typename ExtendOpTy>
2207 bool proveNoWrapByVaryingStart(const SCEV *Start, const SCEV *Step,
2208 const Loop *L);
2209
2210 /// Try to prove NSW or NUW on \p AR relying on ConstantRange manipulation.
2211 SCEV::NoWrapFlags proveNoWrapViaConstantRanges(const SCEVAddRecExpr *AR);
2212
2213 /// Try to prove NSW on \p AR by proving facts about conditions known on
2214 /// entry and backedge.
2215 SCEV::NoWrapFlags proveNoSignedWrapViaInduction(const SCEVAddRecExpr *AR);
2216
2217 /// Try to prove NUW on \p AR by proving facts about conditions known on
2218 /// entry and backedge.
2219 SCEV::NoWrapFlags proveNoUnsignedWrapViaInduction(const SCEVAddRecExpr *AR);
2220
2221 std::optional<MonotonicPredicateType>
2222 getMonotonicPredicateTypeImpl(const SCEVAddRecExpr *LHS,
2223 ICmpInst::Predicate Pred);
2224
2225 /// Return SCEV no-wrap flags that can be proven based on reasoning about
2226 /// how poison produced from no-wrap flags on this value (e.g. a nuw add)
2227 /// would trigger undefined behavior on overflow.
2228 SCEV::NoWrapFlags getNoWrapFlagsFromUB(const Value *V);
2229
2230 /// Return a scope which provides an upper bound on the defining scope of
2231 /// 'S'. Specifically, return the first instruction in said bounding scope.
2232 /// Return nullptr if the scope is trivial (function entry).
2233 /// (See scope definition rules associated with flag discussion above)
2234 const Instruction *getNonTrivialDefiningScopeBound(const SCEV *S);
2235
2236 /// Return a scope which provides an upper bound on the defining scope for
2237 /// a SCEV with the operands in Ops. The outparam Precise is set if the
2238 /// bound found is a precise bound (i.e. must be the defining scope.)
2239 const Instruction *getDefiningScopeBound(ArrayRef<const SCEV *> Ops,
2240 bool &Precise);
2241
2242 /// Wrapper around the above for cases which don't care if the bound
2243 /// is precise.
2244 const Instruction *getDefiningScopeBound(ArrayRef<const SCEV *> Ops);
2245
2246 /// Given two instructions in the same function, return true if we can
2247 /// prove B must execute given A executes.
2248 bool isGuaranteedToTransferExecutionTo(const Instruction *A,
2249 const Instruction *B);
2250
2251 /// Returns true if \p Op is guaranteed not to cause immediate UB.
2252 bool isGuaranteedNotToCauseUB(const SCEV *Op);
2253
2254 /// Returns true if \p Op is guaranteed to not be poison.
2255 static bool isGuaranteedNotToBePoison(const SCEV *Op);
2256
2257 /// Return true if the SCEV corresponding to \p I is never poison. Proving
2258 /// this is more complex than proving that just \p I is never poison, since
2259 /// SCEV commons expressions across control flow, and you can have cases
2260 /// like:
2261 ///
2262 /// idx0 = a + b;
2263 /// ptr[idx0] = 100;
2264 /// if (<condition>) {
2265 /// idx1 = a +nsw b;
2266 /// ptr[idx1] = 200;
2267 /// }
2268 ///
2269 /// where the SCEV expression (+ a b) is guaranteed to not be poison (and
2270 /// hence not sign-overflow) only if "<condition>" is true. Since both
2271 /// `idx0` and `idx1` will be mapped to the same SCEV expression, (+ a b),
2272 /// it is not okay to annotate (+ a b) with <nsw> in the above example.
2273 bool isSCEVExprNeverPoison(const Instruction *I);
2274
2275 /// This is like \c isSCEVExprNeverPoison but it specifically works for
2276 /// instructions that will get mapped to SCEV add recurrences. Return true
2277 /// if \p I will never generate poison under the assumption that \p I is an
2278 /// add recurrence on the loop \p L.
2279 bool isAddRecNeverPoison(const Instruction *I, const Loop *L);
2280
2281 /// Similar to createAddRecFromPHI, but with the additional flexibility of
2282 /// suggesting runtime overflow checks in case casts are encountered.
2283 /// If successful, the analysis records that for this loop, \p SymbolicPHI,
2284 /// which is the UnknownSCEV currently representing the PHI, can be rewritten
2285 /// into an AddRec, assuming some predicates; The function then returns the
2286 /// AddRec and the predicates as a pair, and caches this pair in
2287 /// PredicatedSCEVRewrites.
2288 /// If the analysis is not successful, a mapping from the \p SymbolicPHI to
2289 /// itself (with no predicates) is recorded, and a nullptr with an empty
2290 /// predicates vector is returned as a pair.
2291 std::optional<std::pair<const SCEV *, SmallVector<const SCEVPredicate *, 3>>>
2292 createAddRecFromPHIWithCastsImpl(const SCEVUnknown *SymbolicPHI);
2293
2294 /// Compute the maximum backedge count based on the range of values
2295 /// permitted by Start, End, and Stride. This is for loops of the form
2296 /// {Start, +, Stride} LT End.
2297 ///
2298 /// Preconditions:
2299 /// * the induction variable is known to be positive.
2300 /// * the induction variable is assumed not to overflow (i.e. either it
2301 /// actually doesn't, or we'd have to immediately execute UB)
2302 /// We *don't* assert these preconditions so please be careful.
2303 const SCEV *computeMaxBECountForLT(const SCEV *Start, const SCEV *Stride,
2304 const SCEV *End, unsigned BitWidth,
2305 bool IsSigned);
2306
2307 /// Verify if an linear IV with positive stride can overflow when in a
2308 /// less-than comparison, knowing the invariant term of the comparison,
2309 /// the stride.
2310 bool canIVOverflowOnLT(const SCEV *RHS, const SCEV *Stride, bool IsSigned);
2311
2312 /// Verify if an linear IV with negative stride can overflow when in a
2313 /// greater-than comparison, knowing the invariant term of the comparison,
2314 /// the stride.
2315 bool canIVOverflowOnGT(const SCEV *RHS, const SCEV *Stride, bool IsSigned);
2316
2317 /// Get add expr already created or create a new one.
2318 const SCEV *getOrCreateAddExpr(ArrayRef<const SCEV *> Ops,
2319 SCEV::NoWrapFlags Flags);
2320
2321 /// Get mul expr already created or create a new one.
2322 const SCEV *getOrCreateMulExpr(ArrayRef<const SCEV *> Ops,
2323 SCEV::NoWrapFlags Flags);
2324
2325 // Get addrec expr already created or create a new one.
2326 const SCEV *getOrCreateAddRecExpr(ArrayRef<const SCEV *> Ops,
2327 const Loop *L, SCEV::NoWrapFlags Flags);
2328
2329 /// Return x if \p Val is f(x) where f is a 1-1 function.
2330 const SCEV *stripInjectiveFunctions(const SCEV *Val) const;
2331
2332 /// Find all of the loops transitively used in \p S, and fill \p LoopsUsed.
2333 /// A loop is considered "used" by an expression if it contains
2334 /// an add rec on said loop.
2335 void getUsedLoops(const SCEV *S, SmallPtrSetImpl<const Loop *> &LoopsUsed);
2336
2337 /// Look for a SCEV expression with type `SCEVType` and operands `Ops` in
2338 /// `UniqueSCEVs`. Return if found, else nullptr.
2339 SCEV *findExistingSCEVInCache(SCEVTypes SCEVType, ArrayRef<const SCEV *> Ops);
2340
2341 /// Get reachable blocks in this function, making limited use of SCEV
2342 /// reasoning about conditions.
2343 void getReachableBlocks(SmallPtrSetImpl<BasicBlock *> &Reachable,
2344 Function &F);
2345
2346 /// Return the given SCEV expression with a new set of operands.
2347 /// This preserves the origial nowrap flags.
2348 const SCEV *getWithOperands(const SCEV *S,
2349 SmallVectorImpl<const SCEV *> &NewOps);
2350
2351 FoldingSet<SCEV> UniqueSCEVs;
2352 FoldingSet<SCEVPredicate> UniquePreds;
2353 BumpPtrAllocator SCEVAllocator;
2354
2355 /// This maps loops to a list of addrecs that directly use said loop.
2356 DenseMap<const Loop *, SmallVector<const SCEVAddRecExpr *, 4>> LoopUsers;
2357
2358 /// Cache tentative mappings from UnknownSCEVs in a Loop, to a SCEV expression
2359 /// they can be rewritten into under certain predicates.
2360 DenseMap<std::pair<const SCEVUnknown *, const Loop *>,
2361 std::pair<const SCEV *, SmallVector<const SCEVPredicate *, 3>>>
2362 PredicatedSCEVRewrites;
2363
2364 /// Set of AddRecs for which proving NUW via an induction has already been
2365 /// tried.
2366 SmallPtrSet<const SCEVAddRecExpr *, 16> UnsignedWrapViaInductionTried;
2367
2368 /// Set of AddRecs for which proving NSW via an induction has already been
2369 /// tried.
2370 SmallPtrSet<const SCEVAddRecExpr *, 16> SignedWrapViaInductionTried;
2371
2372 /// The head of a linked list of all SCEVUnknown values that have been
2373 /// allocated. This is used by releaseMemory to locate them all and call
2374 /// their destructors.
2375 SCEVUnknown *FirstUnknown = nullptr;
2376};
2377
2378/// Analysis pass that exposes the \c ScalarEvolution for a function.
2380 : public AnalysisInfoMixin<ScalarEvolutionAnalysis> {
2382
2383 LLVM_ABI static AnalysisKey Key;
2384
2385public:
2387
2389};
2390
2391/// Verifier pass for the \c ScalarEvolutionAnalysis results.
2393 : public PassInfoMixin<ScalarEvolutionVerifierPass> {
2394public:
2396 static bool isRequired() { return true; }
2397};
2398
2399/// Printer pass for the \c ScalarEvolutionAnalysis results.
2401 : public PassInfoMixin<ScalarEvolutionPrinterPass> {
2402 raw_ostream &OS;
2403
2404public:
2405 explicit ScalarEvolutionPrinterPass(raw_ostream &OS) : OS(OS) {}
2406
2408
2409 static bool isRequired() { return true; }
2410};
2411
2413 std::unique_ptr<ScalarEvolution> SE;
2414
2415public:
2416 static char ID;
2417
2419
2420 ScalarEvolution &getSE() { return *SE; }
2421 const ScalarEvolution &getSE() const { return *SE; }
2422
2423 bool runOnFunction(Function &F) override;
2424 void releaseMemory() override;
2425 void getAnalysisUsage(AnalysisUsage &AU) const override;
2426 void print(raw_ostream &OS, const Module * = nullptr) const override;
2427 void verifyAnalysis() const override;
2428};
2429
2430/// An interface layer with SCEV used to manage how we see SCEV expressions
2431/// for values in the context of existing predicates. We can add new
2432/// predicates, but we cannot remove them.
2433///
2434/// This layer has multiple purposes:
2435/// - provides a simple interface for SCEV versioning.
2436/// - guarantees that the order of transformations applied on a SCEV
2437/// expression for a single Value is consistent across two different
2438/// getSCEV calls. This means that, for example, once we've obtained
2439/// an AddRec expression for a certain value through expression
2440/// rewriting, we will continue to get an AddRec expression for that
2441/// Value.
2442/// - lowers the number of expression rewrites.
2444public:
2446
2447 LLVM_ABI const SCEVPredicate &getPredicate() const;
2448
2449 /// Returns the SCEV expression of V, in the context of the current SCEV
2450 /// predicate. The order of transformations applied on the expression of V
2451 /// returned by ScalarEvolution is guaranteed to be preserved, even when
2452 /// adding new predicates.
2453 LLVM_ABI const SCEV *getSCEV(Value *V);
2454
2455 /// Returns the rewritten SCEV for \p Expr in the context of the current SCEV
2456 /// predicate. The order of transformations applied on the expression of \p
2457 /// Expr returned by ScalarEvolution is guaranteed to be preserved, even when
2458 /// adding new predicates.
2459 LLVM_ABI const SCEV *getPredicatedSCEV(const SCEV *Expr);
2460
2461 /// Get the (predicated) backedge count for the analyzed loop.
2463
2464 /// Get the (predicated) symbolic max backedge count for the analyzed loop.
2466
2467 /// Returns the upper bound of the loop trip count as a normal unsigned
2468 /// value, or 0 if the trip count is unknown.
2470
2471 /// Adds a new predicate.
2472 LLVM_ABI void addPredicate(const SCEVPredicate &Pred);
2473
2474 /// Attempts to produce an AddRecExpr for V by adding additional SCEV
2475 /// predicates. If we can't transform the expression into an AddRecExpr we
2476 /// return nullptr and not add additional SCEV predicates to the current
2477 /// context.
2479
2480 /// Proves that V doesn't overflow by adding SCEV predicate.
2483
2484 /// Returns true if we've proved that V doesn't wrap by means of a SCEV
2485 /// predicate.
2488
2489 /// Returns the ScalarEvolution analysis used.
2490 ScalarEvolution *getSE() const { return &SE; }
2491
2492 /// We need to explicitly define the copy constructor because of FlagsMap.
2494
2495 /// Print the SCEV mappings done by the Predicated Scalar Evolution.
2496 /// The printed text is indented by \p Depth.
2497 LLVM_ABI void print(raw_ostream &OS, unsigned Depth) const;
2498
2499 /// Check if \p AR1 and \p AR2 are equal, while taking into account
2500 /// Equal predicates in Preds.
2502 const SCEVAddRecExpr *AR2) const;
2503
2504private:
2505 /// Increments the version number of the predicate. This needs to be called
2506 /// every time the SCEV predicate changes.
2507 void updateGeneration();
2508
2509 /// Holds a SCEV and the version number of the SCEV predicate used to
2510 /// perform the rewrite of the expression.
2511 using RewriteEntry = std::pair<unsigned, const SCEV *>;
2512
2513 /// Maps a SCEV to the rewrite result of that SCEV at a certain version
2514 /// number. If this number doesn't match the current Generation, we will
2515 /// need to do a rewrite. To preserve the transformation order of previous
2516 /// rewrites, we will rewrite the previous result instead of the original
2517 /// SCEV.
2519
2520 /// Records what NoWrap flags we've added to a Value *.
2522
2523 /// The ScalarEvolution analysis.
2524 ScalarEvolution &SE;
2525
2526 /// The analyzed Loop.
2527 const Loop &L;
2528
2529 /// The SCEVPredicate that forms our context. We will rewrite all
2530 /// expressions assuming that this predicate true.
2531 std::unique_ptr<SCEVUnionPredicate> Preds;
2532
2533 /// Marks the version of the SCEV predicate used. When rewriting a SCEV
2534 /// expression we mark it with the version of the predicate. We use this to
2535 /// figure out if the predicate has changed from the last rewrite of the
2536 /// SCEV. If so, we need to perform a new rewrite.
2537 unsigned Generation = 0;
2538
2539 /// The backedge taken count.
2540 const SCEV *BackedgeCount = nullptr;
2541
2542 /// The symbolic backedge taken count.
2543 const SCEV *SymbolicMaxBackedgeCount = nullptr;
2544
2545 /// The constant max trip count for the loop.
2546 std::optional<unsigned> SmallConstantMaxTripCount;
2547};
2548
2549template <> struct DenseMapInfo<ScalarEvolution::FoldID> {
2552 return ID;
2553 }
2556 return ID;
2557 }
2558
2559 static unsigned getHashValue(const ScalarEvolution::FoldID &Val) {
2560 return Val.computeHash();
2561 }
2562
2565 return LHS == RHS;
2566 }
2567};
2568
2569} // end namespace llvm
2570
2571#endif // LLVM_ANALYSIS_SCALAREVOLUTION_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
constexpr LLT S1
This file implements a class to represent arbitrary precision integral constant values and operations...
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< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_ABI
Definition Compiler.h:213
SmallPtrSet< const BasicBlock *, 8 > VisitedBlocks
This file defines DenseMapInfo traits for DenseMap.
This file defines the DenseMap class.
static bool runOnFunction(Function &F, bool PostInlining)
This file defines a hash set that can be used to remove duplication of nodes in a graph.
Hexagon Common GEP
This header defines various interfaces for pass management in LLVM.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define P(N)
This file defines the PointerIntPair class.
const SmallVectorImpl< MachineOperand > & Cond
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
Value * RHS
Value * LHS
Class for arbitrary precision integers.
Definition APInt.h:78
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:240
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
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
Value handle with callbacks on RAUW and destruction.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:676
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
This is the shared class of boolean and integer constants.
Definition Constants.h:87
This class represents a range of values.
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
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:164
FoldingSetNodeIDRef - This class describes a reference to an interned FoldingSetNodeID,...
Definition FoldingSet.h:172
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
Definition FoldingSet.h:209
FunctionPass(char &pid)
Definition Pass.h:316
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags none()
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
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
Utility class for integer operators which may exhibit overflow - Add, Sub, Mul, and Shl.
Definition Operator.h:78
Value handle that poisons itself if the Value is deleted.
An interface layer with SCEV used to manage how we see SCEV expressions for values in the context of ...
LLVM_ABI void addPredicate(const SCEVPredicate &Pred)
Adds a new predicate.
ScalarEvolution * getSE() const
Returns the ScalarEvolution analysis used.
LLVM_ABI const SCEVPredicate & getPredicate() const
LLVM_ABI const SCEV * getPredicatedSCEV(const SCEV *Expr)
Returns the rewritten SCEV for Expr in the context of the current SCEV predicate.
LLVM_ABI bool hasNoOverflow(Value *V, SCEVWrapPredicate::IncrementWrapFlags Flags)
Returns true if we've proved that V doesn't wrap by means of a SCEV predicate.
LLVM_ABI void setNoOverflow(Value *V, SCEVWrapPredicate::IncrementWrapFlags Flags)
Proves that V doesn't overflow by adding SCEV predicate.
LLVM_ABI void print(raw_ostream &OS, unsigned Depth) const
Print the SCEV mappings done by the Predicated Scalar Evolution.
LLVM_ABI bool areAddRecsEqualWithPreds(const SCEVAddRecExpr *AR1, const SCEVAddRecExpr *AR2) const
Check if AR1 and AR2 are equal, while taking into account Equal predicates in Preds.
LLVM_ABI PredicatedScalarEvolution(ScalarEvolution &SE, Loop &L)
LLVM_ABI const SCEVAddRecExpr * getAsAddRec(Value *V)
Attempts to produce an AddRecExpr for V by adding additional SCEV predicates.
LLVM_ABI unsigned getSmallConstantMaxTripCount()
Returns the upper bound of the loop trip count as a normal unsigned value, or 0 if the trip count is ...
LLVM_ABI const SCEV * getBackedgeTakenCount()
Get the (predicated) backedge count for the analyzed loop.
LLVM_ABI const SCEV * getSymbolicMaxBackedgeTakenCount()
Get the (predicated) symbolic max backedge count for the analyzed loop.
LLVM_ABI const SCEV * getSCEV(Value *V)
Returns the SCEV expression of V, in the context of the current SCEV predicate.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
This node represents a polynomial recurrence on the trip count of the specified loop.
SCEVComparePredicate(const FoldingSetNodeIDRef ID, const ICmpInst::Predicate Pred, const SCEV *LHS, const SCEV *RHS)
const SCEV * getRHS() const
Returns the right hand side of the predicate.
ICmpInst::Predicate getPredicate() const
bool isAlwaysTrue() const override
Returns true if the predicate is always true.
const SCEV * getLHS() const
Returns the left hand side of the predicate.
static bool classof(const SCEVPredicate *P)
Methods for support type inquiry through isa, cast, and dyn_cast:
bool implies(const SCEVPredicate *N, ScalarEvolution &SE) const override
Implementation of the SCEVPredicate interface.
This class represents an assumption made using SCEV expressions which can be checked at run-time.
SCEVPredicateKind getKind() const
virtual unsigned getComplexity() const
Returns the estimated complexity of this predicate.
SCEVPredicate & operator=(const SCEVPredicate &)=default
SCEVPredicate(const SCEVPredicate &)=default
virtual bool implies(const SCEVPredicate *N, ScalarEvolution &SE) const =0
Returns true if this predicate implies N.
virtual void print(raw_ostream &OS, unsigned Depth=0) const =0
Prints a textual representation of this predicate with an indentation of Depth.
~SCEVPredicate()=default
virtual bool isAlwaysTrue() const =0
Returns true if the predicate is always true.
SCEVPredicateKind Kind
unsigned getComplexity() const override
We estimate the complexity of a union predicate as the size number of predicates in the union.
SCEVUnionPredicate(ArrayRef< const SCEVPredicate * > Preds, ScalarEvolution &SE)
Union predicates don't get cached so create a dummy set ID for it.
SCEVUnionPredicate getUnionWith(const SCEVPredicate *N, ScalarEvolution &SE) const
Returns a new SCEVUnionPredicate that is the union of this predicate and the given predicate N.
ArrayRef< const SCEVPredicate * > getPredicates() const
static bool classof(const SCEVPredicate *P)
Methods for support type inquiry through isa, cast, and dyn_cast:
This means that we are dealing with an entirely unknown SCEV value, and only represent it as its LLVM...
This class represents an assumption made on an AddRec expression.
IncrementWrapFlags
Similar to SCEV::NoWrapFlags, but with slightly different semantics for FlagNUSW.
SCEVWrapPredicate(const FoldingSetNodeIDRef ID, const SCEVAddRecExpr *AR, IncrementWrapFlags Flags)
static SCEVWrapPredicate::IncrementWrapFlags setFlags(SCEVWrapPredicate::IncrementWrapFlags Flags, SCEVWrapPredicate::IncrementWrapFlags OnFlags)
static SCEVWrapPredicate::IncrementWrapFlags clearFlags(SCEVWrapPredicate::IncrementWrapFlags Flags, SCEVWrapPredicate::IncrementWrapFlags OffFlags)
Convenient IncrementWrapFlags manipulation methods.
static bool classof(const SCEVPredicate *P)
Methods for support type inquiry through isa, cast, and dyn_cast:
IncrementWrapFlags getFlags() const
Returns the set assumed no overflow flags.
static SCEVWrapPredicate::IncrementWrapFlags maskFlags(SCEVWrapPredicate::IncrementWrapFlags Flags, int Mask)
This class represents an analyzed expression in the program.
LLVM_ABI ArrayRef< const SCEV * > operands() const
Return operands of this SCEV expression.
unsigned short getExpressionSize() const
SCEV & operator=(const SCEV &)=delete
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.
SCEV(const SCEV &)=delete
LLVM_ABI void dump() const
This method is used for debugging.
LLVM_ABI bool isAllOnesValue() const
Return true if the expression is a constant all-ones value.
LLVM_ABI bool isNonConstantNegative() const
Return true if the specified scev is negated, but not a constant.
const unsigned short ExpressionSize
LLVM_ABI void print(raw_ostream &OS) const
Print out the internal representation of this scalar to the specified stream.
SCEV(const FoldingSetNodeIDRef ID, SCEVTypes SCEVTy, unsigned short ExpressionSize)
SCEVTypes getSCEVType() const
unsigned short SubclassData
This field is initialized to zero and may be used in subclasses to store miscellaneous information.
LLVM_ABI Type * getType() const
Return the LLVM type of this SCEV expression.
NoWrapFlags
NoWrapFlags are bitfield indices into SubclassData.
Analysis pass that exposes the ScalarEvolution for a function.
LLVM_ABI ScalarEvolution run(Function &F, FunctionAnalysisManager &AM)
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Verifier pass for the ScalarEvolutionAnalysis results.
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
const ScalarEvolution & getSE() const
bool operator==(const FoldID &RHS) const
FoldID(SCEVTypes C, const SCEV *Op, const Type *Ty)
static LLVM_ABI LoopGuards collect(const Loop *L, ScalarEvolution &SE)
Collect rewrite map for loop guards for loop L, together with flags indicating if NUW and NSW can be ...
LLVM_ABI const SCEV * rewrite(const SCEV *Expr) const
Try to apply the collected loop guards to Expr.
The main scalar evolution driver.
const SCEV * getConstantMaxBackedgeTakenCount(const Loop *L)
When successful, this returns a SCEVConstant that is greater than or equal to (i.e.
static bool hasFlags(SCEV::NoWrapFlags Flags, SCEV::NoWrapFlags TestFlags)
const DataLayout & getDataLayout() const
Return the DataLayout associated with the module this SCEV instance is operating on.
LLVM_ABI bool isKnownNonNegative(const SCEV *S)
Test if the given expression is known to be non-negative.
LLVM_ABI bool isKnownOnEveryIteration(CmpPredicate Pred, const SCEVAddRecExpr *LHS, const SCEV *RHS)
Test if the condition described by Pred, LHS, RHS is known to be true on every iteration of the loop ...
LLVM_ABI const SCEV * getNegativeSCEV(const SCEV *V, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap)
Return the SCEV object corresponding to -V.
LLVM_ABI std::optional< LoopInvariantPredicate > getLoopInvariantExitCondDuringFirstIterationsImpl(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const Loop *L, const Instruction *CtxI, const SCEV *MaxIter)
LLVM_ABI const SCEV * getSMaxExpr(const SCEV *LHS, const SCEV *RHS)
LLVM_ABI const SCEV * getUDivCeilSCEV(const SCEV *N, const SCEV *D)
Compute ceil(N / D).
LLVM_ABI std::optional< LoopInvariantPredicate > getLoopInvariantExitCondDuringFirstIterations(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const Loop *L, const Instruction *CtxI, const SCEV *MaxIter)
If the result of the predicate LHS Pred RHS is loop invariant with respect to L at given Context duri...
LLVM_ABI Type * getWiderType(Type *Ty1, Type *Ty2) const
LLVM_ABI const SCEV * getAbsExpr(const SCEV *Op, bool IsNSW)
LLVM_ABI bool isKnownNonPositive(const SCEV *S)
Test if the given expression is known to be non-positive.
LLVM_ABI const SCEV * getURemExpr(const SCEV *LHS, const SCEV *RHS)
Represents an unsigned remainder expression based on unsigned division.
LLVM_ABI bool isKnownNegative(const SCEV *S)
Test if the given expression is known to be negative.
LLVM_ABI const SCEV * getPredicatedConstantMaxBackedgeTakenCount(const Loop *L, SmallVectorImpl< const SCEVPredicate * > &Predicates)
Similar to getConstantMaxBackedgeTakenCount, except it will add a set of SCEV predicates to Predicate...
LLVM_ABI const SCEV * removePointerBase(const SCEV *S)
Compute an expression equivalent to S - getPointerBase(S).
LLVM_ABI bool isLoopEntryGuardedByCond(const Loop *L, CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Test whether entry to the loop is protected by a conditional between LHS and RHS.
LLVM_ABI bool isKnownNonZero(const SCEV *S)
Test if the given expression is known to be non-zero.
LLVM_ABI const SCEV * getSCEVAtScope(const SCEV *S, const Loop *L)
Return a SCEV expression for the specified value at the specified scope in the program.
LLVM_ABI const SCEV * getSMinExpr(const SCEV *LHS, const SCEV *RHS)
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 * getUMaxExpr(const SCEV *LHS, const SCEV *RHS)
LLVM_ABI void setNoWrapFlags(SCEVAddRecExpr *AddRec, SCEV::NoWrapFlags Flags)
Update no-wrap flags of an AddRec.
const SCEV * getAddExpr(const SCEV *LHS, const SCEV *RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
LLVM_ABI const SCEV * getUMaxFromMismatchedTypes(const SCEV *LHS, const SCEV *RHS)
Promote the operands to the wider of the types using zero-extension, and then perform a umax operatio...
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 ExitLimit computeExitLimitFromCond(const Loop *L, Value *ExitCond, bool ExitIfTrue, bool ControlsOnlyExit, bool AllowPredicates=false)
Compute the number of times the backedge of the specified loop will execute if its exit condition wer...
LLVM_ABI const SCEV * getZeroExtendExprImpl(const SCEV *Op, Type *Ty, unsigned Depth=0)
LLVM_ABI const SCEVPredicate * getEqualPredicate(const SCEV *LHS, const SCEV *RHS)
LLVM_ABI unsigned getSmallConstantTripMultiple(const Loop *L, const SCEV *ExitCount)
Returns the largest constant divisor of the trip count as a normal unsigned value,...
LLVM_ABI uint64_t getTypeSizeInBits(Type *Ty) const
Return the size in bits of the specified type, for which isSCEVable must return true.
LLVM_ABI const SCEV * getConstant(ConstantInt *V)
LLVM_ABI const SCEV * getPredicatedBackedgeTakenCount(const Loop *L, SmallVectorImpl< const SCEVPredicate * > &Predicates)
Similar to getBackedgeTakenCount, except it will add a set of SCEV predicates to Predicates that are ...
LLVM_ABI const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
ConstantRange getSignedRange(const SCEV *S)
Determine the signed range for a particular SCEV.
LLVM_ABI const SCEV * getNoopOrSignExtend(const SCEV *V, Type *Ty)
Return a SCEV corresponding to a conversion of the input value to the specified type.
bool loopHasNoAbnormalExits(const Loop *L)
Return true if the loop has no abnormal exits.
LLVM_ABI const SCEV * getTripCountFromExitCount(const SCEV *ExitCount)
A version of getTripCountFromExitCount below which always picks an evaluation type which can not resu...
LLVM_ABI ScalarEvolution(Function &F, TargetLibraryInfo &TLI, AssumptionCache &AC, DominatorTree &DT, LoopInfo &LI)
const SCEV * getOne(Type *Ty)
Return a SCEV for the constant 1 of a specific type.
LLVM_ABI const SCEV * getTruncateOrNoop(const SCEV *V, Type *Ty)
Return a SCEV corresponding to a conversion of the input value to the specified type.
LLVM_ABI const SCEV * getLosslessPtrToIntExpr(const SCEV *Op)
LLVM_ABI const SCEV * getCastExpr(SCEVTypes Kind, const SCEV *Op, Type *Ty)
LLVM_ABI const SCEV * getSequentialMinMaxExpr(SCEVTypes Kind, SmallVectorImpl< const SCEV * > &Operands)
LLVM_ABI std::optional< bool > evaluatePredicateAt(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const Instruction *CtxI)
Check whether the condition described by Pred, LHS, and RHS is true or false in the given Context.
LLVM_ABI unsigned getSmallConstantMaxTripCount(const Loop *L, SmallVectorImpl< const SCEVPredicate * > *Predicates=nullptr)
Returns the upper bound of the loop trip count as a normal unsigned value.
LLVM_ABI const SCEV * getPtrToIntExpr(const SCEV *Op, Type *Ty)
const SCEV * getMulExpr(const SCEV *LHS, const SCEV *RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
LLVM_ABI bool isBackedgeTakenCountMaxOrZero(const Loop *L)
Return true if the backedge taken count is either the value returned by getConstantMaxBackedgeTakenCo...
LLVM_ABI void forgetLoop(const Loop *L)
This method should be called by the client when it has changed a loop in a way that may effect Scalar...
LLVM_ABI bool isLoopInvariant(const SCEV *S, const Loop *L)
Return true if the value of the given SCEV is unchanging in the specified loop.
LLVM_ABI bool isKnownPositive(const SCEV *S)
Test if the given expression is known to be positive.
APInt getUnsignedRangeMin(const SCEV *S)
Determine the min of the unsigned range for a particular SCEV.
LLVM_ABI bool SimplifyICmpOperands(CmpPredicate &Pred, const SCEV *&LHS, const SCEV *&RHS, unsigned Depth=0)
Simplify LHS and RHS in a comparison with predicate Pred.
LLVM_ABI const SCEV * getOffsetOfExpr(Type *IntTy, StructType *STy, unsigned FieldNo)
Return an expression for offsetof on the given field with type IntTy.
LLVM_ABI LoopDisposition getLoopDisposition(const SCEV *S, const Loop *L)
Return the "disposition" of the given SCEV with respect to the given loop.
LLVM_ABI bool containsAddRecurrence(const SCEV *S)
Return true if the SCEV is a scAddRecExpr or it contains scAddRecExpr.
LLVM_ABI const SCEV * getSignExtendExprImpl(const SCEV *Op, Type *Ty, unsigned Depth=0)
LLVM_ABI const SCEV * getAddRecExpr(const SCEV *Start, const SCEV *Step, const Loop *L, SCEV::NoWrapFlags Flags)
Get an add recurrence expression for the specified loop.
LLVM_ABI bool hasOperand(const SCEV *S, const SCEV *Op) const
Test whether the given SCEV has Op as a direct or indirect operand.
LLVM_ABI const SCEV * getUDivExpr(const SCEV *LHS, const SCEV *RHS)
Get a canonical unsigned division expression, or something simpler if possible.
LLVM_ABI const SCEV * getZeroExtendExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
LLVM_ABI bool isSCEVable(Type *Ty) const
Test if values of the given type are analyzable within the SCEV framework.
LLVM_ABI Type * getEffectiveSCEVType(Type *Ty) const
Return a type with the same bitwidth as the given type and which represents how SCEV will treat the g...
const SCEV * getAddRecExpr(const SmallVectorImpl< const SCEV * > &Operands, const Loop *L, SCEV::NoWrapFlags Flags)
LLVM_ABI const SCEVPredicate * getComparePredicate(ICmpInst::Predicate Pred, const SCEV *LHS, const SCEV *RHS)
LLVM_ABI bool haveSameSign(const SCEV *S1, const SCEV *S2)
Return true if we know that S1 and S2 must have the same sign.
LLVM_ABI const SCEV * getNotSCEV(const SCEV *V)
Return the SCEV object corresponding to ~V.
LLVM_ABI const SCEV * getElementCount(Type *Ty, ElementCount EC, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap)
LLVM_ABI bool instructionCouldExistWithOperands(const SCEV *A, const SCEV *B)
Return true if there exists a point in the program at which both A and B could be operands to the sam...
ConstantRange getUnsignedRange(const SCEV *S)
Determine the unsigned range for a particular SCEV.
LLVM_ABI void print(raw_ostream &OS) const
LLVM_ABI const SCEV * getUMinExpr(const SCEV *LHS, const SCEV *RHS, bool Sequential=false)
LLVM_ABI const SCEV * getPredicatedExitCount(const Loop *L, const BasicBlock *ExitingBlock, SmallVectorImpl< const SCEVPredicate * > *Predicates, ExitCountKind Kind=Exact)
Same as above except this uses the predicated backedge taken info and may require predicates.
static SCEV::NoWrapFlags clearFlags(SCEV::NoWrapFlags Flags, SCEV::NoWrapFlags OffFlags)
LLVM_ABI void forgetTopmostLoop(const Loop *L)
friend class ScalarEvolutionsTest
LLVM_ABI void forgetValue(Value *V)
This method should be called by the client when it has changed a value in a way that may effect its v...
APInt getSignedRangeMin(const SCEV *S)
Determine the min of the signed range for a particular SCEV.
const SCEV * getMulExpr(const SCEV *Op0, const SCEV *Op1, const SCEV *Op2, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
LLVM_ABI const SCEV * getNoopOrAnyExtend(const SCEV *V, Type *Ty)
Return a SCEV corresponding to a conversion of the input value to the specified type.
LLVM_ABI void forgetBlockAndLoopDispositions(Value *V=nullptr)
Called when the client has changed the disposition of values in a loop or block.
LLVM_ABI const SCEV * getTruncateExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
MonotonicPredicateType
A predicate is said to be monotonically increasing if may go from being false to being true as the lo...
LLVM_ABI std::optional< LoopInvariantPredicate > getLoopInvariantPredicate(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const Loop *L, const Instruction *CtxI=nullptr)
If the result of the predicate LHS Pred RHS is loop invariant with respect to L, return a LoopInvaria...
LLVM_ABI const SCEV * getStoreSizeOfExpr(Type *IntTy, Type *StoreTy)
Return an expression for the store size of StoreTy that is type IntTy.
LLVM_ABI const SCEVPredicate * getWrapPredicate(const SCEVAddRecExpr *AR, SCEVWrapPredicate::IncrementWrapFlags AddedFlags)
LLVM_ABI bool isLoopBackedgeGuardedByCond(const Loop *L, CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Test whether the backedge of the loop is protected by a conditional between LHS and RHS.
LLVM_ABI const SCEV * getMinusSCEV(const SCEV *LHS, const SCEV *RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Return LHS-RHS.
LLVM_ABI APInt getNonZeroConstantMultiple(const SCEV *S)
const SCEV * getMinusOne(Type *Ty)
Return a SCEV for the constant -1 of a specific type.
static SCEV::NoWrapFlags setFlags(SCEV::NoWrapFlags Flags, SCEV::NoWrapFlags OnFlags)
LLVM_ABI bool hasLoopInvariantBackedgeTakenCount(const Loop *L)
Return true if the specified loop has an analyzable loop-invariant backedge-taken count.
LLVM_ABI BlockDisposition getBlockDisposition(const SCEV *S, const BasicBlock *BB)
Return the "disposition" of the given SCEV with respect to the given block.
LLVM_ABI const SCEV * getNoopOrZeroExtend(const SCEV *V, Type *Ty)
Return a SCEV corresponding to a conversion of the input value to the specified type.
LLVM_ABI bool invalidate(Function &F, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &Inv)
LLVM_ABI const SCEV * getUMinFromMismatchedTypes(const SCEV *LHS, const SCEV *RHS, bool Sequential=false)
Promote the operands to the wider of the types using zero-extension, and then perform a umin operatio...
LLVM_ABI bool loopIsFiniteByAssumption(const Loop *L)
Return true if this loop is finite by assumption.
LLVM_ABI const SCEV * getExistingSCEV(Value *V)
Return an existing SCEV for V if there is one, otherwise return nullptr.
LLVM_ABI APInt getConstantMultiple(const SCEV *S, const Instruction *CtxI=nullptr)
Returns the max constant multiple of S.
LoopDisposition
An enum describing the relationship between a SCEV and a loop.
@ LoopComputable
The SCEV varies predictably with the loop.
@ LoopVariant
The SCEV is loop-variant (unknown).
@ LoopInvariant
The SCEV is loop-invariant.
LLVM_ABI bool isKnownMultipleOf(const SCEV *S, uint64_t M, SmallVectorImpl< const SCEVPredicate * > &Assumptions)
Check that S is a multiple of M.
LLVM_ABI const SCEV * getAnyExtendExpr(const SCEV *Op, Type *Ty)
getAnyExtendExpr - Return a SCEV for the given operand extended with unspecified bits out to the give...
LLVM_ABI bool isKnownToBeAPowerOfTwo(const SCEV *S, bool OrZero=false, bool OrNegative=false)
Test if the given expression is known to be a power of 2.
LLVM_ABI std::optional< SCEV::NoWrapFlags > getStrengthenedNoWrapFlagsFromBinOp(const OverflowingBinaryOperator *OBO)
Parse NSW/NUW flags from add/sub/mul IR binary operation Op into SCEV no-wrap flags,...
LLVM_ABI void forgetLcssaPhiWithNewPredecessor(Loop *L, PHINode *V)
Forget LCSSA phi node V of loop L to which a new predecessor was added, such that it may no longer be...
LLVM_ABI bool containsUndefs(const SCEV *S) const
Return true if the SCEV expression contains an undef value.
LLVM_ABI std::optional< MonotonicPredicateType > getMonotonicPredicateType(const SCEVAddRecExpr *LHS, ICmpInst::Predicate Pred)
If, for all loop invariant X, the predicate "LHS `Pred` X" is monotonically increasing or decreasing,...
LLVM_ABI const SCEV * getCouldNotCompute()
LLVM_ABI bool isAvailableAtLoopEntry(const SCEV *S, const Loop *L)
Determine if the SCEV can be evaluated at loop's entry.
LLVM_ABI uint32_t getMinTrailingZeros(const SCEV *S, const Instruction *CtxI=nullptr)
Determine the minimum number of zero bits that S is guaranteed to end in (at every loop iteration).
BlockDisposition
An enum describing the relationship between a SCEV and a basic block.
@ DominatesBlock
The SCEV dominates the block.
@ ProperlyDominatesBlock
The SCEV properly dominates the block.
@ DoesNotDominateBlock
The SCEV does not dominate the block.
LLVM_ABI const SCEV * getGEPExpr(GEPOperator *GEP, ArrayRef< const SCEV * > IndexExprs)
Returns an expression for a GEP.
LLVM_ABI const SCEV * getExitCount(const Loop *L, const BasicBlock *ExitingBlock, ExitCountKind Kind=Exact)
Return the number of times the backedge executes before the given exit would be taken; if not exactly...
LLVM_ABI const SCEV * getSignExtendExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
LLVM_ABI void getPoisonGeneratingValues(SmallPtrSetImpl< const Value * > &Result, const SCEV *S)
Return the set of Values that, if poison, will definitively result in S being poison as well.
LLVM_ABI void forgetLoopDispositions()
Called when the client has changed the disposition of values in this loop.
LLVM_ABI const SCEV * getVScale(Type *Ty)
LLVM_ABI unsigned getSmallConstantTripCount(const Loop *L)
Returns the exact trip count of the loop if we can compute it, and the result is a small constant.
LLVM_ABI bool hasComputableLoopEvolution(const SCEV *S, const Loop *L)
Return true if the given SCEV changes value in a known way in the specified loop.
LLVM_ABI const SCEV * getPointerBase(const SCEV *V)
Transitively follow the chain of pointer-type operands until reaching a SCEV that does not have a sin...
const SCEV * getPowerOfTwo(Type *Ty, unsigned Power)
Return a SCEV for the constant Power of two.
LLVM_ABI const SCEV * getMinMaxExpr(SCEVTypes Kind, SmallVectorImpl< const SCEV * > &Operands)
LLVM_ABI void forgetAllLoops()
LLVM_ABI bool dominates(const SCEV *S, const BasicBlock *BB)
Return true if elements that makes up the given SCEV dominate the specified basic block.
APInt getUnsignedRangeMax(const SCEV *S)
Determine the max of the unsigned range for a particular SCEV.
ExitCountKind
The terms "backedge taken count" and "exit count" are used interchangeably to refer to the number of ...
@ SymbolicMaximum
An expression which provides an upper bound on the exact trip count.
@ ConstantMaximum
A constant which provides an upper bound on the exact trip count.
@ Exact
An expression exactly describing the number of times the backedge has executed when a loop is exited.
LLVM_ABI const SCEV * applyLoopGuards(const SCEV *Expr, const Loop *L)
Try to apply information from loop guards for L to Expr.
LLVM_ABI const SCEV * getMulExpr(SmallVectorImpl< const SCEV * > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Get a canonical multiply expression, or something simpler if possible.
LLVM_ABI const SCEV * getPtrToAddrExpr(const SCEV *Op)
LLVM_ABI const SCEVAddRecExpr * convertSCEVToAddRecWithPredicates(const SCEV *S, const Loop *L, SmallVectorImpl< const SCEVPredicate * > &Preds)
Tries to convert the S expression to an AddRec expression, adding additional predicates to Preds as r...
LLVM_ABI const SCEV * getElementSize(Instruction *Inst)
Return the size of an element read or written by Inst.
LLVM_ABI const SCEV * getSizeOfExpr(Type *IntTy, TypeSize Size)
Return an expression for a TypeSize.
LLVM_ABI std::optional< bool > evaluatePredicate(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Check whether the condition described by Pred, LHS, and RHS is true or false.
LLVM_ABI const SCEV * getUnknown(Value *V)
LLVM_ABI std::optional< std::pair< const SCEV *, SmallVector< const SCEVPredicate *, 3 > > > createAddRecFromPHIWithCasts(const SCEVUnknown *SymbolicPHI)
Checks if SymbolicPHI can be rewritten as an AddRecExpr under some Predicates.
LLVM_ABI const SCEV * getTruncateOrZeroExtend(const SCEV *V, Type *Ty, unsigned Depth=0)
Return a SCEV corresponding to a conversion of the input value to the specified type.
static SCEV::NoWrapFlags maskFlags(SCEV::NoWrapFlags Flags, int Mask)
Convenient NoWrapFlags manipulation that hides enum casts and is visible in the ScalarEvolution name ...
LLVM_ABI std::optional< APInt > computeConstantDifference(const SCEV *LHS, const SCEV *RHS)
Compute LHS - RHS and returns the result as an APInt if it is a constant, and std::nullopt if it isn'...
LLVM_ABI bool properlyDominates(const SCEV *S, const BasicBlock *BB)
Return true if elements that makes up the given SCEV properly dominate the specified basic block.
const SCEV * getAddExpr(const SCEV *Op0, const SCEV *Op1, const SCEV *Op2, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
LLVM_ABI const SCEV * rewriteUsingPredicate(const SCEV *S, const Loop *L, const SCEVPredicate &A)
Re-writes the SCEV according to the Predicates in A.
LLVM_ABI std::pair< const SCEV *, const SCEV * > SplitIntoInitAndPostInc(const Loop *L, const SCEV *S)
Splits SCEV expression S into two SCEVs.
LLVM_ABI bool canReuseInstruction(const SCEV *S, Instruction *I, SmallVectorImpl< Instruction * > &DropPoisonGeneratingInsts)
Check whether it is poison-safe to represent the expression S using the instruction I.
LLVM_ABI bool isKnownPredicateAt(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const Instruction *CtxI)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
LLVM_ABI const SCEV * getPredicatedSymbolicMaxBackedgeTakenCount(const Loop *L, SmallVectorImpl< const SCEVPredicate * > &Predicates)
Similar to getSymbolicMaxBackedgeTakenCount, except it will add a set of SCEV predicates to Predicate...
LLVM_ABI const SCEV * getUDivExactExpr(const SCEV *LHS, const SCEV *RHS)
Get a canonical unsigned division expression, or something simpler if possible.
LLVM_ABI void registerUser(const SCEV *User, ArrayRef< const SCEV * > Ops)
Notify this ScalarEvolution that User directly uses SCEVs in Ops.
LLVM_ABI const SCEV * getAddExpr(SmallVectorImpl< const SCEV * > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Get a canonical add expression, or something simpler if possible.
LLVM_ABI bool isBasicBlockEntryGuardedByCond(const BasicBlock *BB, CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Test whether entry to the basic block is protected by a conditional between LHS and RHS.
LLVM_ABI const SCEV * getTruncateOrSignExtend(const SCEV *V, Type *Ty, unsigned Depth=0)
Return a SCEV corresponding to a conversion of the input value to the specified type.
LLVM_ABI bool containsErasedValue(const SCEV *S) const
Return true if the SCEV expression contains a Value that has been optimised out and is now a nullptr.
LLVM_ABI bool isKnownPredicate(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
LLVM_ABI bool isKnownViaInduction(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
We'd like to check the predicate on every iteration of the most dominated loop between loops used in ...
const SCEV * getSymbolicMaxBackedgeTakenCount(const Loop *L)
When successful, this returns a SCEV that is greater than or equal to (i.e.
APInt getSignedRangeMax(const SCEV *S)
Determine the max of the signed range for a particular SCEV.
LLVM_ABI void verify() const
LLVMContext & getContext() const
Implements a dense probed hash-table based set with some number of buckets stored inline.
Definition DenseSet.h:291
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:339
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Class to represent struct types.
Provides information about what library functions are available for the current target.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
See the file comment.
Definition ValueMap.h:84
LLVM Value Representation.
Definition Value.h:75
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
unsigned combineHashValue(unsigned a, unsigned b)
Simplistic combination of 32-bit hash values into 32-bit hash values.
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
FoldingSetBase::Node FoldingSetNode
Definition FoldingSet.h:408
LLVM_ABI bool VerifySCEV
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
DWARFExpression::Operation Op
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:383
#define N
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
DefaultFoldingSetTrait - This class provides default implementations for FoldingSetTrait implementati...
Definition FoldingSet.h:115
static unsigned getHashValue(const ScalarEvolution::FoldID &Val)
static ScalarEvolution::FoldID getTombstoneKey()
static ScalarEvolution::FoldID getEmptyKey()
static bool isEqual(const ScalarEvolution::FoldID &LHS, const ScalarEvolution::FoldID &RHS)
An information struct used to provide DenseMap with the various necessary components for a given valu...
static void Profile(const SCEVPredicate &X, FoldingSetNodeID &ID)
static bool Equals(const SCEVPredicate &X, const FoldingSetNodeID &ID, unsigned IDHash, FoldingSetNodeID &TempID)
static unsigned ComputeHash(const SCEVPredicate &X, FoldingSetNodeID &TempID)
static bool Equals(const SCEV &X, const FoldingSetNodeID &ID, unsigned IDHash, FoldingSetNodeID &TempID)
static unsigned ComputeHash(const SCEV &X, FoldingSetNodeID &TempID)
static void Profile(const SCEV &X, FoldingSetNodeID &ID)
FoldingSetTrait - This trait class is used to define behavior of how to "profile" (in the FoldingSet ...
Definition FoldingSet.h:145
A CRTP mix-in to automatically provide informational APIs needed for passes.
Definition PassManager.h:70
static LLVM_ABI bool classof(const SCEV *S)
Methods for support type inquiry through isa, cast, and dyn_cast:
Information about the number of loop iterations for which a loop exit's branch condition evaluates to...
LLVM_ABI ExitLimit(const SCEV *E)
Construct either an exact exit limit from a constant, or an unknown one from a SCEVCouldNotCompute.
bool hasAnyInfo() const
Test whether this ExitLimit contains any computed information, or whether it's all SCEVCouldNotComput...
SmallVector< const SCEVPredicate *, 4 > Predicates
A vector of predicate guards for this ExitLimit.
bool hasFullInfo() const
Test whether this ExitLimit contains all information.
LoopInvariantPredicate(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)