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