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