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