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