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