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