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