LLVM 24.0.0git
ScalarEvolution.cpp
Go to the documentation of this file.
1//===- ScalarEvolution.cpp - Scalar Evolution Analysis --------------------===//
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// This file contains the implementation of the scalar evolution analysis
10// engine, which is used primarily to analyze expressions involving induction
11// variables in loops.
12//
13// There are several aspects to this library. First is the representation of
14// scalar expressions, which are represented as subclasses of the SCEV class.
15// These classes are used to represent certain types of subexpressions that we
16// can handle. We only create one SCEV of a particular shape, so
17// pointer-comparisons for equality are legal.
18//
19// One important aspect of the SCEV objects is that they are never cyclic, even
20// if there is a cycle in the dataflow for an expression (ie, a PHI node). If
21// the PHI node is one of the idioms that we can represent (e.g., a polynomial
22// recurrence) then we represent it directly as a recurrence node, otherwise we
23// represent it as a SCEVUnknown node.
24//
25// In addition to being able to represent expressions of various types, we also
26// have folders that are used to build the *canonical* representation for a
27// particular expression. These folders are capable of using a variety of
28// rewrite rules to simplify the expressions.
29//
30// Once the folders are defined, we can implement the more interesting
31// higher-level code, such as the code that recognizes PHI nodes of various
32// types, computes the execution count of a loop, etc.
33//
34// TODO: We should use these routines and value representations to implement
35// dependence analysis!
36//
37//===----------------------------------------------------------------------===//
38//
39// There are several good references for the techniques used in this analysis.
40//
41// Chains of recurrences -- a method to expedite the evaluation
42// of closed-form functions
43// Olaf Bachmann, Paul S. Wang, Eugene V. Zima
44//
45// On computational properties of chains of recurrences
46// Eugene V. Zima
47//
48// Symbolic Evaluation of Chains of Recurrences for Loop Optimization
49// Robert A. van Engelen
50//
51// Efficient Symbolic Analysis for Optimizing Compilers
52// Robert A. van Engelen
53//
54// Using the chains of recurrences algebra for data dependence testing and
55// induction variable substitution
56// MS Thesis, Johnie Birch
57//
58//===----------------------------------------------------------------------===//
59
61#include "AnalysisOptions.h"
62#include "llvm/ADT/APInt.h"
63#include "llvm/ADT/ArrayRef.h"
64#include "llvm/ADT/DenseMap.h"
66#include "llvm/ADT/FoldingSet.h"
67#include "llvm/ADT/STLExtras.h"
68#include "llvm/ADT/ScopeExit.h"
69#include "llvm/ADT/Sequence.h"
72#include "llvm/ADT/Statistic.h"
74#include "llvm/ADT/StringRef.h"
84#include "llvm/Config/llvm-config.h"
85#include "llvm/IR/Argument.h"
86#include "llvm/IR/BasicBlock.h"
87#include "llvm/IR/CFG.h"
88#include "llvm/IR/Constant.h"
90#include "llvm/IR/Constants.h"
91#include "llvm/IR/DataLayout.h"
93#include "llvm/IR/Dominators.h"
94#include "llvm/IR/Function.h"
95#include "llvm/IR/GlobalAlias.h"
96#include "llvm/IR/GlobalValue.h"
98#include "llvm/IR/InstrTypes.h"
99#include "llvm/IR/Instruction.h"
100#include "llvm/IR/Instructions.h"
102#include "llvm/IR/Intrinsics.h"
103#include "llvm/IR/LLVMContext.h"
104#include "llvm/IR/Operator.h"
105#include "llvm/IR/PatternMatch.h"
106#include "llvm/IR/Type.h"
107#include "llvm/IR/Use.h"
108#include "llvm/IR/User.h"
109#include "llvm/IR/Value.h"
110#include "llvm/IR/Verifier.h"
112#include "llvm/Pass.h"
113#include "llvm/Support/Casting.h"
116#include "llvm/Support/Debug.h"
122#include <algorithm>
123#include <cassert>
124#include <climits>
125#include <cstdint>
126#include <cstdlib>
127#include <map>
128#include <memory>
129#include <numeric>
130#include <optional>
131#include <tuple>
132#include <utility>
133#include <vector>
134
135using namespace llvm;
136using namespace PatternMatch;
137using namespace SCEVPatternMatch;
138
139#define DEBUG_TYPE "scalar-evolution"
140
141STATISTIC(NumExitCountsComputed,
142 "Number of loop exits with predictable exit counts");
143STATISTIC(NumExitCountsNotComputed,
144 "Number of loop exits without predictable exit counts");
145STATISTIC(NumBruteForceTripCountsComputed,
146 "Number of loops with trip counts computed by force");
147
148#ifdef EXPENSIVE_CHECKS
149bool llvm::VerifySCEV = true;
150#else
151bool llvm::VerifySCEV = false;
152#endif
153
155 "verify-scev", cl::Hidden, cl::location(VerifySCEV),
156 cl::desc("Verify ScalarEvolution's backedge taken counts (slow)"));
157
158//===----------------------------------------------------------------------===//
159// SCEV class definitions
160//===----------------------------------------------------------------------===//
161
163 // Leaf nodes are always their own canonical.
164 switch (getSCEVType()) {
165 case scConstant:
166 case scVScale:
167 case scUnknown:
168 CanonicalSCEV = this;
169 return;
170 default:
171 break;
172 }
173
174 // For all other expressions, check whether any immediate operand has a
175 // different canonical. Since operands are always created before their parent,
176 // their canonical pointers are already set — no recursion needed.
177 if (all_of(operands(), [](SCEVUse Op) { return Op.isCanonical(); })) {
178 CanonicalSCEV = this;
179 return;
180 }
181
183 map_range(operands(), [](SCEVUse Op) { return Op.getCanonical(); }));
184 // Rebuild the expression from the canonical operands, stripping use flags.
185 CanonicalSCEV = SE.getWithOperands(this, CanonOps);
186}
187
188//===----------------------------------------------------------------------===//
189// Implementation of the SCEV class.
190//
191
192#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
194 print(dbgs());
195 dbgs() << '\n';
196}
197#endif
198
199void SCEV::print(raw_ostream &OS) const {
200 switch (getSCEVType()) {
201 case scConstant:
202 cast<SCEVConstant>(this)->getValue()->printAsOperand(OS, false);
203 return;
204 case scVScale:
205 OS << "vscale";
206 return;
207 case scPtrToAddr: {
208 const SCEVCastExpr *PtrCast = cast<SCEVCastExpr>(this);
209 SCEVUse Op = PtrCast->getOperand();
210 OS << "(ptrtoaddr " << *Op->getType() << " " << Op << " to "
211 << *PtrCast->getType() << ")";
212 return;
213 }
214 case scTruncate: {
215 const SCEVTruncateExpr *Trunc = cast<SCEVTruncateExpr>(this);
216 SCEVUse Op = Trunc->getOperand();
217 OS << "(trunc " << *Op->getType() << " " << Op << " to "
218 << *Trunc->getType() << ")";
219 return;
220 }
221 case scZeroExtend: {
223 SCEVUse Op = ZExt->getOperand();
224 OS << "(zext " << *Op->getType() << " " << Op << " to " << *ZExt->getType()
225 << ")";
226 return;
227 }
228 case scSignExtend: {
230 SCEVUse Op = SExt->getOperand();
231 OS << "(sext " << *Op->getType() << " " << Op << " to " << *SExt->getType()
232 << ")";
233 return;
234 }
235 case scAddRecExpr: {
236 const SCEVAddRecExpr *AR = cast<SCEVAddRecExpr>(this);
237 OS << "{" << AR->getOperand(0);
238 for (unsigned i = 1, e = AR->getNumOperands(); i != e; ++i)
239 OS << ",+," << AR->getOperand(i);
240 OS << "}<";
241 if (AR->hasNoUnsignedWrap())
242 OS << "nuw><";
243 if (AR->hasNoSignedWrap())
244 OS << "nsw><";
245 if (AR->hasNoSelfWrap() && !AR->hasNoUnsignedWrap() &&
246 !AR->hasNoSignedWrap())
247 OS << "nw><";
248 AR->getLoop()->getHeader()->printAsOperand(OS, /*PrintType=*/false);
249 OS << ">";
250 return;
251 }
252 case scAddExpr:
253 case scMulExpr:
254 case scUMaxExpr:
255 case scSMaxExpr:
256 case scUMinExpr:
257 case scSMinExpr:
259 const SCEVNAryExpr *NAry = cast<SCEVNAryExpr>(this);
260 const char *OpStr = nullptr;
261 switch (NAry->getSCEVType()) {
262 case scAddExpr: OpStr = " + "; break;
263 case scMulExpr: OpStr = " * "; break;
264 case scUMaxExpr: OpStr = " umax "; break;
265 case scSMaxExpr: OpStr = " smax "; break;
266 case scUMinExpr:
267 OpStr = " umin ";
268 break;
269 case scSMinExpr:
270 OpStr = " smin ";
271 break;
273 OpStr = " umin_seq ";
274 break;
275 default:
276 llvm_unreachable("There are no other nary expression types.");
277 }
278 OS << "(" << llvm::interleaved(NAry->operands(), OpStr) << ")";
279 switch (NAry->getSCEVType()) {
280 case scAddExpr:
281 case scMulExpr:
282 if (NAry->hasNoUnsignedWrap())
283 OS << "<nuw>";
284 if (NAry->hasNoSignedWrap())
285 OS << "<nsw>";
286 break;
287 default:
288 // Nothing to print for other nary expressions.
289 break;
290 }
291 return;
292 }
293 case scUDivExpr: {
294 const SCEVUDivExpr *UDiv = cast<SCEVUDivExpr>(this);
295 OS << "(" << UDiv->getLHS() << " /u " << UDiv->getRHS() << ")";
296 return;
297 }
298 case scUnknown:
299 cast<SCEVUnknown>(this)->getValue()->printAsOperand(OS, false);
300 return;
302 OS << "***COULDNOTCOMPUTE***";
303 return;
304 }
305 llvm_unreachable("Unknown SCEV kind!");
306}
307
309 switch (getSCEVType()) {
310 case scConstant:
311 case scVScale:
312 case scUnknown:
313 return {};
314 case scPtrToAddr:
315 case scTruncate:
316 case scZeroExtend:
317 case scSignExtend:
318 return cast<SCEVCastExpr>(this)->operands();
319 case scAddRecExpr:
320 case scAddExpr:
321 case scMulExpr:
322 case scUMaxExpr:
323 case scSMaxExpr:
324 case scUMinExpr:
325 case scSMinExpr:
327 return cast<SCEVNAryExpr>(this)->operands();
328 case scUDivExpr:
329 return cast<SCEVUDivExpr>(this)->operands();
331 llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!");
332 }
333 llvm_unreachable("Unknown SCEV kind!");
334}
335
336bool SCEV::isZero() const { return match(this, m_scev_Zero()); }
337
338bool SCEV::isOne() const { return match(this, m_scev_One()); }
339
340bool SCEV::isAllOnesValue() const { return match(this, m_scev_AllOnes()); }
341
344 if (!Mul) return false;
345
346 // If there is a constant factor, it will be first.
347 const SCEVConstant *SC = dyn_cast<SCEVConstant>(Mul->getOperand(0));
348 if (!SC) return false;
349
350 // Return true if the value is negative, this matches things like (-42 * V).
351 return SC->getAPInt().isNegative();
352}
353
356
358 return S->getSCEVType() == scCouldNotCompute;
359}
360
362 auto &Entry = ConstantSCEVs[V];
363 if (Entry)
364 return Entry;
365
368 ID.AddPointer(V);
370 if (SCEVConstant *S =
371 static_cast<SCEVConstant *>(UniqueSCEVs.lookup(ID, Token)))
372 return Entry = S;
373 SCEVConstant *S =
374 new (SCEVAllocator) SCEVConstant(ID.Intern(SCEVAllocator), V);
375 UniqueSCEVs.insert(S, Token);
376 S->computeAndSetCanonical(*this);
377 return Entry = S;
378}
379
381 return getConstant(ConstantInt::get(getContext(), Val));
382}
383
384const SCEV *
387 // TODO: Avoid implicit trunc?
388 // See https://github.com/llvm/llvm-project/issues/112510.
389 return getConstant(
390 ConstantInt::get(ITy, V, isSigned, /*ImplicitTrunc=*/true));
391}
392
396 ID.AddPointer(Ty);
398 if (const SCEV *S = UniqueSCEVs.lookup(ID, Token))
399 return S;
400 SCEV *S = new (SCEVAllocator) SCEVVScale(ID.Intern(SCEVAllocator), Ty);
401 UniqueSCEVs.insert(S, Token);
402 S->computeAndSetCanonical(*this);
403 return S;
404}
405
407 SCEVFlags Flags) {
408 const SCEV *Res = getConstant(Ty, EC.getKnownMinValue());
409 if (EC.isScalable())
410 Res = getMulExpr(Res, getVScale(Ty), Flags);
411 return Res;
412}
413
415 SCEVUse op, Type *ty)
416 : SCEV(ID, SCEVTy, computeExpressionSize(op), ty), Op(op) {}
417
418SCEVPtrToAddrExpr::SCEVPtrToAddrExpr(const FoldingSetNodeIDRef ID,
419 const SCEV *Op, Type *ITy)
420 : SCEVCastExpr(ID, scPtrToAddr, Op, ITy) {
421 assert(getOperand()->getType()->isPointerTy() && getType()->isIntegerTy() &&
422 "Must be a non-bit-width-changing pointer-to-integer cast!");
423}
424
429
430SCEVTruncateExpr::SCEVTruncateExpr(const FoldingSetNodeIDRef ID, SCEVUse op,
431 Type *ty)
433 assert(getOperand()->getType()->isIntOrPtrTy() && getType()->isIntOrPtrTy() &&
434 "Cannot truncate non-integer value!");
435}
436
437SCEVZeroExtendExpr::SCEVZeroExtendExpr(const FoldingSetNodeIDRef ID, SCEVUse op,
438 Type *ty)
440 assert(getOperand()->getType()->isIntOrPtrTy() && getType()->isIntOrPtrTy() &&
441 "Cannot zero extend non-integer value!");
442}
443
444SCEVSignExtendExpr::SCEVSignExtendExpr(const FoldingSetNodeIDRef ID, SCEVUse op,
445 Type *ty)
447 assert(getOperand()->getType()->isIntOrPtrTy() && getType()->isIntOrPtrTy() &&
448 "Cannot sign extend non-integer value!");
449}
450
452 // Clear this SCEVUnknown from various maps.
453 SE->forgetMemoizedResults({this});
454
455 // Remove this SCEVUnknown from the uniquing map.
456 SE->UniqueSCEVs.erase(this);
457
458 // Release the value.
459 setValPtr(nullptr);
460}
461
462void SCEVUnknown::allUsesReplacedWith(Value *New) {
463 // Clear this SCEVUnknown from various maps.
464 SE->forgetMemoizedResults({this});
465
466 // Remove this SCEVUnknown from the uniquing map.
467 SE->UniqueSCEVs.erase(this);
468
469 // Replace the value pointer in case someone is still using this SCEVUnknown.
470 setValPtr(New);
471}
472
473//===----------------------------------------------------------------------===//
474// SCEV Utilities
475//===----------------------------------------------------------------------===//
476
477/// Compare the two values \p LV and \p RV in terms of their "complexity" where
478/// "complexity" is a partial (and somewhat ad-hoc) relation used to order
479/// operands in SCEV expressions.
480static int compareValueComplexity(const AnalysisOptions &Opts,
481 const LoopInfo *const LI, Value *LV,
482 Value *RV, unsigned Depth) {
483 if (Depth > Opts.scalar_evolution_max_value_compare_depth)
484 return 0;
485
486 // Order pointer values after integer values. This helps SCEVExpander form
487 // GEPs.
488 bool LIsPointer = LV->getType()->isPointerTy(),
489 RIsPointer = RV->getType()->isPointerTy();
490 if (LIsPointer != RIsPointer)
491 return (int)LIsPointer - (int)RIsPointer;
492
493 // Compare getValueID values.
494 unsigned LID = LV->getValueID(), RID = RV->getValueID();
495 if (LID != RID)
496 return (int)LID - (int)RID;
497
498 // Sort arguments by their position.
499 if (const auto *LA = dyn_cast<Argument>(LV)) {
500 const auto *RA = cast<Argument>(RV);
501 unsigned LArgNo = LA->getArgNo(), RArgNo = RA->getArgNo();
502 return (int)LArgNo - (int)RArgNo;
503 }
504
505 if (const auto *LGV = dyn_cast<GlobalValue>(LV)) {
506 const auto *RGV = cast<GlobalValue>(RV);
507
508 if (auto L = LGV->getLinkage() - RGV->getLinkage())
509 return L;
510
511 const auto IsGVNameSemantic = [&](const GlobalValue *GV) {
512 auto LT = GV->getLinkage();
513 return !(GlobalValue::isPrivateLinkage(LT) ||
515 };
516
517 // Use the names to distinguish the two values, but only if the
518 // names are semantically important.
519 if (IsGVNameSemantic(LGV) && IsGVNameSemantic(RGV))
520 return LGV->getName().compare(RGV->getName());
521 }
522
523 // For instructions, compare their loop depth, and their operand count. This
524 // is pretty loose.
525 if (const auto *LInst = dyn_cast<Instruction>(LV)) {
526 const auto *RInst = cast<Instruction>(RV);
527
528 // Compare loop depths.
529 const BasicBlock *LParent = LInst->getParent(),
530 *RParent = RInst->getParent();
531 if (LParent != RParent) {
532 unsigned LDepth = LI->getLoopDepth(LParent),
533 RDepth = LI->getLoopDepth(RParent);
534 if (LDepth != RDepth)
535 return (int)LDepth - (int)RDepth;
536 }
537
538 // Compare the number of operands.
539 unsigned LNumOps = LInst->getNumOperands(),
540 RNumOps = RInst->getNumOperands();
541 if (LNumOps != RNumOps)
542 return (int)LNumOps - (int)RNumOps;
543
544 for (unsigned Idx : seq(LNumOps)) {
545 int Result = compareValueComplexity(Opts, LI, LInst->getOperand(Idx),
546 RInst->getOperand(Idx), Depth + 1);
547 if (Result != 0)
548 return Result;
549 }
550 }
551
552 return 0;
553}
554
555// Return negative, zero, or positive, if LHS is less than, equal to, or greater
556// than RHS, respectively. A three-way result allows recursive comparisons to be
557// more efficient. The result is a total order.
558static int compareSCEVComplexity(const AnalysisOptions &Opts,
559 const LoopInfo *const LI, SCEVUse LHS,
561 // Fast-path: SCEVs are uniqued so we can do a quick equality check.
562 if (LHS == RHS)
563 return 0;
564
565 if (LHS.getPointer() == RHS.getPointer())
566 return (int)LHS.getUseNoWrapFlags() - (int)RHS.getUseNoWrapFlags();
567
568 // Primarily, sort the SCEVs by their getSCEVType().
569 SCEVTypes LType = LHS->getSCEVType(), RType = RHS->getSCEVType();
570 if (LType != RType)
571 return (int)LType - (int)RType;
572
573 // Aside from the getSCEVType() ordering, the particular ordering
574 // isn't very important except that it's beneficial to be consistent,
575 // so that (a + b) and (b + a) don't end up as different expressions.
576 switch (LType) {
577 case scUnknown: {
578 const SCEVUnknown *LU = cast<SCEVUnknown>(LHS);
579 const SCEVUnknown *RU = cast<SCEVUnknown>(RHS);
580
581 if (int X = compareValueComplexity(Opts, LI, LU->getValue(), RU->getValue(),
582 /*Depth=*/0))
583 return X;
584 return LU->getOrderID() < RU->getOrderID() ? -1 : 1;
585 }
586
587 case scConstant: {
590
591 // Compare constant values.
592 const APInt &LA = LC->getAPInt();
593 const APInt &RA = RC->getAPInt();
594 unsigned LBitWidth = LA.getBitWidth(), RBitWidth = RA.getBitWidth();
595 if (LBitWidth != RBitWidth)
596 return (int)LBitWidth - (int)RBitWidth;
597 return LA.ult(RA) ? -1 : 1;
598 }
599
600 case scVScale: {
601 const auto *LTy = cast<IntegerType>(cast<SCEVVScale>(LHS)->getType());
602 const auto *RTy = cast<IntegerType>(cast<SCEVVScale>(RHS)->getType());
603 return LTy->getBitWidth() - RTy->getBitWidth();
604 }
605
606 case scAddRecExpr: {
609
610 // There is always a dominance between two recs that are used by one SCEV,
611 // so we can safely sort recs by loop header dominance. We require such
612 // order in getAddExpr.
613 const Loop *LLoop = LA->getLoop(), *RLoop = RA->getLoop();
614 if (LLoop != RLoop) {
615 const BasicBlock *LHead = LLoop->getHeader(), *RHead = RLoop->getHeader();
616 assert(LHead != RHead && "Two loops share the same header?");
617 if (DT.dominates(LHead, RHead))
618 return 1;
619 assert(DT.dominates(RHead, LHead) &&
620 "No dominance between recurrences used by one SCEV?");
621 return -1;
622 }
623
624 [[fallthrough]];
625 }
626
627 case scTruncate:
628 case scZeroExtend:
629 case scSignExtend:
630 case scPtrToAddr:
631 case scAddExpr:
632 case scMulExpr:
633 case scUDivExpr:
634 case scSMaxExpr:
635 case scUMaxExpr:
636 case scSMinExpr:
637 case scUMinExpr:
639 ArrayRef<SCEVUse> LOps = LHS->operands();
640 ArrayRef<SCEVUse> ROps = RHS->operands();
641
642 // Lexicographically compare n-ary-like expressions.
643 unsigned LNumOps = LOps.size(), RNumOps = ROps.size();
644 if (LNumOps != RNumOps)
645 return (int)LNumOps - (int)RNumOps;
646
647 for (unsigned i = 0; i != LNumOps; ++i) {
648 auto X = compareSCEVComplexity(Opts, LI, LOps[i], ROps[i], DT);
649 if (X != 0)
650 return X;
651 }
652
653 assert(isa<SCEVCastExpr>(LHS) && "distinct SCEVs compare equal");
654 unsigned LBitWidth = cast<IntegerType>(LHS->getType())->getBitWidth();
655 unsigned RBitWidth = cast<IntegerType>(RHS->getType())->getBitWidth();
656 assert(LBitWidth != RBitWidth && "distinct SCEVs compare equal");
657 return (int)LBitWidth - (int)RBitWidth;
658 }
659
661 llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!");
662 }
663 llvm_unreachable("Unknown SCEV kind!");
664}
665
666/// Given a list of SCEV objects, order them by their complexity, and group
667/// objects of the same complexity together by value. When this routine is
668/// finished, we know that any duplicates in the vector are consecutive and that
669/// complexity is monotonically increasing.
670///
671/// Note that we go take special precautions to ensure that we get deterministic
672/// results from this routine. In other words, we don't want the results of
673/// this to depend on where the addresses of various SCEV objects happened to
674/// land in memory.
675static void groupByComplexity(const AnalysisOptions &Opts,
677 DominatorTree &DT) {
678 if (Ops.size() < 2) return; // Noop
679
680 // Whether LHS has provably less complexity than RHS.
681 auto IsLessComplex = [&](SCEVUse LHS, SCEVUse RHS) {
682 return compareSCEVComplexity(Opts, LI, LHS, RHS, DT) < 0;
683 };
684 if (Ops.size() == 2) {
685 // This is the common case, which also happens to be trivially simple.
686 // Special case it.
687 SCEVUse &LHS = Ops[0], &RHS = Ops[1];
688 if (IsLessComplex(RHS, LHS))
689 std::swap(LHS, RHS);
690 return;
691 }
692
693 llvm::sort(Ops, IsLessComplex);
694}
695
696/// Returns true if \p Ops contains a huge SCEV (the subtree of S contains at
697/// least -scalar-evolution-huge-expr-threshold nodes).
698static bool hasHugeExpression(const AnalysisOptions &Opts,
700 return any_of(Ops, [&](const SCEV *S) {
701 return S->getExpressionSize() >= Opts.scalar_evolution_huge_expr_threshold;
702 });
703}
704
705/// Performs a number of common optimizations on the passed \p Ops. If the
706/// whole expression reduces down to a single operand, it will be returned.
707///
708/// The following optimizations are performed:
709/// * Fold constants using the \p Fold function.
710/// * Remove identity constants satisfying \p IsIdentity.
711/// * If a constant satisfies \p IsAbsorber, return it.
712/// * Sort operands by complexity.
713template <typename FoldT, typename IsIdentityT, typename IsAbsorberT>
714static const SCEV *
715constantFoldAndGroupOps(const AnalysisOptions &Opts, ScalarEvolution &SE,
716 LoopInfo &LI, DominatorTree &DT,
717 SmallVectorImpl<SCEVUse> &Ops, FoldT Fold,
718 IsIdentityT IsIdentity, IsAbsorberT IsAbsorber) {
719 const SCEVConstant *Folded = nullptr;
720 for (unsigned Idx = 0; Idx < Ops.size();) {
721 const SCEV *Op = Ops[Idx];
722 if (const auto *C = dyn_cast<SCEVConstant>(Op)) {
723 if (!Folded)
724 Folded = C;
725 else
727 SE.getConstant(Fold(Folded->getAPInt(), C->getAPInt())));
728 Ops.erase(Ops.begin() + Idx);
729 continue;
730 }
731 ++Idx;
732 }
733
734 if (Ops.empty()) {
735 assert(Folded && "Must have folded value");
736 return Folded;
737 }
738
739 if (Folded && IsAbsorber(Folded->getAPInt()))
740 return Folded;
741
742 groupByComplexity(Opts, Ops, &LI, DT);
743 if (Folded && !IsIdentity(Folded->getAPInt()))
744 Ops.insert(Ops.begin(), Folded);
745
746 return Ops.size() == 1 ? Ops[0] : nullptr;
747}
748
749//===----------------------------------------------------------------------===//
750// Simple SCEV method implementations
751//===----------------------------------------------------------------------===//
752
753/// Compute BC(It, K). The result has width W. Assume, K > 0.
754static const SCEV *BinomialCoefficient(const SCEV *It, unsigned K,
755 ScalarEvolution &SE,
756 Type *ResultTy) {
757 // Handle the simplest case efficiently.
758 if (K == 1)
759 return SE.getTruncateOrZeroExtend(It, ResultTy);
760
761 // We are using the following formula for BC(It, K):
762 //
763 // BC(It, K) = (It * (It - 1) * ... * (It - K + 1)) / K!
764 //
765 // Suppose, W is the bitwidth of the return value. We must be prepared for
766 // overflow. Hence, we must assure that the result of our computation is
767 // equal to the accurate one modulo 2^W. Unfortunately, division isn't
768 // safe in modular arithmetic.
769 //
770 // However, this code doesn't use exactly that formula; the formula it uses
771 // is something like the following, where T is the number of factors of 2 in
772 // K! (i.e. trailing zeros in the binary representation of K!), and ^ is
773 // exponentiation:
774 //
775 // BC(It, K) = (It * (It - 1) * ... * (It - K + 1)) / 2^T / (K! / 2^T)
776 //
777 // This formula is trivially equivalent to the previous formula. However,
778 // this formula can be implemented much more efficiently. The trick is that
779 // K! / 2^T is odd, and exact division by an odd number *is* safe in modular
780 // arithmetic. To do exact division in modular arithmetic, all we have
781 // to do is multiply by the inverse. Therefore, this step can be done at
782 // width W.
783 //
784 // The next issue is how to safely do the division by 2^T. The way this
785 // is done is by doing the multiplication step at a width of at least W + T
786 // bits. This way, the bottom W+T bits of the product are accurate. Then,
787 // when we perform the division by 2^T (which is equivalent to a right shift
788 // by T), the bottom W bits are accurate. Extra bits are okay; they'll get
789 // truncated out after the division by 2^T.
790 //
791 // In comparison to just directly using the first formula, this technique
792 // is much more efficient; using the first formula requires W * K bits,
793 // but this formula less than W + K bits. Also, the first formula requires
794 // a division step, whereas this formula only requires multiplies and shifts.
795 //
796 // It doesn't matter whether the subtraction step is done in the calculation
797 // width or the input iteration count's width; if the subtraction overflows,
798 // the result must be zero anyway. We prefer here to do it in the width of
799 // the induction variable because it helps a lot for certain cases; CodeGen
800 // isn't smart enough to ignore the overflow, which leads to much less
801 // efficient code if the width of the subtraction is wider than the native
802 // register width.
803 //
804 // (It's possible to not widen at all by pulling out factors of 2 before
805 // the multiplication; for example, K=2 can be calculated as
806 // It/2*(It+(It*INT_MIN/INT_MIN)+-1). However, it requires
807 // extra arithmetic, so it's not an obvious win, and it gets
808 // much more complicated for K > 3.)
809
810 // Protection from insane SCEVs; this bound is conservative,
811 // but it probably doesn't matter.
812 if (K > 1000)
813 return SE.getCouldNotCompute();
814
815 unsigned W = SE.getTypeSizeInBits(ResultTy);
816
817 // Calculate K! / 2^T and T; we divide out the factors of two before
818 // multiplying for calculating K! / 2^T to avoid overflow.
819 // Other overflow doesn't matter because we only care about the bottom
820 // W bits of the result.
821 APInt OddFactorial(W, 1);
822 unsigned T = 1;
823 for (unsigned i = 3; i <= K; ++i) {
824 unsigned TwoFactors = countr_zero(i);
825 T += TwoFactors;
826 OddFactorial *= (i >> TwoFactors);
827 }
828
829 // We need at least W + T bits for the multiplication step
830 unsigned CalculationBits = W + T;
831
832 // Calculate 2^T, at width T+W.
833 APInt DivFactor = APInt::getOneBitSet(CalculationBits, T);
834
835 // Calculate the multiplicative inverse of K! / 2^T;
836 // this multiplication factor will perform the exact division by
837 // K! / 2^T.
838 APInt MultiplyFactor = OddFactorial.multiplicativeInverse();
839
840 // Calculate the product, at width T+W
841 IntegerType *CalculationTy = IntegerType::get(SE.getContext(),
842 CalculationBits);
843 const SCEV *Dividend = SE.getTruncateOrZeroExtend(It, CalculationTy);
844 for (unsigned i = 1; i != K; ++i) {
845 const SCEV *S = SE.getMinusSCEV(It, SE.getConstant(It->getType(), i));
846 Dividend = SE.getMulExpr(Dividend,
847 SE.getTruncateOrZeroExtend(S, CalculationTy));
848 }
849
850 // Divide by 2^T
851 const SCEV *DivResult = SE.getUDivExpr(Dividend, SE.getConstant(DivFactor));
852
853 // Truncate the result, and divide by K! / 2^T.
854
855 return SE.getMulExpr(SE.getConstant(MultiplyFactor),
856 SE.getTruncateOrZeroExtend(DivResult, ResultTy));
857}
858
859/// Return the value of this chain of recurrences at the specified iteration
860/// number. We can evaluate this recurrence by multiplying each element in the
861/// chain by the binomial coefficient corresponding to it. In other words, we
862/// can evaluate {A,+,B,+,C,+,D} as:
863///
864/// A*BC(It, 0) + B*BC(It, 1) + C*BC(It, 2) + D*BC(It, 3)
865///
866/// where BC(It, k) stands for binomial coefficient.
868 ScalarEvolution &SE) const {
869 return evaluateAtIteration(operands(), It, SE);
870}
871
873 const SCEV *It, ScalarEvolution &SE,
874 SCEVFlags UseFlags) {
875 assert(Operands.size() > 0);
876 assert((Operands.size() == 2 || UseFlags == SCEV::FlagNone) &&
877 "use-specific flags only supported for affine AddRecs");
878 SCEVUse Result = Operands[0].getPointer();
879 for (unsigned i = 1, e = Operands.size(); i != e; ++i) {
880 // The computation is correct in the face of overflow provided that the
881 // multiplication is performed _after_ the evaluation of the binomial
882 // coefficient.
883 const SCEV *Coeff = BinomialCoefficient(It, i, SE, Result->getType());
884 if (isa<SCEVCouldNotCompute>(Coeff))
885 return Coeff;
886
887 SCEVUse Mul = SE.getMulExpr(Operands[i].getPointer(), Coeff,
888 {SCEV::FlagNone, UseFlags});
889 Result = SE.getAddExpr(Result, Mul, {SCEV::FlagNone, UseFlags});
890 }
891 return Result;
892}
893
895 const SCEV *BTC = SE.getBackedgeTakenCount(getLoop());
897 return BTC;
898 // The loop reaches iteration BTC, so the value this recurrence computes there
899 // is the value it had, and that did not wrap.
900 return evaluateAtIteration(operands(), BTC, SE,
903}
904
905//===----------------------------------------------------------------------===//
906// SCEV Expression folder implementations
907//===----------------------------------------------------------------------===//
908
909/// The SCEVCastSinkingRewriter takes a scalar evolution expression,
910/// which computes a pointer-typed value, and rewrites the whole expression
911/// tree so that *all* the computations are done on integers, and the only
912/// pointer-typed operands in the expression are SCEVUnknown.
913/// The CreatePtrCast callback is invoked to create the actual conversion
914/// (ptrtoint or ptrtoaddr) at the SCEVUnknown leaves.
916 : public SCEVRewriteVisitor<SCEVCastSinkingRewriter> {
918 using ConversionFn = function_ref<const SCEV *(const SCEVUnknown *)>;
919 Type *TargetTy;
920 ConversionFn CreatePtrCast;
921
922public:
924 ConversionFn CreatePtrCast)
925 : Base(SE), TargetTy(TargetTy), CreatePtrCast(std::move(CreatePtrCast)) {}
926
927 static const SCEV *rewrite(const SCEV *Scev, ScalarEvolution &SE,
928 Type *TargetTy, ConversionFn CreatePtrCast) {
929 SCEVCastSinkingRewriter Rewriter(SE, TargetTy, std::move(CreatePtrCast));
930 return Rewriter.visit(Scev);
931 }
932
933 const SCEV *visit(const SCEV *S) {
934 Type *STy = S->getType();
935 // If the expression is not pointer-typed, just keep it as-is.
936 if (!STy->isPointerTy())
937 return S;
938 // Else, recursively sink the cast down into it.
939 return Base::visit(S);
940 }
941
942 const SCEV *visitAddExpr(const SCEVAddExpr *Expr) {
943 // Preserve wrap flags on rewritten SCEVAddExpr, which the default
944 // implementation drops.
946 bool Changed = false;
947 for (SCEVUse Op : Expr->operands()) {
948 Operands.push_back(visit(Op.getPointer()));
949 Changed |= Op.getPointer() != Operands.back();
950 }
951 return !Changed ? Expr : SE.getAddExpr(Operands, Expr->getNoWrapFlags());
952 }
953
954 const SCEV *visitUnknown(const SCEVUnknown *Expr) {
955 assert(Expr->getType()->isPointerTy() &&
956 "Should only reach pointer-typed SCEVUnknown's.");
957 // Perform some basic constant folding. If the operand of the cast is a
958 // null pointer, don't create a cast SCEV expression (that will be left
959 // as-is), but produce a zero constant.
961 return SE.getZero(TargetTy);
962 return CreatePtrCast(Expr);
963 }
964};
965
967 assert(Op->getType()->isPointerTy() && "Op must be a pointer");
968
969 // Treat pointers with unstable representation conservatively, since the
970 // address bits may change.
971 if (DL.hasUnstableRepresentation(Op->getType()))
972 return getCouldNotCompute();
973
974 Type *Ty = DL.getAddressType(Op->getType());
975
976 // Use the rewriter to sink the cast down to SCEVUnknown leaves.
977 // The rewriter handles null pointer constant folding.
979 Op, *this, Ty, [this, Ty](const SCEVUnknown *U) {
982 ID.AddPointer(U);
983 ID.AddPointer(Ty);
985 if (const SCEV *S = UniqueSCEVs.lookup(ID, Token))
986 return S;
987 SCEV *S = new (SCEVAllocator)
988 SCEVPtrToAddrExpr(ID.Intern(SCEVAllocator), U, Ty);
989 UniqueSCEVs.insert(S, Token);
990 S->computeAndSetCanonical(*this);
991 registerUser(S, {U});
992 return static_cast<const SCEV *>(S);
993 });
994 assert(IntOp->getType()->isIntegerTy() &&
995 "We must have succeeded in sinking the cast, "
996 "and ending up with an integer-typed expression!");
997 return IntOp;
998}
999
1001 unsigned Depth) {
1002 assert(getTypeSizeInBits(Op->getType()) > getTypeSizeInBits(Ty) &&
1003 "This is not a truncating conversion!");
1004 assert(isSCEVable(Ty) &&
1005 "This is not a conversion to a SCEVable type!");
1006 assert(!Op->getType()->isPointerTy() && "Can't truncate pointer!");
1007 Ty = getEffectiveSCEVType(Ty);
1008
1011 ID.AddPointer(Op.getOpaqueValue());
1012 ID.AddPointer(Ty);
1014 if (const SCEV *S = UniqueSCEVs.lookup(ID, Token))
1015 return S;
1016
1017 // Fold if the operand is constant.
1018 if (const SCEVConstant *SC = dyn_cast<SCEVConstant>(Op))
1019 return getConstant(
1020 cast<ConstantInt>(ConstantExpr::getTrunc(SC->getValue(), Ty)));
1021
1022 // trunc(trunc(x)) --> trunc(x)
1024 return getTruncateExpr(ST->getOperand(), Ty, Depth + 1);
1025
1026 // trunc(sext(x)) --> sext(x) if widening or trunc(x) if narrowing
1028 return getTruncateOrSignExtend(SS->getOperand(), Ty, Depth + 1);
1029
1030 // trunc(zext(x)) --> zext(x) if widening or trunc(x) if narrowing
1032 return getTruncateOrZeroExtend(SZ->getOperand(), Ty, Depth + 1);
1033
1034 if (Depth > Opts.scalar_evolution_max_cast_depth) {
1035 SCEV *S =
1036 new (SCEVAllocator) SCEVTruncateExpr(ID.Intern(SCEVAllocator), Op, Ty);
1037 UniqueSCEVs.insert(S, Token);
1038 S->computeAndSetCanonical(*this);
1039 registerUser(S, Op);
1040 return S;
1041 }
1042
1043 // trunc(x1 + ... + xN) --> trunc(x1) + ... + trunc(xN) and
1044 // trunc(x1 * ... * xN) --> trunc(x1) * ... * trunc(xN),
1045 // if after transforming we have at most one truncate, not counting truncates
1046 // that replace other casts.
1048 auto *CommOp = cast<SCEVCommutativeExpr>(Op);
1050 unsigned numTruncs = 0;
1051 for (unsigned i = 0, e = CommOp->getNumOperands(); i != e && numTruncs < 2;
1052 ++i) {
1053 const SCEV *S = getTruncateExpr(CommOp->getOperand(i), Ty, Depth + 1);
1054 if (!isa<SCEVIntegralCastExpr>(CommOp->getOperand(i)) &&
1056 numTruncs++;
1057 Operands.push_back(S);
1058 }
1059 if (numTruncs < 2) {
1060 if (isa<SCEVAddExpr>(Op))
1061 return getAddExpr(Operands);
1062 if (isa<SCEVMulExpr>(Op))
1063 return getMulExpr(Operands);
1064 llvm_unreachable("Unexpected SCEV type for Op.");
1065 }
1066 // Although we checked in the beginning that ID is not in the cache, it is
1067 // possible that during recursion and different modification ID was inserted
1068 // into the cache. So if we find it, just return it.
1069 if (const SCEV *S = UniqueSCEVs.lookup(ID, Token))
1070 return S;
1071 }
1072
1073 // If the input value is a chrec scev, truncate the chrec's operands.
1074 if (const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(Op)) {
1076 for (const SCEV *Op : AddRec->operands())
1077 Operands.push_back(getTruncateExpr(Op, Ty, Depth + 1));
1078 return getAddRecExpr(Operands, AddRec->getLoop(), SCEV::FlagNone);
1079 }
1080
1081 // Return zero if truncating to known zeros.
1082 uint32_t MinTrailingZeros = getMinTrailingZeros(Op);
1083 if (MinTrailingZeros >= getTypeSizeInBits(Ty))
1084 return getZero(Ty);
1085
1086 // The cast wasn't folded; create an explicit cast node. We can reuse
1087 // the existing insert position since if we get here, we won't have
1088 // made any changes which would invalidate it.
1089 SCEV *S = new (SCEVAllocator) SCEVTruncateExpr(ID.Intern(SCEVAllocator),
1090 Op, Ty);
1091 UniqueSCEVs.insert(S, Token);
1092 S->computeAndSetCanonical(*this);
1093 registerUser(S, Op);
1094 return S;
1095}
1096
1097// Get the limit of a recurrence such that incrementing by Step cannot cause
1098// signed overflow as long as the value of the recurrence within the
1099// loop does not exceed this limit before incrementing.
1100static const SCEV *getSignedOverflowLimitForStep(const SCEV *Step,
1102 ScalarEvolution *SE) {
1103 unsigned BitWidth = SE->getTypeSizeInBits(Step->getType());
1104 if (SE->isKnownPositive(Step)) {
1107 SE->getSignedRangeMax(Step));
1108 }
1109 if (SE->isKnownNegative(Step)) {
1112 SE->getSignedRangeMin(Step));
1113 }
1114 return nullptr;
1115}
1116
1117// Get the limit of a recurrence such that incrementing by Step cannot cause
1118// unsigned overflow as long as the value of the recurrence within the loop does
1119// not exceed this limit before incrementing.
1122 ScalarEvolution *SE) {
1123 unsigned BitWidth = SE->getTypeSizeInBits(Step->getType());
1125
1127 SE->getUnsignedRangeMax(Step));
1128}
1129
1130namespace {
1131
1132struct ExtendOpTraitsBase {
1133 typedef const SCEV *(ScalarEvolution::*GetExtendExprTy)(SCEVUse, Type *,
1134 unsigned);
1135};
1136
1137// Used to make code generic over signed and unsigned overflow.
1138template <typename ExtendOp> struct ExtendOpTraits {
1139 // Members present:
1140 //
1141 // static const SCEVFlags WrapType;
1142 //
1143 // static const ExtendOpTraitsBase::GetExtendExprTy GetExtendExpr;
1144 //
1145 // static const SCEV *getOverflowLimitForStep(const SCEV *Step,
1146 // ICmpInst::Predicate *Pred,
1147 // ScalarEvolution *SE);
1148};
1149
1150template <>
1151struct ExtendOpTraits<SCEVSignExtendExpr> : public ExtendOpTraitsBase {
1152 static const SCEVFlags WrapType = SCEV::FlagNSW;
1153
1154 static const GetExtendExprTy GetExtendExpr;
1155
1156 static const SCEV *getOverflowLimitForStep(const SCEV *Step,
1157 ICmpInst::Predicate *Pred,
1158 ScalarEvolution *SE) {
1159 return getSignedOverflowLimitForStep(Step, Pred, SE);
1160 }
1161};
1162
1163const ExtendOpTraitsBase::GetExtendExprTy ExtendOpTraits<
1165
1166template <>
1167struct ExtendOpTraits<SCEVZeroExtendExpr> : public ExtendOpTraitsBase {
1168 static const SCEVFlags WrapType = SCEV::FlagNUW;
1169
1170 static const GetExtendExprTy GetExtendExpr;
1171
1172 static const SCEV *getOverflowLimitForStep(const SCEV *Step,
1173 ICmpInst::Predicate *Pred,
1174 ScalarEvolution *SE) {
1175 return getUnsignedOverflowLimitForStep(Step, Pred, SE);
1176 }
1177};
1178
1179const ExtendOpTraitsBase::GetExtendExprTy ExtendOpTraits<
1181
1182} // end anonymous namespace
1183
1184// The recurrence AR has been shown to have no signed/unsigned wrap or something
1185// close to it. Typically, if we can prove NSW/NUW for AR, then we can just as
1186// easily prove NSW/NUW for its preincrement or postincrement sibling. This
1187// allows normalizing a sign/zero extended AddRec as such: {sext/zext(Step +
1188// Start),+,Step} => {(Step + sext/zext(Start),+,Step} As a result, the
1189// expression "Step + sext/zext(PreIncAR)" is congruent with
1190// "sext/zext(PostIncAR)"
1191template <typename ExtendOpTy>
1193 ScalarEvolution *SE, unsigned Depth) {
1194 auto WrapType = ExtendOpTraits<ExtendOpTy>::WrapType;
1195 auto GetExtendExpr = ExtendOpTraits<ExtendOpTy>::GetExtendExpr;
1196
1197 const Loop *L = AR->getLoop();
1198 const SCEV *Start = AR->getStart();
1199 const SCEV *Step = AR->getStepRecurrence(*SE);
1200
1201 // Check for a simple looking step prior to loop entry.
1202 const SCEVAddExpr *SA = dyn_cast<SCEVAddExpr>(Start);
1203 if (!SA)
1204 return nullptr;
1205
1206 // Create an AddExpr for "PreStart" after subtracting Step. Full SCEV
1207 // subtraction is expensive. For this purpose, perform a quick and dirty
1208 // difference, by checking for Step in the operand list. Note, that
1209 // SA might have repeated ops, like %a + %a + ..., so only remove one.
1210 SmallVector<SCEVUse, 4> DiffOps(SA->operands());
1211 for (auto It = DiffOps.begin(); It != DiffOps.end(); ++It)
1212 if (*It == Step) {
1213 DiffOps.erase(It);
1214 break;
1215 }
1216
1217 if (DiffOps.size() == SA->getNumOperands())
1218 return nullptr;
1219
1220 // Try to prove `WrapType` (SCEV::FlagNSW or SCEV::FlagNUW) on `PreStart` +
1221 // `Step`:
1222
1223 // 1. NSW/NUW flags on the step increment.
1224 auto PreStartFlags =
1226 const SCEV *PreStart = SE->getAddExpr(DiffOps, PreStartFlags);
1228 SE->getAddRecExpr(PreStart, Step, L, SCEV::FlagNone));
1229
1230 // "{S,+,X} is <nsw>/<nuw>" and "the backedge is taken at least once" implies
1231 // "S+X does not sign/unsign-overflow".
1232 //
1233
1234 const SCEV *BECount = SE->getBackedgeTakenCount(L);
1235 if (PreAR && any(PreAR->getNoWrapFlags(WrapType)) &&
1236 !isa<SCEVCouldNotCompute>(BECount) && SE->isKnownPositive(BECount))
1237 return PreStart;
1238
1239 // 2. Direct overflow check on the step operation's expression.
1240 unsigned BitWidth = SE->getTypeSizeInBits(AR->getType());
1241 Type *WideTy = IntegerType::get(SE->getContext(), BitWidth * 2);
1242 const SCEV *OperandExtendedStart =
1243 SE->getAddExpr((SE->*GetExtendExpr)(PreStart, WideTy, Depth),
1244 (SE->*GetExtendExpr)(Step, WideTy, Depth));
1245 if ((SE->*GetExtendExpr)(Start, WideTy, Depth) == OperandExtendedStart) {
1246 if (PreAR && any(AR->getNoWrapFlags(WrapType))) {
1247 // If we know `AR` == {`PreStart`+`Step`,+,`Step`} is `WrapType` (FlagNSW
1248 // or FlagNUW) and that `PreStart` + `Step` is `WrapType` too, then
1249 // `PreAR` == {`PreStart`,+,`Step`} is also `WrapType`. Cache this fact.
1250 SE->setNoWrapFlags(const_cast<SCEVAddRecExpr *>(PreAR), WrapType);
1251 }
1252 return PreStart;
1253 }
1254
1255 // 3. Loop precondition.
1257 const SCEV *OverflowLimit =
1258 ExtendOpTraits<ExtendOpTy>::getOverflowLimitForStep(Step, &Pred, SE);
1259
1260 if (OverflowLimit &&
1261 SE->isLoopEntryGuardedByCond(L, Pred, PreStart, OverflowLimit))
1262 return PreStart;
1263
1264 return nullptr;
1265}
1266
1267// Get the normalized zero or sign extended expression for this AddRec's Start.
1268template <typename ExtendOpTy>
1269static const SCEV *getExtendAddRecStart(const SCEVAddRecExpr *AR, Type *Ty,
1270 ScalarEvolution *SE,
1271 unsigned Depth) {
1272 auto GetExtendExpr = ExtendOpTraits<ExtendOpTy>::GetExtendExpr;
1273
1274 const SCEV *PreStart = getPreStartForExtend<ExtendOpTy>(AR, SE, Depth);
1275 if (!PreStart)
1276 return (SE->*GetExtendExpr)(AR->getStart(), Ty, Depth);
1277
1278 return SE->getAddExpr((SE->*GetExtendExpr)(AR->getStepRecurrence(*SE), Ty,
1279 Depth),
1280 (SE->*GetExtendExpr)(PreStart, Ty, Depth));
1281}
1282
1283// Try to prove away overflow by looking at "nearby" add recurrences. A
1284// motivating example for this rule: if we know `{0,+,4}` is `ult` `-1` and it
1285// does not itself wrap then we can conclude that `{1,+,4}` is `nuw`.
1286//
1287// Formally:
1288//
1289// {S,+,X} == {S-T,+,X} + T
1290// => Ext({S,+,X}) == Ext({S-T,+,X} + T)
1291//
1292// If ({S-T,+,X} + T) does not overflow ... (1)
1293//
1294// RHS == Ext({S-T,+,X} + T) == Ext({S-T,+,X}) + Ext(T)
1295//
1296// If {S-T,+,X} does not overflow ... (2)
1297//
1298// RHS == Ext({S-T,+,X}) + Ext(T) == {Ext(S-T),+,Ext(X)} + Ext(T)
1299// == {Ext(S-T)+Ext(T),+,Ext(X)}
1300//
1301// If (S-T)+T does not overflow ... (3)
1302//
1303// RHS == {Ext(S-T)+Ext(T),+,Ext(X)} == {Ext(S-T+T),+,Ext(X)}
1304// == {Ext(S),+,Ext(X)} == LHS
1305//
1306// Thus, if (1), (2) and (3) are true for some T, then
1307// Ext({S,+,X}) == {Ext(S),+,Ext(X)}
1308//
1309// (3) is implied by (1) -- "(S-T)+T does not overflow" is simply "({S-T,+,X}+T)
1310// does not overflow" restricted to the 0th iteration. Therefore we only need
1311// to check for (1) and (2).
1312//
1313// In the current context, S is `Start`, X is `Step`, Ext is `ExtendOpTy` and T
1314// is `Delta` (defined below).
1315template <typename ExtendOpTy>
1316bool ScalarEvolution::proveNoWrapByVaryingStart(const SCEV *Start,
1317 const SCEV *Step,
1318 const Loop *L) {
1319 auto WrapType = ExtendOpTraits<ExtendOpTy>::WrapType;
1320
1321 // We restrict `Start` to a constant to prevent SCEV from spending too much
1322 // time here. It is correct (but more expensive) to continue with a
1323 // non-constant `Start` and do a general SCEV subtraction to compute
1324 // `PreStart` below.
1325 const SCEVConstant *StartC = dyn_cast<SCEVConstant>(Start);
1326 if (!StartC)
1327 return false;
1328
1329 APInt StartAI = StartC->getAPInt();
1330
1331 for (unsigned Delta : {-2, -1, 1, 2}) {
1332 const SCEV *PreStart = getConstant(StartAI - Delta);
1333 const auto *PreAR = static_cast<SCEVAddRecExpr *>(
1334 findExistingSCEVInCache(scAddRecExpr, {PreStart, Step}, L));
1335
1336 // Give up if we don't already have the add recurrence we need because
1337 // actually constructing an add recurrence is relatively expensive.
1338 if (PreAR && any(PreAR->getNoWrapFlags(WrapType))) { // proves (2)
1339 const SCEV *DeltaS = getConstant(StartC->getType(), Delta);
1341 const SCEV *Limit = ExtendOpTraits<ExtendOpTy>::getOverflowLimitForStep(
1342 DeltaS, &Pred, this);
1343 if (Limit && isKnownPredicate(Pred, PreAR, Limit)) // proves (1)
1344 return true;
1345 }
1346 }
1347
1348 return false;
1349}
1350
1351// Finds an integer D for an expression (C + x + y + ...) such that the top
1352// level addition in (D + (C - D + x + y + ...)) would not wrap (signed or
1353// unsigned) and the number of trailing zeros of (C - D + x + y + ...) is
1354// maximized, where C is the \p ConstantTerm, x, y, ... are arbitrary SCEVs, and
1355// the (C + x + y + ...) expression is \p WholeAddExpr.
1357 const SCEVConstant *ConstantTerm,
1358 const SCEVAddExpr *WholeAddExpr) {
1359 const APInt &C = ConstantTerm->getAPInt();
1360 const unsigned BitWidth = C.getBitWidth();
1361 // Find number of trailing zeros of (x + y + ...) w/o the C first:
1362 uint32_t TZ = BitWidth;
1363 for (unsigned I = 1, E = WholeAddExpr->getNumOperands(); I < E && TZ; ++I)
1364 TZ = std::min(TZ, SE.getMinTrailingZeros(WholeAddExpr->getOperand(I)));
1365 if (TZ) {
1366 // Set D to be as many least significant bits of C as possible while still
1367 // guaranteeing that adding D to (C - D + x + y + ...) won't cause a wrap:
1368 return TZ < BitWidth ? C.trunc(TZ).zext(BitWidth) : C;
1369 }
1370 return APInt(BitWidth, 0);
1371}
1372
1373// Finds an integer D for an affine AddRec expression {C,+,x} such that the top
1374// level addition in (D + {C-D,+,x}) would not wrap (signed or unsigned) and the
1375// number of trailing zeros of (C - D + x * n) is maximized, where C is the \p
1376// ConstantStart, x is an arbitrary \p Step, and n is the loop trip count.
1378 const APInt &ConstantStart,
1379 const SCEV *Step) {
1380 const unsigned BitWidth = ConstantStart.getBitWidth();
1381 const uint32_t TZ = SE.getMinTrailingZeros(Step);
1382 if (TZ)
1383 return TZ < BitWidth ? ConstantStart.trunc(TZ).zext(BitWidth)
1384 : ConstantStart;
1385 return APInt(BitWidth, 0);
1386}
1387
1389 const ScalarEvolution::FoldID &ID, const SCEV *S,
1392 &FoldCacheUser) {
1393 auto I = FoldCache.insert({ID, S});
1394 if (!I.second) {
1395 // Remove FoldCacheUser entry for ID when replacing an existing FoldCache
1396 // entry.
1397 auto &UserIDs = FoldCacheUser[I.first->second];
1398 assert(count(UserIDs, ID) == 1 && "unexpected duplicates in UserIDs");
1399 for (unsigned I = 0; I != UserIDs.size(); ++I)
1400 if (UserIDs[I] == ID) {
1401 std::swap(UserIDs[I], UserIDs.back());
1402 break;
1403 }
1404 UserIDs.pop_back();
1405 I.first->second = S;
1406 }
1407 FoldCacheUser[S].push_back(ID);
1408}
1409
1411 unsigned Depth) {
1412 assert(getTypeSizeInBits(Op->getType()) < getTypeSizeInBits(Ty) &&
1413 "This is not an extending conversion!");
1414 assert(isSCEVable(Ty) &&
1415 "This is not a conversion to a SCEVable type!");
1416 assert(!Op->getType()->isPointerTy() && "Can't extend pointer!");
1417 Ty = getEffectiveSCEVType(Ty);
1418
1419 FoldID ID(scZeroExtend, Op, Ty);
1420 if (const SCEV *S = FoldCache.lookup(ID))
1421 return S;
1422
1423 const SCEV *S = getZeroExtendExprImpl(Op, Ty, Depth);
1425 insertFoldCacheEntry(ID, S, FoldCache, FoldCacheUser);
1426 return S;
1427}
1428
1430 unsigned Depth) {
1431 assert(getTypeSizeInBits(Op->getType()) < getTypeSizeInBits(Ty) &&
1432 "This is not an extending conversion!");
1433 assert(isSCEVable(Ty) && "This is not a conversion to a SCEVable type!");
1434 assert(!Op->getType()->isPointerTy() && "Can't extend pointer!");
1435
1436 // Fold if the operand is constant.
1437 if (const SCEVConstant *SC = dyn_cast<SCEVConstant>(Op))
1438 return getConstant(SC->getAPInt().zext(getTypeSizeInBits(Ty)));
1439
1440 // zext(zext(x)) --> zext(x)
1442 return getZeroExtendExpr(SZ->getOperand(), Ty, Depth + 1);
1443
1444 // If the operand is an affine AddRec with the no-unsigned-wrap flag, the
1445 // zero-extension distributes over the recurrence.
1446 const SCEV *Start, *Step;
1447 const Loop *L;
1448 if (Depth <= Opts.scalar_evolution_max_cast_depth &&
1449 match(Op, m_scev_AffineAddRec(m_SCEV(Start), m_SCEV(Step), m_Loop(L)))) {
1450 const auto *AR = cast<SCEVAddRecExpr>(Op);
1451 if (AR->hasNoUnsignedWrap()) {
1452 Start = getExtendAddRecStart<SCEVZeroExtendExpr>(AR, Ty, this, Depth + 1);
1453 Step = getZeroExtendExpr(Step, Ty, Depth + 1);
1454 return getAddRecExpr(Start, Step, L, AR->getNoWrapFlags());
1455 }
1456 }
1457
1458 // Before doing any expensive analysis, check to see if we've already
1459 // computed a SCEV for this Op and Ty.
1462 ID.AddPointer(Op.getOpaqueValue());
1463 ID.AddPointer(Ty);
1465 if (const SCEV *S = UniqueSCEVs.lookup(ID, Token))
1466 return S;
1467 if (Depth > Opts.scalar_evolution_max_cast_depth) {
1468 SCEV *S = new (SCEVAllocator) SCEVZeroExtendExpr(ID.Intern(SCEVAllocator),
1469 Op, Ty);
1470 UniqueSCEVs.insert(S, Token);
1471 S->computeAndSetCanonical(*this);
1472 registerUser(S, Op);
1473 return S;
1474 }
1475
1476 // zext(trunc(x)) --> zext(x) or x or trunc(x)
1478 // It's possible the bits taken off by the truncate were all zero bits. If
1479 // so, we should be able to simplify this further.
1480 const SCEV *X = ST->getOperand();
1482 unsigned TruncBits = getTypeSizeInBits(ST->getType());
1483 unsigned NewBits = getTypeSizeInBits(Ty);
1484 if (CR.truncate(TruncBits).zeroExtend(NewBits).contains(
1485 CR.zextOrTrunc(NewBits)))
1486 return getTruncateOrZeroExtend(X, Ty, Depth);
1487 }
1488
1489 // If the input value is a chrec scev, and we can prove that the value
1490 // did not overflow the old, smaller, value, we can zero extend all of the
1491 // operands (often constants). This allows analysis of something like
1492 // this: for (unsigned char X = 0; X < 100; ++X) { int Y = X; }
1493 if (match(Op, m_scev_AffineAddRec(m_SCEV(Start), m_SCEV(Step), m_Loop(L)))) {
1494 const auto *AR = cast<SCEVAddRecExpr>(Op);
1495 unsigned BitWidth = getTypeSizeInBits(AR->getType());
1496
1497 // The no-unsigned-wrap case is handled before the uniquing lookup above.
1498
1499 // Check whether the backedge-taken count is SCEVCouldNotCompute.
1500 // Note that this serves two purposes: It filters out loops that are
1501 // simply not analyzable, and it covers the case where this code is
1502 // being called from within backedge-taken count analysis, such that
1503 // attempting to ask for the backedge-taken count would likely result
1504 // in infinite recursion. In the later case, the analysis code will
1505 // cope with a conservative value, and it will take care to purge
1506 // that value once it has finished.
1507 const SCEV *MaxBECount = getConstantMaxBackedgeTakenCount(L);
1508 if (!isa<SCEVCouldNotCompute>(MaxBECount)) {
1509 // Manually compute the final value for AR, checking for overflow.
1510
1511 // Check whether the backedge-taken count can be losslessly casted to
1512 // the addrec's type. The count is always unsigned.
1513 const SCEV *CastedMaxBECount =
1514 getTruncateOrZeroExtend(MaxBECount, Start->getType(), Depth);
1515 const SCEV *RecastedMaxBECount = getTruncateOrZeroExtend(
1516 CastedMaxBECount, MaxBECount->getType(), Depth);
1517 if (MaxBECount == RecastedMaxBECount) {
1518 Type *WideTy = IntegerType::get(getContext(), BitWidth * 2);
1519 // Check whether Start+Step*MaxBECount has no unsigned overflow.
1520 const SCEV *ZMul =
1521 getMulExpr(CastedMaxBECount, Step, SCEV::FlagNone, Depth + 1);
1522 const SCEV *ZAdd = getZeroExtendExpr(
1523 getAddExpr(Start, ZMul, SCEV::FlagNone, Depth + 1), WideTy,
1524 Depth + 1);
1525 const SCEV *WideStart = getZeroExtendExpr(Start, WideTy, Depth + 1);
1526 const SCEV *WideMaxBECount =
1527 getZeroExtendExpr(CastedMaxBECount, WideTy, Depth + 1);
1528 const SCEV *OperandExtendedAdd =
1529 getAddExpr(WideStart,
1530 getMulExpr(WideMaxBECount,
1531 getZeroExtendExpr(Step, WideTy, Depth + 1),
1532 SCEV::FlagNone, Depth + 1),
1533 SCEV::FlagNone, Depth + 1);
1534 if (ZAdd == OperandExtendedAdd) {
1535 // Cache knowledge of AR NUW, which is propagated to this AddRec.
1536 setNoWrapFlags(const_cast<SCEVAddRecExpr *>(AR), SCEV::FlagNUW);
1537 // Return the expression with the addrec on the outside.
1538 Start =
1540 Step = getZeroExtendExpr(Step, Ty, Depth + 1);
1541 return getAddRecExpr(Start, Step, L, AR->getNoWrapFlags());
1542 }
1543 // Similar to above, only this time treat the step value as signed.
1544 // This covers loops that count down.
1545 OperandExtendedAdd =
1546 getAddExpr(WideStart,
1547 getMulExpr(WideMaxBECount,
1548 getSignExtendExpr(Step, WideTy, Depth + 1),
1549 SCEV::FlagNone, Depth + 1),
1550 SCEV::FlagNone, Depth + 1);
1551 if (ZAdd == OperandExtendedAdd) {
1552 // Cache knowledge of AR NW, which is propagated to this AddRec.
1553 // Negative step causes unsigned wrap, but it still can't self-wrap.
1554 setNoWrapFlags(const_cast<SCEVAddRecExpr *>(AR), SCEV::FlagNW);
1555 // Return the expression with the addrec on the outside.
1556 Start =
1558 Step = getSignExtendExpr(Step, Ty, Depth + 1);
1559 return getAddRecExpr(Start, Step, L, AR->getNoWrapFlags());
1560 }
1561 }
1562 }
1563
1564 // Normally, in the cases we can prove no-overflow via a
1565 // backedge guarding condition, we can also compute a backedge
1566 // taken count for the loop. The exceptions are assumptions and
1567 // guards present in the loop -- SCEV is not great at exploiting
1568 // these to compute max backedge taken counts, but can still use
1569 // these to prove lack of overflow. Use this fact to avoid
1570 // doing extra work that may not pay off.
1571 if (!isa<SCEVCouldNotCompute>(MaxBECount) || HasGuards ||
1572 !AC.assumptions().empty()) {
1573
1574 auto NewFlags = proveNoUnsignedWrapViaInduction(AR);
1575 setNoWrapFlags(const_cast<SCEVAddRecExpr *>(AR), NewFlags);
1576 if (AR->hasNoUnsignedWrap()) {
1577 // Same as nuw case above - duplicated here to avoid a compile time
1578 // issue. It's not clear that the order of checks does matter, but
1579 // it's one of two issue possible causes for a change which was
1580 // reverted. Be conservative for the moment.
1581 Start =
1583 Step = getZeroExtendExpr(Step, Ty, Depth + 1);
1584 return getAddRecExpr(Start, Step, L, AR->getNoWrapFlags());
1585 }
1586
1587 // For a negative step, we can extend the operands iff doing so only
1588 // traverses values in the range zext([0,UINT_MAX]).
1589 if (isKnownNegative(Step)) {
1590 const SCEV *N =
1594 // Cache knowledge of AR NW, which is propagated to this
1595 // AddRec. Negative step causes unsigned wrap, but it
1596 // still can't self-wrap.
1597 setNoWrapFlags(const_cast<SCEVAddRecExpr *>(AR), SCEV::FlagNW);
1598 // Return the expression with the addrec on the outside.
1599 Start =
1601 Step = getSignExtendExpr(Step, Ty, Depth + 1);
1602 return getAddRecExpr(Start, Step, L, AR->getNoWrapFlags());
1603 }
1604 }
1605 }
1606
1607 // zext({C,+,Step}) --> (zext(D) + zext({C-D,+,Step}))<nuw><nsw>
1608 // if D + (C - D + Step * n) could be proven to not unsigned wrap
1609 // where D maximizes the number of trailing zeros of (C - D + Step * n)
1610 if (const auto *SC = dyn_cast<SCEVConstant>(Start)) {
1611 const APInt &C = SC->getAPInt();
1612 const APInt &D = extractConstantWithoutWrapping(*this, C, Step);
1613 if (D != 0) {
1614 const SCEV *SZExtD = getZeroExtendExpr(getConstant(D), Ty, Depth);
1615 const SCEV *SResidual =
1616 getAddRecExpr(getConstant(C - D), Step, L, AR->getNoWrapFlags());
1617 const SCEV *SZExtR = getZeroExtendExpr(SResidual, Ty, Depth + 1);
1618 return getAddExpr(SZExtD, SZExtR, SCEV::FlagNSW | SCEV::FlagNUW,
1619 Depth + 1);
1620 }
1621 }
1622
1623 if (proveNoWrapByVaryingStart<SCEVZeroExtendExpr>(Start, Step, L)) {
1624 setNoWrapFlags(const_cast<SCEVAddRecExpr *>(AR), SCEV::FlagNUW);
1625 Start = getExtendAddRecStart<SCEVZeroExtendExpr>(AR, Ty, this, Depth + 1);
1626 Step = getZeroExtendExpr(Step, Ty, Depth + 1);
1627 return getAddRecExpr(Start, Step, L, AR->getNoWrapFlags());
1628 }
1629 }
1630
1631 // zext(A % B) --> zext(A) % zext(B)
1632 {
1633 const SCEV *LHS;
1634 const SCEV *RHS;
1635 if (match(Op, m_scev_URem(m_SCEV(LHS), m_SCEV(RHS), *this)))
1636 return getURemExpr(getZeroExtendExpr(LHS, Ty, Depth + 1),
1637 getZeroExtendExpr(RHS, Ty, Depth + 1));
1638 }
1639
1640 // zext(A / B) --> zext(A) / zext(B).
1641 if (auto *Div = dyn_cast<SCEVUDivExpr>(Op))
1642 return getUDivExpr(getZeroExtendExpr(Div->getLHS(), Ty, Depth + 1),
1643 getZeroExtendExpr(Div->getRHS(), Ty, Depth + 1));
1644
1645 if (auto *SA = dyn_cast<SCEVAddExpr>(Op)) {
1646 // zext((A + B + ...)<nuw>) --> (zext(A) + zext(B) + ...)<nuw>
1647 if (SA->hasNoUnsignedWrap()) {
1648 // If the addition does not unsign overflow then we can, by definition,
1649 // commute the zero extension with the addition operation.
1651 for (SCEVUse Op : SA->operands())
1652 Ops.push_back(getZeroExtendExpr(Op, Ty, Depth + 1));
1653 return getAddExpr(Ops, SCEV::FlagNUW, Depth + 1);
1654 }
1655
1656 const APInt *C, *C2;
1657 // zext (C + A)<nsw> -> (sext(C) + sext(A))<nsw> if zext (C + A)<nsw> >=s 0.
1658 // Currently the non-negative check is done manually, as isKnownNonNegative
1659 // is too expensive.
1660 if (SA->hasNoSignedWrap() &&
1662 m_scev_SMax(m_scev_APInt(C2), m_SCEV()))) &&
1663 C->isNegative() && !C->isMinSignedValue() && C2->sge(C->abs())) {
1664 assert(isKnownNonNegative(SA) && "incorrectly determined non-negative");
1665 return getAddExpr(getSignExtendExpr(SA->getOperand(0), Ty, Depth + 1),
1666 getSignExtendExpr(SA->getOperand(1), Ty, Depth + 1),
1667 SCEV::FlagNSW, Depth + 1);
1668 }
1669
1670 // zext(C + x + y + ...) --> (zext(D) + zext((C - D) + x + y + ...))
1671 // if D + (C - D + x + y + ...) could be proven to not unsigned wrap
1672 // where D maximizes the number of trailing zeros of (C - D + x + y + ...)
1673 //
1674 // Often address arithmetics contain expressions like
1675 // (zext (add (shl X, C1), C2)), for instance, (zext (5 + (4 * X))).
1676 // This transformation is useful while proving that such expressions are
1677 // equal or differ by a small constant amount, see LoadStoreVectorizer pass.
1678 if (const auto *SC = dyn_cast<SCEVConstant>(SA->getOperand(0))) {
1679 const APInt &D = extractConstantWithoutWrapping(*this, SC, SA);
1680 if (D != 0) {
1681 const SCEV *SZExtD = getZeroExtendExpr(getConstant(D), Ty, Depth);
1682 const SCEV *SResidual =
1684 const SCEV *SZExtR = getZeroExtendExpr(SResidual, Ty, Depth + 1);
1685 return getAddExpr(SZExtD, SZExtR, (SCEV::FlagNSW | SCEV::FlagNUW),
1686 Depth + 1);
1687 }
1688 }
1689 }
1690
1691 if (auto *SM = dyn_cast<SCEVMulExpr>(Op)) {
1692 // zext((A * B * ...)<nuw>) --> (zext(A) * zext(B) * ...)<nuw>
1693 if (SM->hasNoUnsignedWrap()) {
1694 // If the multiply does not unsign overflow then we can, by definition,
1695 // commute the zero extension with the multiply operation.
1697 for (SCEVUse Op : SM->operands())
1698 Ops.push_back(getZeroExtendExpr(Op, Ty, Depth + 1));
1699 return getMulExpr(Ops, SCEV::FlagNUW, Depth + 1);
1700 }
1701
1702 // zext(2^K * (trunc X to iN)) to iM ->
1703 // 2^K * (zext(trunc X to i{N-K}) to iM)<nuw>
1704 //
1705 // Proof:
1706 //
1707 // zext(2^K * (trunc X to iN)) to iM
1708 // = zext((trunc X to iN) << K) to iM
1709 // = zext((trunc X to i{N-K}) << K)<nuw> to iM
1710 // (because shl removes the top K bits)
1711 // = zext((2^K * (trunc X to i{N-K}))<nuw>) to iM
1712 // = (2^K * (zext(trunc X to i{N-K}) to iM))<nuw>.
1713 //
1714 const APInt *C;
1715 const SCEV *TruncRHS;
1716 if (match(SM,
1717 m_scev_Mul(m_scev_APInt(C), m_scev_Trunc(m_SCEV(TruncRHS)))) &&
1718 C->isPowerOf2()) {
1719 int NewTruncBits =
1720 getTypeSizeInBits(SM->getOperand(1)->getType()) - C->logBase2();
1721 Type *NewTruncTy = IntegerType::get(getContext(), NewTruncBits);
1722 return getMulExpr(
1723 getZeroExtendExpr(SM->getOperand(0), Ty),
1724 getZeroExtendExpr(getTruncateExpr(TruncRHS, NewTruncTy), Ty),
1725 SCEV::FlagNUW, Depth + 1);
1726 }
1727 }
1728
1729 // zext(umin(x, y)) -> umin(zext(x), zext(y))
1730 // zext(umax(x, y)) -> umax(zext(x), zext(y))
1734 for (SCEVUse Operand : MinMax->operands())
1735 Operands.push_back(getZeroExtendExpr(Operand, Ty));
1737 return getUMinExpr(Operands);
1738 return getUMaxExpr(Operands);
1739 }
1740
1741 // zext(umin_seq(x, y)) -> umin_seq(zext(x), zext(y))
1743 assert(isa<SCEVSequentialUMinExpr>(MinMax) && "Not supported!");
1745 for (SCEVUse Operand : MinMax->operands())
1746 Operands.push_back(getZeroExtendExpr(Operand, Ty));
1747 return getUMinExpr(Operands, /*Sequential*/ true);
1748 }
1749
1750 // The cast wasn't folded; create an explicit cast node.
1751 // Recompute the insert position, as it may have been invalidated.
1752 if (const SCEV *S = UniqueSCEVs.lookup(ID, Token))
1753 return S;
1754 SCEV *S = new (SCEVAllocator) SCEVZeroExtendExpr(ID.Intern(SCEVAllocator),
1755 Op, Ty);
1756 UniqueSCEVs.insert(S, Token);
1757 S->computeAndSetCanonical(*this);
1758 registerUser(S, Op);
1759 return S;
1760}
1761
1763 unsigned Depth) {
1764 assert(getTypeSizeInBits(Op->getType()) < getTypeSizeInBits(Ty) &&
1765 "This is not an extending conversion!");
1766 assert(isSCEVable(Ty) &&
1767 "This is not a conversion to a SCEVable type!");
1768 assert(!Op->getType()->isPointerTy() && "Can't extend pointer!");
1769 Ty = getEffectiveSCEVType(Ty);
1770
1771 FoldID ID(scSignExtend, Op, Ty);
1772 if (const SCEV *S = FoldCache.lookup(ID))
1773 return S;
1774
1775 const SCEV *S = getSignExtendExprImpl(Op, Ty, Depth);
1777 insertFoldCacheEntry(ID, S, FoldCache, FoldCacheUser);
1778 return S;
1779}
1780
1782 unsigned Depth) {
1783 assert(getTypeSizeInBits(Op->getType()) < getTypeSizeInBits(Ty) &&
1784 "This is not an extending conversion!");
1785 assert(isSCEVable(Ty) && "This is not a conversion to a SCEVable type!");
1786 assert(!Op->getType()->isPointerTy() && "Can't extend pointer!");
1787 Ty = getEffectiveSCEVType(Ty);
1788
1789 // Fold if the operand is constant.
1790 if (const SCEVConstant *SC = dyn_cast<SCEVConstant>(Op))
1791 return getConstant(SC->getAPInt().sext(getTypeSizeInBits(Ty)));
1792
1793 // sext(sext(x)) --> sext(x)
1795 return getSignExtendExpr(SS->getOperand(), Ty, Depth + 1);
1796
1797 // sext(zext(x)) --> zext(x)
1799 return getZeroExtendExpr(SZ->getOperand(), Ty, Depth + 1);
1800
1801 // If the operand is an affine AddRec with the no-signed-wrap flag, the
1802 // sign-extension distributes over the recurrence.
1803 const SCEV *Start, *Step;
1804 const Loop *L;
1805 if (Depth <= Opts.scalar_evolution_max_cast_depth &&
1806 match(Op, m_scev_AffineAddRec(m_SCEV(Start), m_SCEV(Step), m_Loop(L)))) {
1807 const auto *AR = cast<SCEVAddRecExpr>(Op);
1808 if (AR->hasNoSignedWrap()) {
1809 Start = getExtendAddRecStart<SCEVSignExtendExpr>(AR, Ty, this, Depth + 1);
1810 Step = getSignExtendExpr(Step, Ty, Depth + 1);
1811 return getAddRecExpr(Start, Step, L, AR->getNoWrapFlags());
1812 }
1813 }
1814
1815 // Before doing any expensive analysis, check to see if we've already
1816 // computed a SCEV for this Op and Ty.
1819 ID.AddPointer(Op.getOpaqueValue());
1820 ID.AddPointer(Ty);
1822 if (const SCEV *S = UniqueSCEVs.lookup(ID, Token))
1823 return S;
1824 // Limit recursion depth.
1825 if (Depth > Opts.scalar_evolution_max_cast_depth) {
1826 SCEV *S = new (SCEVAllocator) SCEVSignExtendExpr(ID.Intern(SCEVAllocator),
1827 Op, Ty);
1828 UniqueSCEVs.insert(S, Token);
1829 S->computeAndSetCanonical(*this);
1830 registerUser(S, Op);
1831 return S;
1832 }
1833
1834 // sext(trunc(x)) --> sext(x) or x or trunc(x)
1836 // It's possible the bits taken off by the truncate were all sign bits. If
1837 // so, we should be able to simplify this further.
1838 const SCEV *X = ST->getOperand();
1840 unsigned TruncBits = getTypeSizeInBits(ST->getType());
1841 unsigned NewBits = getTypeSizeInBits(Ty);
1842 if (CR.truncate(TruncBits).signExtend(NewBits).contains(
1843 CR.sextOrTrunc(NewBits)))
1844 return getTruncateOrSignExtend(X, Ty, Depth);
1845 }
1846
1847 if (auto *SA = dyn_cast<SCEVAddExpr>(Op)) {
1848 // sext((A + B + ...)<nsw>) --> (sext(A) + sext(B) + ...)<nsw>
1849 if (SA->hasNoSignedWrap()) {
1850 // If the addition does not sign overflow then we can, by definition,
1851 // commute the sign extension with the addition operation.
1853 for (SCEVUse Op : SA->operands())
1854 Ops.push_back(getSignExtendExpr(Op, Ty, Depth + 1));
1855 return getAddExpr(Ops, SCEV::FlagNSW, Depth + 1);
1856 }
1857
1858 // sext(C + x + y + ...) --> (sext(D) + sext((C - D) + x + y + ...))
1859 // if D + (C - D + x + y + ...) could be proven to not signed wrap
1860 // where D maximizes the number of trailing zeros of (C - D + x + y + ...)
1861 //
1862 // For instance, this will bring two seemingly different expressions:
1863 // 1 + sext(5 + 20 * %x + 24 * %y) and
1864 // sext(6 + 20 * %x + 24 * %y)
1865 // to the same form:
1866 // 2 + sext(4 + 20 * %x + 24 * %y)
1867 if (const auto *SC = dyn_cast<SCEVConstant>(SA->getOperand(0))) {
1868 const APInt &D = extractConstantWithoutWrapping(*this, SC, SA);
1869 if (D != 0) {
1870 const SCEV *SSExtD = getSignExtendExpr(getConstant(D), Ty, Depth);
1871 const SCEV *SResidual =
1873 const SCEV *SSExtR = getSignExtendExpr(SResidual, Ty, Depth + 1);
1874 return getAddExpr(SSExtD, SSExtR, (SCEV::FlagNSW | SCEV::FlagNUW),
1875 Depth + 1);
1876 }
1877 }
1878 }
1879 // If the input value is a chrec scev, and we can prove that the value
1880 // did not overflow the old, smaller, value, we can sign extend all of the
1881 // operands (often constants). This allows analysis of something like
1882 // this: for (signed char X = 0; X < 100; ++X) { int Y = X; }
1883 if (match(Op, m_scev_AffineAddRec(m_SCEV(Start), m_SCEV(Step), m_Loop(L)))) {
1884 const auto *AR = cast<SCEVAddRecExpr>(Op);
1885 unsigned BitWidth = getTypeSizeInBits(AR->getType());
1886
1887 // The no-signed-wrap case is handled before the uniquing lookup above.
1888
1889 // Check whether the backedge-taken count is SCEVCouldNotCompute.
1890 // Note that this serves two purposes: It filters out loops that are
1891 // simply not analyzable, and it covers the case where this code is
1892 // being called from within backedge-taken count analysis, such that
1893 // attempting to ask for the backedge-taken count would likely result
1894 // in infinite recursion. In the later case, the analysis code will
1895 // cope with a conservative value, and it will take care to purge
1896 // that value once it has finished.
1897 const SCEV *MaxBECount = getConstantMaxBackedgeTakenCount(L);
1898 if (!isa<SCEVCouldNotCompute>(MaxBECount)) {
1899 // Manually compute the final value for AR, checking for
1900 // overflow.
1901
1902 // Check whether the backedge-taken count can be losslessly casted to
1903 // the addrec's type. The count is always unsigned.
1904 const SCEV *CastedMaxBECount =
1905 getTruncateOrZeroExtend(MaxBECount, Start->getType(), Depth);
1906 const SCEV *RecastedMaxBECount = getTruncateOrZeroExtend(
1907 CastedMaxBECount, MaxBECount->getType(), Depth);
1908 if (MaxBECount == RecastedMaxBECount) {
1909 Type *WideTy = IntegerType::get(getContext(), BitWidth * 2);
1910 // Check whether Start+Step*MaxBECount has no signed overflow.
1911 const SCEV *SMul =
1912 getMulExpr(CastedMaxBECount, Step, SCEV::FlagNone, Depth + 1);
1913 const SCEV *SAdd = getSignExtendExpr(
1914 getAddExpr(Start, SMul, SCEV::FlagNone, Depth + 1), WideTy,
1915 Depth + 1);
1916 const SCEV *WideStart = getSignExtendExpr(Start, WideTy, Depth + 1);
1917 const SCEV *WideMaxBECount =
1918 getZeroExtendExpr(CastedMaxBECount, WideTy, Depth + 1);
1919 const SCEV *OperandExtendedAdd =
1920 getAddExpr(WideStart,
1921 getMulExpr(WideMaxBECount,
1922 getSignExtendExpr(Step, WideTy, Depth + 1),
1923 SCEV::FlagNone, Depth + 1),
1924 SCEV::FlagNone, Depth + 1);
1925 if (SAdd == OperandExtendedAdd) {
1926 // Cache knowledge of AR NSW, which is propagated to this AddRec.
1927 setNoWrapFlags(const_cast<SCEVAddRecExpr *>(AR), SCEV::FlagNSW);
1928 // Return the expression with the addrec on the outside.
1929 Start =
1931 Step = getSignExtendExpr(Step, Ty, Depth + 1);
1932 return getAddRecExpr(Start, Step, L, AR->getNoWrapFlags());
1933 }
1934 // Similar to above, only this time treat the step value as unsigned.
1935 // This covers loops that count up with an unsigned step.
1936 OperandExtendedAdd =
1937 getAddExpr(WideStart,
1938 getMulExpr(WideMaxBECount,
1939 getZeroExtendExpr(Step, WideTy, Depth + 1),
1940 SCEV::FlagNone, Depth + 1),
1941 SCEV::FlagNone, Depth + 1);
1942 if (SAdd == OperandExtendedAdd) {
1943 // If AR wraps around then
1944 //
1945 // abs(Step) * MaxBECount > unsigned-max(AR->getType())
1946 // => SAdd != OperandExtendedAdd
1947 //
1948 // Thus (AR is not NW => SAdd != OperandExtendedAdd) <=>
1949 // (SAdd == OperandExtendedAdd => AR is NW)
1950
1951 setNoWrapFlags(const_cast<SCEVAddRecExpr *>(AR), SCEV::FlagNW);
1952
1953 // Return the expression with the addrec on the outside.
1954 Start =
1956 Step = getZeroExtendExpr(Step, Ty, Depth + 1);
1957 return getAddRecExpr(Start, Step, L, AR->getNoWrapFlags());
1958 }
1959 }
1960 }
1961
1962 auto NewFlags = proveNoSignedWrapViaInduction(AR);
1963 setNoWrapFlags(const_cast<SCEVAddRecExpr *>(AR), NewFlags);
1964 if (AR->hasNoSignedWrap()) {
1965 // Same as nsw case above - duplicated here to avoid a compile time
1966 // issue. It's not clear that the order of checks does matter, but
1967 // it's one of two issue possible causes for a change which was
1968 // reverted. Be conservative for the moment.
1969 Start = getExtendAddRecStart<SCEVSignExtendExpr>(AR, Ty, this, Depth + 1);
1970 Step = getSignExtendExpr(Step, Ty, Depth + 1);
1971 return getAddRecExpr(Start, Step, L, AR->getNoWrapFlags());
1972 }
1973
1974 // sext({C,+,Step}) --> (sext(D) + sext({C-D,+,Step}))<nuw><nsw>
1975 // if D + (C - D + Step * n) could be proven to not signed wrap
1976 // where D maximizes the number of trailing zeros of (C - D + Step * n)
1977 if (const auto *SC = dyn_cast<SCEVConstant>(Start)) {
1978 const APInt &C = SC->getAPInt();
1979 const APInt &D = extractConstantWithoutWrapping(*this, C, Step);
1980 if (D != 0) {
1981 const SCEV *SSExtD = getSignExtendExpr(getConstant(D), Ty, Depth);
1982 const SCEV *SResidual =
1983 getAddRecExpr(getConstant(C - D), Step, L, AR->getNoWrapFlags());
1984 const SCEV *SSExtR = getSignExtendExpr(SResidual, Ty, Depth + 1);
1985 return getAddExpr(SSExtD, SSExtR, (SCEV::FlagNSW | SCEV::FlagNUW),
1986 Depth + 1);
1987 }
1988 }
1989
1990 if (proveNoWrapByVaryingStart<SCEVSignExtendExpr>(Start, Step, L)) {
1991 setNoWrapFlags(const_cast<SCEVAddRecExpr *>(AR), SCEV::FlagNSW);
1992 Start = getExtendAddRecStart<SCEVSignExtendExpr>(AR, Ty, this, Depth + 1);
1993 Step = getSignExtendExpr(Step, Ty, Depth + 1);
1994 return getAddRecExpr(Start, Step, L, AR->getNoWrapFlags());
1995 }
1996 }
1997
1998 // If the input value is provably positive and we could not simplify
1999 // away the sext build a zext instead.
2001 return getZeroExtendExpr(Op, Ty, Depth + 1);
2002
2003 // sext(smin(x, y)) -> smin(sext(x), sext(y))
2004 // sext(smax(x, y)) -> smax(sext(x), sext(y))
2008 for (SCEVUse Operand : MinMax->operands())
2009 Operands.push_back(getSignExtendExpr(Operand, Ty));
2011 return getSMinExpr(Operands);
2012 return getSMaxExpr(Operands);
2013 }
2014
2015 // The cast wasn't folded; create an explicit cast node.
2016 // Recompute the insert position, as it may have been invalidated.
2017 if (const SCEV *S = UniqueSCEVs.lookup(ID, Token))
2018 return S;
2019 SCEV *S = new (SCEVAllocator) SCEVSignExtendExpr(ID.Intern(SCEVAllocator),
2020 Op, Ty);
2021 UniqueSCEVs.insert(S, Token);
2022 S->computeAndSetCanonical(*this);
2023 registerUser(S, Op);
2024 return S;
2025}
2026
2028 switch (Kind) {
2029 case scTruncate:
2030 return getTruncateExpr(Op, Ty);
2031 case scZeroExtend:
2032 return getZeroExtendExpr(Op, Ty);
2033 case scSignExtend:
2034 return getSignExtendExpr(Op, Ty);
2035 case scPtrToAddr: {
2036 const SCEV *Expr = getPtrToAddrExpr(Op);
2037 assert(Expr->getType() == Ty && "requested type must match");
2038 return Expr;
2039 }
2040 default:
2041 llvm_unreachable("Not a SCEV cast expression!");
2042 }
2043}
2044
2045/// getAnyExtendExpr - Return a SCEV for the given operand extended with
2046/// unspecified bits out to the given type.
2048 assert(getTypeSizeInBits(Op->getType()) < getTypeSizeInBits(Ty) &&
2049 "This is not an extending conversion!");
2050 assert(isSCEVable(Ty) &&
2051 "This is not a conversion to a SCEVable type!");
2052 Ty = getEffectiveSCEVType(Ty);
2053
2054 // Sign-extend negative constants.
2055 if (const SCEVConstant *SC = dyn_cast<SCEVConstant>(Op))
2056 if (SC->getAPInt().isNegative())
2057 return getSignExtendExpr(Op, Ty);
2058
2059 // Peel off a truncate cast.
2061 const SCEV *NewOp = T->getOperand();
2062 if (getTypeSizeInBits(NewOp->getType()) < getTypeSizeInBits(Ty))
2063 return getAnyExtendExpr(NewOp, Ty);
2064 return getTruncateOrNoop(NewOp, Ty);
2065 }
2066
2067 // Next try a zext cast. If the cast is folded, use it.
2068 const SCEV *ZExt = getZeroExtendExpr(Op, Ty);
2069 if (!isa<SCEVZeroExtendExpr>(ZExt))
2070 return ZExt;
2071
2072 // Next try a sext cast. If the cast is folded, use it.
2073 const SCEV *SExt = getSignExtendExpr(Op, Ty);
2074 if (!isa<SCEVSignExtendExpr>(SExt))
2075 return SExt;
2076
2077 // Force the cast to be folded into the operands of an addrec.
2078 if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(Op)) {
2080 for (const SCEV *Op : AR->operands())
2081 Ops.push_back(getAnyExtendExpr(Op, Ty));
2082 return getAddRecExpr(Ops, AR->getLoop(), SCEV::FlagNW);
2083 }
2084
2085 // If the expression is obviously signed, use the sext cast value.
2086 if (isa<SCEVSMaxExpr>(Op))
2087 return SExt;
2088
2089 // Absent any other information, use the zext cast value.
2090 return ZExt;
2091}
2092
2093/// Process the given Ops list, which is a list of operands to be added under
2094/// the given scale, update the given map. This is a helper function for
2095/// getAddRecExpr. As an example of what it does, given a sequence of operands
2096/// that would form an add expression like this:
2097///
2098/// m + n + 13 + (A * (o + p + (B * (q + m + 29)))) + r + (-1 * r)
2099///
2100/// where A and B are constants, update the map with these values:
2101///
2102/// (m, 1+A*B), (n, 1), (o, A), (p, A), (q, A*B), (r, 0)
2103///
2104/// and add 13 + A*B*29 to AccumulatedConstant.
2105/// This will allow getAddRecExpr to produce this:
2106///
2107/// 13+A*B*29 + n + (m * (1+A*B)) + ((o + p) * A) + (q * A*B)
2108///
2109/// This form often exposes folding opportunities that are hidden in
2110/// the original operand list.
2111///
2112/// Return true iff it appears that any interesting folding opportunities
2113/// may be exposed. This helps getAddRecExpr short-circuit extra work in
2114/// the common case where no interesting opportunities are present, and
2115/// is also used as a check to avoid infinite recursion.
2116static bool
2119 APInt &AccumulatedConstant, ArrayRef<SCEVUse> Ops,
2120 const APInt &Scale, ScalarEvolution &SE) {
2121 bool Interesting = false;
2122
2123 // Iterate over the add operands. They are sorted, with constants first.
2124 unsigned i = 0;
2125 while (const SCEVConstant *C = dyn_cast<SCEVConstant>(Ops[i])) {
2126 ++i;
2127 // Pull a buried constant out to the outside.
2128 if (Scale != 1 || AccumulatedConstant != 0 || C->getValue()->isZero())
2129 Interesting = true;
2130 AccumulatedConstant += Scale * C->getAPInt();
2131 }
2132
2133 // Next comes everything else. We're especially interested in multiplies
2134 // here, but they're in the middle, so just visit the rest with one loop.
2135 for (; i != Ops.size(); ++i) {
2137 if (Mul && isa<SCEVConstant>(Mul->getOperand(0))) {
2138 APInt NewScale =
2139 Scale * cast<SCEVConstant>(Mul->getOperand(0))->getAPInt();
2140 if (Mul->getNumOperands() == 2 && isa<SCEVAddExpr>(Mul->getOperand(1))) {
2141 // A multiplication of a constant with another add; recurse.
2142 const SCEVAddExpr *Add = cast<SCEVAddExpr>(Mul->getOperand(1));
2143 Interesting |= CollectAddOperandsWithScales(
2144 M, NewOps, AccumulatedConstant, Add->operands(), NewScale, SE);
2145 } else {
2146 // A multiplication of a constant with some other value. Update
2147 // the map.
2148 SmallVector<SCEVUse, 4> MulOps(drop_begin(Mul->operands()));
2149 const SCEV *Key = SE.getMulExpr(MulOps)->getCanonical();
2150 auto Pair = M.insert({Key, NewScale});
2151 if (Pair.second) {
2152 NewOps.push_back(Pair.first->first);
2153 } else {
2154 Pair.first->second += NewScale;
2155 // The map already had an entry for this value, which may indicate
2156 // a folding opportunity.
2157 Interesting = true;
2158 }
2159 }
2160 } else {
2161 // An ordinary operand. Update the map.
2162 auto Pair = M.insert({Ops[i]->getCanonical(), Scale});
2163 if (Pair.second) {
2164 NewOps.push_back(Pair.first->first);
2165 } else {
2166 Pair.first->second += Scale;
2167 // The map already had an entry for this value, which may indicate
2168 // a folding opportunity.
2169 Interesting = true;
2170 }
2171 }
2172 }
2173
2174 return Interesting;
2175}
2176
2178 const SCEV *LHS, const SCEV *RHS,
2179 const Instruction *CtxI) {
2180 auto Operation = [this, BinOp](SCEVUse L, SCEVUse R) -> const SCEV * {
2181 switch (BinOp) {
2182 default:
2183 llvm_unreachable("Unsupported binary op");
2184 case Instruction::Add:
2185 return getAddExpr(L, R);
2186 case Instruction::Sub:
2187 return getMinusSCEV(L, R);
2188 case Instruction::Mul:
2189 return getMulExpr(L, R);
2190 }
2191 };
2192
2193 const SCEV *(ScalarEvolution::*Extension)(SCEVUse, Type *, unsigned) =
2196
2197 // Check ext(LHS op RHS) == ext(LHS) op ext(RHS)
2198 auto *NarrowTy = cast<IntegerType>(LHS->getType());
2199 auto *WideTy =
2200 IntegerType::get(NarrowTy->getContext(), NarrowTy->getBitWidth() * 2);
2201
2202 const SCEV *A = (this->*Extension)(Operation(LHS, RHS), WideTy, 0);
2203 const SCEV *LHSB = (this->*Extension)(LHS, WideTy, 0);
2204 const SCEV *RHSB = (this->*Extension)(RHS, WideTy, 0);
2205 const SCEV *B = Operation(LHSB, RHSB);
2206 if (A == B)
2207 return true;
2208 // Can we use context to prove the fact we need?
2209 if (!CtxI)
2210 return false;
2211 // TODO: Support mul.
2212 if (BinOp == Instruction::Mul)
2213 return false;
2214 auto *RHSC = dyn_cast<SCEVConstant>(RHS);
2215 // TODO: Lift this limitation.
2216 if (!RHSC)
2217 return false;
2218 APInt C = RHSC->getAPInt();
2219 unsigned NumBits = C.getBitWidth();
2220 bool IsSub = (BinOp == Instruction::Sub);
2221 bool IsNegativeConst = (Signed && C.isNegative());
2222 // Compute the direction and magnitude by which we need to check overflow.
2223 bool OverflowDown = IsSub ^ IsNegativeConst;
2224 APInt Magnitude = C;
2225 if (IsNegativeConst) {
2226 if (C == APInt::getSignedMinValue(NumBits))
2227 // TODO: SINT_MIN on inversion gives the same negative value, we don't
2228 // want to deal with that.
2229 return false;
2230 Magnitude = -C;
2231 }
2232
2234 if (OverflowDown) {
2235 // To avoid overflow down, we need to make sure that MIN + Magnitude <= LHS.
2236 APInt Min = Signed ? APInt::getSignedMinValue(NumBits)
2237 : APInt::getMinValue(NumBits);
2238 APInt Limit = Min + Magnitude;
2239 return isKnownPredicateAt(Pred, getConstant(Limit), LHS, CtxI);
2240 } else {
2241 // To avoid overflow up, we need to make sure that LHS <= MAX - Magnitude.
2242 APInt Max = Signed ? APInt::getSignedMaxValue(NumBits)
2243 : APInt::getMaxValue(NumBits);
2244 APInt Limit = Max - Magnitude;
2245 return isKnownPredicateAt(Pred, LHS, getConstant(Limit), CtxI);
2246 }
2247}
2248
2250 const OverflowingBinaryOperator *OBO) {
2251 // It cannot be done any better.
2252 if (OBO->hasNoUnsignedWrap() && OBO->hasNoSignedWrap())
2253 return std::nullopt;
2254
2256
2257 if (OBO->hasNoUnsignedWrap())
2259 if (OBO->hasNoSignedWrap())
2261
2262 bool Deduced = false;
2263
2265 const SCEV *LHS = getSCEV(OBO->getOperand(0));
2266 const SCEV *RHS = getSCEV(OBO->getOperand(1));
2267
2268 bool CanUseNSW = true;
2269 const APInt *ShiftAmt;
2270 // Treat `shl %a, C` as `mul %a, 1 << C`.
2271 if (match(OBO, m_Shl(m_Value(), m_APInt(ShiftAmt)))) {
2272 unsigned BitWidth = ShiftAmt->getBitWidth();
2273 if (ShiftAmt->uge(BitWidth))
2274 return std::nullopt;
2275 // NSW only transfers if the shift amount is < BitWidth - 1, as INT_MIN * -1
2276 // overflows.
2277 CanUseNSW = ShiftAmt->ult(BitWidth - 1);
2278 Opcode = Instruction::Mul;
2280 } else if (Opcode != Instruction::Add && Opcode != Instruction::Sub &&
2281 Opcode != Instruction::Mul) {
2282 return std::nullopt;
2283 }
2284
2285 const Instruction *CtxI =
2286 Opts.scalar_evolution_use_context_for_no_wrap_flag_strenghening
2288 : nullptr;
2289 if (!OBO->hasNoUnsignedWrap() &&
2290 willNotOverflow(Opcode, /* Signed */ false, LHS, RHS, CtxI)) {
2292 Deduced = true;
2293 }
2294
2295 if (CanUseNSW && !OBO->hasNoSignedWrap() &&
2296 willNotOverflow(Opcode, /* Signed */ true, LHS, RHS, CtxI)) {
2298 Deduced = true;
2299 }
2300
2301 if (Deduced)
2302 return Flags;
2303 return std::nullopt;
2304}
2305
2306// We're trying to construct a SCEV of type `Type' with `Ops' as operands and
2307// `OldFlags' as can't-wrap behavior. Infer a more aggressive set of
2308// can't-overflow flags for the operation if possible.
2311 using namespace std::placeholders;
2312
2313 using OBO = OverflowingBinaryOperator;
2314
2315 bool CanAnalyze =
2317 (void)CanAnalyze;
2318 assert(CanAnalyze && "don't call from other places!");
2319
2320 SCEVFlags SignOrUnsignMask = SCEV::FlagNUW | SCEV::FlagNSW;
2321 SCEVFlags SignOrUnsignWrap =
2322 ScalarEvolution::maskFlags(Flags, SignOrUnsignMask);
2323
2324 // If FlagNSW is true and all the operands are non-negative, infer FlagNUW.
2325 auto IsKnownNonNegative = [&](SCEVUse U) {
2326 return SE->isKnownNonNegative(U);
2327 };
2328
2329 if (SignOrUnsignWrap == SCEV::FlagNSW && all_of(Ops, IsKnownNonNegative))
2330 Flags = ScalarEvolution::setFlags(Flags, SignOrUnsignMask);
2331
2332 SignOrUnsignWrap = ScalarEvolution::maskFlags(Flags, SignOrUnsignMask);
2333
2334 if (SignOrUnsignWrap != SignOrUnsignMask &&
2335 (Type == scAddExpr || Type == scMulExpr) && Ops.size() == 2 &&
2336 isa<SCEVConstant>(Ops[0])) {
2337
2338 auto Opcode = [&] {
2339 switch (Type) {
2340 case scAddExpr:
2341 return Instruction::Add;
2342 case scMulExpr:
2343 return Instruction::Mul;
2344 default:
2345 llvm_unreachable("Unexpected SCEV op.");
2346 }
2347 }();
2348
2349 const APInt &C = cast<SCEVConstant>(Ops[0])->getAPInt();
2350
2351 // (A <opcode> C) --> (A <opcode> C)<nsw> if the op doesn't sign overflow.
2352 if (!(SignOrUnsignWrap & SCEV::FlagNSW)) {
2353 auto NSWRegion =
2354 ConstantRange::makeExactNoWrapRegion(Opcode, C, OBO::NoSignedWrap);
2355 if (NSWRegion.contains(SE->getSignedRange(Ops[1])))
2357 }
2358
2359 // (A <opcode> C) --> (A <opcode> C)<nuw> if the op doesn't unsign overflow.
2360 if (!(SignOrUnsignWrap & SCEV::FlagNUW)) {
2361 auto NUWRegion =
2362 ConstantRange::makeExactNoWrapRegion(Opcode, C, OBO::NoUnsignedWrap);
2363 if (NUWRegion.contains(SE->getUnsignedRange(Ops[1])))
2365 }
2366 }
2367
2368 // <0,+,nonnegative><nw> is also nuw
2369 // TODO: Add corresponding nsw case
2371 !ScalarEvolution::hasFlags(Flags, SCEV::FlagNUW) && Ops.size() == 2 &&
2372 Ops[0]->isZero() && IsKnownNonNegative(Ops[1]))
2374
2375 // both (udiv X, Y) * Y and Y * (udiv X, Y) are always NUW
2377 Ops.size() == 2) {
2378 if (auto *UDiv = dyn_cast<SCEVUDivExpr>(Ops[0]))
2379 if (UDiv->getOperand(1) == Ops[1])
2381 if (auto *UDiv = dyn_cast<SCEVUDivExpr>(Ops[1]))
2382 if (UDiv->getOperand(1) == Ops[0])
2384 }
2385
2386 return Flags;
2387}
2388
2390 return isLoopInvariant(S, L) && properlyDominates(S, L->getHeader());
2391}
2392
2393/// Get a canonical add expression, or something simpler if possible.
2395 SCEVFlagsPair Flags, unsigned Depth) {
2396 SCEVFlags ExprFlags = Flags.ExprFlags;
2397 SCEVFlags UseFlags = Flags.UseFlags;
2398 assert(!(ExprFlags & ~(SCEV::FlagNUW | SCEV::FlagNSW)) &&
2399 "only nuw or nsw allowed");
2400 assert(!(UseFlags & ~(SCEV::FlagNUW | SCEV::FlagNSW)) &&
2401 "only nuw or nsw allowed");
2402 assert(!Ops.empty() && "Cannot get empty add!");
2403 if (Ops.size() == 1) return Ops[0];
2404#ifndef NDEBUG
2405 Type *ETy = getEffectiveSCEVType(Ops[0]->getType());
2406 for (unsigned i = 1, e = Ops.size(); i != e; ++i)
2407 assert(getEffectiveSCEVType(Ops[i]->getType()) == ETy &&
2408 "SCEVAddExpr operand types don't match!");
2409 unsigned NumPtrs = count_if(
2410 Ops, [](const SCEV *Op) { return Op->getType()->isPointerTy(); });
2411 assert(NumPtrs <= 1 && "add has at most one pointer operand");
2412#endif
2413
2415 Opts, *this, LI, DT, Ops,
2416 [](const APInt &C1, const APInt &C2) { return C1 + C2; },
2417 [](const APInt &C) { return C.isZero(); }, // identity
2418 [](const APInt &C) { return false; }); // absorber
2419 if (Folded)
2420 return Folded;
2421
2422#ifndef NDEBUG
2423 // Keep track of operands after constant folding, for verification when adding
2424 // use-specific flags.
2425 const SmallVector<SCEVUse, 8> OrigOps(Ops.begin(), Ops.end());
2426#endif
2427
2428 unsigned Idx = isa<SCEVConstant>(Ops[0]) ? 1 : 0;
2429
2430 // Delay expensive flag strengthening until necessary.
2431 auto ComputeFlags = [this, ExprFlags](ArrayRef<SCEVUse> Ops) {
2432 return StrengthenNoWrapFlags(this, scAddExpr, Ops, ExprFlags);
2433 };
2434
2435 // Limit recursion calls depth.
2436 if (Depth > Opts.scalar_evolution_max_arith_depth ||
2437 hasHugeExpression(Opts, Ops))
2438 return {getOrCreateAddExpr(Ops, ComputeFlags(Ops)), UseFlags};
2439
2440 if (SCEV *S = findExistingSCEVInCache(scAddExpr, Ops)) {
2441 // Don't strengthen flags if we have no new information.
2442 SCEVAddExpr *Add = static_cast<SCEVAddExpr *>(S);
2443 if (Add->getNoWrapFlags(ExprFlags) != ExprFlags)
2444 Add->setNoWrapFlags(ComputeFlags(Ops));
2445 return {S, UseFlags};
2446 }
2447
2448 // Okay, check to see if the same value occurs in the operand list more than
2449 // once. If so, merge them together into an multiply expression. Since we
2450 // sorted the list, these values are required to be adjacent.
2451 Type *Ty = Ops[0]->getType();
2452 bool FoundMatch = false;
2453 for (unsigned i = 0, e = Ops.size(); i != e-1; ++i)
2454 if (SCEVUse Op = SCEVUse::getCommon(Ops[i], Ops[i + 1])) {
2455 // X + Y + Y --> X + Y*2
2456 // Scan ahead to count how many equal operands there are.
2457 unsigned Count = 2;
2458 for (; i + Count != e; ++Count) {
2459 SCEVUse Common = SCEVUse::getCommon(Op, Ops[i + Count]);
2460 if (!Common)
2461 break;
2462 Op = Common;
2463 }
2464 // Merge the values into a multiply.
2465 SCEVUse Scale = getConstant(Ty, Count);
2466 SCEVUse Mul = getMulExpr(Scale, Op, SCEV::FlagNone, Depth + 1);
2467 if (Ops.size() == Count)
2468 return Mul;
2469 Ops[i] = Mul;
2470 Ops.erase(Ops.begin()+i+1, Ops.begin()+i+Count);
2471 --i; e -= Count - 1;
2472 FoundMatch = true;
2473 }
2474 if (FoundMatch)
2475 return getAddExpr(Ops, ExprFlags, Depth + 1);
2476
2477 // Check for truncates. If all the operands are truncated from the same
2478 // type, see if factoring out the truncate would permit the result to be
2479 // folded. eg., n*trunc(x) + m*trunc(y) --> trunc(trunc(m)*x + trunc(n)*y)
2480 // if the contents of the resulting outer trunc fold to something simple.
2481 auto FindTruncSrcType = [&]() -> Type * {
2482 // We're ultimately looking to fold an addrec of truncs and muls of only
2483 // constants and truncs, so if we find any other types of SCEV
2484 // as operands of the addrec then we bail and return nullptr here.
2485 // Otherwise, we return the type of the operand of a trunc that we find.
2486 if (auto *T = dyn_cast<SCEVTruncateExpr>(Ops[Idx]))
2487 return T->getOperand()->getType();
2488 if (const auto *Mul = dyn_cast<SCEVMulExpr>(Ops[Idx])) {
2489 SCEVUse LastOp = Mul->getOperand(Mul->getNumOperands() - 1);
2490 if (const auto *T = dyn_cast<SCEVTruncateExpr>(LastOp))
2491 return T->getOperand()->getType();
2492 }
2493 return nullptr;
2494 };
2495 if (auto *SrcType = FindTruncSrcType()) {
2496 SmallVector<SCEVUse, 8> LargeOps;
2497 bool Ok = true;
2498 // Check all the operands to see if they can be represented in the
2499 // source type of the truncate.
2500 for (const SCEV *Op : Ops) {
2502 if (T->getOperand()->getType() != SrcType) {
2503 Ok = false;
2504 break;
2505 }
2506 LargeOps.push_back(T->getOperand());
2507 } else if (const SCEVConstant *C = dyn_cast<SCEVConstant>(Op)) {
2508 LargeOps.push_back(getAnyExtendExpr(C, SrcType));
2509 } else if (const SCEVMulExpr *M = dyn_cast<SCEVMulExpr>(Op)) {
2510 SmallVector<SCEVUse, 8> LargeMulOps;
2511 for (unsigned j = 0, f = M->getNumOperands(); j != f && Ok; ++j) {
2512 if (const SCEVTruncateExpr *T =
2513 dyn_cast<SCEVTruncateExpr>(M->getOperand(j))) {
2514 if (T->getOperand()->getType() != SrcType) {
2515 Ok = false;
2516 break;
2517 }
2518 LargeMulOps.push_back(T->getOperand());
2519 } else if (const auto *C = dyn_cast<SCEVConstant>(M->getOperand(j))) {
2520 LargeMulOps.push_back(getAnyExtendExpr(C, SrcType));
2521 } else {
2522 Ok = false;
2523 break;
2524 }
2525 }
2526 if (Ok)
2527 LargeOps.push_back(
2528 getMulExpr(LargeMulOps, SCEV::FlagNone, Depth + 1));
2529 } else {
2530 Ok = false;
2531 break;
2532 }
2533 }
2534 if (Ok) {
2535 // Evaluate the expression in the larger type.
2536 const SCEV *Fold = getAddExpr(LargeOps, SCEV::FlagNone, Depth + 1);
2537 // If it folds to something simple, use it. Otherwise, don't.
2538 if (isa<SCEVConstant>(Fold) || isa<SCEVUnknown>(Fold))
2539 return getTruncateExpr(Fold, Ty);
2540 }
2541 }
2542
2543 if (Ops.size() == 2) {
2544 // Check if we have an expression of the form ((X + C1) - C2), where C1 and
2545 // C2 can be folded in a way that allows retaining wrapping flags of (X +
2546 // C1).
2547 const SCEV *A = Ops[0];
2548 const SCEV *B = Ops[1];
2549 auto *AddExpr = dyn_cast<SCEVAddExpr>(B);
2550 auto *C = dyn_cast<SCEVConstant>(A);
2551 if (AddExpr && C && isa<SCEVConstant>(AddExpr->getOperand(0))) {
2552 auto C1 = cast<SCEVConstant>(AddExpr->getOperand(0))->getAPInt();
2553 auto C2 = C->getAPInt();
2554 SCEVFlags PreservedFlags = SCEV::FlagNone;
2555
2556 APInt ConstAdd = C1 + C2;
2557 auto AddFlags = AddExpr->getNoWrapFlags();
2558 // Adding a smaller constant is NUW if the original AddExpr was NUW.
2560 ConstAdd.ule(C1)) {
2561 PreservedFlags =
2563 }
2564
2565 // Adding a constant with the same sign and small magnitude is NSW, if the
2566 // original AddExpr was NSW.
2568 C1.isSignBitSet() == ConstAdd.isSignBitSet() &&
2569 ConstAdd.abs().ule(C1.abs())) {
2570 PreservedFlags =
2572 }
2573
2574 if (PreservedFlags != SCEV::FlagNone) {
2575 SmallVector<SCEVUse, 4> NewOps(AddExpr->operands());
2576 NewOps[0] = getConstant(ConstAdd);
2577 return getAddExpr(NewOps, PreservedFlags);
2578 }
2579 }
2580
2581 // Try to push the constant operand into a ZExt: A + zext (-A + B) -> zext
2582 // (B), if trunc (A) + -A + B does not unsigned-wrap.
2583 const SCEVAddExpr *InnerAdd;
2584 if (match(B, m_scev_ZExt(m_scev_Add(InnerAdd)))) {
2585 const SCEV *NarrowA = getTruncateExpr(A, InnerAdd->getType());
2586 if (NarrowA == getNegativeSCEV(InnerAdd->getOperand(0)) &&
2587 getZeroExtendExpr(NarrowA, B->getType()) == A &&
2588 hasFlags(StrengthenNoWrapFlags(this, scAddExpr, {NarrowA, InnerAdd},
2590 SCEV::FlagNUW)) {
2591 return getZeroExtendExpr(getAddExpr(NarrowA, InnerAdd), B->getType());
2592 }
2593 }
2594 }
2595
2596 // Canonicalize (-1 * urem X, Y) + X --> (Y * X/Y)
2597 const SCEV *Y;
2598 if (Ops.size() == 2 &&
2599 match(Ops[0],
2601 m_scev_URem(m_scev_Specific(Ops[1]), m_SCEV(Y), *this))))
2602 return getMulExpr(Y, getUDivExpr(Ops[1], Y));
2603
2604 // Skip past any other cast SCEVs.
2605 while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scAddExpr)
2606 ++Idx;
2607
2608 // If there are add operands they would be next.
2609 if (Idx < Ops.size()) {
2610 bool DeletedAdd = false;
2611 // If the original flags and all inlined SCEVAddExprs are NUW, use the
2612 // common NUW flag for expression after inlining. Other flags cannot be
2613 // preserved, because they may depend on the original order of operations.
2614 SCEVFlags CommonFlags = maskFlags(ExprFlags, SCEV::FlagNUW);
2615 while (const SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(Ops[Idx])) {
2616 if (Ops.size() > Opts.scev_addops_inline_threshold ||
2617 Add->getNumOperands() > Opts.scev_addops_inline_threshold)
2618 break;
2619 // If we have an add, expand the add operands onto the end of the operands
2620 // list.
2621 Ops.erase(Ops.begin()+Idx);
2622 append_range(Ops, Add->operands());
2623 DeletedAdd = true;
2624 CommonFlags = maskFlags(CommonFlags, Add->getNoWrapFlags());
2625 }
2626
2627 // If we deleted at least one add, we added operands to the end of the list,
2628 // and they are not necessarily sorted. Recurse to resort and resimplify
2629 // any operands we just acquired.
2630 if (DeletedAdd)
2631 return getAddExpr(Ops, CommonFlags, Depth + 1);
2632 }
2633
2634 // Skip over the add expression until we get to a multiply.
2635 while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scMulExpr)
2636 ++Idx;
2637
2638 // Check to see if there are any folding opportunities present with
2639 // operands multiplied by constant values.
2640 if (Idx < Ops.size() && isa<SCEVMulExpr>(Ops[Idx])) {
2641 uint64_t BitWidth = getTypeSizeInBits(Ty);
2644 APInt AccumulatedConstant(BitWidth, 0);
2645 if (CollectAddOperandsWithScales(M, NewOps, AccumulatedConstant,
2646 Ops, APInt(BitWidth, 1), *this)) {
2647 struct APIntCompare {
2648 bool operator()(const APInt &LHS, const APInt &RHS) const {
2649 return LHS.ult(RHS);
2650 }
2651 };
2652
2653 // Some interesting folding opportunity is present, so its worthwhile to
2654 // re-generate the operands list. Group the operands by constant scale,
2655 // to avoid multiplying by the same constant scale multiple times.
2656 std::map<APInt, SmallVector<SCEVUse, 4>, APIntCompare> MulOpLists;
2657 for (SCEVUse NewOp : NewOps)
2658 MulOpLists[M.find(NewOp)->second].push_back(NewOp);
2659 // Re-generate the operands list.
2660 Ops.clear();
2661 if (AccumulatedConstant != 0)
2662 Ops.push_back(getConstant(AccumulatedConstant));
2663 for (auto &MulOp : MulOpLists) {
2664 if (MulOp.first == 1) {
2665 Ops.push_back(getAddExpr(MulOp.second, SCEV::FlagNone, Depth + 1));
2666 } else if (MulOp.first != 0) {
2667 Ops.push_back(
2668 getMulExpr(getConstant(MulOp.first),
2669 getAddExpr(MulOp.second, SCEV::FlagNone, Depth + 1),
2670 SCEV::FlagNone, Depth + 1));
2671 }
2672 }
2673 if (Ops.empty())
2674 return getZero(Ty);
2675 if (Ops.size() == 1)
2676 return Ops[0];
2677 return getAddExpr(Ops, SCEV::FlagNone, Depth + 1);
2678 }
2679 }
2680
2681 // Given a SCEVMulExpr and an operand index, return the product of all
2682 // operands except the one at OpIdx.
2683 auto StripFactor = [&](const SCEVMulExpr *M, unsigned OpIdx) -> SCEVUse {
2684 if (M->getNumOperands() == 2)
2685 return M->getOperand(OpIdx == 0);
2686 SmallVector<SCEVUse, 4> Remaining(M->operands().take_front(OpIdx));
2687 append_range(Remaining, M->operands().drop_front(OpIdx + 1));
2688 return getMulExpr(Remaining, SCEV::FlagNone, Depth + 1);
2689 };
2690
2691 // If we are adding something to a multiply expression, make sure the
2692 // something is not already an operand of the multiply. If so, merge it into
2693 // the multiply.
2694 for (; Idx < Ops.size() && isa<SCEVMulExpr>(Ops[Idx]); ++Idx) {
2695 const SCEVMulExpr *Mul = cast<SCEVMulExpr>(Ops[Idx]);
2696 for (unsigned MulOp = 0, e = Mul->getNumOperands(); MulOp != e; ++MulOp) {
2697 // Scan all terms to find every occurrence of common factor MulOpSCEV
2698 // and fold them in one shot:
2699 // A1*X + A2*X + ... + An*X --> X * (A1 + A2 + ... + An)
2700 SCEVUse MulOpSCEV = Mul->getOperand(MulOp);
2701 if (isa<SCEVConstant>(MulOpSCEV))
2702 continue;
2703
2704 // Cofactors: 1 for bare addends matching MulOpSCEV, or the
2705 // remaining product for multiply terms containing MulOpSCEV.
2706 SmallVector<SCEVUse, 4> Cofactors;
2707 SmallVector<unsigned, 4> DeadIndices;
2708 for (unsigned AddOp = 0, e = Ops.size(); AddOp != e; ++AddOp) {
2709 if (SCEVUse Common = SCEVUse::getCommon(MulOpSCEV, Ops[AddOp])) {
2710 // W + X + (X * Y * Z) --> W + (X * ((Y*Z)+1))
2711 MulOpSCEV = Common;
2712 Cofactors.push_back(getOne(Ty));
2713 DeadIndices.push_back(AddOp);
2714 continue;
2715 }
2716
2717 if (AddOp <= Idx || !isa<SCEVMulExpr>(Ops[AddOp]))
2718 continue;
2719
2720 const SCEVMulExpr *OtherMul = cast<SCEVMulExpr>(Ops[AddOp]);
2721 for (unsigned OMulOp = 0, OE = OtherMul->getNumOperands(); OMulOp != OE;
2722 ++OMulOp) {
2723 if (SCEVUse Common =
2724 SCEVUse::getCommon(MulOpSCEV, OtherMul->getOperand(OMulOp))) {
2725 // (A*B*C) + (A*D*E) --> A * (B*C + D*E)
2726 MulOpSCEV = Common;
2727 Cofactors.push_back(StripFactor(OtherMul, OMulOp));
2728 DeadIndices.push_back(AddOp);
2729 break;
2730 }
2731 }
2732 }
2733
2734 // Fold all collected cofactors with the anchor multiply's cofactor:
2735 // MulOpSCEV * (Cofactor_1 + ... + Cofactor_n + AnchorCofactor)
2736 if (!Cofactors.empty()) {
2737 Cofactors.push_back(StripFactor(Mul, MulOp));
2738
2739 SCEVUse InnerSum = getAddExpr(Cofactors, SCEV::FlagNone, Depth + 1);
2740 SCEVUse OuterMul =
2741 getMulExpr(MulOpSCEV, InnerSum, SCEV::FlagNone, Depth + 1);
2742
2743 // DeadIndices does not include Idx (the anchor), hence +1.
2744 if (Ops.size() == DeadIndices.size() + 1)
2745 return OuterMul;
2746
2747 // Erase Ops[Idx] first, then erase DeadIndices in reverse order.
2748 // The -1 adjustment accounts for the shift from removing Idx;
2749 // reverse order means each erasure only shifts later positions,
2750 // which have already been processed.
2751 Ops.erase(Ops.begin() + Idx);
2752 for (unsigned Dead : reverse(DeadIndices))
2753 Ops.erase(Ops.begin() + (Dead > Idx ? Dead - 1 : Dead));
2754
2755 Ops.push_back(OuterMul);
2756 return getAddExpr(Ops, SCEV::FlagNone, Depth + 1);
2757 }
2758 }
2759 }
2760
2761 // If there are any add recurrences in the operands list, see if any other
2762 // added values are loop invariant. If so, we can fold them into the
2763 // recurrence.
2764 while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scAddRecExpr)
2765 ++Idx;
2766
2767 // Scan over all recurrences, trying to fold loop invariants into them.
2768 for (; Idx < Ops.size() && isa<SCEVAddRecExpr>(Ops[Idx]); ++Idx) {
2769 // Scan all of the other operands to this add and add them to the vector if
2770 // they are loop invariant w.r.t. the recurrence.
2772 const SCEVAddRecExpr *AddRec = cast<SCEVAddRecExpr>(Ops[Idx]);
2773 const Loop *AddRecLoop = AddRec->getLoop();
2774 for (unsigned i = 0, e = Ops.size(); i != e; ++i)
2775 if (isAvailableAtLoopEntry(Ops[i], AddRecLoop)) {
2776 LIOps.push_back(Ops[i]);
2777 Ops.erase(Ops.begin()+i);
2778 --i; --e;
2779 }
2780
2781 // If we found some loop invariants, fold them into the recurrence.
2782 if (!LIOps.empty()) {
2783 // Compute nowrap flags for the addition of the loop-invariant ops and
2784 // the addrec. Temporarily push it as an operand for that purpose. These
2785 // flags are valid in the scope of the addrec only.
2786 LIOps.push_back(AddRec);
2787 SCEVFlags Flags = ComputeFlags(LIOps);
2788 LIOps.pop_back();
2789
2790 // NLI + LI + {Start,+,Step} --> NLI + {LI+Start,+,Step}
2791 LIOps.push_back(AddRec->getStart());
2792
2793 SmallVector<SCEVUse, 4> AddRecOps(AddRec->operands());
2794
2795 // It is not in general safe to propagate flags valid on an add within
2796 // the addrec scope to one outside it. We must prove that the inner
2797 // scope is guaranteed to execute if the outer one does to be able to
2798 // safely propagate. We know the program is undefined if poison is
2799 // produced on the inner scoped addrec. We also know that *for this use*
2800 // the outer scoped add can't overflow (because of the flags we just
2801 // computed for the inner scoped add) without the program being undefined.
2802 // Proving that entry to the outer scope neccesitates entry to the inner
2803 // scope, thus proves the program undefined if the flags would be violated
2804 // in the outer scope.
2805 SCEVFlags AddFlags = Flags;
2806 if (AddFlags != SCEV::FlagNone) {
2807 auto *DefI = getDefiningScopeBound(LIOps);
2808 auto *ReachI = &*AddRecLoop->getHeader()->begin();
2809 if (!isGuaranteedToTransferExecutionTo(DefI, ReachI))
2810 AddFlags = SCEV::FlagNone;
2811 }
2812 AddRecOps[0] = getAddExpr(LIOps, AddFlags, Depth + 1);
2813
2814 // Build the new addrec. Propagate the NUW and NSW flags if both the
2815 // outer add and the inner addrec are guaranteed to have no overflow.
2816 // Always propagate NW.
2817 Flags = AddRec->getNoWrapFlags(setFlags(Flags, SCEV::FlagNW));
2818 const SCEV *NewRec = getAddRecExpr(AddRecOps, AddRecLoop, Flags);
2819
2820 // If all of the other operands were loop invariant, we are done.
2821 if (Ops.size() == 1) return NewRec;
2822
2823 // Otherwise, add the folded AddRec by the non-invariant parts.
2824 for (unsigned i = 0;; ++i)
2825 if (Ops[i] == AddRec) {
2826 Ops[i] = NewRec;
2827 break;
2828 }
2829 return getAddExpr(Ops, SCEV::FlagNone, Depth + 1);
2830 }
2831
2832 // Okay, if there weren't any loop invariants to be folded, check to see if
2833 // there are multiple AddRec's with the same loop induction variable being
2834 // added together. If so, we can fold them.
2835 for (unsigned OtherIdx = Idx+1;
2836 OtherIdx < Ops.size() && isa<SCEVAddRecExpr>(Ops[OtherIdx]);
2837 ++OtherIdx) {
2838 // We expect the AddRecExpr's to be sorted in reverse dominance order,
2839 // so that the 1st found AddRecExpr is dominated by all others.
2840 assert(DT.dominates(
2841 cast<SCEVAddRecExpr>(Ops[OtherIdx])->getLoop()->getHeader(),
2842 AddRec->getLoop()->getHeader()) &&
2843 "AddRecExprs are not sorted in reverse dominance order?");
2844 if (AddRecLoop == cast<SCEVAddRecExpr>(Ops[OtherIdx])->getLoop()) {
2845 // Other + {A,+,B}<L> + {C,+,D}<L> --> Other + {A+C,+,B+D}<L>
2846 SmallVector<SCEVUse, 4> AddRecOps(AddRec->operands());
2847 for (; OtherIdx != Ops.size() && isa<SCEVAddRecExpr>(Ops[OtherIdx]);
2848 ++OtherIdx) {
2849 const auto *OtherAddRec = cast<SCEVAddRecExpr>(Ops[OtherIdx]);
2850 if (OtherAddRec->getLoop() == AddRecLoop) {
2851 for (unsigned i = 0, e = OtherAddRec->getNumOperands();
2852 i != e; ++i) {
2853 if (i >= AddRecOps.size()) {
2854 append_range(AddRecOps, OtherAddRec->operands().drop_front(i));
2855 break;
2856 }
2857 AddRecOps[i] =
2858 getAddExpr(AddRecOps[i], OtherAddRec->getOperand(i),
2859 SCEV::FlagNone, Depth + 1);
2860 }
2861 Ops.erase(Ops.begin() + OtherIdx); --OtherIdx;
2862 }
2863 }
2864 // Step size has changed, so we cannot guarantee no self-wraparound.
2865 Ops[Idx] = getAddRecExpr(AddRecOps, AddRecLoop, SCEV::FlagNone);
2866 return getAddExpr(Ops, SCEV::FlagNone, Depth + 1);
2867 }
2868 }
2869
2870 // Otherwise couldn't fold anything into this recurrence. Move onto the
2871 // next one.
2872 }
2873
2874 // Okay, it looks like we really DO need an add expr. Check to see if we
2875 // already have one, otherwise create a new one.
2876 assert((UseFlags == SCEV::FlagNone || equal(OrigOps, Ops)) &&
2877 "Tried to add SCEVUse flags after operands changed");
2878 return {getOrCreateAddExpr(Ops, ComputeFlags(Ops)), UseFlags};
2879}
2880
2881const SCEV *ScalarEvolution::getOrCreateAddExpr(ArrayRef<SCEVUse> Ops,
2882 SCEVFlags Flags) {
2885 for (SCEVUse Op : Ops)
2886 ID.AddPointer(Op.getOpaqueValue());
2888 SCEVAddExpr *S = static_cast<SCEVAddExpr *>(UniqueSCEVs.lookup(ID, Token));
2889 if (!S) {
2890 SCEVUse *O = SCEVAllocator.Allocate<SCEVUse>(Ops.size());
2892 S = new (SCEVAllocator)
2893 SCEVAddExpr(ID.Intern(SCEVAllocator), O, Ops.size());
2894 UniqueSCEVs.insert(S, Token);
2895 S->computeAndSetCanonical(*this);
2896 registerUser(S, Ops);
2897 }
2898 S->setNoWrapFlags(Flags);
2899 return S;
2900}
2901
2902const SCEV *ScalarEvolution::getOrCreateAddRecExpr(ArrayRef<SCEVUse> Ops,
2903 const Loop *L,
2904 SCEVFlags Flags) {
2905 FoldingSetNodeID ID;
2906 ID.AddInteger(scAddRecExpr);
2907 for (SCEVUse Op : Ops)
2908 ID.AddPointer(Op.getOpaqueValue());
2909 ID.AddPointer(L);
2910 FoldingSetInsertToken Token;
2911 SCEVAddRecExpr *S =
2912 static_cast<SCEVAddRecExpr *>(UniqueSCEVs.lookup(ID, Token));
2913 if (!S) {
2914 SCEVUse *O = SCEVAllocator.Allocate<SCEVUse>(Ops.size());
2916 S = new (SCEVAllocator)
2917 SCEVAddRecExpr(ID.Intern(SCEVAllocator), O, Ops.size(), L);
2918 UniqueSCEVs.insert(S, Token);
2919 S->computeAndSetCanonical(*this);
2920 LoopUsers[L].push_back(S);
2921 registerUser(S, Ops);
2922 }
2923 setNoWrapFlags(S, Flags);
2924 return S;
2925}
2926
2927const SCEV *ScalarEvolution::getOrCreateMulExpr(ArrayRef<SCEVUse> Ops,
2928 SCEVFlags Flags) {
2929 FoldingSetNodeID ID;
2930 ID.AddInteger(scMulExpr);
2931 for (SCEVUse Op : Ops)
2932 ID.AddPointer(Op.getOpaqueValue());
2933 FoldingSetInsertToken Token;
2934 SCEVMulExpr *S = static_cast<SCEVMulExpr *>(UniqueSCEVs.lookup(ID, Token));
2935 if (!S) {
2936 SCEVUse *O = SCEVAllocator.Allocate<SCEVUse>(Ops.size());
2938 S = new (SCEVAllocator) SCEVMulExpr(ID.Intern(SCEVAllocator),
2939 O, Ops.size());
2940 UniqueSCEVs.insert(S, Token);
2941 S->computeAndSetCanonical(*this);
2942 registerUser(S, Ops);
2943 }
2944 S->setNoWrapFlags(Flags);
2945 return S;
2946}
2947
2948const SCEV *ScalarEvolution::getOrCreateUDivExpr(SCEVUse LHS, SCEVUse RHS) {
2949 FoldingSetNodeID ID;
2950 ID.AddInteger(scUDivExpr);
2951 ID.AddPointer(LHS.getOpaqueValue());
2952 ID.AddPointer(RHS.getOpaqueValue());
2953 FoldingSetInsertToken Token;
2954 SCEV *S = UniqueSCEVs.lookup(ID, Token);
2955 if (!S) {
2956 S = new (SCEVAllocator) SCEVUDivExpr(ID.Intern(SCEVAllocator), LHS, RHS);
2957 UniqueSCEVs.insert(S, Token);
2958 S->computeAndSetCanonical(*this);
2959 registerUser(S, {LHS, RHS});
2960 }
2961 return S;
2962}
2963
2964static uint64_t umul_ov(uint64_t i, uint64_t j, bool &Overflow) {
2965 uint64_t k = i*j;
2966 if (j > 1 && k / j != i) Overflow = true;
2967 return k;
2968}
2969
2970/// Compute the result of "n choose k", the binomial coefficient. If an
2971/// intermediate computation overflows, Overflow will be set and the return will
2972/// be garbage. Overflow is not cleared on absence of overflow.
2973static uint64_t Choose(uint64_t n, uint64_t k, bool &Overflow) {
2974 // We use the multiplicative formula:
2975 // n(n-1)(n-2)...(n-(k-1)) / k(k-1)(k-2)...1 .
2976 // At each iteration, we take the n-th term of the numeral and divide by the
2977 // (k-n)th term of the denominator. This division will always produce an
2978 // integral result, and helps reduce the chance of overflow in the
2979 // intermediate computations. However, we can still overflow even when the
2980 // final result would fit.
2981
2982 if (n == 0 || n == k) return 1;
2983 if (k > n) return 0;
2984
2985 if (k > n/2)
2986 k = n-k;
2987
2988 uint64_t r = 1;
2989 for (uint64_t i = 1; i <= k; ++i) {
2990 r = umul_ov(r, n-(i-1), Overflow);
2991 r /= i;
2992 }
2993 return r;
2994}
2995
2996/// Determine if any of the operands in this SCEV are a constant or if
2997/// any of the add or multiply expressions in this SCEV contain a constant.
2998static bool containsConstantInAddMulChain(const SCEV *StartExpr) {
2999 struct FindConstantInAddMulChain {
3000 bool FoundConstant = false;
3001
3002 bool follow(const SCEV *S) {
3003 FoundConstant |= isa<SCEVConstant>(S);
3004 return isa<SCEVAddExpr>(S) || isa<SCEVMulExpr>(S);
3005 }
3006
3007 bool isDone() const {
3008 return FoundConstant;
3009 }
3010 };
3011
3012 FindConstantInAddMulChain F;
3014 ST.visitAll(StartExpr);
3015 return F.FoundConstant;
3016}
3017
3018/// Get a canonical multiply expression, or something simpler if possible.
3020 SCEVFlagsPair Flags, unsigned Depth) {
3021 SCEVFlags ExprFlags = Flags.ExprFlags;
3022 SCEVFlags UseFlags = Flags.UseFlags;
3023 assert(ExprFlags == maskFlags(ExprFlags, SCEV::FlagNUW | SCEV::FlagNSW) &&
3024 "only nuw or nsw allowed");
3025 assert(UseFlags == maskFlags(UseFlags, SCEV::FlagNUW | SCEV::FlagNSW) &&
3026 "only nuw or nsw allowed");
3027 assert(!Ops.empty() && "Cannot get empty mul!");
3028 if (Ops.size() == 1) return Ops[0];
3029#ifndef NDEBUG
3030 Type *ETy = Ops[0]->getType();
3031 assert(!ETy->isPointerTy());
3032 for (unsigned i = 1, e = Ops.size(); i != e; ++i)
3033 assert(Ops[i]->getType() == ETy &&
3034 "SCEVMulExpr operand types don't match!");
3035#endif
3036
3038 Opts, *this, LI, DT, Ops,
3039 [](const APInt &C1, const APInt &C2) { return C1 * C2; },
3040 [](const APInt &C) { return C.isOne(); }, // identity
3041 [](const APInt &C) { return C.isZero(); }); // absorber
3042 if (Folded)
3043 return Folded;
3044
3045#ifndef NDEBUG
3046 // Keep track of operands after constant folding, for verification when adding
3047 // use-specific flags.
3048 const SmallVector<SCEVUse, 8> OrigOps(Ops.begin(), Ops.end());
3049#endif
3050
3051 // Delay expensive flag strengthening until necessary.
3052 auto ComputeFlags = [this, ExprFlags](const ArrayRef<SCEVUse> Ops) {
3053 return StrengthenNoWrapFlags(this, scMulExpr, Ops, ExprFlags);
3054 };
3055
3056 // Limit recursion calls depth.
3057 if (Depth > Opts.scalar_evolution_max_arith_depth ||
3058 hasHugeExpression(Opts, Ops))
3059 return {getOrCreateMulExpr(Ops, ComputeFlags(Ops)), UseFlags};
3060
3061 if (SCEV *S = findExistingSCEVInCache(scMulExpr, Ops)) {
3062 // Don't strengthen flags if we have no new information.
3063 SCEVMulExpr *Mul = static_cast<SCEVMulExpr *>(S);
3064 if (Mul->getNoWrapFlags(ExprFlags) != ExprFlags)
3065 Mul->setNoWrapFlags(ComputeFlags(Ops));
3066 return {S, UseFlags};
3067 }
3068
3069 if (const SCEVConstant *LHSC = dyn_cast<SCEVConstant>(Ops[0])) {
3070 if (Ops.size() == 2) {
3071 // C1*(C2+V) -> C1*C2 + C1*V
3072 // If any of Add's ops are Adds or Muls with a constant, apply this
3073 // transformation as well.
3074 //
3075 // TODO: There are some cases where this transformation is not
3076 // profitable; for example, Add = (C0 + X) * Y + Z. Maybe the scope of
3077 // this transformation should be narrowed down.
3078 const SCEV *Op0, *Op1;
3079 if (match(Ops[1], m_scev_Add(m_SCEV(Op0), m_SCEV(Op1))) &&
3081 const SCEV *LHS = getMulExpr(LHSC, Op0, SCEV::FlagNone, Depth + 1);
3082 const SCEV *RHS = getMulExpr(LHSC, Op1, SCEV::FlagNone, Depth + 1);
3083 return getAddExpr(LHS, RHS, SCEV::FlagNone, Depth + 1);
3084 }
3085
3086 if (Ops[0]->isAllOnesValue()) {
3087 // If we have a mul by -1 of an add, try distributing the -1 among the
3088 // add operands.
3089 if (const SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(Ops[1])) {
3091 bool AnyFolded = false;
3092 for (const SCEV *AddOp : Add->operands()) {
3093 const SCEV *Mul =
3094 getMulExpr(Ops[0], SCEVUse(AddOp), SCEV::FlagNone, Depth + 1);
3095 if (!isa<SCEVMulExpr>(Mul)) AnyFolded = true;
3096 NewOps.push_back(Mul);
3097 }
3098 if (AnyFolded)
3099 return getAddExpr(NewOps, SCEV::FlagNone, Depth + 1);
3100 } else if (const auto *AddRec = dyn_cast<SCEVAddRecExpr>(Ops[1])) {
3101 // Negation preserves a recurrence's no self-wrap property.
3103 for (const SCEV *AddRecOp : AddRec->operands())
3104 Operands.push_back(getMulExpr(Ops[0], SCEVUse(AddRecOp),
3105 SCEV::FlagNone, Depth + 1));
3106 // Let M be the minimum representable signed value. AddRec with nsw
3107 // multiplied by -1 can have signed overflow if and only if it takes a
3108 // value of M: M * (-1) would stay M and (M + 1) * (-1) would be the
3109 // maximum signed value. In all other cases signed overflow is
3110 // impossible.
3111 auto FlagsMask = SCEV::FlagNW;
3112 if (AddRec->hasNoSignedWrap()) {
3113 auto MinInt =
3114 APInt::getSignedMinValue(getTypeSizeInBits(AddRec->getType()));
3115 if (getSignedRangeMin(AddRec) != MinInt)
3117 }
3118 return getAddRecExpr(Operands, AddRec->getLoop(),
3119 AddRec->getNoWrapFlags(FlagsMask));
3120 }
3121 }
3122
3123 // Try to push the constant operand into a ZExt: C * zext (A + B) ->
3124 // zext (C*A + C*B) if trunc (C) * (A + B) does not unsigned-wrap.
3125 const SCEVAddExpr *InnerAdd;
3126 if (match(Ops[1], m_scev_ZExt(m_scev_Add(InnerAdd)))) {
3127 const SCEV *NarrowC = getTruncateExpr(LHSC, InnerAdd->getType());
3128 if (isa<SCEVConstant>(InnerAdd->getOperand(0)) &&
3129 getZeroExtendExpr(NarrowC, Ops[1]->getType()) == LHSC &&
3130 hasFlags(StrengthenNoWrapFlags(this, scMulExpr, {NarrowC, InnerAdd},
3132 SCEV::FlagNUW)) {
3133 const SCEV *Res =
3134 getMulExpr(NarrowC, InnerAdd, SCEV::FlagNUW, Depth + 1);
3135 return getZeroExtendExpr(Res, Ops[1]->getType(), Depth + 1);
3136 };
3137 }
3138
3139 // Try to fold (C1 * D /u C2) -> C1/C2 * D, if C1 and C2 are powers-of-2,
3140 // D is a multiple of C2, and C1 is a multiple of C2. If C2 is a multiple
3141 // of C1, fold to (D /u (C2 /u C1)).
3142 const SCEV *D;
3143 APInt C1V = LHSC->getAPInt();
3144 // (C1 * D /u C2) == -1 * -C1 * D /u C2 when C1 != INT_MIN. Don't treat -1
3145 // as -1 * 1, as it won't enable additional folds.
3146 if (C1V.isNegative() && !C1V.isMinSignedValue() && !C1V.isAllOnes())
3147 C1V = C1V.abs();
3148 const SCEVConstant *C2;
3149 if (C1V.isPowerOf2() &&
3151 C2->getAPInt().isPowerOf2() &&
3152 C1V.logBase2() <= getMinTrailingZeros(D)) {
3153 const SCEV *NewMul = nullptr;
3154 if (C1V.uge(C2->getAPInt())) {
3155 NewMul = getMulExpr(getUDivExpr(getConstant(C1V), C2), D);
3156 } else if (C2->getAPInt().logBase2() <= getMinTrailingZeros(D)) {
3157 assert(C1V.ugt(1) && "C1 <= 1 should have been folded earlier");
3158 NewMul = getUDivExpr(D, getUDivExpr(C2, getConstant(C1V)));
3159 }
3160 if (NewMul)
3161 return C1V == LHSC->getAPInt() ? NewMul : getNegativeSCEV(NewMul);
3162 }
3163 }
3164 }
3165
3166 // Skip over the add expression until we get to a multiply.
3167 unsigned Idx = 0;
3168 while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scMulExpr)
3169 ++Idx;
3170
3171 // If there are mul operands inline them all into this expression.
3172 if (Idx < Ops.size()) {
3173 bool DeletedMul = false;
3174 while (const SCEVMulExpr *Mul = dyn_cast<SCEVMulExpr>(Ops[Idx])) {
3175 if (Ops.size() > Opts.scev_mulops_inline_threshold)
3176 break;
3177 // If we have an mul, expand the mul operands onto the end of the
3178 // operands list.
3179 Ops.erase(Ops.begin()+Idx);
3180 append_range(Ops, Mul->operands());
3181 DeletedMul = true;
3182 }
3183
3184 // If we deleted at least one mul, we added operands to the end of the
3185 // list, and they are not necessarily sorted. Recurse to resort and
3186 // resimplify any operands we just acquired.
3187 if (DeletedMul)
3188 return getMulExpr(Ops, SCEV::FlagNone, Depth + 1);
3189 }
3190
3191 // If there are any add recurrences in the operands list, see if any other
3192 // added values are loop invariant. If so, we can fold them into the
3193 // recurrence.
3194 while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scAddRecExpr)
3195 ++Idx;
3196
3197 // Scan over all recurrences, trying to fold loop invariants into them.
3198 for (; Idx < Ops.size() && isa<SCEVAddRecExpr>(Ops[Idx]); ++Idx) {
3199 // Scan all of the other operands to this mul and add them to the vector
3200 // if they are loop invariant w.r.t. the recurrence.
3202 const SCEVAddRecExpr *AddRec = cast<SCEVAddRecExpr>(Ops[Idx]);
3203 for (unsigned i = 0, e = Ops.size(); i != e; ++i)
3204 if (isAvailableAtLoopEntry(Ops[i], AddRec->getLoop())) {
3205 LIOps.push_back(Ops[i]);
3206 Ops.erase(Ops.begin()+i);
3207 --i; --e;
3208 }
3209
3210 // If we found some loop invariants, fold them into the recurrence.
3211 if (!LIOps.empty()) {
3212 // NLI * LI * {Start,+,Step} --> NLI * {LI*Start,+,LI*Step}
3214 NewOps.reserve(AddRec->getNumOperands());
3215 const SCEV *Scale = getMulExpr(LIOps, SCEV::FlagNone, Depth + 1);
3216
3217 // If both the mul and addrec are nuw, we can preserve nuw.
3218 // If both the mul and addrec are nsw, we can only preserve nsw if either
3219 // a) they are also nuw, or
3220 // b) all multiplications of addrec operands with scale are nsw.
3221 SCEVFlags Flags = AddRec->getNoWrapFlags(ComputeFlags({Scale, AddRec}));
3222
3223 for (unsigned i = 0, e = AddRec->getNumOperands(); i != e; ++i) {
3224 NewOps.push_back(getMulExpr(Scale, AddRec->getOperand(i),
3225 SCEV::FlagNone, Depth + 1));
3226
3227 if (hasFlags(Flags, SCEV::FlagNSW) && !hasFlags(Flags, SCEV::FlagNUW)) {
3229 Instruction::Mul, getSignedRange(Scale),
3231 if (!NSWRegion.contains(getSignedRange(AddRec->getOperand(i))))
3232 Flags = clearFlags(Flags, SCEV::FlagNSW);
3233 }
3234 }
3235
3236 const SCEV *NewRec = getAddRecExpr(NewOps, AddRec->getLoop(), Flags);
3237
3238 // If all of the other operands were loop invariant, we are done.
3239 if (Ops.size() == 1) return NewRec;
3240
3241 // Otherwise, multiply the folded AddRec by the non-invariant parts.
3242 for (unsigned i = 0;; ++i)
3243 if (Ops[i] == AddRec) {
3244 Ops[i] = NewRec;
3245 break;
3246 }
3247 return getMulExpr(Ops, SCEV::FlagNone, Depth + 1);
3248 }
3249
3250 // Okay, if there weren't any loop invariants to be folded, check to see
3251 // if there are multiple AddRec's with the same loop induction variable
3252 // being multiplied together. If so, we can fold them.
3253
3254 // {A1,+,A2,+,...,+,An}<L> * {B1,+,B2,+,...,+,Bn}<L>
3255 // = {x=1 in [ sum y=x..2x [ sum z=max(y-x, y-n)..min(x,n) [
3256 // choose(x, 2x)*choose(2x-y, x-z)*A_{y-z}*B_z
3257 // ]]],+,...up to x=2n}.
3258 // Note that the arguments to choose() are always integers with values
3259 // known at compile time, never SCEV objects.
3260 //
3261 // The implementation avoids pointless extra computations when the two
3262 // addrec's are of different length (mathematically, it's equivalent to
3263 // an infinite stream of zeros on the right).
3264 bool OpsModified = false;
3265 for (unsigned OtherIdx = Idx+1;
3266 OtherIdx != Ops.size() && isa<SCEVAddRecExpr>(Ops[OtherIdx]);
3267 ++OtherIdx) {
3268 const SCEVAddRecExpr *OtherAddRec =
3269 dyn_cast<SCEVAddRecExpr>(Ops[OtherIdx]);
3270 if (!OtherAddRec || OtherAddRec->getLoop() != AddRec->getLoop())
3271 continue;
3272
3273 // Limit max number of arguments to avoid creation of unreasonably big
3274 // SCEVAddRecs with very complex operands.
3275 if (AddRec->getNumOperands() + OtherAddRec->getNumOperands() - 1 >
3276 Opts.scalar_evolution_max_add_rec_size ||
3277 hasHugeExpression(Opts, {AddRec, OtherAddRec}))
3278 continue;
3279
3280 bool Overflow = false;
3281 Type *Ty = AddRec->getType();
3282 bool LargerThan64Bits = getTypeSizeInBits(Ty) > 64;
3283 SmallVector<SCEVUse, 7> AddRecOps;
3284 for (int x = 0, xe = AddRec->getNumOperands() +
3285 OtherAddRec->getNumOperands() - 1; x != xe && !Overflow; ++x) {
3287 for (int y = x, ye = 2*x+1; y != ye && !Overflow; ++y) {
3288 uint64_t Coeff1 = Choose(x, 2*x - y, Overflow);
3289 for (int z = std::max(y-x, y-(int)AddRec->getNumOperands()+1),
3290 ze = std::min(x+1, (int)OtherAddRec->getNumOperands());
3291 z < ze && !Overflow; ++z) {
3292 uint64_t Coeff2 = Choose(2*x - y, x-z, Overflow);
3293 uint64_t Coeff;
3294 if (LargerThan64Bits)
3295 Coeff = umul_ov(Coeff1, Coeff2, Overflow);
3296 else
3297 Coeff = Coeff1*Coeff2;
3298 const SCEV *CoeffTerm = getConstant(Ty, Coeff);
3299 const SCEV *Term1 = AddRec->getOperand(y-z);
3300 const SCEV *Term2 = OtherAddRec->getOperand(z);
3301 SumOps.push_back(
3302 getMulExpr(CoeffTerm, Term1, Term2, SCEV::FlagNone, Depth + 1));
3303 }
3304 }
3305 if (SumOps.empty())
3306 SumOps.push_back(getZero(Ty));
3307 AddRecOps.push_back(getAddExpr(SumOps, SCEV::FlagNone, Depth + 1));
3308 }
3309 if (!Overflow) {
3310 const SCEV *NewAddRec =
3311 getAddRecExpr(AddRecOps, AddRec->getLoop(), SCEV::FlagNone);
3312 if (Ops.size() == 2) return NewAddRec;
3313 Ops[Idx] = NewAddRec;
3314 Ops.erase(Ops.begin() + OtherIdx); --OtherIdx;
3315 OpsModified = true;
3316 AddRec = dyn_cast<SCEVAddRecExpr>(NewAddRec);
3317 if (!AddRec)
3318 break;
3319 }
3320 }
3321 if (OpsModified)
3322 return getMulExpr(Ops, SCEV::FlagNone, Depth + 1);
3323
3324 // Otherwise couldn't fold anything into this recurrence. Move onto the
3325 // next one.
3326 }
3327
3328 // Okay, it looks like we really DO need an mul expr. Check to see if we
3329 // already have one, otherwise create a new one.
3330 assert((UseFlags == SCEV::FlagNone || equal(OrigOps, Ops)) &&
3331 "Tried to add SCEVUse flags after operands changed");
3332 return {getOrCreateMulExpr(Ops, ComputeFlags(Ops)), UseFlags};
3333}
3334
3335/// Represents an unsigned remainder expression based on unsigned division.
3337 assert(getEffectiveSCEVType(LHS->getType()) ==
3338 getEffectiveSCEVType(RHS->getType()) &&
3339 "SCEVURemExpr operand types don't match!");
3340
3341 // Short-circuit easy cases
3342 if (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(RHS)) {
3343 // If constant is one, the result is trivial
3344 if (RHSC->getValue()->isOne())
3345 return getZero(LHS->getType()); // X urem 1 --> 0
3346
3347 // If constant is a power of two, fold into a zext(trunc(LHS)).
3348 if (RHSC->getAPInt().isPowerOf2()) {
3349 Type *FullTy = LHS->getType();
3350 Type *TruncTy =
3351 IntegerType::get(getContext(), RHSC->getAPInt().logBase2());
3352 return getZeroExtendExpr(getTruncateExpr(LHS, TruncTy), FullTy);
3353 }
3354 }
3355
3356 // Fallback to %a == %x urem %y == %x -<nuw> ((%x udiv %y) *<nuw> %y)
3357 const SCEV *UDiv = getUDivExpr(LHS, RHS);
3358 const SCEV *Mult = getMulExpr(UDiv, RHS, SCEV::FlagNUW);
3359 return getMinusSCEV(LHS, Mult, SCEV::FlagNUW);
3360}
3361
3362/// Get a canonical unsigned division expression, or something simpler if
3363/// possible.
3365 assert(!LHS->getType()->isPointerTy() &&
3366 "SCEVUDivExpr operand can't be pointer!");
3367 assert(LHS->getType() == RHS->getType() &&
3368 "SCEVUDivExpr operand types don't match!");
3369
3370 if (SCEV *S = findExistingSCEVInCache(scUDivExpr, {LHS, RHS}))
3371 return S;
3372
3373 // 0 udiv Y == 0
3374 if (match(LHS, m_scev_Zero()))
3375 return LHS;
3376
3377 if (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(RHS)) {
3378 if (RHSC->getValue()->isOne())
3379 return LHS; // X udiv 1 --> x
3380 // If the denominator is zero, the result of the udiv is undefined. Don't
3381 // try to analyze it, because the resolution chosen here may differ from
3382 // the resolution chosen in other parts of the compiler.
3383 if (!RHSC->getValue()->isZero()) {
3384 // Determine if the division can be folded into the operands of
3385 // its operands.
3386 // TODO: Generalize this to non-constants by using known-bits information.
3387 Type *Ty = LHS->getType();
3388 unsigned LZ = RHSC->getAPInt().countl_zero();
3389 unsigned MaxShiftAmt = getTypeSizeInBits(Ty) - LZ - 1;
3390 // For non-power-of-two values, effectively round the value up to the
3391 // nearest power of two.
3392 if (!RHSC->getAPInt().isPowerOf2())
3393 ++MaxShiftAmt;
3394 IntegerType *ExtTy =
3395 IntegerType::get(getContext(), getTypeSizeInBits(Ty) + MaxShiftAmt);
3396 if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(LHS))
3397 if (const SCEVConstant *Step =
3398 dyn_cast<SCEVConstant>(AR->getStepRecurrence(*this))) {
3399 // {X,+,N}/C --> {X/C,+,N/C} if safe and N/C can be folded.
3400 const APInt &StepInt = Step->getAPInt();
3401 const APInt &DivInt = RHSC->getAPInt();
3402 if (!StepInt.urem(DivInt) &&
3403 getZeroExtendExpr(AR, ExtTy) ==
3404 getAddRecExpr(getZeroExtendExpr(AR->getStart(), ExtTy),
3405 getZeroExtendExpr(Step, ExtTy), AR->getLoop(),
3406 SCEV::FlagNone)) {
3408 for (const SCEV *Op : AR->operands())
3409 Operands.push_back(getUDivExpr(Op, RHS));
3410 return getAddRecExpr(Operands, AR->getLoop(), SCEV::FlagNW);
3411 }
3412 /// Get a canonical UDivExpr for a recurrence.
3413 /// {X,+,N}/C => {Y,+,N}/C where Y=X-(X%N). Safe when C%N=0.
3414 const APInt *StartRem;
3415 if (!DivInt.urem(StepInt) && match(getURemExpr(AR->getStart(), Step),
3416 m_scev_APInt(StartRem))) {
3417 bool NoWrap =
3418 getZeroExtendExpr(AR, ExtTy) ==
3419 getAddRecExpr(getZeroExtendExpr(AR->getStart(), ExtTy),
3420 getZeroExtendExpr(Step, ExtTy), AR->getLoop(),
3422
3423 // With N <= C and both N, C as powers-of-2, the transformation
3424 // {X,+,N}/C => {(X - X%N),+,N}/C preserves division results even
3425 // if wrapping occurs, as the division results remain equivalent for
3426 // all offsets in [[(X - X%N), X).
3427 bool CanFoldWithWrap = StepInt.ule(DivInt) && // N <= C
3428 StepInt.isPowerOf2() && DivInt.isPowerOf2();
3429 // Only fold if the subtraction can be folded in the start
3430 // expression.
3431 const SCEV *NewStart =
3432 getMinusSCEV(AR->getStart(), getConstant(*StartRem));
3433 if (*StartRem != 0 && (NoWrap || CanFoldWithWrap) &&
3434 !isa<SCEVAddExpr>(NewStart)) {
3435 const SCEV *NewLHS =
3436 getAddRecExpr(NewStart, Step, AR->getLoop(),
3437 NoWrap ? SCEV::FlagNW : SCEV::FlagNone);
3438 if (LHS != NewLHS)
3439 return getUDivExpr(NewLHS, RHS);
3440 }
3441 }
3442 }
3443 // (A*B)/C --> A*(B/C) if safe and B/C can be folded.
3444 if (const SCEVMulExpr *M = dyn_cast<SCEVMulExpr>(LHS)) {
3445 if (M->hasNoUnsignedWrap()) {
3446 // Find an operand that's safely divisible.
3447 for (unsigned i = 0, e = M->getNumOperands(); i != e; ++i) {
3448 const SCEV *Op = M->getOperand(i);
3449 const SCEV *Div = getUDivExpr(Op, RHSC);
3450 if (!isa<SCEVUDivExpr>(Div) && getMulExpr(Div, RHSC) == Op) {
3451 SmallVector<SCEVUse, 4> Operands(M->operands());
3452 Operands[i] = Div;
3453 return getMulExpr(Operands);
3454 }
3455 }
3456
3457 // Even if it's not divisible, try to remove a common factor.
3458 if (const auto *LHSC = dyn_cast<SCEVConstant>(M->getOperand(0))) {
3459 APInt Factor = APIntOps::GreatestCommonDivisor(LHSC->getAPInt(),
3460 RHSC->getAPInt());
3461 if (!Factor.isIntN(1)) {
3462 SmallVector<SCEVUse, 2> NewOperands;
3463 NewOperands.push_back(getConstant(LHSC->getAPInt().udiv(Factor)));
3464 append_range(NewOperands, M->operands().drop_front());
3465 const SCEV *NewMul = getMulExpr(NewOperands);
3466 return getUDivExpr(NewMul,
3467 getConstant(RHSC->getAPInt().udiv(Factor)));
3468 }
3469 }
3470 }
3471 }
3472
3473 // (A/B)/C --> A/(B*C) if safe and B*C can be folded.
3474 if (const SCEVUDivExpr *OtherDiv = dyn_cast<SCEVUDivExpr>(LHS)) {
3475 if (auto *DivisorConstant =
3476 dyn_cast<SCEVConstant>(OtherDiv->getRHS())) {
3477 bool Overflow = false;
3478 APInt NewRHS =
3479 DivisorConstant->getAPInt().umul_ov(RHSC->getAPInt(), Overflow);
3480 if (Overflow) {
3481 return getConstant(RHSC->getType(), 0, false);
3482 }
3483 return getUDivExpr(OtherDiv->getLHS(), getConstant(NewRHS));
3484 }
3485 }
3486
3487 // (A+B)/C --> (A/C + B/C) if the add does not unsigned wrap and A/C and
3488 // B/C can be folded.
3489 if (const SCEVAddExpr *A = dyn_cast<SCEVAddExpr>(LHS)) {
3490 if (A->hasNoUnsignedWrap()) {
3492 for (unsigned i = 0, e = A->getNumOperands(); i != e; ++i) {
3493 const SCEV *Op = getUDivExpr(A->getOperand(i), RHS);
3494 if (isa<SCEVUDivExpr>(Op) ||
3495 getMulExpr(Op, RHS) != A->getOperand(i))
3496 break;
3497 Operands.push_back(Op);
3498 }
3499 if (Operands.size() == A->getNumOperands())
3500 return getAddExpr(Operands);
3501 }
3502 }
3503
3504 // ((N - M) + (M * A)) / N --> ((N - 1) + (M * A)) / N
3505 // This is an idiom for rounding A up to the next multiple of N, where A
3506 // is aready known to be a multiple of M. In this case, instcombine can
3507 // see that some low bits of the added constant are unused, so can clear
3508 // them, but we want to canonicalise to set the low bits. This makes the
3509 // pattern easier to match, without needing to check for known bits in
3510 // A*M.
3511 const APInt &N = RHSC->getAPInt();
3512 const APInt *NMinusM, *M;
3513 const SCEV *A;
3514 if (match(LHS, m_scev_Add(m_scev_APInt(NMinusM),
3515 m_scev_Mul(m_scev_APInt(M), m_SCEV(A))))) {
3516 if (N.isPowerOf2() && M->isPowerOf2() && M->ult(N) &&
3517 *NMinusM == N - *M) {
3518 return getUDivExpr(
3520 RHS);
3521 }
3522 }
3523
3524 // Fold if both operands are constant.
3525 if (const SCEVConstant *LHSC = dyn_cast<SCEVConstant>(LHS))
3526 return getConstant(LHSC->getAPInt().udiv(RHSC->getAPInt()));
3527 }
3528 }
3529
3530 // ((-C + (C smax %x)) /u %x) evaluates to zero, for any positive constant C.
3531 const APInt *NegC, *C;
3532 if (match(LHS,
3535 NegC->isNegative() && !NegC->isMinSignedValue() && *C == -*NegC)
3536 return getZero(LHS->getType());
3537
3538 // (%a * %b)<nuw> / %b -> %a
3539 const auto *Mul = dyn_cast<SCEVMulExpr>(LHS);
3540 if (Mul && Mul->hasNoUnsignedWrap()) {
3541 for (int i = 0, e = Mul->getNumOperands(); i != e; ++i) {
3542 if (Mul->getOperand(i) == RHS) {
3544 append_range(Operands, Mul->operands().take_front(i));
3545 append_range(Operands, Mul->operands().drop_front(i + 1));
3546 return getMulExpr(Operands);
3547 }
3548 }
3549 }
3550
3551 // TODO: Generalize to handle any common factors.
3552 // udiv (mul nuw a, vscale), (mul nuw b, vscale) --> udiv a, b
3553 const SCEV *NewLHS, *NewRHS;
3554 if (match(LHS, m_scev_c_NUWMul(m_SCEV(NewLHS), m_SCEVVScale())) &&
3555 match(RHS, m_scev_c_NUWMul(m_SCEV(NewRHS), m_SCEVVScale())))
3556 return getUDivExpr(NewLHS, NewRHS);
3557
3558 return getOrCreateUDivExpr(LHS, RHS);
3559}
3560
3561/// Get a canonical unsigned division expression, or something simpler if
3562/// possible. There is no representation for an exact udiv in SCEV IR, but we
3563/// can attempt to optimize it prior to construction.
3565 // Currently there is no exact specific logic.
3566
3567 return getUDivExpr(LHS, RHS);
3568}
3569
3570/// Get an add recurrence expression for the specified loop. Simplify the
3571/// expression as much as possible.
3573 const Loop *L, SCEVFlagsPair Flags) {
3575 Operands.push_back(Start);
3576 if (const SCEVAddRecExpr *StepChrec = dyn_cast<SCEVAddRecExpr>(Step))
3577 if (StepChrec->getLoop() == L) {
3578 append_range(Operands, StepChrec->operands());
3579 // The use flags describe the two-operand recurrence, not the flattened
3580 // one built here, so drop them just like the expression's NUW/NSW.
3581 return getAddRecExpr(Operands, L,
3582 maskFlags(Flags.ExprFlags, SCEV::FlagNW));
3583 }
3584
3585 Operands.push_back(Step);
3586 return getAddRecExpr(Operands, L, Flags);
3587}
3588
3589/// Get an add recurrence expression for the specified loop. Simplify the
3590/// expression as much as possible.
3592 const Loop *L, SCEVFlagsPair NWFlags) {
3593 SCEVFlags ExprFlags = NWFlags.ExprFlags;
3594 SCEVFlags UseFlags = NWFlags.UseFlags;
3595 assert(!(UseFlags & ~(SCEV::FlagNUW | SCEV::FlagNSW)) &&
3596 "only nuw or nsw allowed");
3597 if (Operands.size() == 1) return Operands[0];
3598#ifndef NDEBUG
3600 for (const SCEV *Op : llvm::drop_begin(Operands)) {
3601 assert(getEffectiveSCEVType(Op->getType()) == ETy &&
3602 "SCEVAddRecExpr operand types don't match!");
3603 assert(!Op->getType()->isPointerTy() && "Step must be integer");
3604 }
3605 for (const SCEV *Op : Operands)
3607 "SCEVAddRecExpr operand is not available at loop entry!");
3608#endif
3609
3610 if (Operands.back()->isZero()) {
3611 Operands.pop_back();
3612 return getAddRecExpr(Operands, L, SCEV::FlagNone); // {X,+,0} --> X
3613 }
3614
3615 // It's tempting to want to call getConstantMaxBackedgeTakenCount count here and
3616 // use that information to infer NUW and NSW flags. However, computing a
3617 // BE count requires calling getAddRecExpr, so we may not yet have a
3618 // meaningful BE count at this point (and if we don't, we'd be stuck
3619 // with a SCEVCouldNotCompute as the cached BE count).
3620
3621 ExprFlags = StrengthenNoWrapFlags(this, scAddRecExpr, Operands, ExprFlags);
3622
3623 return {getOrCreateAddRecExpr(Operands, L, ExprFlags), UseFlags};
3624}
3625
3627 ArrayRef<SCEVUse> IndexExprs) {
3628 const SCEV *BaseExpr = getSCEV(GEP->getPointerOperand());
3629 // getSCEV(Base)->getType() has the same address space as Base->getType()
3630 // because SCEV::getType() preserves the address space.
3631 GEPNoWrapFlags BaseNW = GEP->getNoWrapFlags();
3632 GEPNoWrapFlags OffsetNW = GEP->getNoWrapFlags();
3633 if (BaseNW != GEPNoWrapFlags::none()) {
3634 // We'd like to propagate flags from the IR to the corresponding SCEV nodes,
3635 // but to do that, we have to ensure that said flag is valid in the entire
3636 // defined scope of the SCEV.
3637 // TODO: non-instructions have global scope. We might be able to prove
3638 // some global scope cases
3639 auto *GEPI = dyn_cast<Instruction>(GEP);
3640 if (!GEPI || !isSCEVExprNeverPoison(GEPI)) {
3641 BaseNW = OffsetNW = GEPNoWrapFlags::none();
3642 } else if (any_of(IndexExprs, [&](const SCEVUse &IndexExpr) {
3643 const SCEV *Idx = IndexExpr;
3644 return !isa<SCEVConstant>(Idx) &&
3645 !isGuaranteedToTransferExecutionTo(
3646 getDefiningScopeBound({Idx}), GEPI);
3647 })) {
3648 // The offset flags should not take into account the base pointer
3649 // defining scope, as the offset only depends on the indices. Thus,
3650 // derive the scope bound for the offset flags from each index operand
3651 // individually.
3652 OffsetNW = GEPNoWrapFlags::none();
3653 }
3654 }
3655
3656 return getGEPExpr(BaseExpr, IndexExprs, GEP->getSourceElementType(), BaseNW,
3657 OffsetNW);
3658}
3659
3661 ArrayRef<SCEVUse> IndexExprs,
3662 Type *SrcElementTy,
3663 GEPNoWrapFlags BaseNW,
3664 GEPNoWrapFlags OffsetNW) {
3665 SCEVFlags OffsetWrap = SCEV::FlagNone;
3666 if (OffsetNW.hasNoUnsignedSignedWrap())
3667 OffsetWrap = setFlags(OffsetWrap, SCEV::FlagNSW);
3668 if (OffsetNW.hasNoUnsignedWrap())
3669 OffsetWrap = setFlags(OffsetWrap, SCEV::FlagNUW);
3670
3671 Type *CurTy = BaseExpr->getType();
3672 Type *IntIdxTy = getEffectiveSCEVType(BaseExpr->getType());
3673 bool FirstIter = true;
3675 for (SCEVUse IndexExpr : IndexExprs) {
3676 // Compute the (potentially symbolic) offset in bytes for this index.
3677 if (StructType *STy = dyn_cast<StructType>(CurTy)) {
3678 // For a struct, add the member offset.
3679 ConstantInt *Index = cast<SCEVConstant>(IndexExpr)->getValue();
3680 unsigned FieldNo = Index->getZExtValue();
3681 const SCEV *FieldOffset = getOffsetOfExpr(IntIdxTy, STy, FieldNo);
3682 Offsets.push_back(FieldOffset);
3683
3684 // Update CurTy to the type of the field at Index.
3685 CurTy = STy->getTypeAtIndex(Index);
3686 } else {
3687 // Update CurTy to its element type.
3688 if (FirstIter) {
3689 assert(isa<PointerType>(CurTy) &&
3690 "The first index of a GEP indexes a pointer");
3691 CurTy = SrcElementTy;
3692 FirstIter = false;
3693 } else {
3694 CurTy = GetElementPtrInst::getTypeAtIndex(CurTy, (uint64_t)0);
3695 }
3696 // For an array, add the element offset, explicitly scaled.
3697 const SCEV *ElementSize = getSizeOfExpr(IntIdxTy, CurTy);
3698 // Getelementptr indices are signed.
3699 IndexExpr = getTruncateOrSignExtend(IndexExpr, IntIdxTy);
3700
3701 // Multiply the index by the element size to compute the element offset.
3702 const SCEV *LocalOffset = getMulExpr(IndexExpr, ElementSize, OffsetWrap);
3703 Offsets.push_back(LocalOffset);
3704 }
3705 }
3706
3707 // Handle degenerate case of GEP without offsets.
3708 if (Offsets.empty())
3709 return BaseExpr;
3710
3711 // Add the offsets together, assuming nsw if inbounds.
3712 const SCEV *Offset = getAddExpr(Offsets, OffsetWrap);
3713 // Add the base address and the offset. We cannot use the nsw flag, as the
3714 // base address is unsigned. However, if we know that the offset is
3715 // non-negative, we can use nuw.
3716 bool NUW = BaseNW.hasNoUnsignedWrap() ||
3718 SCEVFlags BaseWrap = NUW ? SCEV::FlagNUW : SCEV::FlagNone;
3719 const SCEV *GEPExpr = getAddExpr(BaseExpr, Offset, BaseWrap);
3720 assert(BaseExpr->getType() == GEPExpr->getType() &&
3721 "GEP should not change type mid-flight.");
3722 return GEPExpr;
3723}
3724
3725SCEV *ScalarEvolution::findExistingSCEVInCache(SCEVTypes SCEVType,
3727 const Loop *L) {
3728 assert((SCEVType != scAddRecExpr || L) &&
3729 "L must be passed to find existing AddRecs");
3731 ID.AddInteger(SCEVType);
3732 for (SCEVUse Op : Ops)
3733 ID.AddPointer(Op.getOpaqueValue());
3734 if (L)
3735 ID.AddPointer(L);
3737 return UniqueSCEVs.lookup(ID, Token);
3738}
3739
3740const SCEV *ScalarEvolution::getAbsExpr(const SCEV *Op, bool IsNSW) {
3741 SCEVFlags Flags = IsNSW ? SCEV::FlagNSW : SCEV::FlagNone;
3742 return getSMaxExpr(Op, getNegativeSCEV(Op, Flags));
3743}
3744
3747 assert(SCEVMinMaxExpr::isMinMaxType(Kind) && "Not a SCEVMinMaxExpr!");
3748 assert(!Ops.empty() && "Cannot get empty (u|s)(min|max)!");
3749 if (Ops.size() == 1) return Ops[0];
3750#ifndef NDEBUG
3751 Type *ETy = getEffectiveSCEVType(Ops[0]->getType());
3752 for (unsigned i = 1, e = Ops.size(); i != e; ++i) {
3753 assert(getEffectiveSCEVType(Ops[i]->getType()) == ETy &&
3754 "Operand types don't match!");
3755 assert(Ops[0]->getType()->isPointerTy() ==
3756 Ops[i]->getType()->isPointerTy() &&
3757 "min/max should be consistently pointerish");
3758 }
3759#endif
3760
3761 bool IsSigned = Kind == scSMaxExpr || Kind == scSMinExpr;
3762 bool IsMax = Kind == scSMaxExpr || Kind == scUMaxExpr;
3763
3765 Opts, *this, LI, DT, Ops,
3766 [&](const APInt &C1, const APInt &C2) {
3767 switch (Kind) {
3768 case scSMaxExpr:
3769 return APIntOps::smax(C1, C2);
3770 case scSMinExpr:
3771 return APIntOps::smin(C1, C2);
3772 case scUMaxExpr:
3773 return APIntOps::umax(C1, C2);
3774 case scUMinExpr:
3775 return APIntOps::umin(C1, C2);
3776 default:
3777 llvm_unreachable("Unknown SCEV min/max opcode");
3778 }
3779 },
3780 [&](const APInt &C) {
3781 // identity
3782 if (IsMax)
3783 return IsSigned ? C.isMinSignedValue() : C.isMinValue();
3784 else
3785 return IsSigned ? C.isMaxSignedValue() : C.isMaxValue();
3786 },
3787 [&](const APInt &C) {
3788 // absorber
3789 if (IsMax)
3790 return IsSigned ? C.isMaxSignedValue() : C.isMaxValue();
3791 else
3792 return IsSigned ? C.isMinSignedValue() : C.isMinValue();
3793 });
3794 if (Folded)
3795 return Folded;
3796
3797 // Check if we have created the same expression before.
3798 if (const SCEV *S = findExistingSCEVInCache(Kind, Ops)) {
3799 return S;
3800 }
3801
3802 // Find the first operation of the same kind
3803 unsigned Idx = 0;
3804 while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < Kind)
3805 ++Idx;
3806
3807 // Check to see if one of the operands is of the same kind. If so, expand its
3808 // operands onto our operand list, and recurse to simplify.
3809 if (Idx < Ops.size()) {
3810 bool DeletedAny = false;
3811 while (Ops[Idx]->getSCEVType() == Kind) {
3812 const SCEVMinMaxExpr *SMME = cast<SCEVMinMaxExpr>(Ops[Idx]);
3813 Ops.erase(Ops.begin()+Idx);
3814 append_range(Ops, SMME->operands());
3815 DeletedAny = true;
3816 }
3817
3818 if (DeletedAny)
3819 return getMinMaxExpr(Kind, Ops);
3820 }
3821
3822 // Okay, check to see if the same value occurs in the operand list twice. If
3823 // so, delete one. Since we sorted the list, these values are required to
3824 // be adjacent.
3829 llvm::CmpInst::Predicate FirstPred = IsMax ? GEPred : LEPred;
3830 llvm::CmpInst::Predicate SecondPred = IsMax ? LEPred : GEPred;
3831 for (unsigned i = 0, e = Ops.size() - 1; i != e; ++i) {
3832 if (SCEVUse Common = SCEVUse::getCommon(Ops[i], Ops[i + 1]))
3833 Ops[i] = Ops[i + 1] = Common;
3834 if (Ops[i] == Ops[i + 1] ||
3835 isKnownViaNonRecursiveReasoning(FirstPred, Ops[i], Ops[i + 1])) {
3836 // X op Y op Y --> X op Y
3837 // X op Y --> X, if we know X, Y are ordered appropriately
3838 Ops.erase(Ops.begin() + i + 1, Ops.begin() + i + 2);
3839 --i;
3840 --e;
3841 } else if (isKnownViaNonRecursiveReasoning(SecondPred, Ops[i],
3842 Ops[i + 1])) {
3843 // X op Y --> Y, if we know X, Y are ordered appropriately
3844 Ops.erase(Ops.begin() + i, Ops.begin() + i + 1);
3845 --i;
3846 --e;
3847 }
3848 }
3849
3850 if (Ops.size() == 1) return Ops[0];
3851
3852 assert(!Ops.empty() && "Reduced smax down to nothing!");
3853
3854 // Okay, it looks like we really DO need an expr. Check to see if we
3855 // already have one, otherwise create a new one.
3857 ID.AddInteger(Kind);
3858 for (SCEVUse Op : Ops)
3859 ID.AddPointer(Op.getOpaqueValue());
3861 const SCEV *ExistingSCEV = UniqueSCEVs.lookup(ID, Token);
3862 if (ExistingSCEV)
3863 return ExistingSCEV;
3864 SCEVUse *O = SCEVAllocator.Allocate<SCEVUse>(Ops.size());
3866 SCEV *S = new (SCEVAllocator)
3867 SCEVMinMaxExpr(ID.Intern(SCEVAllocator), Kind, O, Ops.size());
3868
3869 UniqueSCEVs.insert(S, Token);
3870 S->computeAndSetCanonical(*this);
3871 registerUser(S, Ops);
3872 return S;
3873}
3874
3875namespace {
3876
3877class SCEVSequentialMinMaxDeduplicatingVisitor final
3878 : public SCEVVisitor<SCEVSequentialMinMaxDeduplicatingVisitor,
3879 std::optional<const SCEV *>> {
3880 using RetVal = std::optional<const SCEV *>;
3881
3882 ScalarEvolution &SE;
3883 const SCEVTypes RootKind; // Must be a sequential min/max expression.
3884 const SCEVTypes NonSequentialRootKind; // Non-sequential variant of RootKind.
3886
3887 bool canRecurseInto(SCEVTypes Kind) const {
3888 // We can only recurse into the SCEV expression of the same effective type
3889 // as the type of our root SCEV expression.
3890 return RootKind == Kind || NonSequentialRootKind == Kind;
3891 };
3892
3893 RetVal visit(const SCEV *S) {
3894 // Has the whole operand been seen already?
3895 if (!SeenOps.insert(S).second)
3896 return std::nullopt;
3898 SCEVTypes Kind = S->getSCEVType();
3899
3900 if (!canRecurseInto(Kind))
3901 return S;
3902
3903 auto *NAry = cast<SCEVNAryExpr>(S);
3904 SmallVector<SCEVUse> NewOps;
3905 bool Changed = visit(Kind, NAry->operands(), NewOps);
3906
3907 if (!Changed)
3908 return S;
3909 if (NewOps.empty())
3910 return std::nullopt;
3911
3913 ? SE.getSequentialMinMaxExpr(Kind, NewOps)
3914 : SE.getMinMaxExpr(Kind, NewOps);
3915 }
3916 return S;
3917 }
3918
3919public:
3920 SCEVSequentialMinMaxDeduplicatingVisitor(ScalarEvolution &SE,
3921 SCEVTypes RootKind)
3922 : SE(SE), RootKind(RootKind),
3923 NonSequentialRootKind(
3924 SCEVSequentialMinMaxExpr::getEquivalentNonSequentialSCEVType(
3925 RootKind)) {}
3926
3927 bool /*Changed*/ visit(SCEVTypes Kind, ArrayRef<SCEVUse> OrigOps,
3928 SmallVectorImpl<SCEVUse> &NewOps) {
3929 bool Changed = false;
3931 Ops.reserve(OrigOps.size());
3932
3933 for (const SCEV *Op : OrigOps) {
3934 RetVal NewOp = visit(Op);
3935 if (NewOp != Op)
3936 Changed = true;
3937 if (NewOp)
3938 Ops.emplace_back(*NewOp);
3939 }
3940
3941 if (Changed)
3942 NewOps = std::move(Ops);
3943 return Changed;
3944 }
3945};
3946
3947} // namespace
3948
3950 switch (Kind) {
3951 case scConstant:
3952 case scVScale:
3953 case scTruncate:
3954 case scZeroExtend:
3955 case scSignExtend:
3956 case scPtrToAddr:
3957 case scAddExpr:
3958 case scMulExpr:
3959 case scUDivExpr:
3960 case scAddRecExpr:
3961 case scUMaxExpr:
3962 case scSMaxExpr:
3963 case scUMinExpr:
3964 case scSMinExpr:
3965 case scUnknown:
3966 // If any operand is poison, the whole expression is poison.
3967 return true;
3969 // FIXME: if the *first* operand is poison, the whole expression is poison.
3970 return false; // Pessimistically, say that it does not propagate poison.
3971 case scCouldNotCompute:
3972 llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!");
3973 }
3974 llvm_unreachable("Unknown SCEV kind!");
3975}
3976
3977namespace {
3978// The only way poison may be introduced in a SCEV expression is from a
3979// poison SCEVUnknown (ConstantExprs are also represented as SCEVUnknown,
3980// not SCEVConstant). Notably, SCEVFlags on SCEV nodes can *not*
3981// introduce poison -- they encode guaranteed, non-speculated knowledge.
3982//
3983// Additionally, all SCEV nodes propagate poison from inputs to outputs,
3984// with the notable exception of umin_seq, where only poison from the first
3985// operand is (unconditionally) propagated.
3986struct SCEVPoisonCollector {
3987 bool LookThroughMaybePoisonBlocking;
3988 SmallPtrSet<const SCEVUnknown *, 4> MaybePoison;
3989 SCEVPoisonCollector(bool LookThroughMaybePoisonBlocking)
3990 : LookThroughMaybePoisonBlocking(LookThroughMaybePoisonBlocking) {}
3991
3992 bool follow(const SCEV *S) {
3993 if (!LookThroughMaybePoisonBlocking &&
3995 return false;
3996
3997 if (auto *SU = dyn_cast<SCEVUnknown>(S)) {
3998 if (!isGuaranteedNotToBePoison(SU->getValue()))
3999 MaybePoison.insert(SU);
4000 }
4001 return true;
4002 }
4003 bool isDone() const { return false; }
4004};
4005} // namespace
4006
4007/// Return true if V is poison given that AssumedPoison is already poison.
4008static bool impliesPoison(const SCEV *AssumedPoison, const SCEV *S) {
4009 // First collect all SCEVs that might result in AssumedPoison to be poison.
4010 // We need to look through potentially poison-blocking operations here,
4011 // because we want to find all SCEVs that *might* result in poison, not only
4012 // those that are *required* to.
4013 SCEVPoisonCollector PC1(/* LookThroughMaybePoisonBlocking */ true);
4014 visitAll(AssumedPoison, PC1);
4015
4016 // AssumedPoison is never poison. As the assumption is false, the implication
4017 // is true. Don't bother walking the other SCEV in this case.
4018 if (PC1.MaybePoison.empty())
4019 return true;
4020
4021 // Collect all SCEVs in S that, if poison, *will* result in S being poison
4022 // as well. We cannot look through potentially poison-blocking operations
4023 // here, as their arguments only *may* make the result poison.
4024 SCEVPoisonCollector PC2(/* LookThroughMaybePoisonBlocking */ false);
4025 visitAll(S, PC2);
4026
4027 // Make sure that no matter which SCEV in PC1.MaybePoison is actually poison,
4028 // it will also make S poison by being part of PC2.MaybePoison.
4029 return llvm::set_is_subset(PC1.MaybePoison, PC2.MaybePoison);
4030}
4031
4033 SmallPtrSetImpl<const Value *> &Result, const SCEV *S) {
4034 SCEVPoisonCollector PC(/* LookThroughMaybePoisonBlocking */ false);
4035 visitAll(S, PC);
4036 for (const SCEVUnknown *SU : PC.MaybePoison)
4037 Result.insert(SU->getValue());
4038}
4039
4041 const SCEV *S, Instruction *I,
4042 SmallVectorImpl<Instruction *> &DropPoisonGeneratingInsts) {
4043 // If the instruction cannot be poison, it's always safe to reuse.
4045 return true;
4046
4047 // Otherwise, it is possible that I is more poisonous that S. Collect the
4048 // poison-contributors of S, and then check whether I has any additional
4049 // poison-contributors. Poison that is contributed through poison-generating
4050 // flags is handled by dropping those flags instead.
4052 getPoisonGeneratingValues(PoisonVals, S);
4053
4054 SmallVector<Value *> Worklist;
4056 Worklist.push_back(I);
4057 unsigned NumVisitedInsts = 0;
4058 const unsigned InstLimit = std::max<unsigned>(16, S->getExpressionSize());
4059 while (!Worklist.empty()) {
4060 Value *V = Worklist.pop_back_val();
4061 if (!Visited.insert(V).second)
4062 continue;
4063
4064 // Either the value can't be poison, or the S would also be poison if it
4065 // is.
4066 if (PoisonVals.contains(V) || ::isGuaranteedNotToBePoison(V))
4067 continue;
4068
4069 // Avoid walking large instruction graphs.
4070 if (++NumVisitedInsts > InstLimit)
4071 return false;
4072
4073 auto *I = dyn_cast<Instruction>(V);
4074 if (!I)
4075 return false;
4076
4077 // Disjoint or instructions are interpreted as adds by SCEV. However, we
4078 // can't replace an arbitrary add with disjoint or, even if we drop the
4079 // flag. We would need to convert the or into an add.
4080 if (auto *PDI = dyn_cast<PossiblyDisjointInst>(I))
4081 if (PDI->isDisjoint())
4082 return false;
4083
4084 // FIXME: Ignore vscale, even though it technically could be poison. Do this
4085 // because SCEV currently assumes it can't be poison. Remove this special
4086 // case once we proper model when vscale can be poison.
4087 if (auto *II = dyn_cast<IntrinsicInst>(I);
4088 II && II->getIntrinsicID() == Intrinsic::vscale)
4089 continue;
4090
4091 if (canCreatePoison(cast<Operator>(I), /*ConsiderFlagsAndMetadata*/ false))
4092 return false;
4093
4094 // If the instruction can't create poison, we can recurse to its operands.
4095 if (I->hasPoisonGeneratingAnnotations())
4096 DropPoisonGeneratingInsts.push_back(I);
4097
4098 llvm::append_range(Worklist, I->operands());
4099 }
4100 return true;
4101}
4102
4103const SCEV *
4106 assert(SCEVSequentialMinMaxExpr::isSequentialMinMaxType(Kind) &&
4107 "Not a SCEVSequentialMinMaxExpr!");
4108 assert(!Ops.empty() && "Cannot get empty (u|s)(min|max)!");
4109 if (Ops.size() == 1)
4110 return Ops[0];
4111#ifndef NDEBUG
4112 Type *ETy = getEffectiveSCEVType(Ops[0]->getType());
4113 for (unsigned i = 1, e = Ops.size(); i != e; ++i) {
4114 assert(getEffectiveSCEVType(Ops[i]->getType()) == ETy &&
4115 "Operand types don't match!");
4116 assert(Ops[0]->getType()->isPointerTy() ==
4117 Ops[i]->getType()->isPointerTy() &&
4118 "min/max should be consistently pointerish");
4119 }
4120#endif
4121
4122 // Note that SCEVSequentialMinMaxExpr is *NOT* commutative,
4123 // so we can *NOT* do any kind of sorting of the expressions!
4124
4125 // Check if we have created the same expression before.
4126 if (const SCEV *S = findExistingSCEVInCache(Kind, Ops))
4127 return S;
4128
4129 // FIXME: there are *some* simplifications that we can do here.
4130
4131 // Keep only the first instance of an operand.
4132 {
4133 SCEVSequentialMinMaxDeduplicatingVisitor Deduplicator(*this, Kind);
4134 bool Changed = Deduplicator.visit(Kind, Ops, Ops);
4135 if (Changed)
4136 return getSequentialMinMaxExpr(Kind, Ops);
4137 }
4138
4139 // Check to see if one of the operands is of the same kind. If so, expand its
4140 // operands onto our operand list, and recurse to simplify.
4141 {
4142 unsigned Idx = 0;
4143 bool DeletedAny = false;
4144 while (Idx < Ops.size()) {
4145 if (Ops[Idx]->getSCEVType() != Kind) {
4146 ++Idx;
4147 continue;
4148 }
4149 const auto *SMME = cast<SCEVSequentialMinMaxExpr>(Ops[Idx]);
4150 Ops.erase(Ops.begin() + Idx);
4151 Ops.insert(Ops.begin() + Idx, SMME->operands().begin(),
4152 SMME->operands().end());
4153 DeletedAny = true;
4154 }
4155
4156 if (DeletedAny)
4157 return getSequentialMinMaxExpr(Kind, Ops);
4158 }
4159
4160 const SCEV *SaturationPoint;
4162 switch (Kind) {
4164 SaturationPoint = getZero(Ops[0]->getType());
4165 Pred = ICmpInst::ICMP_ULE;
4166 break;
4167 default:
4168 llvm_unreachable("Not a sequential min/max type.");
4169 }
4170
4171 for (unsigned i = 1, e = Ops.size(); i != e; ++i) {
4173 continue;
4174 // We can replace %x umin_seq %y with %x umin %y if either:
4175 // * %y being poison implies %x is also poison.
4176 // * %x cannot be the saturating value (e.g. zero for umin).
4177 if (::impliesPoison(Ops[i], Ops[i - 1]) ||
4178 isKnownViaNonRecursiveReasoning(ICmpInst::ICMP_NE, Ops[i - 1],
4179 SaturationPoint)) {
4180 SmallVector<SCEVUse, 2> SeqOps = {Ops[i - 1], Ops[i]};
4181 Ops[i - 1] = getMinMaxExpr(
4183 SeqOps);
4184 Ops.erase(Ops.begin() + i);
4185 return getSequentialMinMaxExpr(Kind, Ops);
4186 }
4187 // Fold %x umin_seq %y to %x if %x ule %y.
4188 // TODO: We might be able to prove the predicate for a later operand.
4189 if (isKnownViaNonRecursiveReasoning(Pred, Ops[i - 1], Ops[i])) {
4190 Ops.erase(Ops.begin() + i);
4191 return getSequentialMinMaxExpr(Kind, Ops);
4192 }
4193 }
4194
4195 // Okay, it looks like we really DO need an expr. Check to see if we
4196 // already have one, otherwise create a new one.
4198 ID.AddInteger(Kind);
4199 for (SCEVUse Op : Ops)
4200 ID.AddPointer(Op.getOpaqueValue());
4202 const SCEV *ExistingSCEV = UniqueSCEVs.lookup(ID, Token);
4203 if (ExistingSCEV)
4204 return ExistingSCEV;
4205
4206 SCEVUse *O = SCEVAllocator.Allocate<SCEVUse>(Ops.size());
4208 SCEV *S = new (SCEVAllocator)
4209 SCEVSequentialMinMaxExpr(ID.Intern(SCEVAllocator), Kind, O, Ops.size());
4210
4211 UniqueSCEVs.insert(S, Token);
4212 S->computeAndSetCanonical(*this);
4213 registerUser(S, Ops);
4214 return S;
4215}
4216
4221
4225
4230
4234
4239
4243
4245 bool Sequential) {
4246 SmallVector<SCEVUse, 2> Ops = {LHS, RHS};
4247 return getUMinExpr(Ops, Sequential);
4248}
4249
4255
4256const SCEV *
4258 const SCEV *Res = getConstant(IntTy, Size.getKnownMinValue());
4259 if (Size.isScalable())
4260 Res = getMulExpr(Res, getVScale(IntTy));
4261 return Res;
4262}
4263
4265 return getSizeOfExpr(IntTy, getDataLayout().getTypeAllocSize(AllocTy));
4266}
4267
4269 return getSizeOfExpr(IntTy, getDataLayout().getTypeStoreSize(StoreTy));
4270}
4271
4273 StructType *STy,
4274 unsigned FieldNo) {
4275 // We can bypass creating a target-independent constant expression and then
4276 // folding it back into a ConstantInt. This is just a compile-time
4277 // optimization.
4278 const StructLayout *SL = getDataLayout().getStructLayout(STy);
4279 assert(!SL->getSizeInBits().isScalable() &&
4280 "Cannot get offset for structure containing scalable vector types");
4281 return getConstant(IntTy, SL->getElementOffset(FieldNo));
4282}
4283
4285 // Don't attempt to do anything other than create a SCEVUnknown object
4286 // here. createSCEV only calls getUnknown after checking for all other
4287 // interesting possibilities, and any other code that calls getUnknown
4288 // is doing so in order to hide a value from SCEV canonicalization.
4289
4292 ID.AddPointer(V);
4294 if (SCEV *S = UniqueSCEVs.lookup(ID, Token)) {
4295 assert(cast<SCEVUnknown>(S)->getValue() == V &&
4296 "Stale SCEVUnknown in uniquing map!");
4297 return S;
4298 }
4299 SCEV *S = new (SCEVAllocator) SCEVUnknown(ID.Intern(SCEVAllocator), V, this,
4300 FirstUnknown, NextUnknownOrderID++);
4301 FirstUnknown = cast<SCEVUnknown>(S);
4302 UniqueSCEVs.insert(S, Token);
4303 S->computeAndSetCanonical(*this);
4304 return S;
4305}
4306
4307//===----------------------------------------------------------------------===//
4308// Basic SCEV Analysis and PHI Idiom Recognition Code
4309//
4310
4311/// Test if values of the given type are analyzable within the SCEV
4312/// framework. This primarily includes integer types, and it can optionally
4313/// include pointer types if the ScalarEvolution class has access to
4314/// target-specific information.
4316 // Integers and pointers are always SCEVable.
4317 return Ty->isIntOrPtrTy();
4318}
4319
4320/// Return the size in bits of the specified type, for which isSCEVable must
4321/// return true.
4323 assert(isSCEVable(Ty) && "Type is not SCEVable!");
4324 if (Ty->isPointerTy())
4326 return getDataLayout().getTypeSizeInBits(Ty);
4327}
4328
4329/// Return a type with the same bitwidth as the given type and which represents
4330/// how SCEV will treat the given type, for which isSCEVable must return
4331/// true. For pointer types, this is the pointer index sized integer type.
4333 assert(isSCEVable(Ty) && "Type is not SCEVable!");
4334
4335 if (Ty->isIntegerTy())
4336 return Ty;
4337
4338 // The only other support type is pointer.
4339 assert(Ty->isPointerTy() && "Unexpected non-pointer non-integer type!");
4340 return getDataLayout().getIndexType(Ty);
4341}
4342
4344 return getTypeSizeInBits(T1) >= getTypeSizeInBits(T2) ? T1 : T2;
4345}
4346
4348 const SCEV *B) {
4349 /// For a valid use point to exist, the defining scope of one operand
4350 /// must dominate the other.
4351 bool PreciseA, PreciseB;
4352 auto *ScopeA = getDefiningScopeBound({A}, PreciseA);
4353 auto *ScopeB = getDefiningScopeBound({B}, PreciseB);
4354 if (!PreciseA || !PreciseB)
4355 // Can't tell.
4356 return false;
4357 return (ScopeA == ScopeB) || DT.dominates(ScopeA, ScopeB) ||
4358 DT.dominates(ScopeB, ScopeA);
4359}
4360
4362 return CouldNotCompute.get();
4363}
4364
4365bool ScalarEvolution::checkValidity(const SCEV *S) const {
4366 bool ContainsNulls = SCEVExprContains(S, [](const SCEV *S) {
4367 auto *SU = dyn_cast<SCEVUnknown>(S);
4368 return SU && SU->getValue() == nullptr;
4369 });
4370
4371 return !ContainsNulls;
4372}
4373
4375 HasRecMapType::iterator I = HasRecMap.find(S);
4376 if (I != HasRecMap.end())
4377 return I->second;
4378
4379 bool FoundAddRec =
4380 SCEVExprContains(S, [](const SCEV *S) { return isa<SCEVAddRecExpr>(S); });
4381 HasRecMap.insert({S, FoundAddRec});
4382 return FoundAddRec;
4383}
4384
4385/// Return the ValueOffsetPair set for \p S. \p S can be represented
4386/// by the value and offset from any ValueOffsetPair in the set.
4387ArrayRef<Value *> ScalarEvolution::getSCEVValues(const SCEV *S) {
4388 ExprValueMapType::iterator SI = ExprValueMap.find_as(S);
4389 if (SI == ExprValueMap.end())
4390 return {};
4391 return SI->second;
4392}
4393
4394/// Erase Value from ValueExprMap and ExprValueMap. ValueExprMap.erase(V)
4395/// cannot be used separately. eraseValueFromMap should be used to remove
4396/// V from ValueExprMap and ExprValueMap at the same time.
4397void ScalarEvolution::eraseValueFromMap(Value *V) {
4398 ValueExprMapType::iterator I = ValueExprMap.find_as(V);
4399 if (I != ValueExprMap.end()) {
4400 auto EVIt = ExprValueMap.find(I->second);
4401 assert(is_contained(EVIt->second, V) && "Value not in ExprValueMap?");
4402 llvm::erase(EVIt->second, V);
4403 ValueExprMap.erase(I);
4404 }
4405}
4406
4407void ScalarEvolution::insertValueToMap(Value *V, const SCEV *S) {
4408 // A recursive query may have already computed the SCEV. It should be
4409 // equivalent, but may not necessarily be exactly the same, e.g. due to lazily
4410 // inferred nowrap flags.
4411 if (ValueExprMap.insert({SCEVCallbackVH(V, this), S}).second)
4412 ExprValueMap[S].push_back(V);
4413}
4414
4415/// Return an existing SCEV if it exists, otherwise analyze the expression and
4416/// create a new one.
4418 assert(isSCEVable(V->getType()) && "Value is not SCEVable!");
4419
4420 if (const SCEV *S = getExistingSCEV(V))
4421 return S;
4422 return createSCEVIter(V);
4423}
4424
4426 assert(isSCEVable(V->getType()) && "Value is not SCEVable!");
4427
4428 ValueExprMapType::iterator I = ValueExprMap.find_as(V);
4429 if (I != ValueExprMap.end()) {
4430 const SCEV *S = I->second;
4431 assert(checkValidity(S) &&
4432 "existing SCEV has not been properly invalidated");
4433 return S;
4434 }
4435 return nullptr;
4436}
4437
4438/// Return a SCEV corresponding to -V = -1*V
4440 if (const SCEVConstant *VC = dyn_cast<SCEVConstant>(V))
4441 return getConstant(
4442 cast<ConstantInt>(ConstantExpr::getNeg(VC->getValue())));
4443
4444 Type *Ty = V->getType();
4445 Ty = getEffectiveSCEVType(Ty);
4446 return getMulExpr(V, getMinusOne(Ty), Flags);
4447}
4448
4449/// If Expr computes ~A, return A else return nullptr
4450static const SCEV *MatchNotExpr(const SCEV *Expr) {
4451 const SCEV *MulOp;
4452 if (match(Expr, m_scev_Add(m_scev_AllOnes(),
4453 m_scev_Mul(m_scev_AllOnes(), m_SCEV(MulOp)))))
4454 return MulOp;
4455 return nullptr;
4456}
4457
4458/// Return a SCEV corresponding to ~V = -1-V
4460 assert(!V->getType()->isPointerTy() && "Can't negate pointer");
4461
4462 if (const SCEVConstant *VC = dyn_cast<SCEVConstant>(V))
4463 return getConstant(
4464 cast<ConstantInt>(ConstantExpr::getNot(VC->getValue())));
4465
4466 // Fold ~(u|s)(min|max)(~x, ~y) to (u|s)(max|min)(x, y)
4467 if (const SCEVMinMaxExpr *MME = dyn_cast<SCEVMinMaxExpr>(V)) {
4468 auto MatchMinMaxNegation = [&](const SCEVMinMaxExpr *MME) {
4469 SmallVector<SCEVUse, 2> MatchedOperands;
4470 for (const SCEV *Operand : MME->operands()) {
4471 const SCEV *Matched = MatchNotExpr(Operand);
4472 if (!Matched)
4473 return (const SCEV *)nullptr;
4474 MatchedOperands.push_back(Matched);
4475 }
4476 return getMinMaxExpr(SCEVMinMaxExpr::negate(MME->getSCEVType()),
4477 MatchedOperands);
4478 };
4479 if (const SCEV *Replaced = MatchMinMaxNegation(MME))
4480 return Replaced;
4481 }
4482
4483 Type *Ty = V->getType();
4484 Ty = getEffectiveSCEVType(Ty);
4485 return getMinusSCEV(getMinusOne(Ty), V);
4486}
4487
4489 assert(P->getType()->isPointerTy());
4490
4491 if (auto *AddRec = dyn_cast<SCEVAddRecExpr>(P)) {
4492 // The base of an AddRec is the first operand.
4493 SmallVector<SCEVUse> Ops{AddRec->operands()};
4494 Ops[0] = removePointerBase(Ops[0]);
4495 // Don't try to transfer nowrap flags for now. We could in some cases
4496 // (for example, if pointer operand of the AddRec is a SCEVUnknown).
4497 return getAddRecExpr(Ops, AddRec->getLoop(), SCEV::FlagNone);
4498 }
4499 if (auto *Add = dyn_cast<SCEVAddExpr>(P)) {
4500 // The base of an Add is the pointer operand.
4501 SmallVector<SCEVUse> Ops{Add->operands()};
4502 SCEVUse *PtrOp = nullptr;
4503 for (SCEVUse &AddOp : Ops) {
4504 if (AddOp->getType()->isPointerTy()) {
4505 assert(!PtrOp && "Cannot have multiple pointer ops");
4506 PtrOp = &AddOp;
4507 }
4508 }
4509 *PtrOp = removePointerBase(*PtrOp);
4510 // Don't try to transfer nowrap flags for now. We could in some cases
4511 // (for example, if the pointer operand of the Add is a SCEVUnknown).
4512 return getAddExpr(Ops);
4513 }
4514 // Any other expression must be a pointer base.
4515 return getZero(P->getType());
4516}
4517
4519 SCEVFlags Flags, unsigned Depth) {
4520 // Fast path: X - X --> 0.
4521 if (SCEVUse::getCommon(LHS, RHS))
4522 return getZero(LHS->getType());
4523
4524 // If we subtract two pointers with different pointer bases, bail.
4525 // Eventually, we're going to add an assertion to getMulExpr that we
4526 // can't multiply by a pointer.
4527 if (RHS->getType()->isPointerTy()) {
4528 if (!LHS->getType()->isPointerTy() ||
4529 getPointerBase(LHS) != getPointerBase(RHS))
4530 return getCouldNotCompute();
4531 LHS = removePointerBase(LHS);
4532 RHS = removePointerBase(RHS);
4533 }
4534
4535 // We represent LHS - RHS as LHS + (-1)*RHS. This transformation
4536 // makes it so that we cannot make much use of NUW.
4537 auto AddFlags = SCEV::FlagNone;
4538 const bool RHSIsNotMinSigned =
4540 if (hasFlags(Flags, SCEV::FlagNSW)) {
4541 // Let M be the minimum representable signed value. Then (-1)*RHS
4542 // signed-wraps if and only if RHS is M. That can happen even for
4543 // a NSW subtraction because e.g. (-1)*M signed-wraps even though
4544 // -1 - M does not. So to transfer NSW from LHS - RHS to LHS +
4545 // (-1)*RHS, we need to prove that RHS != M.
4546 //
4547 // If LHS is non-negative and we know that LHS - RHS does not
4548 // signed-wrap, then RHS cannot be M. So we can rule out signed-wrap
4549 // either by proving that RHS > M or that LHS >= 0.
4550 if (RHSIsNotMinSigned || isKnownNonNegative(LHS)) {
4551 AddFlags = SCEV::FlagNSW;
4552 }
4553 }
4554
4555 // FIXME: Find a correct way to transfer NSW to (-1)*M when LHS -
4556 // RHS is NSW and LHS >= 0.
4557 //
4558 // The difficulty here is that the NSW flag may have been proven
4559 // relative to a loop that is to be found in a recurrence in LHS and
4560 // not in RHS. Applying NSW to (-1)*M may then let the NSW have a
4561 // larger scope than intended.
4562 auto NegFlags = RHSIsNotMinSigned ? SCEV::FlagNSW : SCEV::FlagNone;
4563
4564 return getAddExpr(LHS, getNegativeSCEV(RHS, NegFlags), AddFlags, Depth);
4565}
4566
4568 unsigned Depth) {
4569 Type *SrcTy = V->getType();
4570 assert(SrcTy->isIntOrPtrTy() && Ty->isIntOrPtrTy() &&
4571 "Cannot truncate or zero extend with non-integer arguments!");
4572 if (getTypeSizeInBits(SrcTy) == getTypeSizeInBits(Ty))
4573 return V; // No conversion
4574 if (getTypeSizeInBits(SrcTy) > getTypeSizeInBits(Ty))
4575 return getTruncateExpr(V, Ty, Depth);
4576 return getZeroExtendExpr(V, Ty, Depth);
4577}
4578
4580 unsigned Depth) {
4581 Type *SrcTy = V->getType();
4582 assert(SrcTy->isIntOrPtrTy() && Ty->isIntOrPtrTy() &&
4583 "Cannot truncate or zero extend with non-integer arguments!");
4584 if (getTypeSizeInBits(SrcTy) == getTypeSizeInBits(Ty))
4585 return V; // No conversion
4586 if (getTypeSizeInBits(SrcTy) > getTypeSizeInBits(Ty))
4587 return getTruncateExpr(V, Ty, Depth);
4588 return getSignExtendExpr(V, Ty, Depth);
4589}
4590
4592 Type *SrcTy = V->getType();
4593 assert(SrcTy->isIntOrPtrTy() && Ty->isIntOrPtrTy() &&
4594 "Cannot noop or zero extend with non-integer arguments!");
4596 "getNoopOrZeroExtend cannot truncate!");
4597 if (getTypeSizeInBits(SrcTy) == getTypeSizeInBits(Ty))
4598 return V; // No conversion
4599 return getZeroExtendExpr(V, Ty);
4600}
4601
4603 Type *SrcTy = V->getType();
4604 assert(SrcTy->isIntOrPtrTy() && Ty->isIntOrPtrTy() &&
4605 "Cannot noop or sign extend with non-integer arguments!");
4607 "getNoopOrSignExtend cannot truncate!");
4608 if (getTypeSizeInBits(SrcTy) == getTypeSizeInBits(Ty))
4609 return V; // No conversion
4610 return getSignExtendExpr(V, Ty);
4611}
4612
4614 Type *SrcTy = V->getType();
4615 assert(SrcTy->isIntOrPtrTy() && Ty->isIntOrPtrTy() &&
4616 "Cannot noop or any extend with non-integer arguments!");
4618 "getNoopOrAnyExtend cannot truncate!");
4619 if (getTypeSizeInBits(SrcTy) == getTypeSizeInBits(Ty))
4620 return V; // No conversion
4621 return getAnyExtendExpr(V, Ty);
4622}
4623
4625 Type *SrcTy = V->getType();
4626 assert(SrcTy->isIntOrPtrTy() && Ty->isIntOrPtrTy() &&
4627 "Cannot truncate or noop with non-integer arguments!");
4629 "getTruncateOrNoop cannot extend!");
4630 if (getTypeSizeInBits(SrcTy) == getTypeSizeInBits(Ty))
4631 return V; // No conversion
4632 return getTruncateExpr(V, Ty);
4633}
4634
4636 const SCEV *RHS) {
4637 const SCEV *PromotedLHS = LHS;
4638 const SCEV *PromotedRHS = RHS;
4639
4640 if (getTypeSizeInBits(LHS->getType()) > getTypeSizeInBits(RHS->getType()))
4641 PromotedRHS = getZeroExtendExpr(RHS, LHS->getType());
4642 else
4643 PromotedLHS = getNoopOrZeroExtend(LHS, RHS->getType());
4644
4645 return getUMaxExpr(PromotedLHS, PromotedRHS);
4646}
4647
4649 const SCEV *RHS,
4650 bool Sequential) {
4651 SmallVector<SCEVUse, 2> Ops = {LHS, RHS};
4652 return getUMinFromMismatchedTypes(Ops, Sequential);
4653}
4654
4655const SCEV *
4657 bool Sequential) {
4658 assert(!Ops.empty() && "At least one operand must be!");
4659 // Trivial case.
4660 if (Ops.size() == 1)
4661 return Ops[0];
4662
4663 // Find the max type first.
4664 Type *MaxType = nullptr;
4665 for (SCEVUse S : Ops)
4666 if (MaxType)
4667 MaxType = getWiderType(MaxType, S->getType());
4668 else
4669 MaxType = S->getType();
4670 assert(MaxType && "Failed to find maximum type!");
4671
4672 // Extend all ops to max type.
4673 SmallVector<SCEVUse, 2> PromotedOps;
4674 for (SCEVUse S : Ops)
4675 PromotedOps.push_back(getNoopOrZeroExtend(S, MaxType));
4676
4677 // Generate umin.
4678 return getUMinExpr(PromotedOps, Sequential);
4679}
4680
4682 // A pointer operand may evaluate to a nonpointer expression, such as null.
4683 if (!V->getType()->isPointerTy())
4684 return V;
4685
4686 while (true) {
4687 if (auto *AddRec = dyn_cast<SCEVAddRecExpr>(V)) {
4688 V = AddRec->getStart();
4689 } else if (auto *Add = dyn_cast<SCEVAddExpr>(V)) {
4690 const SCEV *PtrOp = nullptr;
4691 for (const SCEV *AddOp : Add->operands()) {
4692 if (AddOp->getType()->isPointerTy()) {
4693 assert(!PtrOp && "Cannot have multiple pointer ops");
4694 PtrOp = AddOp;
4695 }
4696 }
4697 assert(PtrOp && "Must have pointer op");
4698 V = PtrOp;
4699 } else // Not something we can look further into.
4700 return V;
4701 }
4702}
4703
4704/// Push users of the given Instruction onto the given Worklist.
4708 // Push the def-use children onto the Worklist stack.
4709 for (User *U : I->users()) {
4710 auto *UserInsn = cast<Instruction>(U);
4711 if (Visited.insert(UserInsn).second)
4712 Worklist.push_back(UserInsn);
4713 }
4714}
4715
4716namespace {
4717
4718/// Takes SCEV S and Loop L. For each AddRec sub-expression, use its start
4719/// expression in case its Loop is L. If it is not L then
4720/// if IgnoreOtherLoops is true then use AddRec itself
4721/// otherwise rewrite cannot be done.
4722/// If SCEV contains non-invariant unknown SCEV rewrite cannot be done.
4723class SCEVInitRewriter : public SCEVRewriteVisitor<SCEVInitRewriter> {
4724public:
4725 static const SCEV *rewrite(const SCEV *S, const Loop *L, ScalarEvolution &SE,
4726 bool IgnoreOtherLoops = true) {
4727 SCEVInitRewriter Rewriter(L, SE);
4728 const SCEV *Result = Rewriter.visit(S);
4729 if (Rewriter.hasSeenLoopVariantSCEVUnknown())
4730 return SE.getCouldNotCompute();
4731 return Rewriter.hasSeenOtherLoops() && !IgnoreOtherLoops
4732 ? SE.getCouldNotCompute()
4733 : Result;
4734 }
4735
4736 const SCEV *visitUnknown(const SCEVUnknown *Expr) {
4737 if (!SE.isLoopInvariant(Expr, L))
4738 SeenLoopVariantSCEVUnknown = true;
4739 return Expr;
4740 }
4741
4742 const SCEV *visitAddRecExpr(const SCEVAddRecExpr *Expr) {
4743 // Only re-write AddRecExprs for this loop.
4744 if (Expr->getLoop() == L)
4745 return Expr->getStart();
4746 SeenOtherLoops = true;
4747 return Expr;
4748 }
4749
4750 bool hasSeenLoopVariantSCEVUnknown() { return SeenLoopVariantSCEVUnknown; }
4751
4752 bool hasSeenOtherLoops() { return SeenOtherLoops; }
4753
4754private:
4755 explicit SCEVInitRewriter(const Loop *L, ScalarEvolution &SE)
4756 : SCEVRewriteVisitor(SE), L(L) {}
4757
4758 const Loop *L;
4759 bool SeenLoopVariantSCEVUnknown = false;
4760 bool SeenOtherLoops = false;
4761};
4762
4763/// Takes SCEV S and Loop L. For each AddRec sub-expression, use its post
4764/// increment expression in case its Loop is L. If it is not L then
4765/// use AddRec itself.
4766/// If SCEV contains non-invariant unknown SCEV rewrite cannot be done.
4767class SCEVPostIncRewriter : public SCEVRewriteVisitor<SCEVPostIncRewriter> {
4768public:
4769 static const SCEV *rewrite(const SCEV *S, const Loop *L, ScalarEvolution &SE) {
4770 SCEVPostIncRewriter Rewriter(L, SE);
4771 const SCEV *Result = Rewriter.visit(S);
4772 return Rewriter.hasSeenLoopVariantSCEVUnknown()
4773 ? SE.getCouldNotCompute()
4774 : Result;
4775 }
4776
4777 const SCEV *visitUnknown(const SCEVUnknown *Expr) {
4778 if (!SE.isLoopInvariant(Expr, L))
4779 SeenLoopVariantSCEVUnknown = true;
4780 return Expr;
4781 }
4782
4783 const SCEV *visitAddRecExpr(const SCEVAddRecExpr *Expr) {
4784 // Only re-write AddRecExprs for this loop.
4785 if (Expr->getLoop() == L)
4786 return Expr->getPostIncExpr(SE);
4787 SeenOtherLoops = true;
4788 return Expr;
4789 }
4790
4791 bool hasSeenLoopVariantSCEVUnknown() { return SeenLoopVariantSCEVUnknown; }
4792
4793 bool hasSeenOtherLoops() { return SeenOtherLoops; }
4794
4795private:
4796 explicit SCEVPostIncRewriter(const Loop *L, ScalarEvolution &SE)
4797 : SCEVRewriteVisitor(SE), L(L) {}
4798
4799 const Loop *L;
4800 bool SeenLoopVariantSCEVUnknown = false;
4801 bool SeenOtherLoops = false;
4802};
4803
4804/// This class evaluates the compare condition by matching it against the
4805/// condition of loop latch. If there is a match we assume a true value
4806/// for the condition while building SCEV nodes.
4807class SCEVBackedgeConditionFolder
4808 : public SCEVRewriteVisitor<SCEVBackedgeConditionFolder> {
4809public:
4810 static const SCEV *rewrite(const SCEV *S, const Loop *L,
4811 ScalarEvolution &SE) {
4812 bool IsPosBECond = false;
4813 Value *BECond = nullptr;
4814 if (BasicBlock *Latch = L->getLoopLatch()) {
4815 if (CondBrInst *BI = dyn_cast<CondBrInst>(Latch->getTerminator())) {
4816 assert(BI->getSuccessor(0) != BI->getSuccessor(1) &&
4817 "Both outgoing branches should not target same header!");
4818 BECond = BI->getCondition();
4819 IsPosBECond = BI->getSuccessor(0) == L->getHeader();
4820 } else {
4821 return S;
4822 }
4823 }
4824 SCEVBackedgeConditionFolder Rewriter(L, BECond, IsPosBECond, SE);
4825 return Rewriter.visit(S);
4826 }
4827
4828 const SCEV *visitUnknown(const SCEVUnknown *Expr) {
4829 const SCEV *Result = Expr;
4830 bool InvariantF = SE.isLoopInvariant(Expr, L);
4831
4832 if (!InvariantF) {
4834 switch (I->getOpcode()) {
4835 case Instruction::Select: {
4836 SelectInst *SI = cast<SelectInst>(I);
4837 std::optional<const SCEV *> Res =
4838 compareWithBackedgeCondition(SI->getCondition());
4839 if (Res) {
4840 bool IsOne = cast<SCEVConstant>(*Res)->getValue()->isOne();
4841 Result = SE.getSCEV(IsOne ? SI->getTrueValue() : SI->getFalseValue());
4842 }
4843 break;
4844 }
4845 default: {
4846 std::optional<const SCEV *> Res = compareWithBackedgeCondition(I);
4847 if (Res)
4848 Result = *Res;
4849 break;
4850 }
4851 }
4852 }
4853 return Result;
4854 }
4855
4856private:
4857 explicit SCEVBackedgeConditionFolder(const Loop *L, Value *BECond,
4858 bool IsPosBECond, ScalarEvolution &SE)
4859 : SCEVRewriteVisitor(SE), L(L), BackedgeCond(BECond),
4860 IsPositiveBECond(IsPosBECond) {}
4861
4862 std::optional<const SCEV *> compareWithBackedgeCondition(Value *IC);
4863
4864 const Loop *L;
4865 /// Loop back condition.
4866 Value *BackedgeCond = nullptr;
4867 /// Set to true if loop back is on positive branch condition.
4868 bool IsPositiveBECond;
4869};
4870
4871std::optional<const SCEV *>
4872SCEVBackedgeConditionFolder::compareWithBackedgeCondition(Value *IC) {
4873
4874 // If value matches the backedge condition for loop latch,
4875 // then return a constant evolution node based on loopback
4876 // branch taken.
4877 if (BackedgeCond == IC)
4878 return IsPositiveBECond ? SE.getOne(Type::getInt1Ty(SE.getContext()))
4880 return std::nullopt;
4881}
4882
4883class SCEVShiftRewriter : public SCEVRewriteVisitor<SCEVShiftRewriter> {
4884public:
4885 static const SCEV *rewrite(const SCEV *S, const Loop *L,
4886 ScalarEvolution &SE) {
4887 SCEVShiftRewriter Rewriter(L, SE);
4888 const SCEV *Result = Rewriter.visit(S);
4889 return Rewriter.isValid() ? Result : SE.getCouldNotCompute();
4890 }
4891
4892 const SCEV *visitUnknown(const SCEVUnknown *Expr) {
4893 // Only allow AddRecExprs for this loop.
4894 if (!SE.isLoopInvariant(Expr, L))
4895 Valid = false;
4896 return Expr;
4897 }
4898
4899 const SCEV *visitAddRecExpr(const SCEVAddRecExpr *Expr) {
4900 if (Expr->getLoop() == L && Expr->isAffine())
4901 return SE.getMinusSCEV(Expr, Expr->getStepRecurrence(SE));
4902 Valid = false;
4903 return Expr;
4904 }
4905
4906 bool isValid() { return Valid; }
4907
4908private:
4909 explicit SCEVShiftRewriter(const Loop *L, ScalarEvolution &SE)
4910 : SCEVRewriteVisitor(SE), L(L) {}
4911
4912 const Loop *L;
4913 bool Valid = true;
4914};
4915
4916} // end anonymous namespace
4917
4918void ScalarEvolution::inferNoWrapViaConstantRanges(const SCEVAddRecExpr *AR) {
4919 if (!AR->isAffine())
4920 return;
4921
4922 // Force computation of ranges, which will also perform range-based flag
4923 // inference.
4924 if (!AR->hasNoSignedWrap())
4925 (void)getSignedRange(AR);
4926
4927 if (!AR->hasNoUnsignedWrap())
4928 (void)getUnsignedRange(AR);
4929
4930 if (!AR->hasNoSelfWrap()) {
4931 const SCEV *BECount = getConstantMaxBackedgeTakenCount(AR->getLoop());
4932 if (const SCEVConstant *BECountMax = dyn_cast<SCEVConstant>(BECount)) {
4933 ConstantRange StepCR = getSignedRange(AR->getStepRecurrence(*this));
4934 const APInt &BECountAP = BECountMax->getAPInt();
4935 unsigned NoOverflowBitWidth =
4936 BECountAP.getActiveBits() + StepCR.getMinSignedBits();
4937 if (NoOverflowBitWidth <= getTypeSizeInBits(AR->getType()))
4938 const_cast<SCEVAddRecExpr *>(AR)->setNoWrapFlags(SCEV::FlagNW);
4939 }
4940 }
4941}
4942
4944ScalarEvolution::proveNoSignedWrapViaInduction(const SCEVAddRecExpr *AR) {
4946
4947 if (AR->hasNoSignedWrap())
4948 return Result;
4949
4950 if (!AR->isAffine())
4951 return Result;
4952
4953 // This function can be expensive, only try to prove NSW once per AddRec.
4954 if (!SignedWrapViaInductionTried.insert(AR).second)
4955 return Result;
4956
4957 const SCEV *Step = AR->getStepRecurrence(*this);
4958 const Loop *L = AR->getLoop();
4959
4960 // Check whether the backedge-taken count is SCEVCouldNotCompute.
4961 // Note that this serves two purposes: It filters out loops that are
4962 // simply not analyzable, and it covers the case where this code is
4963 // being called from within backedge-taken count analysis, such that
4964 // attempting to ask for the backedge-taken count would likely result
4965 // in infinite recursion. In the later case, the analysis code will
4966 // cope with a conservative value, and it will take care to purge
4967 // that value once it has finished.
4968 const SCEV *MaxBECount = getConstantMaxBackedgeTakenCount(L);
4969
4970 // Normally, in the cases we can prove no-overflow via a
4971 // backedge guarding condition, we can also compute a backedge
4972 // taken count for the loop. The exceptions are assumptions and
4973 // guards present in the loop -- SCEV is not great at exploiting
4974 // these to compute max backedge taken counts, but can still use
4975 // these to prove lack of overflow. Use this fact to avoid
4976 // doing extra work that may not pay off.
4977
4978 if (isa<SCEVCouldNotCompute>(MaxBECount) && !HasGuards &&
4979 AC.assumptions().empty())
4980 return Result;
4981
4982 // If the backedge is guarded by a comparison with the pre-inc value the
4983 // addrec is safe. Also, if the entry is guarded by a comparison with the
4984 // start value and the backedge is guarded by a comparison with the post-inc
4985 // value, the addrec is safe.
4987 const SCEV *OverflowLimit =
4988 getSignedOverflowLimitForStep(Step, &Pred, this);
4989 if (OverflowLimit &&
4990 (isLoopBackedgeGuardedByCond(L, Pred, AR, OverflowLimit) ||
4991 isKnownOnEveryIteration(Pred, AR, OverflowLimit))) {
4992 Result = setFlags(Result, SCEV::FlagNSW);
4993 }
4994 return Result;
4995}
4997ScalarEvolution::proveNoUnsignedWrapViaInduction(const SCEVAddRecExpr *AR) {
4999
5000 if (AR->hasNoUnsignedWrap())
5001 return Result;
5002
5003 if (!AR->isAffine())
5004 return Result;
5005
5006 // This function can be expensive, only try to prove NUW once per AddRec.
5007 if (!UnsignedWrapViaInductionTried.insert(AR).second)
5008 return Result;
5009
5010 const SCEV *Step = AR->getStepRecurrence(*this);
5011 const Loop *L = AR->getLoop();
5012
5013 // Check whether the backedge-taken count is SCEVCouldNotCompute.
5014 // Note that this serves two purposes: It filters out loops that are
5015 // simply not analyzable, and it covers the case where this code is
5016 // being called from within backedge-taken count analysis, such that
5017 // attempting to ask for the backedge-taken count would likely result
5018 // in infinite recursion. In the later case, the analysis code will
5019 // cope with a conservative value, and it will take care to purge
5020 // that value once it has finished.
5021 const SCEV *MaxBECount = getConstantMaxBackedgeTakenCount(L);
5022
5023 // Normally, in the cases we can prove no-overflow via a
5024 // backedge guarding condition, we can also compute a backedge
5025 // taken count for the loop. The exceptions are assumptions and
5026 // guards present in the loop -- SCEV is not great at exploiting
5027 // these to compute max backedge taken counts, but can still use
5028 // these to prove lack of overflow. Use this fact to avoid
5029 // doing extra work that may not pay off.
5030
5031 if (isa<SCEVCouldNotCompute>(MaxBECount) && !HasGuards &&
5032 AC.assumptions().empty())
5033 return Result;
5034
5035 // If the backedge is guarded by a comparison with the pre-inc value the
5036 // addrec is safe. Also, if the entry is guarded by a comparison with the
5037 // start value and the backedge is guarded by a comparison with the post-inc
5038 // value, the addrec is safe.
5039 if (isKnownPositive(Step)) {
5041 const SCEV *OverflowLimit =
5043 if (isLoopBackedgeGuardedByCond(L, Pred, AR, OverflowLimit) ||
5044 isKnownOnEveryIteration(Pred, AR, OverflowLimit))
5045 Result = setFlags(Result, SCEV::FlagNUW);
5046 }
5047 return Result;
5048}
5049
5050namespace {
5051
5052/// Represents an abstract binary operation. This may exist as a
5053/// normal instruction or constant expression, or may have been
5054/// derived from an expression tree.
5055struct BinaryOp {
5056 unsigned Opcode;
5057 Value *LHS;
5058 Value *RHS;
5059 bool IsNSW = false;
5060 bool IsNUW = false;
5061
5062 /// Op is set if this BinaryOp corresponds to a concrete LLVM instruction or
5063 /// constant expression.
5064 Operator *Op = nullptr;
5065
5066 explicit BinaryOp(Operator *Op)
5067 : Opcode(Op->getOpcode()), LHS(Op->getOperand(0)), RHS(Op->getOperand(1)),
5068 Op(Op) {
5069 if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(Op)) {
5070 IsNSW = OBO->hasNoSignedWrap();
5071 IsNUW = OBO->hasNoUnsignedWrap();
5072 }
5073 }
5074
5075 explicit BinaryOp(unsigned Opcode, Value *LHS, Value *RHS, bool IsNSW = false,
5076 bool IsNUW = false)
5077 : Opcode(Opcode), LHS(LHS), RHS(RHS), IsNSW(IsNSW), IsNUW(IsNUW) {}
5078};
5079
5080} // end anonymous namespace
5081
5082/// Try to map \p V into a BinaryOp, and return \c std::nullopt on failure.
5083static std::optional<BinaryOp> MatchBinaryOp(Value *V,
5084 const DominatorTree &DT) {
5085 auto *Op = dyn_cast<Operator>(V);
5086 if (!Op)
5087 return std::nullopt;
5088
5089 // Implementation detail: all the cleverness here should happen without
5090 // creating new SCEV expressions -- our caller knowns tricks to avoid creating
5091 // SCEV expressions when possible, and we should not break that.
5092
5093 switch (Op->getOpcode()) {
5094 case Instruction::Add:
5095 case Instruction::Sub:
5096 case Instruction::Mul:
5097 case Instruction::UDiv:
5098 case Instruction::URem:
5099 case Instruction::And:
5100 case Instruction::AShr:
5101 case Instruction::Shl:
5102 return BinaryOp(Op);
5103
5104 case Instruction::Or: {
5105 // Convert or disjoint into add nuw nsw.
5106 if (cast<PossiblyDisjointInst>(Op)->isDisjoint()) {
5107 BinaryOp BinOp(Instruction::Add, Op->getOperand(0), Op->getOperand(1),
5108 /*IsNSW=*/true, /*IsNUW=*/true);
5109 // Keep the reference to the original instruction so that we can later
5110 // check whether it can produce poison value or not.
5111 BinOp.Op = Op;
5112 return BinOp;
5113 }
5114 return BinaryOp(Op);
5115 }
5116
5117 case Instruction::Xor:
5118 if (auto *RHSC = dyn_cast<ConstantInt>(Op->getOperand(1)))
5119 // If the RHS of the xor is a signmask, then this is just an add.
5120 // Instcombine turns add of signmask into xor as a strength reduction step.
5121 if (RHSC->getValue().isSignMask())
5122 return BinaryOp(Instruction::Add, Op->getOperand(0), Op->getOperand(1));
5123 // Binary `xor` is a bit-wise `add`.
5124 if (V->getType()->isIntegerTy(1))
5125 return BinaryOp(Instruction::Add, Op->getOperand(0), Op->getOperand(1));
5126 return BinaryOp(Op);
5127
5128 case Instruction::LShr:
5129 // Turn logical shift right of a constant into a unsigned divide.
5130 if (ConstantInt *SA = dyn_cast<ConstantInt>(Op->getOperand(1))) {
5131 uint32_t BitWidth = cast<IntegerType>(Op->getType())->getBitWidth();
5132
5133 // If the shift count is not less than the bitwidth, the result of
5134 // the shift is undefined. Don't try to analyze it, because the
5135 // resolution chosen here may differ from the resolution chosen in
5136 // other parts of the compiler.
5137 if (SA->getValue().ult(BitWidth)) {
5138 Constant *X =
5139 ConstantInt::get(SA->getContext(),
5140 APInt::getOneBitSet(BitWidth, SA->getZExtValue()));
5141 return BinaryOp(Instruction::UDiv, Op->getOperand(0), X);
5142 }
5143 }
5144 return BinaryOp(Op);
5145
5146 case Instruction::ExtractValue: {
5147 auto *EVI = cast<ExtractValueInst>(Op);
5148 if (EVI->getNumIndices() != 1 || EVI->getIndices()[0] != 0)
5149 break;
5150
5151 auto *WO = dyn_cast<WithOverflowInst>(EVI->getAggregateOperand());
5152 if (!WO)
5153 break;
5154
5155 Instruction::BinaryOps BinOp = WO->getBinaryOp();
5156 bool Signed = WO->isSigned();
5157 // TODO: Should add nuw/nsw flags for mul as well.
5158 if (BinOp == Instruction::Mul || !isOverflowIntrinsicNoWrap(WO, DT))
5159 return BinaryOp(BinOp, WO->getLHS(), WO->getRHS());
5160
5161 // Now that we know that all uses of the arithmetic-result component of
5162 // CI are guarded by the overflow check, we can go ahead and pretend
5163 // that the arithmetic is non-overflowing.
5164 return BinaryOp(BinOp, WO->getLHS(), WO->getRHS(),
5165 /* IsNSW = */ Signed, /* IsNUW = */ !Signed);
5166 }
5167
5168 default:
5169 break;
5170 }
5171
5172 // Recognise intrinsic loop.decrement.reg, and as this has exactly the same
5173 // semantics as a Sub, return a binary sub expression.
5174 if (auto *II = dyn_cast<IntrinsicInst>(V))
5175 if (II->getIntrinsicID() == Intrinsic::loop_decrement_reg)
5176 return BinaryOp(Instruction::Sub, II->getOperand(0), II->getOperand(1));
5177
5178 return std::nullopt;
5179}
5180
5181/// Helper function to createAddRecFromPHIWithCasts. We have a phi
5182/// node whose symbolic (unknown) SCEV is \p SymbolicPHI, which is updated via
5183/// the loop backedge by a SCEVAddExpr, possibly also with a few casts on the
5184/// way. This function checks if \p Op, an operand of this SCEVAddExpr,
5185/// follows one of the following patterns:
5186/// Op == (SExt ix (Trunc iy (%SymbolicPHI) to ix) to iy)
5187/// Op == (ZExt ix (Trunc iy (%SymbolicPHI) to ix) to iy)
5188/// If the SCEV expression of \p Op conforms with one of the expected patterns
5189/// we return the type of the truncation operation, and indicate whether the
5190/// truncated type should be treated as signed/unsigned by setting
5191/// \p Signed to true/false, respectively.
5192static Type *isSimpleCastedPHI(const SCEV *Op, const SCEVUnknown *SymbolicPHI,
5193 bool &Signed, ScalarEvolution &SE) {
5194 // The case where Op == SymbolicPHI (that is, with no type conversions on
5195 // the way) is handled by the regular add recurrence creating logic and
5196 // would have already been triggered in createAddRecForPHI. Reaching it here
5197 // means that createAddRecFromPHI had failed for this PHI before (e.g.,
5198 // because one of the other operands of the SCEVAddExpr updating this PHI is
5199 // not invariant).
5200 //
5201 // Here we look for the case where Op = (ext(trunc(SymbolicPHI))), and in
5202 // this case predicates that allow us to prove that Op == SymbolicPHI will
5203 // be added.
5204 if (Op == SymbolicPHI)
5205 return nullptr;
5206
5207 unsigned SourceBits = SE.getTypeSizeInBits(SymbolicPHI->getType());
5208 unsigned NewBits = SE.getTypeSizeInBits(Op->getType());
5209 if (SourceBits != NewBits)
5210 return nullptr;
5211
5212 if (match(Op, m_scev_SExt(m_scev_Trunc(m_scev_Specific(SymbolicPHI))))) {
5213 Signed = true;
5214 return cast<SCEVCastExpr>(Op)->getOperand()->getType();
5215 }
5216 if (match(Op, m_scev_ZExt(m_scev_Trunc(m_scev_Specific(SymbolicPHI))))) {
5217 Signed = false;
5218 return cast<SCEVCastExpr>(Op)->getOperand()->getType();
5219 }
5220 return nullptr;
5221}
5222
5223static const Loop *isIntegerLoopHeaderPHI(const PHINode *PN, LoopInfo &LI) {
5224 if (!PN->getType()->isIntegerTy())
5225 return nullptr;
5226 const Loop *L = LI.getLoopFor(PN->getParent());
5227 if (!L || L->getHeader() != PN->getParent())
5228 return nullptr;
5229 return L;
5230}
5231
5232// Analyze \p SymbolicPHI, a SCEV expression of a phi node, and check if the
5233// computation that updates the phi follows the following pattern:
5234// (SExt/ZExt ix (Trunc iy (%SymbolicPHI) to ix) to iy) + InvariantAccum
5235// which correspond to a phi->trunc->sext/zext->add->phi update chain.
5236// If so, try to see if it can be rewritten as an AddRecExpr under some
5237// Predicates. If successful, return them as a pair. Also cache the results
5238// of the analysis.
5239//
5240// Example usage scenario:
5241// Say the Rewriter is called for the following SCEV:
5242// 8 * ((sext i32 (trunc i64 %X to i32) to i64) + %Step)
5243// where:
5244// %X = phi i64 (%Start, %BEValue)
5245// It will visitMul->visitAdd->visitSExt->visitTrunc->visitUnknown(%X),
5246// and call this function with %SymbolicPHI = %X.
5247//
5248// The analysis will find that the value coming around the backedge has
5249// the following SCEV:
5250// BEValue = ((sext i32 (trunc i64 %X to i32) to i64) + %Step)
5251// Upon concluding that this matches the desired pattern, the function
5252// will return the pair {NewAddRec, SmallPredsVec} where:
5253// NewAddRec = {%Start,+,%Step}
5254// SmallPredsVec = {P1, P2, P3} as follows:
5255// P1(WrapPred): AR: {trunc(%Start),+,(trunc %Step)}<nsw> Flags: <nssw>
5256// P2(EqualPred): %Start == (sext i32 (trunc i64 %Start to i32) to i64)
5257// P3(EqualPred): %Step == (sext i32 (trunc i64 %Step to i32) to i64)
5258// The returned pair means that SymbolicPHI can be rewritten into NewAddRec
5259// under the predicates {P1,P2,P3}.
5260// This predicated rewrite will be cached in PredicatedSCEVRewrites:
5261// PredicatedSCEVRewrites[{%X,L}] = {NewAddRec, {P1,P2,P3)}
5262//
5263// TODO's:
5264//
5265// 1) Extend the Induction descriptor to also support inductions that involve
5266// casts: When needed (namely, when we are called in the context of the
5267// vectorizer induction analysis), a Set of cast instructions will be
5268// populated by this method, and provided back to isInductionPHI. This is
5269// needed to allow the vectorizer to properly record them to be ignored by
5270// the cost model and to avoid vectorizing them (otherwise these casts,
5271// which are redundant under the runtime overflow checks, will be
5272// vectorized, which can be costly).
5273//
5274// 2) Support additional induction/PHISCEV patterns: We also want to support
5275// inductions where the sext-trunc / zext-trunc operations (partly) occur
5276// after the induction update operation (the induction increment):
5277//
5278// (Trunc iy (SExt/ZExt ix (%SymbolicPHI + InvariantAccum) to iy) to ix)
5279// which correspond to a phi->add->trunc->sext/zext->phi update chain.
5280//
5281// (Trunc iy ((SExt/ZExt ix (%SymbolicPhi) to iy) + InvariantAccum) to ix)
5282// which correspond to a phi->trunc->add->sext/zext->phi update chain.
5283//
5284// 3) Outline common code with createAddRecFromPHI to avoid duplication.
5285std::optional<std::pair<const SCEV *, SmallVector<const SCEVPredicate *, 3>>>
5286ScalarEvolution::createAddRecFromPHIWithCastsImpl(const SCEVUnknown *SymbolicPHI) {
5288
5289 // *** Part1: Analyze if we have a phi-with-cast pattern for which we can
5290 // return an AddRec expression under some predicate.
5291
5292 auto *PN = cast<PHINode>(SymbolicPHI->getValue());
5293 const Loop *L = isIntegerLoopHeaderPHI(PN, LI);
5294 assert(L && "Expecting an integer loop header phi");
5295
5296 // The loop may have multiple entrances or multiple exits; we can analyze
5297 // this phi as an addrec if it has a unique entry value and a unique
5298 // backedge value.
5299 Value *BEValueV = nullptr, *StartValueV = nullptr;
5300 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
5301 Value *V = PN->getIncomingValue(i);
5302 if (L->contains(PN->getIncomingBlock(i))) {
5303 if (!BEValueV) {
5304 BEValueV = V;
5305 } else if (BEValueV != V) {
5306 BEValueV = nullptr;
5307 break;
5308 }
5309 } else if (!StartValueV) {
5310 StartValueV = V;
5311 } else if (StartValueV != V) {
5312 StartValueV = nullptr;
5313 break;
5314 }
5315 }
5316 if (!BEValueV || !StartValueV)
5317 return std::nullopt;
5318
5319 const SCEV *BEValue = getSCEV(BEValueV);
5320
5321 // If the value coming around the backedge is an add with the symbolic
5322 // value we just inserted, possibly with casts that we can ignore under
5323 // an appropriate runtime guard, then we found a simple induction variable!
5324 const auto *Add = dyn_cast<SCEVAddExpr>(BEValue);
5325 if (!Add)
5326 return std::nullopt;
5327
5328 // If there is a single occurrence of the symbolic value, possibly
5329 // casted, replace it with a recurrence.
5330 unsigned FoundIndex = Add->getNumOperands();
5331 Type *TruncTy = nullptr;
5332 bool Signed;
5333 for (unsigned i = 0, e = Add->getNumOperands(); i != e; ++i)
5334 if ((TruncTy =
5335 isSimpleCastedPHI(Add->getOperand(i), SymbolicPHI, Signed, *this)))
5336 if (FoundIndex == e) {
5337 FoundIndex = i;
5338 break;
5339 }
5340
5341 if (FoundIndex == Add->getNumOperands())
5342 return std::nullopt;
5343
5344 // Create an add with everything but the specified operand.
5346 for (unsigned i = 0, e = Add->getNumOperands(); i != e; ++i)
5347 if (i != FoundIndex)
5348 Ops.push_back(Add->getOperand(i));
5349 const SCEV *Accum = getAddExpr(Ops);
5350
5351 // The runtime checks will not be valid if the step amount is
5352 // varying inside the loop.
5353 if (!isLoopInvariant(Accum, L))
5354 return std::nullopt;
5355
5356 // *** Part2: Create the predicates
5357
5358 // Analysis was successful: we have a phi-with-cast pattern for which we
5359 // can return an AddRec expression under the following predicates:
5360 //
5361 // P1: A Wrap predicate that guarantees that Trunc(Start) + i*Trunc(Accum)
5362 // fits within the truncated type (does not overflow) for i = 0 to n-1.
5363 // P2: An Equal predicate that guarantees that
5364 // Start = (Ext ix (Trunc iy (Start) to ix) to iy)
5365 // P3: An Equal predicate that guarantees that
5366 // Accum = (Ext ix (Trunc iy (Accum) to ix) to iy)
5367 //
5368 // As we next prove, the above predicates guarantee that:
5369 // Start + i*Accum = (Ext ix (Trunc iy ( Start + i*Accum ) to ix) to iy)
5370 //
5371 //
5372 // More formally, we want to prove that:
5373 // Expr(i+1) = Start + (i+1) * Accum
5374 // = (Ext ix (Trunc iy (Expr(i)) to ix) to iy) + Accum
5375 //
5376 // Given that:
5377 // 1) Expr(0) = Start
5378 // 2) Expr(1) = Start + Accum
5379 // = (Ext ix (Trunc iy (Start) to ix) to iy) + Accum :: from P2
5380 // 3) Induction hypothesis (step i):
5381 // Expr(i) = (Ext ix (Trunc iy (Expr(i-1)) to ix) to iy) + Accum
5382 //
5383 // Proof:
5384 // Expr(i+1) =
5385 // = Start + (i+1)*Accum
5386 // = (Start + i*Accum) + Accum
5387 // = Expr(i) + Accum
5388 // = (Ext ix (Trunc iy (Expr(i-1)) to ix) to iy) + Accum + Accum
5389 // :: from step i
5390 //
5391 // = (Ext ix (Trunc iy (Start + (i-1)*Accum) to ix) to iy) + Accum + Accum
5392 //
5393 // = (Ext ix (Trunc iy (Start + (i-1)*Accum) to ix) to iy)
5394 // + (Ext ix (Trunc iy (Accum) to ix) to iy)
5395 // + Accum :: from P3
5396 //
5397 // = (Ext ix (Trunc iy ((Start + (i-1)*Accum) + Accum) to ix) to iy)
5398 // + Accum :: from P1: Ext(x)+Ext(y)=>Ext(x+y)
5399 //
5400 // = (Ext ix (Trunc iy (Start + i*Accum) to ix) to iy) + Accum
5401 // = (Ext ix (Trunc iy (Expr(i)) to ix) to iy) + Accum
5402 //
5403 // By induction, the same applies to all iterations 1<=i<n:
5404 //
5405
5406 // Create a truncated addrec for which we will add a no overflow check (P1).
5407 const SCEV *StartVal = getSCEV(StartValueV);
5408 const SCEV *PHISCEV =
5409 getAddRecExpr(getTruncateExpr(StartVal, TruncTy),
5410 getTruncateExpr(Accum, TruncTy), L, SCEV::FlagNone);
5411
5412 // PHISCEV can be either a SCEVConstant or a SCEVAddRecExpr.
5413 // ex: If truncated Accum is 0 and StartVal is a constant, then PHISCEV
5414 // will be constant.
5415 //
5416 // If PHISCEV is a constant, then P1 degenerates into P2 or P3, so we don't
5417 // add P1.
5418 if (const auto *AR = dyn_cast<SCEVAddRecExpr>(PHISCEV)) {
5422 const SCEVPredicate *AddRecPred = getWrapPredicate(AR, AddedFlags);
5423 Predicates.push_back(AddRecPred);
5424 }
5425
5426 // Create the Equal Predicates P2,P3:
5427
5428 // It is possible that the predicates P2 and/or P3 are computable at
5429 // compile time due to StartVal and/or Accum being constants.
5430 // If either one is, then we can check that now and escape if either P2
5431 // or P3 is false.
5432
5433 // Construct the extended SCEV: (Ext ix (Trunc iy (Expr) to ix) to iy)
5434 // for each of StartVal and Accum
5435 auto getExtendedExpr = [&](const SCEV *Expr,
5436 bool CreateSignExtend) -> const SCEV * {
5437 assert(isLoopInvariant(Expr, L) && "Expr is expected to be invariant");
5438 const SCEV *TruncatedExpr = getTruncateExpr(Expr, TruncTy);
5439 const SCEV *ExtendedExpr =
5440 CreateSignExtend ? getSignExtendExpr(TruncatedExpr, Expr->getType())
5441 : getZeroExtendExpr(TruncatedExpr, Expr->getType());
5442 return ExtendedExpr;
5443 };
5444
5445 // Given:
5446 // ExtendedExpr = (Ext ix (Trunc iy (Expr) to ix) to iy
5447 // = getExtendedExpr(Expr)
5448 // Determine whether the predicate P: Expr == ExtendedExpr
5449 // is known to be false at compile time
5450 auto PredIsKnownFalse = [&](const SCEV *Expr,
5451 const SCEV *ExtendedExpr) -> bool {
5452 return Expr != ExtendedExpr &&
5453 isKnownPredicate(ICmpInst::ICMP_NE, Expr, ExtendedExpr);
5454 };
5455
5456 const SCEV *StartExtended = getExtendedExpr(StartVal, Signed);
5457 if (PredIsKnownFalse(StartVal, StartExtended)) {
5458 LLVM_DEBUG(dbgs() << "P2 is compile-time false\n";);
5459 return std::nullopt;
5460 }
5461
5462 // The Step is always Signed (because the overflow checks are either
5463 // NSSW or NUSW)
5464 const SCEV *AccumExtended = getExtendedExpr(Accum, /*CreateSignExtend=*/true);
5465 if (PredIsKnownFalse(Accum, AccumExtended)) {
5466 LLVM_DEBUG(dbgs() << "P3 is compile-time false\n";);
5467 return std::nullopt;
5468 }
5469
5470 auto AppendPredicate = [&](const SCEV *Expr,
5471 const SCEV *ExtendedExpr) -> void {
5472 if (Expr != ExtendedExpr &&
5473 !isKnownPredicate(ICmpInst::ICMP_EQ, Expr, ExtendedExpr)) {
5474 const SCEVPredicate *Pred = getEqualPredicate(Expr, ExtendedExpr);
5475 LLVM_DEBUG(dbgs() << "Added Predicate: " << *Pred);
5476 Predicates.push_back(Pred);
5477 }
5478 };
5479
5480 AppendPredicate(StartVal, StartExtended);
5481 AppendPredicate(Accum, AccumExtended);
5482
5483 // *** Part3: Predicates are ready. Now go ahead and create the new addrec in
5484 // which the casts had been folded away. The caller can rewrite SymbolicPHI
5485 // into NewAR if it will also add the runtime overflow checks specified in
5486 // Predicates.
5487 const SCEV *NewAR = getAddRecExpr(StartVal, Accum, L, SCEV::FlagNone);
5488
5489 std::pair<const SCEV *, SmallVector<const SCEVPredicate *, 3>> PredRewrite =
5490 std::make_pair(NewAR, Predicates);
5491 // Remember the result of the analysis for this SCEV at this locayyytion.
5492 PredicatedSCEVRewrites[{SymbolicPHI, L}] = PredRewrite;
5493 return PredRewrite;
5494}
5495
5496std::optional<std::pair<const SCEV *, SmallVector<const SCEVPredicate *, 3>>>
5498 auto *PN = cast<PHINode>(SymbolicPHI->getValue());
5499 const Loop *L = isIntegerLoopHeaderPHI(PN, LI);
5500 if (!L)
5501 return std::nullopt;
5502
5503 // Check to see if we already analyzed this PHI.
5504 auto I = PredicatedSCEVRewrites.find({SymbolicPHI, L});
5505 if (I != PredicatedSCEVRewrites.end()) {
5506 std::pair<const SCEV *, SmallVector<const SCEVPredicate *, 3>> Rewrite =
5507 I->second;
5508 // Analysis was done before and failed to create an AddRec:
5509 if (Rewrite.first == SymbolicPHI)
5510 return std::nullopt;
5511 // Analysis was done before and succeeded to create an AddRec under
5512 // a predicate:
5513 assert(isa<SCEVAddRecExpr>(Rewrite.first) && "Expected an AddRec");
5514 assert(!(Rewrite.second).empty() && "Expected to find Predicates");
5515 return Rewrite;
5516 }
5517
5518 std::optional<std::pair<const SCEV *, SmallVector<const SCEVPredicate *, 3>>>
5519 Rewrite = createAddRecFromPHIWithCastsImpl(SymbolicPHI);
5520
5521 // Record in the cache that the analysis failed
5522 if (!Rewrite) {
5524 PredicatedSCEVRewrites[{SymbolicPHI, L}] = {SymbolicPHI, Predicates};
5525 return std::nullopt;
5526 }
5527
5528 return Rewrite;
5529}
5530
5531// FIXME: This utility is currently required because the Rewriter currently
5532// does not rewrite this expression:
5533// {0, +, (sext ix (trunc iy to ix) to iy)}
5534// into {0, +, %step},
5535// even when the following Equal predicate exists:
5536// "%step == (sext ix (trunc iy to ix) to iy)".
5538 const SCEVAddRecExpr *AR1, const SCEVAddRecExpr *AR2,
5539 ArrayRef<const SCEVPredicate *> NoWrapPreds) const {
5540 if (AR1 == AR2)
5541 return true;
5542
5543 SCEVUnionPredicate NoWrapUnionPred(NoWrapPreds, SE);
5544 SCEVUnionPredicate AllPreds = Preds->getUnionWith(&NoWrapUnionPred, SE);
5545 auto areExprsEqual = [&](const SCEV *Expr1, const SCEV *Expr2) -> bool {
5546 if (Expr1 != Expr2 &&
5547 !AllPreds.implies(SE.getEqualPredicate(Expr1, Expr2), SE) &&
5548 !AllPreds.implies(SE.getEqualPredicate(Expr2, Expr1), SE))
5549 return false;
5550 return true;
5551 };
5552
5553 if (!areExprsEqual(AR1->getStart(), AR2->getStart()) ||
5554 !areExprsEqual(AR1->getStepRecurrence(SE), AR2->getStepRecurrence(SE)))
5555 return false;
5556 return true;
5557}
5558
5560 ScalarEvolution &SE) {
5561 SCEVFlags Flags = SCEV::FlagNone;
5562 GEPNoWrapFlags NW = GEP->getNoWrapFlags();
5563 // If the increment has any nowrap flags, then we know the address
5564 // space cannot be wrapped around.
5565 if (NW != GEPNoWrapFlags::none())
5567 // If the GEP is nuw or nusw with non-negative offset, we know that
5568 // no unsigned wrap occurs. We cannot set the nsw flag as only the
5569 // offset is treated as signed, while the base is unsigned.
5570 if (NW.hasNoUnsignedWrap() ||
5571 (NW.hasNoUnsignedSignedWrap() && SE.isKnownNonNegative(Accum)))
5573
5574 return Flags;
5575}
5576
5577/// A helper function for createAddRecFromPHI to handle simple cases.
5578///
5579/// This function tries to find an AddRec expression for the simplest (yet most
5580/// common) cases: PN = PHI(Start, OP(Self, LoopInvariant)).
5581/// If it fails, createAddRecFromPHI will use a more general, but slow,
5582/// technique for finding the AddRec expression.
5583const SCEV *ScalarEvolution::createSimpleAffineAddRec(PHINode *PN,
5584 Value *BEValueV,
5585 Value *StartValueV) {
5586 const Loop *L = LI.getLoopFor(PN->getParent());
5587 assert(L && L->getHeader() == PN->getParent());
5588 assert(BEValueV && StartValueV);
5589
5590 const SCEV *Accum = nullptr;
5592 if (auto BO = MatchBinaryOp(BEValueV, DT)) {
5593 if (BO->Opcode != Instruction::Add)
5594 return nullptr;
5595
5596 if (BO->LHS == PN && L->isLoopInvariant(BO->RHS))
5597 Accum = getSCEV(BO->RHS);
5598 else if (BO->RHS == PN && L->isLoopInvariant(BO->LHS))
5599 Accum = getSCEV(BO->LHS);
5600
5601 if (!Accum)
5602 return nullptr;
5603
5604 if (BO->IsNUW)
5605 Flags = setFlags(Flags, SCEV::FlagNUW);
5606 if (BO->IsNSW)
5607 Flags = setFlags(Flags, SCEV::FlagNSW);
5608 } else {
5609 // Handle pointer induction variable: PN = PHI(Start, gep PN,
5610 // LoopInvariant).
5611 auto *GEP = dyn_cast<GEPOperator>(BEValueV);
5612 if (!GEP || GEP->getPointerOperand() != PN || GEP->getNumIndices() != 1)
5613 return nullptr;
5614 Value *Idx = *GEP->idx_begin();
5615 if (!L->isLoopInvariant(Idx))
5616 return nullptr;
5617
5618 Type *IntIdxTy = getEffectiveSCEVType(GEP->getType());
5619 Accum = getMulExpr(getTruncateOrSignExtend(getSCEV(Idx), IntIdxTy),
5620 getSizeOfExpr(IntIdxTy, GEP->getSourceElementType()));
5621 Flags = getNoWrapFlagsForGEP(GEP, Accum, *this);
5622 }
5623
5624 const SCEV *StartVal = getSCEV(StartValueV);
5625 const SCEV *PHISCEV = getAddRecExpr(StartVal, Accum, L, Flags);
5626 insertValueToMap(PN, PHISCEV);
5627
5628 if (auto *AR = dyn_cast<SCEVAddRecExpr>(PHISCEV))
5629 inferNoWrapViaConstantRanges(AR);
5630
5631 // We can add Flags to the post-inc expression only if we
5632 // know that it is *undefined behavior* for BEValueV to
5633 // overflow.
5634 if (auto *BEInst = dyn_cast<Instruction>(BEValueV)) {
5635 assert(isLoopInvariant(Accum, L) &&
5636 "Accum is defined outside L, but is not invariant?");
5637 if (isAddRecNeverPoison(BEInst, L))
5638 (void)getAddRecExpr(getAddExpr(StartVal, Accum), Accum, L, Flags);
5639 }
5640
5641 return PHISCEV;
5642}
5643
5644const SCEV *ScalarEvolution::createAddRecFromPHI(PHINode *PN) {
5645 const Loop *L = LI.getLoopFor(PN->getParent());
5646 if (!L || L->getHeader() != PN->getParent())
5647 return nullptr;
5648
5649 // The loop may have multiple entrances or multiple exits; we can analyze
5650 // this phi as an addrec if it has a unique entry value and a unique
5651 // backedge value.
5652 Value *BEValueV = nullptr, *StartValueV = nullptr;
5653 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
5654 Value *V = PN->getIncomingValue(i);
5655 if (L->contains(PN->getIncomingBlock(i))) {
5656 if (!BEValueV) {
5657 BEValueV = V;
5658 } else if (BEValueV != V) {
5659 BEValueV = nullptr;
5660 break;
5661 }
5662 } else if (!StartValueV) {
5663 StartValueV = V;
5664 } else if (StartValueV != V) {
5665 StartValueV = nullptr;
5666 break;
5667 }
5668 }
5669 if (!BEValueV || !StartValueV)
5670 return nullptr;
5671
5672 assert(ValueExprMap.find_as(PN) == ValueExprMap.end() &&
5673 "PHI node already processed?");
5674
5675 // First, try to find AddRec expression without creating a fictituos symbolic
5676 // value for PN.
5677 if (auto *S = createSimpleAffineAddRec(PN, BEValueV, StartValueV))
5678 return S;
5679
5680 // Handle PHI node value symbolically.
5681 const SCEV *SymbolicName = getUnknown(PN);
5682 insertValueToMap(PN, SymbolicName);
5683
5684 // Using this symbolic name for the PHI, analyze the value coming around
5685 // the back-edge.
5686 const SCEV *BEValue = getSCEV(BEValueV);
5687
5688 // NOTE: If BEValue is loop invariant, we know that the PHI node just
5689 // has a special value for the first iteration of the loop.
5690
5691 // If the value coming around the backedge is an add with the symbolic
5692 // value we just inserted, then we found a simple induction variable!
5693 if (const SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(BEValue)) {
5694 // If there is a single occurrence of the symbolic value, replace it
5695 // with a recurrence.
5696 unsigned FoundIndex = Add->getNumOperands();
5697 for (unsigned i = 0, e = Add->getNumOperands(); i != e; ++i)
5698 if (Add->getOperand(i) == SymbolicName)
5699 if (FoundIndex == e) {
5700 FoundIndex = i;
5701 break;
5702 }
5703
5704 if (FoundIndex != Add->getNumOperands()) {
5705 // Create an add with everything but the specified operand.
5707 for (unsigned i = 0, e = Add->getNumOperands(); i != e; ++i)
5708 if (i != FoundIndex)
5709 Ops.push_back(SCEVBackedgeConditionFolder::rewrite(Add->getOperand(i),
5710 L, *this));
5711 const SCEV *Accum = getAddExpr(Ops);
5712
5713 // This is not a valid addrec if the step amount is varying each
5714 // loop iteration, but is not itself an addrec in this loop.
5715 if (isLoopInvariant(Accum, L) ||
5716 (isa<SCEVAddRecExpr>(Accum) &&
5717 cast<SCEVAddRecExpr>(Accum)->getLoop() == L)) {
5719
5720 if (auto BO = MatchBinaryOp(BEValueV, DT)) {
5721 if (BO->Opcode == Instruction::Add && BO->LHS == PN) {
5722 if (BO->IsNUW)
5723 Flags = setFlags(Flags, SCEV::FlagNUW);
5724 if (BO->IsNSW)
5725 Flags = setFlags(Flags, SCEV::FlagNSW);
5726 }
5727 } else if (GEPOperator *GEP = dyn_cast<GEPOperator>(BEValueV)) {
5728 if (GEP->getOperand(0) == PN)
5729 Flags = getNoWrapFlagsForGEP(GEP, Accum, *this);
5730
5731 // We cannot transfer nuw and nsw flags from subtraction
5732 // operations -- sub nuw X, Y is not the same as add nuw X, -Y
5733 // for instance.
5734 }
5735
5736 const SCEV *StartVal = getSCEV(StartValueV);
5737 const SCEV *PHISCEV = getAddRecExpr(StartVal, Accum, L, Flags);
5738
5739 // Okay, for the entire analysis of this edge we assumed the PHI
5740 // to be symbolic. We now need to go back and purge all of the
5741 // entries for the scalars that use the symbolic expression.
5742 forgetMemoizedResults({SymbolicName});
5743 insertValueToMap(PN, PHISCEV);
5744
5745 if (auto *AR = dyn_cast<SCEVAddRecExpr>(PHISCEV))
5746 inferNoWrapViaConstantRanges(AR);
5747
5748 // We can add Flags to the post-inc expression only if we
5749 // know that it is *undefined behavior* for BEValueV to
5750 // overflow.
5751 if (auto *BEInst = dyn_cast<Instruction>(BEValueV))
5752 if (isLoopInvariant(Accum, L) && isAddRecNeverPoison(BEInst, L))
5753 (void)getAddRecExpr(getAddExpr(StartVal, Accum), Accum, L, Flags);
5754
5755 return PHISCEV;
5756 }
5757 }
5758 } else {
5759 // Otherwise, this could be a loop like this:
5760 // i = 0; for (j = 1; ..; ++j) { .... i = j; }
5761 // In this case, j = {1,+,1} and BEValue is j.
5762 // Because the other in-value of i (0) fits the evolution of BEValue
5763 // i really is an addrec evolution.
5764 //
5765 // We can generalize this saying that i is the shifted value of BEValue
5766 // by one iteration:
5767 // PHI(f(0), f({1,+,1})) --> f({0,+,1})
5768
5769 // Do not allow refinement in rewriting of BEValue.
5770 const SCEV *Shifted = SCEVShiftRewriter::rewrite(BEValue, L, *this);
5771 const SCEV *Start = SCEVInitRewriter::rewrite(Shifted, L, *this, false);
5772 if (Shifted != getCouldNotCompute() && Start != getCouldNotCompute() &&
5773 isGuaranteedNotToCauseUB(Shifted) && ::impliesPoison(Shifted, Start)) {
5774 const SCEV *StartVal = getSCEV(StartValueV);
5775 if (Start == StartVal) {
5776 // Okay, for the entire analysis of this edge we assumed the PHI
5777 // to be symbolic. We now need to go back and purge all of the
5778 // entries for the scalars that use the symbolic expression.
5779 forgetMemoizedResults({SymbolicName});
5780 insertValueToMap(PN, Shifted);
5781 return Shifted;
5782 }
5783 }
5784 }
5785
5786 // Remove the temporary PHI node SCEV that has been inserted while intending
5787 // to create an AddRecExpr for this PHI node. We can not keep this temporary
5788 // as it will prevent later (possibly simpler) SCEV expressions to be added
5789 // to the ValueExprMap.
5790 eraseValueFromMap(PN);
5791
5792 return nullptr;
5793}
5794
5795// Try to match a control flow sequence that branches out at BI and merges back
5796// at Merge into a "C ? LHS : RHS" select pattern. Return true on a successful
5797// match.
5799 Value *&C, Value *&LHS, Value *&RHS) {
5800 C = BI->getCondition();
5801
5802 BasicBlockEdge LeftEdge(BI->getParent(), BI->getSuccessor(0));
5803 BasicBlockEdge RightEdge(BI->getParent(), BI->getSuccessor(1));
5804
5805 Use &LeftUse = Merge->getOperandUse(0);
5806 Use &RightUse = Merge->getOperandUse(1);
5807
5808 if (DT.dominates(LeftEdge, LeftUse) && DT.dominates(RightEdge, RightUse)) {
5809 LHS = LeftUse;
5810 RHS = RightUse;
5811 return true;
5812 }
5813
5814 if (DT.dominates(LeftEdge, RightUse) && DT.dominates(RightEdge, LeftUse)) {
5815 LHS = RightUse;
5816 RHS = LeftUse;
5817 return true;
5818 }
5819
5820 return false;
5821}
5822
5824 Value *&Cond, Value *&LHS,
5825 Value *&RHS) {
5826 auto IsReachable =
5827 [&](BasicBlock *BB) { return DT.isReachableFromEntry(BB); };
5828 if (PN->getNumIncomingValues() == 2 && all_of(PN->blocks(), IsReachable)) {
5829 // Try to match
5830 //
5831 // br %cond, label %left, label %right
5832 // left:
5833 // br label %merge
5834 // right:
5835 // br label %merge
5836 // merge:
5837 // V = phi [ %x, %left ], [ %y, %right ]
5838 //
5839 // as "select %cond, %x, %y"
5840
5841 BasicBlock *IDom = DT[PN->getParent()]->getIDom()->getBlock();
5842 assert(IDom && "At least the entry block should dominate PN");
5843
5844 auto *BI = dyn_cast<CondBrInst>(IDom->getTerminator());
5845 return BI && BrPHIToSelect(DT, BI, PN, Cond, LHS, RHS);
5846 }
5847 return false;
5848}
5849
5850const SCEV *ScalarEvolution::createNodeFromSelectLikePHI(PHINode *PN) {
5851 Value *Cond = nullptr, *LHS = nullptr, *RHS = nullptr;
5852 if (getOperandsForSelectLikePHI(DT, PN, Cond, LHS, RHS) &&
5855 return createNodeForSelectOrPHI(PN, Cond, LHS, RHS);
5856
5857 return nullptr;
5858}
5859
5861 BinaryOperator *CommonInst = nullptr;
5862 // Check if instructions are identical.
5863 for (Value *Incoming : PN->incoming_values()) {
5864 auto *IncomingInst = dyn_cast<BinaryOperator>(Incoming);
5865 if (!IncomingInst)
5866 return nullptr;
5867 if (CommonInst) {
5868 if (!CommonInst->isIdenticalToWhenDefined(IncomingInst))
5869 return nullptr; // Not identical, give up
5870 } else {
5871 // Remember binary operator
5872 CommonInst = IncomingInst;
5873 }
5874 }
5875 return CommonInst;
5876}
5877
5878/// Returns SCEV for the first operand of a phi if all phi operands have
5879/// identical opcodes and operands
5880/// eg.
5881/// a: %add = %a + %b
5882/// br %c
5883/// b: %add1 = %a + %b
5884/// br %c
5885/// c: %phi = phi [%add, a], [%add1, b]
5886/// scev(%phi) => scev(%add)
5887const SCEV *
5888ScalarEvolution::createNodeForPHIWithIdenticalOperands(PHINode *PN) {
5889 BinaryOperator *CommonInst = getCommonInstForPHI(PN);
5890 if (!CommonInst)
5891 return nullptr;
5892
5893 // Check if SCEV exprs for instructions are identical.
5894 const SCEV *CommonSCEV = getSCEV(CommonInst);
5895 bool SCEVExprsIdentical =
5897 [this, CommonSCEV](Value *V) { return CommonSCEV == getSCEV(V); });
5898 return SCEVExprsIdentical ? CommonSCEV : nullptr;
5899}
5900
5901const SCEV *ScalarEvolution::createNodeForPHI(PHINode *PN) {
5902 if (const SCEV *S = createAddRecFromPHI(PN))
5903 return S;
5904
5905 // We do not allow simplifying phi (undef, X) to X here, to avoid reusing the
5906 // phi node for X.
5908 PN, {getDataLayout(), &TLI, &DT, &AC, /*CtxI=*/nullptr,
5909 /*UseInstrInfo=*/true, /*CanUseUndef=*/false}))
5910 return getSCEV(V);
5911
5912 if (const SCEV *S = createNodeForPHIWithIdenticalOperands(PN))
5913 return S;
5914
5915 if (const SCEV *S = createNodeFromSelectLikePHI(PN))
5916 return S;
5917
5918 // If it's not a loop phi, we can't handle it yet.
5919 return getUnknown(PN);
5920}
5921
5922bool SCEVMinMaxExprContains(const SCEV *Root, const SCEV *OperandToFind,
5923 SCEVTypes RootKind) {
5924 struct FindClosure {
5925 const SCEV *OperandToFind;
5926 const SCEVTypes RootKind; // Must be a sequential min/max expression.
5927 const SCEVTypes NonSequentialRootKind; // Non-seq variant of RootKind.
5928
5929 bool Found = false;
5930
5931 bool canRecurseInto(SCEVTypes Kind) const {
5932 // We can only recurse into the SCEV expression of the same effective type
5933 // as the type of our root SCEV expression, and into zero-extensions.
5934 return RootKind == Kind || NonSequentialRootKind == Kind ||
5935 scZeroExtend == Kind;
5936 };
5937
5938 FindClosure(const SCEV *OperandToFind, SCEVTypes RootKind)
5939 : OperandToFind(OperandToFind), RootKind(RootKind),
5940 NonSequentialRootKind(
5942 RootKind)) {}
5943
5944 bool follow(const SCEV *S) {
5945 Found = S == OperandToFind;
5946
5947 return !isDone() && canRecurseInto(S->getSCEVType());
5948 }
5949
5950 bool isDone() const { return Found; }
5951 };
5952
5953 FindClosure FC(OperandToFind, RootKind);
5954 visitAll(Root, FC);
5955 return FC.Found;
5956}
5957
5958std::optional<const SCEV *>
5959ScalarEvolution::createNodeForSelectOrPHIInstWithICmpInstCond(Type *Ty,
5960 ICmpInst *Cond,
5961 Value *TrueVal,
5962 Value *FalseVal) {
5963 // Try to match some simple smax or umax patterns.
5964 auto *ICI = Cond;
5965
5966 Value *LHS = ICI->getOperand(0);
5967 Value *RHS = ICI->getOperand(1);
5968
5969 switch (ICI->getPredicate()) {
5970 case ICmpInst::ICMP_SLT:
5971 case ICmpInst::ICMP_SLE:
5972 case ICmpInst::ICMP_ULT:
5973 case ICmpInst::ICMP_ULE:
5974 std::swap(LHS, RHS);
5975 [[fallthrough]];
5976 case ICmpInst::ICMP_SGT:
5977 case ICmpInst::ICMP_SGE:
5978 case ICmpInst::ICMP_UGT:
5979 case ICmpInst::ICMP_UGE:
5980 // a > b ? a+x : b+x -> max(a, b)+x
5981 // a > b ? b+x : a+x -> min(a, b)+x
5983 bool Signed = ICI->isSigned();
5984 const SCEV *LA = getSCEV(TrueVal);
5985 const SCEV *RA = getSCEV(FalseVal);
5986 const SCEV *LS = getSCEV(LHS);
5987 const SCEV *RS = getSCEV(RHS);
5988 if (LA->getType()->isPointerTy()) {
5989 // FIXME: Handle cases where LS/RS are pointers not equal to LA/RA.
5990 // Need to make sure we can't produce weird expressions involving
5991 // negated pointers.
5992 if (LA == LS && RA == RS)
5993 return Signed ? getSMaxExpr(LS, RS) : getUMaxExpr(LS, RS);
5994 if (LA == RS && RA == LS)
5995 return Signed ? getSMinExpr(LS, RS) : getUMinExpr(LS, RS);
5996 }
5997 auto CoerceOperand = [&](const SCEV *Op) -> const SCEV * {
5998 if (Op->getType()->isPointerTy()) {
6001 return Op;
6002 }
6003 if (Signed)
6004 Op = getNoopOrSignExtend(Op, Ty);
6005 else
6006 Op = getNoopOrZeroExtend(Op, Ty);
6007 return Op;
6008 };
6009 LS = CoerceOperand(LS);
6010 RS = CoerceOperand(RS);
6012 break;
6013 const SCEV *LDiff = getMinusSCEV(LA, LS);
6014 const SCEV *RDiff = getMinusSCEV(RA, RS);
6015 if (LDiff == RDiff)
6016 return getAddExpr(Signed ? getSMaxExpr(LS, RS) : getUMaxExpr(LS, RS),
6017 LDiff);
6018 LDiff = getMinusSCEV(LA, RS);
6019 RDiff = getMinusSCEV(RA, LS);
6020 if (LDiff == RDiff)
6021 return getAddExpr(Signed ? getSMinExpr(LS, RS) : getUMinExpr(LS, RS),
6022 LDiff);
6023 }
6024 break;
6025 case ICmpInst::ICMP_NE:
6026 // x != 0 ? x+y : C+y -> x == 0 ? C+y : x+y
6027 std::swap(TrueVal, FalseVal);
6028 [[fallthrough]];
6029 case ICmpInst::ICMP_EQ:
6030 // x == 0 ? C+y : x+y -> umax(x, C)+y iff C u<= 1
6033 const SCEV *X = getNoopOrZeroExtend(getSCEV(LHS), Ty);
6034 const SCEV *TrueValExpr = getSCEV(TrueVal); // C+y
6035 const SCEV *FalseValExpr = getSCEV(FalseVal); // x+y
6036 const SCEV *Y = getMinusSCEV(FalseValExpr, X); // y = (x+y)-x
6037 const SCEV *C = getMinusSCEV(TrueValExpr, Y); // C = (C+y)-y
6038 if (isa<SCEVConstant>(C) && cast<SCEVConstant>(C)->getAPInt().ule(1))
6039 return getAddExpr(getUMaxExpr(X, C), Y);
6040 }
6041 // x == 0 ? 0 : umin (..., x, ...) -> umin_seq(x, umin (...))
6042 // x == 0 ? 0 : umin_seq(..., x, ...) -> umin_seq(x, umin_seq(...))
6043 // x == 0 ? 0 : umin (..., umin_seq(..., x, ...), ...)
6044 // -> umin_seq(x, umin (..., umin_seq(...), ...))
6046 isa<ConstantInt>(TrueVal) && cast<ConstantInt>(TrueVal)->isZero()) {
6047 const SCEV *X = getSCEV(LHS);
6048 while (auto *ZExt = dyn_cast<SCEVZeroExtendExpr>(X))
6049 X = ZExt->getOperand();
6050 if (getTypeSizeInBits(X->getType()) <= getTypeSizeInBits(Ty)) {
6051 const SCEV *FalseValExpr = getSCEV(FalseVal);
6052 if (SCEVMinMaxExprContains(FalseValExpr, X, scSequentialUMinExpr))
6053 return getUMinExpr(getNoopOrZeroExtend(X, Ty), FalseValExpr,
6054 /*Sequential=*/true);
6055 }
6056 }
6057 break;
6058 default:
6059 break;
6060 }
6061
6062 return std::nullopt;
6063}
6064
6065static std::optional<const SCEV *>
6067 const SCEV *TrueExpr, const SCEV *FalseExpr) {
6068 assert(CondExpr->getType()->isIntegerTy(1) &&
6069 TrueExpr->getType() == FalseExpr->getType() &&
6070 TrueExpr->getType()->isIntegerTy(1) &&
6071 "Unexpected operands of a select.");
6072
6073 // i1 cond ? i1 x : i1 C --> C + (i1 cond ? (i1 x - i1 C) : i1 0)
6074 // --> C + (umin_seq cond, x - C)
6075 //
6076 // i1 cond ? i1 C : i1 x --> C + (i1 cond ? i1 0 : (i1 x - i1 C))
6077 // --> C + (i1 ~cond ? (i1 x - i1 C) : i1 0)
6078 // --> C + (umin_seq ~cond, x - C)
6079
6080 // FIXME: while we can't legally model the case where both of the hands
6081 // are fully variable, we only require that the *difference* is constant.
6082 if (!isa<SCEVConstant>(TrueExpr) && !isa<SCEVConstant>(FalseExpr))
6083 return std::nullopt;
6084
6085 const SCEV *X, *C;
6086 if (isa<SCEVConstant>(TrueExpr)) {
6087 CondExpr = SE->getNotSCEV(CondExpr);
6088 X = FalseExpr;
6089 C = TrueExpr;
6090 } else {
6091 X = TrueExpr;
6092 C = FalseExpr;
6093 }
6094 return SE->getAddExpr(C, SE->getUMinExpr(CondExpr, SE->getMinusSCEV(X, C),
6095 /*Sequential=*/true));
6096}
6097
6098static std::optional<const SCEV *>
6100 Value *FalseVal) {
6101 if (!isa<ConstantInt>(TrueVal) && !isa<ConstantInt>(FalseVal))
6102 return std::nullopt;
6103
6104 const auto *SECond = SE->getSCEV(Cond);
6105 const auto *SETrue = SE->getSCEV(TrueVal);
6106 const auto *SEFalse = SE->getSCEV(FalseVal);
6107 return createNodeForSelectViaUMinSeq(SE, SECond, SETrue, SEFalse);
6108}
6109
6110const SCEV *ScalarEvolution::createNodeForSelectOrPHIViaUMinSeq(
6111 Value *V, Value *Cond, Value *TrueVal, Value *FalseVal) {
6112 assert(Cond->getType()->isIntegerTy(1) && "Select condition is not an i1?");
6113 assert(TrueVal->getType() == FalseVal->getType() &&
6114 V->getType() == TrueVal->getType() &&
6115 "Types of select hands and of the result must match.");
6116
6117 // For now, only deal with i1-typed `select`s.
6118 if (!V->getType()->isIntegerTy(1))
6119 return getUnknown(V);
6120
6121 if (std::optional<const SCEV *> S =
6122 createNodeForSelectViaUMinSeq(this, Cond, TrueVal, FalseVal))
6123 return *S;
6124
6125 return getUnknown(V);
6126}
6127
6128const SCEV *ScalarEvolution::createNodeForSelectOrPHI(Value *V, Value *Cond,
6129 Value *TrueVal,
6130 Value *FalseVal) {
6131 // Handle "constant" branch or select. This can occur for instance when a
6132 // loop pass transforms an inner loop and moves on to process the outer loop.
6133 if (auto *CI = dyn_cast<ConstantInt>(Cond))
6134 return getSCEV(CI->isOne() ? TrueVal : FalseVal);
6135
6136 if (auto *I = dyn_cast<Instruction>(V)) {
6137 if (auto *ICI = dyn_cast<ICmpInst>(Cond)) {
6138 if (std::optional<const SCEV *> S =
6139 createNodeForSelectOrPHIInstWithICmpInstCond(I->getType(), ICI,
6140 TrueVal, FalseVal))
6141 return *S;
6142 }
6143 }
6144
6145 return createNodeForSelectOrPHIViaUMinSeq(V, Cond, TrueVal, FalseVal);
6146}
6147
6148/// Expand GEP instructions into add and multiply operations. This allows them
6149/// to be analyzed by regular SCEV code.
6150const SCEV *ScalarEvolution::createNodeForGEP(GEPOperator *GEP) {
6151 assert(GEP->getSourceElementType()->isSized() &&
6152 "GEP source element type must be sized");
6153
6154 SmallVector<SCEVUse, 4> IndexExprs;
6155 for (Value *Index : GEP->indices())
6156 IndexExprs.push_back(getSCEV(Index));
6157 return getGEPExpr(GEP, IndexExprs);
6158}
6159
6160APInt ScalarEvolution::getConstantMultipleImpl(const SCEV *S,
6161 const Instruction *CtxI) {
6163 auto GetShiftedByZeros = [BitWidth](uint32_t TrailingZeros) {
6164 return TrailingZeros >= BitWidth
6166 : APInt::getOneBitSet(BitWidth, TrailingZeros);
6167 };
6168 auto GetGCDMultiple = [this, CtxI](const SCEVNAryExpr *N) {
6169 // The result is GCD of all operands results.
6170 APInt Res = getConstantMultiple(N->getOperand(0), CtxI);
6171 for (unsigned I = 1, E = N->getNumOperands(); I < E && Res != 1; ++I)
6173 Res, getConstantMultiple(N->getOperand(I), CtxI));
6174 return Res;
6175 };
6176
6177 switch (S->getSCEVType()) {
6178 case scConstant:
6179 return cast<SCEVConstant>(S)->getAPInt();
6180 case scPtrToAddr:
6181 return getConstantMultiple(cast<SCEVCastExpr>(S)->getOperand());
6182 case scUDivExpr:
6183 case scVScale:
6184 return APInt(BitWidth, 1);
6185 case scTruncate: {
6186 // Only multiples that are a power of 2 will hold after truncation.
6187 const SCEVTruncateExpr *T = cast<SCEVTruncateExpr>(S);
6188 uint32_t TZ = getMinTrailingZeros(T->getOperand(), CtxI);
6189 return GetShiftedByZeros(TZ);
6190 }
6191 case scZeroExtend: {
6192 const SCEVZeroExtendExpr *Z = cast<SCEVZeroExtendExpr>(S);
6193 return getConstantMultiple(Z->getOperand(), CtxI).zext(BitWidth);
6194 }
6195 case scSignExtend: {
6196 // Only multiples that are a power of 2 will hold after sext.
6197 const SCEVSignExtendExpr *E = cast<SCEVSignExtendExpr>(S);
6198 uint32_t TZ = getMinTrailingZeros(E->getOperand(), CtxI);
6199 return GetShiftedByZeros(TZ);
6200 }
6201 case scMulExpr: {
6202 const SCEVMulExpr *M = cast<SCEVMulExpr>(S);
6203 if (M->hasNoUnsignedWrap()) {
6204 // The result is the product of all operand results.
6205 APInt Res = getConstantMultiple(M->getOperand(0), CtxI);
6206 for (const SCEV *Operand : M->operands().drop_front())
6207 Res = Res * getConstantMultiple(Operand, CtxI);
6208 return Res;
6209 }
6210
6211 // If there are no wrap guarentees, find the trailing zeros, which is the
6212 // sum of trailing zeros for all its operands.
6213 uint32_t TZ = 0;
6214 for (const SCEV *Operand : M->operands())
6215 TZ += getMinTrailingZeros(Operand, CtxI);
6216 return GetShiftedByZeros(TZ);
6217 }
6218 case scAddExpr:
6219 case scAddRecExpr: {
6220 const SCEVNAryExpr *N = cast<SCEVNAryExpr>(S);
6221 if (N->hasNoUnsignedWrap())
6222 return GetGCDMultiple(N);
6223 // Find the trailing bits, which is the minimum of its operands.
6224 uint32_t TZ = getMinTrailingZeros(N->getOperand(0), CtxI);
6225 for (const SCEV *Operand : N->operands().drop_front())
6226 TZ = std::min(TZ, getMinTrailingZeros(Operand, CtxI));
6227 return GetShiftedByZeros(TZ);
6228 }
6229 case scUMaxExpr:
6230 case scSMaxExpr:
6231 case scUMinExpr:
6232 case scSMinExpr:
6234 return GetGCDMultiple(cast<SCEVNAryExpr>(S));
6235 case scUnknown: {
6236 // Ask ValueTracking for known bits. SCEVUnknown only become available at
6237 // the point their underlying IR instruction has been defined. If CtxI was
6238 // not provided, use:
6239 // * the first instruction in the entry block if it is an argument
6240 // * the instruction itself otherwise.
6241 const SCEVUnknown *U = cast<SCEVUnknown>(S);
6242 if (!CtxI) {
6243 if (isa<Argument>(U->getValue()))
6244 CtxI = &*F.getEntryBlock().begin();
6245 else if (auto *I = dyn_cast<Instruction>(U->getValue()))
6246 CtxI = I;
6247 }
6248 unsigned Known =
6249 computeKnownBits(U->getValue(),
6250 SimplifyQuery(getDataLayout(), &DT, &AC, CtxI)
6251 .allowEphemerals(true))
6252 .countMinTrailingZeros();
6253 return GetShiftedByZeros(Known);
6254 }
6255 case scCouldNotCompute:
6256 llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!");
6257 }
6258 llvm_unreachable("Unknown SCEV kind!");
6259}
6260
6262 const Instruction *CtxI) {
6263 // Skip looking up and updating the cache if there is a context instruction,
6264 // as the result will only be valid in the specified context.
6265 if (CtxI)
6266 return getConstantMultipleImpl(S, CtxI);
6267
6268 auto I = ConstantMultipleCache.find(S);
6269 if (I != ConstantMultipleCache.end())
6270 return I->second;
6271
6272 APInt Result = getConstantMultipleImpl(S, CtxI);
6273 auto InsertPair = ConstantMultipleCache.insert({S, Result});
6274 assert(InsertPair.second && "Should insert a new key");
6275 return InsertPair.first->second;
6276}
6277
6279 APInt Multiple = getConstantMultiple(S);
6280 return Multiple == 0 ? APInt(Multiple.getBitWidth(), 1) : Multiple;
6281}
6282
6284 const Instruction *CtxI) {
6285 return std::min(getConstantMultiple(S, CtxI).countTrailingZeros(),
6286 (unsigned)getTypeSizeInBits(S->getType()));
6287}
6288
6289/// Helper method to assign a range to V from metadata present in the IR.
6290static std::optional<ConstantRange> GetRangeFromMetadata(Value *V) {
6292 if (MDNode *MD = I->getMetadata(LLVMContext::MD_range))
6293 return getConstantRangeFromMetadata(*MD);
6294 if (const auto *CB = dyn_cast<CallBase>(V))
6295 if (std::optional<ConstantRange> Range = CB->getRange())
6296 return Range;
6297 }
6298 if (auto *A = dyn_cast<Argument>(V))
6299 if (std::optional<ConstantRange> Range = A->getRange())
6300 return Range;
6301
6302 return std::nullopt;
6303}
6304
6306 SCEVFlags NWFlags = Flags & SCEV::FlagsNoWrapMask;
6307 if (AddRec->getNoWrapFlags(NWFlags) != NWFlags) {
6308 AddRec->setNoWrapFlags(NWFlags);
6309 UnsignedRanges.erase(AddRec);
6310 SignedRanges.erase(AddRec);
6311 ConstantMultipleCache.erase(AddRec);
6312 }
6313}
6314
6315ConstantRange ScalarEvolution::
6316getRangeForUnknownRecurrence(const SCEVUnknown *U) {
6317 const DataLayout &DL = getDataLayout();
6318
6319 unsigned BitWidth = getTypeSizeInBits(U->getType());
6320 const ConstantRange FullSet(BitWidth, /*isFullSet=*/true);
6321
6322 // Match a simple recurrence of the form: <start, ShiftOp, Step>, and then
6323 // use information about the trip count to improve our available range. Note
6324 // that the trip count independent cases are already handled by known bits.
6325 // WARNING: The definition of recurrence used here is subtly different than
6326 // the one used by AddRec (and thus most of this file). Step is allowed to
6327 // be arbitrarily loop varying here, where AddRec allows only loop invariant
6328 // and other addrecs in the same loop (for non-affine addrecs). The code
6329 // below intentionally handles the case where step is not loop invariant.
6330 auto *P = dyn_cast<PHINode>(U->getValue());
6331 if (!P)
6332 return FullSet;
6333
6334 // Make sure that no Phi input comes from an unreachable block. Otherwise,
6335 // even the values that are not available in these blocks may come from them,
6336 // and this leads to false-positive recurrence test.
6337 for (auto *Pred : predecessors(P->getParent()))
6338 if (!DT.isReachableFromEntry(Pred))
6339 return FullSet;
6340
6341 BinaryOperator *BO;
6342 Value *Start, *Step;
6343 if (!matchSimpleRecurrence(P, BO, Start, Step))
6344 return FullSet;
6345
6346 // If we found a recurrence in reachable code, we must be in a loop. Note
6347 // that BO might be in some subloop of L, and that's completely okay.
6348 auto *L = LI.getLoopFor(P->getParent());
6349 assert(L && L->getHeader() == P->getParent());
6350 if (!L->contains(BO->getParent()))
6351 // NOTE: This bailout should be an assert instead. However, asserting
6352 // the condition here exposes a case where LoopFusion is querying SCEV
6353 // with malformed loop information during the midst of the transform.
6354 // There doesn't appear to be an obvious fix, so for the moment bailout
6355 // until the caller issue can be fixed. PR49566 tracks the bug.
6356 return FullSet;
6357
6358 // TODO: Extend to other opcodes such as mul, and div
6359 switch (BO->getOpcode()) {
6360 default:
6361 return FullSet;
6362 case Instruction::AShr:
6363 case Instruction::LShr:
6364 case Instruction::Shl:
6365 break;
6366 };
6367
6368 if (BO->getOperand(0) != P)
6369 // TODO: Handle the power function forms some day.
6370 return FullSet;
6371
6372 unsigned TC = getSmallConstantMaxTripCount(L);
6373 if (!TC || TC >= BitWidth)
6374 return FullSet;
6375
6376 auto KnownStart = computeKnownBits(Start, DL, &AC, nullptr, &DT);
6377 auto KnownStep = computeKnownBits(Step, DL, &AC, nullptr, &DT);
6378 assert(KnownStart.getBitWidth() == BitWidth &&
6379 KnownStep.getBitWidth() == BitWidth);
6380
6381 // Compute total shift amount, being careful of overflow and bitwidths.
6382 auto MaxShiftAmt = KnownStep.getMaxValue();
6383 APInt TCAP(BitWidth, TC-1);
6384 bool Overflow = false;
6385 auto TotalShift = MaxShiftAmt.umul_ov(TCAP, Overflow);
6386 if (Overflow)
6387 return FullSet;
6388
6389 switch (BO->getOpcode()) {
6390 default:
6391 llvm_unreachable("filtered out above");
6392 case Instruction::AShr: {
6393 // For each ashr, three cases:
6394 // shift = 0 => unchanged value
6395 // saturation => 0 or -1
6396 // other => a value closer to zero (of the same sign)
6397 // Thus, the end value is closer to zero than the start.
6398 auto KnownEnd = KnownBits::ashr(KnownStart,
6399 KnownBits::makeConstant(TotalShift));
6400 if (KnownStart.isNonNegative())
6401 // Analogous to lshr (simply not yet canonicalized)
6402 return ConstantRange::getNonEmpty(KnownEnd.getMinValue(),
6403 KnownStart.getMaxValue() + 1);
6404 if (KnownStart.isNegative())
6405 // End >=u Start && End <=s Start
6406 return ConstantRange::getNonEmpty(KnownStart.getMinValue(),
6407 KnownEnd.getMaxValue() + 1);
6408 break;
6409 }
6410 case Instruction::LShr: {
6411 // For each lshr, three cases:
6412 // shift = 0 => unchanged value
6413 // saturation => 0
6414 // other => a smaller positive number
6415 // Thus, the low end of the unsigned range is the last value produced.
6416 auto KnownEnd = KnownBits::lshr(KnownStart,
6417 KnownBits::makeConstant(TotalShift));
6418 return ConstantRange::getNonEmpty(KnownEnd.getMinValue(),
6419 KnownStart.getMaxValue() + 1);
6420 }
6421 case Instruction::Shl: {
6422 // Iff no bits are shifted out, value increases on every shift.
6423 auto KnownEnd = KnownBits::shl(KnownStart,
6424 KnownBits::makeConstant(TotalShift));
6425 if (TotalShift.ult(KnownStart.countMinLeadingZeros()))
6426 return ConstantRange(KnownStart.getMinValue(),
6427 KnownEnd.getMaxValue() + 1);
6428 break;
6429 }
6430 };
6431 return FullSet;
6432}
6433
6434// The goal of this function is to check if recursively visiting the operands
6435// of this PHI might lead to an infinite loop. If we do see such a loop,
6436// there's no good way to break it, so we avoid analyzing such cases.
6437//
6438// getRangeRef previously used a visited set to avoid infinite loops, but this
6439// caused other issues: the result was dependent on the order of getRangeRef
6440// calls, and the interaction with createSCEVIter could cause a stack overflow
6441// in some cases (see issue #148253).
6442//
6443// FIXME: The way this is implemented is overly conservative; this checks
6444// for a few obviously safe patterns, but anything that doesn't lead to
6445// recursion is fine.
6447 Value *Cond = nullptr, *LHS = nullptr, *RHS = nullptr;
6449 return true;
6450
6451 if (all_of(PHI->operands(),
6452 [&](Value *Operand) { return DT.dominates(Operand, PHI); }))
6453 return true;
6454
6455 return false;
6456}
6457
6458const ConstantRange &
6459ScalarEvolution::getRangeRefIter(const SCEV *S,
6460 ScalarEvolution::RangeSignHint SignHint) {
6461 DenseMap<const SCEV *, ConstantRange> &Cache =
6462 SignHint == ScalarEvolution::HINT_RANGE_UNSIGNED ? UnsignedRanges
6463 : SignedRanges;
6464 SmallVector<SCEVUse> WorkList;
6465 SmallPtrSet<const SCEV *, 8> Seen;
6466
6467 // Add Expr to the worklist, if Expr is either an N-ary expression or a
6468 // SCEVUnknown PHI node.
6469 auto AddToWorklist = [&WorkList, &Seen, &Cache](const SCEV *Expr) {
6470 if (!Seen.insert(Expr).second)
6471 return;
6472 if (Cache.contains(Expr))
6473 return;
6474 switch (Expr->getSCEVType()) {
6475 case scUnknown:
6477 break;
6478 [[fallthrough]];
6479 case scConstant:
6480 case scVScale:
6481 case scTruncate:
6482 case scZeroExtend:
6483 case scSignExtend:
6484 case scPtrToAddr:
6485 case scAddExpr:
6486 case scMulExpr:
6487 case scUDivExpr:
6488 case scAddRecExpr:
6489 case scUMaxExpr:
6490 case scSMaxExpr:
6491 case scUMinExpr:
6492 case scSMinExpr:
6494 WorkList.push_back(Expr);
6495 break;
6496 case scCouldNotCompute:
6497 llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!");
6498 }
6499 };
6500 AddToWorklist(S);
6501
6502 // Build worklist by queuing operands of N-ary expressions and phi nodes.
6503 for (unsigned I = 0; I != WorkList.size(); ++I) {
6504 const SCEV *P = WorkList[I];
6505 auto *UnknownS = dyn_cast<SCEVUnknown>(P);
6506 // If it is not a `SCEVUnknown`, just recurse into operands.
6507 if (!UnknownS) {
6508 for (const SCEV *Op : P->operands())
6509 AddToWorklist(Op);
6510 continue;
6511 }
6512 // `SCEVUnknown`'s require special treatment.
6513 if (PHINode *P = dyn_cast<PHINode>(UnknownS->getValue())) {
6514 if (!RangeRefPHIAllowedOperands(DT, P))
6515 continue;
6516 for (auto &Op : reverse(P->operands()))
6517 AddToWorklist(getSCEV(Op));
6518 }
6519 }
6520
6521 if (!WorkList.empty()) {
6522 // Use getRangeRef to compute ranges for items in the worklist in reverse
6523 // order. This will force ranges for earlier operands to be computed before
6524 // their users in most cases.
6525 for (const SCEV *P : reverse(drop_begin(WorkList))) {
6526 getRangeRef(P, SignHint);
6527 }
6528 }
6529
6530 return getRangeRef(S, SignHint, 0);
6531}
6532
6533const APInt *ScalarEvolution::getConstantAPIntOrNull(const SCEV *S) {
6534 if (const auto *C = dyn_cast<SCEVConstant>(S))
6535 return &C->getAPInt();
6536 return nullptr;
6537}
6538
6539/// Determine the range for a particular SCEV. If SignHint is
6540/// HINT_RANGE_UNSIGNED (resp. HINT_RANGE_SIGNED) then getRange prefers ranges
6541/// with a "cleaner" unsigned (resp. signed) representation.
6542const ConstantRange &ScalarEvolution::getRangeRef(
6543 const SCEV *S, ScalarEvolution::RangeSignHint SignHint, unsigned Depth) {
6544 DenseMap<const SCEV *, ConstantRange> &Cache =
6545 SignHint == ScalarEvolution::HINT_RANGE_UNSIGNED ? UnsignedRanges
6546 : SignedRanges;
6548 SignHint == ScalarEvolution::HINT_RANGE_UNSIGNED ? ConstantRange::Unsigned
6550
6551 // See if we've computed this range already.
6552 auto I = Cache.find(S);
6553 if (I != Cache.end())
6554 return I->second;
6555
6556 if (const SCEVConstant *C = dyn_cast<SCEVConstant>(S))
6557 return setRange(C, SignHint, ConstantRange(C->getAPInt()));
6558
6559 // Switch to iteratively computing the range for S, if it is part of a deeply
6560 // nested expression.
6561 if (Depth > Opts.scev_range_iter_threshold)
6562 return getRangeRefIter(S, SignHint);
6563
6564 unsigned BitWidth = getTypeSizeInBits(S->getType());
6565 ConstantRange ConservativeResult(BitWidth, /*isFullSet=*/true);
6566 using OBO = OverflowingBinaryOperator;
6567
6568 // If the value has known zeros, the maximum value will have those known zeros
6569 // as well.
6570 if (SignHint == ScalarEvolution::HINT_RANGE_UNSIGNED) {
6571 APInt Multiple = getNonZeroConstantMultiple(S);
6572 APInt Remainder = APInt::getMaxValue(BitWidth).urem(Multiple);
6573 if (!Remainder.isZero())
6574 ConservativeResult =
6575 ConstantRange(APInt::getMinValue(BitWidth),
6576 APInt::getMaxValue(BitWidth) - Remainder + 1);
6577 }
6578 else {
6579 uint32_t TZ = getMinTrailingZeros(S);
6580 if (TZ != 0) {
6581 ConservativeResult = ConstantRange(
6583 APInt::getSignedMaxValue(BitWidth).ashr(TZ).shl(TZ) + 1);
6584 }
6585 }
6586
6587 switch (S->getSCEVType()) {
6588 case scConstant:
6589 llvm_unreachable("Already handled above.");
6590 case scVScale:
6591 return setRange(S, SignHint, getVScaleRange(&F, BitWidth));
6592 case scTruncate: {
6593 const SCEVTruncateExpr *Trunc = cast<SCEVTruncateExpr>(S);
6594 ConstantRange X = getRangeRef(Trunc->getOperand(), SignHint, Depth + 1);
6595 return setRange(
6596 Trunc, SignHint,
6597 ConservativeResult.intersectWith(X.truncate(BitWidth), RangeType));
6598 }
6599 case scZeroExtend: {
6600 const SCEVZeroExtendExpr *ZExt = cast<SCEVZeroExtendExpr>(S);
6601 ConstantRange X = getRangeRef(ZExt->getOperand(), SignHint, Depth + 1);
6602 return setRange(
6603 ZExt, SignHint,
6604 ConservativeResult.intersectWith(X.zeroExtend(BitWidth), RangeType));
6605 }
6606 case scSignExtend: {
6607 const SCEVSignExtendExpr *SExt = cast<SCEVSignExtendExpr>(S);
6608 ConstantRange X = getRangeRef(SExt->getOperand(), SignHint, Depth + 1);
6609 return setRange(
6610 SExt, SignHint,
6611 ConservativeResult.intersectWith(X.signExtend(BitWidth), RangeType));
6612 }
6613 case scPtrToAddr: {
6614 const SCEVCastExpr *Cast = cast<SCEVCastExpr>(S);
6615 ConstantRange X = getRangeRef(Cast->getOperand(), SignHint, Depth + 1);
6616 return setRange(Cast, SignHint, X);
6617 }
6618 case scAddExpr: {
6619 const SCEVAddExpr *Add = cast<SCEVAddExpr>(S);
6620 // Check if this is a URem pattern: A - (A / B) * B, which is always < B.
6621 const SCEV *URemLHS = nullptr, *URemRHS = nullptr;
6622 if (SignHint == ScalarEvolution::HINT_RANGE_UNSIGNED &&
6623 match(S, m_scev_URem(m_SCEV(URemLHS), m_SCEV(URemRHS), *this))) {
6624 ConstantRange LHSRange = getRangeRef(URemLHS, SignHint, Depth + 1);
6625 ConstantRange RHSRange = getRangeRef(URemRHS, SignHint, Depth + 1);
6626 ConservativeResult =
6627 ConservativeResult.intersectWith(LHSRange.urem(RHSRange), RangeType);
6628 }
6629 ConstantRange X = getRangeRef(Add->getOperand(0), SignHint, Depth + 1);
6630 unsigned WrapType = OBO::AnyWrap;
6631 if (Add->hasNoSignedWrap())
6632 WrapType |= OBO::NoSignedWrap;
6633 if (Add->hasNoUnsignedWrap())
6634 WrapType |= OBO::NoUnsignedWrap;
6635 for (const SCEV *Op : drop_begin(Add->operands()))
6636 X = X.addWithNoWrap(getRangeRef(Op, SignHint, Depth + 1), WrapType,
6637 RangeType);
6638 return setRange(Add, SignHint,
6639 ConservativeResult.intersectWith(X, RangeType));
6640 }
6641 case scMulExpr: {
6642 const SCEVMulExpr *Mul = cast<SCEVMulExpr>(S);
6643 ConstantRange X = getRangeRef(Mul->getOperand(0), SignHint, Depth + 1);
6644 for (const SCEV *Op : drop_begin(Mul->operands()))
6645 X = X.multiply(getRangeRef(Op, SignHint, Depth + 1));
6646 return setRange(Mul, SignHint,
6647 ConservativeResult.intersectWith(X, RangeType));
6648 }
6649 case scUDivExpr: {
6650 const SCEVUDivExpr *UDiv = cast<SCEVUDivExpr>(S);
6651 ConstantRange X = getRangeRef(UDiv->getLHS(), SignHint, Depth + 1);
6652 ConstantRange Y = getRangeRef(UDiv->getRHS(), SignHint, Depth + 1);
6653 return setRange(UDiv, SignHint,
6654 ConservativeResult.intersectWith(X.udiv(Y), RangeType));
6655 }
6656 case scAddRecExpr: {
6657 const SCEVAddRecExpr *AddRec = cast<SCEVAddRecExpr>(S);
6658 // If there's no unsigned wrap, the value will never be less than its
6659 // initial value.
6660 if (AddRec->hasNoUnsignedWrap()) {
6661 APInt UnsignedMinValue = getUnsignedRangeMin(AddRec->getStart());
6662 if (!UnsignedMinValue.isZero())
6663 ConservativeResult = ConservativeResult.intersectWith(
6664 ConstantRange(UnsignedMinValue, APInt(BitWidth, 0)), RangeType);
6665 }
6666
6667 // If there's no signed wrap, and all the operands except initial value have
6668 // the same sign or zero, the value won't ever be:
6669 // 1: smaller than initial value if operands are non negative,
6670 // 2: bigger than initial value if operands are non positive.
6671 // For both cases, value can not cross signed min/max boundary.
6672 if (AddRec->hasNoSignedWrap()) {
6673 bool AllNonNeg = true;
6674 bool AllNonPos = true;
6675 for (unsigned i = 1, e = AddRec->getNumOperands(); i != e; ++i) {
6676 if (!isKnownNonNegative(AddRec->getOperand(i)))
6677 AllNonNeg = false;
6678 if (!isKnownNonPositive(AddRec->getOperand(i)))
6679 AllNonPos = false;
6680 }
6681 if (AllNonNeg)
6682 ConservativeResult = ConservativeResult.intersectWith(
6685 RangeType);
6686 else if (AllNonPos)
6687 ConservativeResult = ConservativeResult.intersectWith(
6689 getSignedRangeMax(AddRec->getStart()) +
6690 1),
6691 RangeType);
6692 }
6693
6694 // TODO: non-affine addrec
6695 if (AddRec->isAffine()) {
6696 const SCEV *MaxBEScev =
6698 if (!isa<SCEVCouldNotCompute>(MaxBEScev)) {
6699 APInt MaxBECount = cast<SCEVConstant>(MaxBEScev)->getAPInt();
6700
6701 // Adjust MaxBECount to the same bitwidth as AddRec. We can truncate if
6702 // MaxBECount's active bits are all <= AddRec's bit width.
6703 if (MaxBECount.getBitWidth() > BitWidth &&
6704 MaxBECount.getActiveBits() <= BitWidth)
6705 MaxBECount = MaxBECount.trunc(BitWidth);
6706 else if (MaxBECount.getBitWidth() < BitWidth)
6707 MaxBECount = MaxBECount.zext(BitWidth);
6708
6709 if (MaxBECount.getBitWidth() == BitWidth) {
6710 auto [RangeFromAffine, Flags] = getRangeForAffineAR(
6711 AddRec->getStart(), AddRec->getStepRecurrence(*this), MaxBECount);
6712 ConservativeResult =
6713 ConservativeResult.intersectWith(RangeFromAffine, RangeType);
6714 const_cast<SCEVAddRecExpr *>(AddRec)->setNoWrapFlags(Flags);
6715
6716 auto RangeFromFactoring = getRangeViaFactoring(
6717 AddRec->getStart(), AddRec->getStepRecurrence(*this), MaxBECount);
6718 ConservativeResult =
6719 ConservativeResult.intersectWith(RangeFromFactoring, RangeType);
6720 }
6721 }
6722
6723 // Now try symbolic BE count and more powerful methods.
6724 if (Opts.scalar_evolution_use_expensive_range_sharpening) {
6725 const SCEV *SymbolicMaxBECount =
6727 if (!isa<SCEVCouldNotCompute>(SymbolicMaxBECount) &&
6728 getTypeSizeInBits(MaxBEScev->getType()) <= BitWidth &&
6729 AddRec->hasNoSelfWrap()) {
6730 auto RangeFromAffineNew = getRangeForAffineNoSelfWrappingAR(
6731 AddRec, SymbolicMaxBECount, BitWidth, SignHint);
6732 ConservativeResult =
6733 ConservativeResult.intersectWith(RangeFromAffineNew, RangeType);
6734 }
6735 }
6736 }
6737
6738 return setRange(AddRec, SignHint, std::move(ConservativeResult));
6739 }
6740 case scUMaxExpr:
6741 case scSMaxExpr:
6742 case scUMinExpr:
6743 case scSMinExpr:
6744 case scSequentialUMinExpr: {
6746 switch (S->getSCEVType()) {
6747 case scUMaxExpr:
6748 ID = Intrinsic::umax;
6749 break;
6750 case scSMaxExpr:
6751 ID = Intrinsic::smax;
6752 break;
6753 case scUMinExpr:
6755 ID = Intrinsic::umin;
6756 break;
6757 case scSMinExpr:
6758 ID = Intrinsic::smin;
6759 break;
6760 default:
6761 llvm_unreachable("Unknown SCEVMinMaxExpr/SCEVSequentialMinMaxExpr.");
6762 }
6763
6764 const auto *NAry = cast<SCEVNAryExpr>(S);
6765 ConstantRange X = getRangeRef(NAry->getOperand(0), SignHint, Depth + 1);
6766 for (unsigned i = 1, e = NAry->getNumOperands(); i != e; ++i)
6767 X = X.intrinsic(
6768 ID, {X, getRangeRef(NAry->getOperand(i), SignHint, Depth + 1)});
6769 return setRange(S, SignHint,
6770 ConservativeResult.intersectWith(X, RangeType));
6771 }
6772 case scUnknown: {
6773 const SCEVUnknown *U = cast<SCEVUnknown>(S);
6774 Value *V = U->getValue();
6775
6776 // Check if the IR explicitly contains !range metadata.
6777 std::optional<ConstantRange> MDRange = GetRangeFromMetadata(V);
6778 if (MDRange)
6779 ConservativeResult =
6780 ConservativeResult.intersectWith(*MDRange, RangeType);
6781
6782 // Use facts about recurrences in the underlying IR. Note that add
6783 // recurrences are AddRecExprs and thus don't hit this path. This
6784 // primarily handles shift recurrences.
6785 auto CR = getRangeForUnknownRecurrence(U);
6786 ConservativeResult = ConservativeResult.intersectWith(CR);
6787
6788 // See if ValueTracking can give us a useful range.
6789 const DataLayout &DL = getDataLayout();
6790 KnownBits Known = computeKnownBits(V, DL, &AC, nullptr, &DT);
6791 if (Known.getBitWidth() != BitWidth)
6792 Known = Known.zextOrTrunc(BitWidth);
6793
6794 // ValueTracking may be able to compute a tighter result for the number of
6795 // sign bits than for the value of those sign bits.
6796 unsigned NS = ComputeNumSignBits(V, DL, &AC, nullptr, &DT);
6797 if (U->getType()->isPointerTy()) {
6798 // NS counts the sign bits of the whole pointer; drop those above the
6799 // index bits.
6800 unsigned PtrIdxDiff =
6801 DL.getPointerTypeSizeInBits(U->getType()) - BitWidth;
6802 NS = NS > PtrIdxDiff ? NS - PtrIdxDiff : 1;
6803 }
6804
6805 if (NS > 1) {
6806 // If we know any of the sign bits, we know all of the sign bits.
6807 if (!Known.Zero.getHiBits(NS).isZero())
6808 Known.Zero.setHighBits(NS);
6809 if (!Known.One.getHiBits(NS).isZero())
6810 Known.One.setHighBits(NS);
6811 }
6812
6813 if (Known.getMinValue() != Known.getMaxValue() + 1)
6814 ConservativeResult = ConservativeResult.intersectWith(
6815 ConstantRange(Known.getMinValue(), Known.getMaxValue() + 1),
6816 RangeType);
6817 if (NS > 1)
6818 ConservativeResult = ConservativeResult.intersectWith(
6819 ConstantRange(APInt::getSignedMinValue(BitWidth).ashr(NS - 1),
6820 APInt::getSignedMaxValue(BitWidth).ashr(NS - 1) + 1),
6821 RangeType);
6822
6823 if (U->getType()->isPointerTy() && SignHint == HINT_RANGE_UNSIGNED) {
6824 // Strengthen the range if the underlying IR value is a
6825 // global/alloca/heap allocation using the size of the object.
6826 bool CanBeNull;
6827 uint64_t DerefBytes = V->getPointerDereferenceableBytes(
6828 DL, CanBeNull, /*CanBeFreed=*/nullptr);
6829 if (DerefBytes > 1 && isUIntN(BitWidth, DerefBytes)) {
6830 // The highest address the object can start is DerefBytes bytes before
6831 // the end (unsigned max value). If this value is not a multiple of the
6832 // alignment, the last possible start value is the next lowest multiple
6833 // of the alignment. Note: The computations below cannot overflow,
6834 // because if they would there's no possible start address for the
6835 // object.
6836 APInt MaxVal =
6837 APInt::getMaxValue(BitWidth) - APInt(BitWidth, DerefBytes);
6838 uint64_t Align = U->getValue()->getPointerAlignment(DL).value();
6839 uint64_t Rem = MaxVal.urem(Align);
6840 MaxVal -= APInt(BitWidth, Rem);
6841 APInt MinVal = APInt::getZero(BitWidth);
6842 if (llvm::isKnownNonZero(V, DL))
6843 MinVal = Align;
6844 ConservativeResult = ConservativeResult.intersectWith(
6845 ConstantRange::getNonEmpty(MinVal, MaxVal + 1), RangeType);
6846 }
6847 }
6848
6849 // A range of Phi is a subset of union of all ranges of its input.
6850 if (PHINode *Phi = dyn_cast<PHINode>(V)) {
6851 // SCEVExpander sometimes creates SCEVUnknowns that are secretly
6852 // AddRecs; return the range for the corresponding AddRec.
6853 if (auto *AR = dyn_cast<SCEVAddRecExpr>(getSCEV(V)))
6854 return getRangeRef(AR, SignHint, Depth + 1);
6855
6856 // Make sure that we do not run over cycled Phis.
6857 if (RangeRefPHIAllowedOperands(DT, Phi)) {
6858 ConstantRange RangeFromOps(BitWidth, /*isFullSet=*/false);
6859
6860 for (const auto &Op : Phi->operands()) {
6861 auto OpRange = getRangeRef(getSCEV(Op), SignHint, Depth + 1);
6862 RangeFromOps = RangeFromOps.unionWith(OpRange);
6863 // No point to continue if we already have a full set.
6864 if (RangeFromOps.isFullSet())
6865 break;
6866 }
6867 ConservativeResult =
6868 ConservativeResult.intersectWith(RangeFromOps, RangeType);
6869 }
6870 }
6871
6872 // vscale can't be equal to zero
6873 if (const auto *II = dyn_cast<IntrinsicInst>(V))
6874 if (II->getIntrinsicID() == Intrinsic::vscale) {
6875 ConstantRange Disallowed = APInt::getZero(BitWidth);
6876 ConservativeResult = ConservativeResult.difference(Disallowed);
6877 }
6878
6879 return setRange(U, SignHint, std::move(ConservativeResult));
6880 }
6881 case scCouldNotCompute:
6882 llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!");
6883 }
6884
6885 return setRange(S, SignHint, std::move(ConservativeResult));
6886}
6887
6888// Given a StartRange, Step and MaxBECount for an expression compute a range of
6889// values that the expression can take. Initially, the expression has a value
6890// from StartRange and then is changed by Step up to MaxBECount times. Signed
6891// argument defines if we treat Step as signed or unsigned. The second return
6892// value indicates that no wrapping occurred.
6893static std::pair<ConstantRange, bool>
6895 const APInt &MaxBECount, bool Signed) {
6896 unsigned BitWidth = Step.getBitWidth();
6897 assert(BitWidth == StartRange.getBitWidth() &&
6898 BitWidth == MaxBECount.getBitWidth() && "mismatched bit widths");
6899 // If either Step or MaxBECount is 0, then the expression won't change, and we
6900 // just need to return the initial range.
6901 if (Step == 0 || MaxBECount == 0)
6902 return {StartRange, true};
6903
6904 // If we don't know anything about the initial value (i.e. StartRange is
6905 // FullRange), then we don't know anything about the final range either.
6906 // Return FullRange.
6907 if (StartRange.isFullSet())
6908 return {ConstantRange::getFull(BitWidth), false};
6909
6910 // If Step is signed and negative, then we use its absolute value, but we also
6911 // note that we're moving in the opposite direction.
6912 bool Descending = Signed && Step.isNegative();
6913
6914 if (Signed)
6915 // This is correct even for INT_SMIN. Let's look at i8 to illustrate this:
6916 // abs(INT_SMIN) = abs(-128) = abs(0x80) = -0x80 = 0x80 = 128.
6917 // This equations hold true due to the well-defined wrap-around behavior of
6918 // APInt.
6919 Step = Step.abs();
6920
6921 // Check if Offset is more than full span of BitWidth. If it is, the
6922 // expression is guaranteed to overflow.
6923 if (APInt::getMaxValue(StartRange.getBitWidth()).udiv(Step).ult(MaxBECount))
6924 return {ConstantRange::getFull(BitWidth), false};
6925
6926 // Offset is by how much the expression can change. Checks above guarantee no
6927 // overflow here.
6928 APInt Offset = Step * MaxBECount;
6929
6930 // Minimum value of the final range will match the minimal value of StartRange
6931 // if the expression is increasing and will be decreased by Offset otherwise.
6932 // Maximum value of the final range will match the maximal value of StartRange
6933 // if the expression is decreasing and will be increased by Offset otherwise.
6934 APInt StartLower = StartRange.getLower();
6935 APInt StartUpper = StartRange.getUpper() - 1;
6936 bool Overflow;
6937 APInt MovedBoundary;
6938 if (Signed) {
6939 // This does not use sadd_ov, as we want to check overflow for a signed
6940 // start with an unsigned offset.
6941 if (Descending) {
6942 MovedBoundary = StartLower - std::move(Offset);
6943 Overflow = MovedBoundary.sgt(StartLower) || StartRange.isSignWrappedSet();
6944 } else {
6945 MovedBoundary = StartUpper + std::move(Offset);
6946 Overflow = MovedBoundary.slt(StartUpper) || StartRange.isSignWrappedSet();
6947 }
6948 } else {
6949 MovedBoundary = StartUpper.uadd_ov(std::move(Offset), Overflow);
6950 Overflow |= StartRange.isWrappedSet();
6951 }
6952
6953 // It's possible that the new minimum/maximum value will fall into the initial
6954 // range (due to wrap around). This means that the expression can take any
6955 // value in this bitwidth, and we have to return full range.
6956 if (StartRange.contains(MovedBoundary))
6957 return {ConstantRange::getFull(BitWidth), false};
6958
6959 APInt NewLower =
6960 Descending ? std::move(MovedBoundary) : std::move(StartLower);
6961 APInt NewUpper =
6962 Descending ? std::move(StartUpper) : std::move(MovedBoundary);
6963 NewUpper += 1;
6964
6965 // No overflow detected, return [StartLower, StartUpper + Offset + 1) range.
6966 return {ConstantRange::getNonEmpty(std::move(NewLower), std::move(NewUpper)),
6967 !Overflow};
6968}
6969
6970std::pair<ConstantRange, SCEVFlags>
6971ScalarEvolution::getRangeForAffineAR(const SCEV *Start, const SCEV *Step,
6972 const APInt &MaxBECount) {
6973 assert(getTypeSizeInBits(Start->getType()) ==
6974 getTypeSizeInBits(Step->getType()) &&
6975 getTypeSizeInBits(Start->getType()) == MaxBECount.getBitWidth() &&
6976 "mismatched bit widths");
6977
6978 // First, consider step signed.
6979 ConstantRange StartSRange = getSignedRange(Start);
6980 ConstantRange StepSRange = getSignedRange(Step);
6981
6982 // If Step can be both positive and negative, we need to find ranges for the
6983 // maximum absolute step values in both directions and union them.
6984 auto [SR, NSW] = getRangeForAffineARHelper(
6985 StepSRange.getSignedMin(), StartSRange, MaxBECount, /*Signed=*/true);
6986 // A singleton step has identical signed bounds, so the second computation
6987 // would produce the same range and no-wrap result.
6988 if (!StepSRange.isSingleElement()) {
6989 auto [SRMax, NSWMax] = getRangeForAffineARHelper(
6990 StepSRange.getSignedMax(), StartSRange, MaxBECount, /*Signed=*/true);
6991 SR = SR.unionWith(SRMax);
6992 NSW &= NSWMax;
6993 }
6994
6995 // Next, consider step unsigned.
6996 auto [UR, NUW] = getRangeForAffineARHelper(
6997 getUnsignedRangeMax(Step), getUnsignedRange(Start), MaxBECount,
6998 /*Signed=*/false);
6999
7001 if (NUW)
7003 if (NSW)
7005
7006 // Finally, intersect signed and unsigned ranges.
7007 return {SR.intersectWith(UR, ConstantRange::Smallest), Flags};
7008}
7009
7010ConstantRange ScalarEvolution::getRangeForAffineNoSelfWrappingAR(
7011 const SCEVAddRecExpr *AddRec, const SCEV *MaxBECount, unsigned BitWidth,
7012 ScalarEvolution::RangeSignHint SignHint) {
7013 assert(AddRec->isAffine() && "Non-affine AddRecs are not suppored!\n");
7014 assert(AddRec->hasNoSelfWrap() &&
7015 "This only works for non-self-wrapping AddRecs!");
7016 const bool IsSigned = SignHint == HINT_RANGE_SIGNED;
7017 const SCEV *Step = AddRec->getStepRecurrence(*this);
7018 // Only deal with constant step to save compile time.
7019 if (!isa<SCEVConstant>(Step))
7020 return ConstantRange::getFull(BitWidth);
7021 // Let's make sure that we can prove that we do not self-wrap during
7022 // MaxBECount iterations. We need this because MaxBECount is a maximum
7023 // iteration count estimate, and we might infer nw from some exit for which we
7024 // do not know max exit count (or any other side reasoning).
7025 // TODO: Turn into assert at some point.
7026 if (getTypeSizeInBits(MaxBECount->getType()) >
7027 getTypeSizeInBits(AddRec->getType()))
7028 return ConstantRange::getFull(BitWidth);
7029 MaxBECount = getNoopOrZeroExtend(MaxBECount, AddRec->getType());
7030 const SCEV *RangeWidth = getMinusOne(AddRec->getType());
7031 const SCEV *StepAbs = getUMinExpr(Step, getNegativeSCEV(Step));
7032 const SCEV *MaxItersWithoutWrap = getUDivExpr(RangeWidth, StepAbs);
7033 if (!isKnownPredicateViaConstantRanges(ICmpInst::ICMP_ULE, MaxBECount,
7034 MaxItersWithoutWrap))
7035 return ConstantRange::getFull(BitWidth);
7036
7037 ICmpInst::Predicate LEPred =
7039 ICmpInst::Predicate GEPred =
7041 const SCEV *End = AddRec->evaluateAtIteration(MaxBECount, *this);
7042
7043 // We know that there is no self-wrap. Let's take Start and End values and
7044 // look at all intermediate values V1, V2, ..., Vn that IndVar takes during
7045 // the iteration. They either lie inside the range [Min(Start, End),
7046 // Max(Start, End)] or outside it:
7047 //
7048 // Case 1: RangeMin ... Start V1 ... VN End ... RangeMax;
7049 // Case 2: RangeMin Vk ... V1 Start ... End Vn ... Vk + 1 RangeMax;
7050 //
7051 // No self wrap flag guarantees that the intermediate values cannot be BOTH
7052 // outside and inside the range [Min(Start, End), Max(Start, End)]. Using that
7053 // knowledge, let's try to prove that we are dealing with Case 1. It is so if
7054 // Start <= End and step is positive, or Start >= End and step is negative.
7055 const SCEV *Start = applyLoopGuards(AddRec->getStart(), AddRec->getLoop());
7056 ConstantRange StartRange = getRangeRef(Start, SignHint);
7057 ConstantRange EndRange = getRangeRef(End, SignHint);
7058 ConstantRange RangeBetween = StartRange.unionWith(EndRange);
7059 // If they already cover full iteration space, we will know nothing useful
7060 // even if we prove what we want to prove.
7061 if (RangeBetween.isFullSet())
7062 return RangeBetween;
7063 // Only deal with ranges that do not wrap (i.e. RangeMin < RangeMax).
7064 bool IsWrappedSet = IsSigned ? RangeBetween.isSignWrappedSet()
7065 : RangeBetween.isWrappedSet();
7066 if (IsWrappedSet)
7067 return ConstantRange::getFull(BitWidth);
7068
7069 if (isKnownPositive(Step) &&
7070 isKnownPredicateViaConstantRanges(LEPred, Start, End))
7071 return RangeBetween;
7072 if (isKnownNegative(Step) &&
7073 isKnownPredicateViaConstantRanges(GEPred, Start, End))
7074 return RangeBetween;
7075 return ConstantRange::getFull(BitWidth);
7076}
7077
7078ConstantRange ScalarEvolution::getRangeViaFactoring(const SCEV *Start,
7079 const SCEV *Step,
7080 const APInt &MaxBECount) {
7081 // RangeOf({C?A:B,+,C?P:Q}) == RangeOf(C?{A,+,P}:{B,+,Q})
7082 // == RangeOf({A,+,P}) union RangeOf({B,+,Q})
7083
7084 unsigned BitWidth = MaxBECount.getBitWidth();
7085 assert(getTypeSizeInBits(Start->getType()) == BitWidth &&
7086 getTypeSizeInBits(Step->getType()) == BitWidth &&
7087 "mismatched bit widths");
7088
7089 struct SelectPattern {
7090 Value *Condition = nullptr;
7091 APInt TrueValue;
7092 APInt FalseValue;
7093
7094 explicit SelectPattern(ScalarEvolution &SE, unsigned BitWidth,
7095 const SCEV *S) {
7096 std::optional<unsigned> CastOp;
7097 APInt Offset(BitWidth, 0);
7098
7100 "Should be!");
7101
7102 // Peel off a constant offset. In the future we could consider being
7103 // smarter here and handle {Start+Step,+,Step} too.
7104 const APInt *Off;
7105 if (match(S, m_scev_Add(m_scev_APInt(Off), m_SCEV(S))))
7106 Offset = *Off;
7107
7108 // Peel off a cast operation
7109 if (auto *SCast = dyn_cast<SCEVIntegralCastExpr>(S)) {
7110 CastOp = SCast->getSCEVType();
7111 S = SCast->getOperand();
7112 }
7113
7114 using namespace llvm::PatternMatch;
7115
7116 auto *SU = dyn_cast<SCEVUnknown>(S);
7117 const APInt *TrueVal, *FalseVal;
7118 if (!SU ||
7119 !match(SU->getValue(), m_Select(m_Value(Condition), m_APInt(TrueVal),
7120 m_APInt(FalseVal)))) {
7121 Condition = nullptr;
7122 return;
7123 }
7124
7125 TrueValue = *TrueVal;
7126 FalseValue = *FalseVal;
7127
7128 // Re-apply the cast we peeled off earlier
7129 if (CastOp)
7130 switch (*CastOp) {
7131 default:
7132 llvm_unreachable("Unknown SCEV cast type!");
7133
7134 case scTruncate:
7135 TrueValue = TrueValue.trunc(BitWidth);
7136 FalseValue = FalseValue.trunc(BitWidth);
7137 break;
7138 case scZeroExtend:
7139 TrueValue = TrueValue.zext(BitWidth);
7140 FalseValue = FalseValue.zext(BitWidth);
7141 break;
7142 case scSignExtend:
7143 TrueValue = TrueValue.sext(BitWidth);
7144 FalseValue = FalseValue.sext(BitWidth);
7145 break;
7146 }
7147
7148 // Re-apply the constant offset we peeled off earlier
7149 TrueValue += Offset;
7150 FalseValue += Offset;
7151 }
7152
7153 bool isRecognized() { return Condition != nullptr; }
7154 };
7155
7156 SelectPattern StartPattern(*this, BitWidth, Start);
7157 if (!StartPattern.isRecognized())
7158 return ConstantRange::getFull(BitWidth);
7159
7160 SelectPattern StepPattern(*this, BitWidth, Step);
7161 if (!StepPattern.isRecognized())
7162 return ConstantRange::getFull(BitWidth);
7163
7164 if (StartPattern.Condition != StepPattern.Condition) {
7165 // We don't handle this case today; but we could, by considering four
7166 // possibilities below instead of two. I'm not sure if there are cases where
7167 // that will help over what getRange already does, though.
7168 return ConstantRange::getFull(BitWidth);
7169 }
7170
7171 // NB! Calling ScalarEvolution::getConstant is fine, but we should not try to
7172 // construct arbitrary general SCEV expressions here. This function is called
7173 // from deep in the call stack, and calling getSCEV (on a sext instruction,
7174 // say) can end up caching a suboptimal value.
7175
7176 // FIXME: without the explicit `this` receiver below, MSVC errors out with
7177 // C2352 and C2512 (otherwise it isn't needed).
7178
7179 const SCEV *TrueStart = this->getConstant(StartPattern.TrueValue);
7180 const SCEV *TrueStep = this->getConstant(StepPattern.TrueValue);
7181 const SCEV *FalseStart = this->getConstant(StartPattern.FalseValue);
7182 const SCEV *FalseStep = this->getConstant(StepPattern.FalseValue);
7183
7184 ConstantRange TrueRange =
7185 this->getRangeForAffineAR(TrueStart, TrueStep, MaxBECount).first;
7186 ConstantRange FalseRange =
7187 this->getRangeForAffineAR(FalseStart, FalseStep, MaxBECount).first;
7188
7189 return TrueRange.unionWith(FalseRange);
7190}
7191
7192SCEVFlags ScalarEvolution::getNoWrapFlagsFromUB(const Value *V) {
7193 if (isa<ConstantExpr>(V))
7194 return SCEV::FlagNone;
7195 const BinaryOperator *BinOp = cast<BinaryOperator>(V);
7196
7197 // Return early if there are no flags to propagate to the SCEV.
7199 if (auto *PDI = dyn_cast<PossiblyDisjointInst>(BinOp);
7200 PDI && PDI->isDisjoint()) {
7202 } else {
7203 if (BinOp->hasNoUnsignedWrap())
7205 if (BinOp->hasNoSignedWrap())
7207 }
7208 if (Flags == SCEV::FlagNone)
7209 return SCEV::FlagNone;
7210
7211 return isSCEVExprNeverPoison(BinOp) ? Flags : SCEV::FlagNone;
7212}
7213
7214const Instruction *
7215ScalarEvolution::getNonTrivialDefiningScopeBound(const SCEV *S) {
7216 if (auto *AddRec = dyn_cast<SCEVAddRecExpr>(S))
7217 return &*AddRec->getLoop()->getHeader()->begin();
7218 if (auto *U = dyn_cast<SCEVUnknown>(S))
7219 if (auto *I = dyn_cast<Instruction>(U->getValue()))
7220 return I;
7221 return nullptr;
7222}
7223
7224const Instruction *ScalarEvolution::getDefiningScopeBound(ArrayRef<SCEVUse> Ops,
7225 bool &Precise) {
7226 Precise = true;
7227 // Do a bounded search of the def relation of the requested SCEVs.
7228 SmallPtrSet<const SCEV *, 16> Visited;
7229 SmallVector<SCEVUse> Worklist;
7230 auto pushOp = [&](const SCEV *S) {
7231 if (!Visited.insert(S).second)
7232 return;
7233 // Threshold of 30 here is arbitrary.
7234 if (Visited.size() > 30) {
7235 Precise = false;
7236 return;
7237 }
7238 Worklist.push_back(S);
7239 };
7240
7241 for (SCEVUse S : Ops)
7242 pushOp(S);
7243
7244 const Instruction *Bound = nullptr;
7245 while (!Worklist.empty()) {
7246 SCEVUse S = Worklist.pop_back_val();
7247 if (auto *DefI = getNonTrivialDefiningScopeBound(S)) {
7248 if (!Bound || DT.dominates(Bound, DefI))
7249 Bound = DefI;
7250 } else {
7251 for (SCEVUse Op : S->operands())
7252 pushOp(Op);
7253 }
7254 }
7255 return Bound ? Bound : &*F.getEntryBlock().begin();
7256}
7257
7258const Instruction *
7259ScalarEvolution::getDefiningScopeBound(ArrayRef<SCEVUse> Ops) {
7260 bool Discard;
7261 return getDefiningScopeBound(Ops, Discard);
7262}
7263
7264bool ScalarEvolution::isGuaranteedToTransferExecutionTo(const Instruction *A,
7265 const Instruction *B) {
7266 if (A->getParent() == B->getParent() &&
7268 B->getIterator()))
7269 return true;
7270
7271 auto *BLoop = LI.getLoopFor(B->getParent());
7272 if (BLoop && BLoop->getHeader() == B->getParent() &&
7273 BLoop->getLoopPreheader() == A->getParent() &&
7275 A->getParent()->end()) &&
7276 isGuaranteedToTransferExecutionToSuccessor(B->getParent()->begin(),
7277 B->getIterator()))
7278 return true;
7279 return false;
7280}
7281
7283 SCEVPoisonCollector PC(/* LookThroughMaybePoisonBlocking */ true);
7284 visitAll(Op, PC);
7285 return PC.MaybePoison.empty();
7286}
7287
7289 return !SCEVExprContains(Op, [this](const SCEV *S) {
7290 const SCEV *Op1;
7291 bool M = match(S, m_scev_UDiv(m_SCEV(), m_SCEV(Op1)));
7292 // The UDiv may be UB if the divisor is poison or zero. Unless the divisor
7293 // is a non-zero constant, we have to assume the UDiv may be UB.
7294 return M && (!isKnownNonZero(Op1) || !isGuaranteedNotToBePoison(Op1));
7295 });
7296}
7297
7298bool ScalarEvolution::isSCEVExprNeverPoison(const Instruction *I) {
7299 // Only proceed if we can prove that I does not yield poison.
7301 return false;
7302
7303 // At this point we know that if I is executed, then it does not wrap
7304 // according to at least one of NSW or NUW. If I is not executed, then we do
7305 // not know if the calculation that I represents would wrap. Multiple
7306 // instructions can map to the same SCEV. If we apply NSW or NUW from I to
7307 // the SCEV, we must guarantee no wrapping for that SCEV also when it is
7308 // derived from other instructions that map to the same SCEV. We cannot make
7309 // that guarantee for cases where I is not executed. So we need to find a
7310 // upper bound on the defining scope for the SCEV, and prove that I is
7311 // executed every time we enter that scope. When the bounding scope is a
7312 // loop (the common case), this is equivalent to proving I executes on every
7313 // iteration of that loop.
7314 SmallVector<SCEVUse> SCEVOps;
7315 for (const Use &Op : I->operands()) {
7316 // I could be an extractvalue from a call to an overflow intrinsic.
7317 // TODO: We can do better here in some cases.
7318 if (isSCEVable(Op->getType()))
7319 SCEVOps.push_back(getSCEV(Op));
7320 }
7321 auto *DefI = getDefiningScopeBound(SCEVOps);
7322 return isGuaranteedToTransferExecutionTo(DefI, I);
7323}
7324
7325bool ScalarEvolution::isAddRecNeverPoison(const Instruction *I, const Loop *L) {
7326 // If we know that \c I can never be poison period, then that's enough.
7327 if (isSCEVExprNeverPoison(I))
7328 return true;
7329
7330 // If the loop only has one exit, then we know that, if the loop is entered,
7331 // any instruction dominating that exit will be executed. If any such
7332 // instruction would result in UB, the addrec cannot be poison.
7333 //
7334 // This is basically the same reasoning as in isSCEVExprNeverPoison(), but
7335 // also handles uses outside the loop header (they just need to dominate the
7336 // single exit).
7337
7338 auto *ExitingBB = L->getExitingBlock();
7339 if (!ExitingBB || !loopHasNoAbnormalExits(L))
7340 return false;
7341
7342 SmallPtrSet<const Value *, 16> KnownPoison;
7344
7345 // We start by assuming \c I, the post-inc add recurrence, is poison. Only
7346 // things that are known to be poison under that assumption go on the
7347 // Worklist.
7348 KnownPoison.insert(I);
7349 Worklist.push_back(I);
7350
7351 while (!Worklist.empty()) {
7352 const Instruction *Poison = Worklist.pop_back_val();
7353
7354 for (const Use &U : Poison->uses()) {
7355 const Instruction *PoisonUser = cast<Instruction>(U.getUser());
7356 if (mustTriggerUB(PoisonUser, KnownPoison) &&
7357 DT.dominates(PoisonUser->getParent(), ExitingBB))
7358 return true;
7359
7360 if (propagatesPoison(U) && L->contains(PoisonUser))
7361 if (KnownPoison.insert(PoisonUser).second)
7362 Worklist.push_back(PoisonUser);
7363 }
7364 }
7365
7366 return false;
7367}
7368
7369ScalarEvolution::LoopProperties
7370ScalarEvolution::getLoopProperties(const Loop *L) {
7371 using LoopProperties = ScalarEvolution::LoopProperties;
7372
7373 auto Itr = LoopPropertiesCache.find(L);
7374 if (Itr == LoopPropertiesCache.end()) {
7375 auto HasSideEffects = [](Instruction *I) {
7376 if (auto *SI = dyn_cast<StoreInst>(I))
7377 return !SI->isSimple();
7378
7379 if (I->mayThrow())
7380 return true;
7381
7382 // Non-volatile memset / memcpy do not count as side-effect for forward
7383 // progress.
7384 if (auto *MI = dyn_cast<MemIntrinsic>(I))
7385 if (!MI->isVolatile())
7386 return false;
7387
7388 // Droppable intrinsics only model a memory write; they are not progress.
7389 if (I->isDroppable())
7390 return false;
7391
7392 return I->mayWriteToMemory();
7393 };
7394
7395 LoopProperties LP = {/* HasNoAbnormalExits */ true,
7396 /*HasNoSideEffects*/ true};
7397
7398 for (auto *BB : L->getBlocks())
7399 for (auto &I : *BB) {
7401 LP.HasNoAbnormalExits = false;
7402 if (HasSideEffects(&I))
7403 LP.HasNoSideEffects = false;
7404 if (!LP.HasNoAbnormalExits && !LP.HasNoSideEffects)
7405 break; // We're already as pessimistic as we can get.
7406 }
7407
7408 auto InsertPair = LoopPropertiesCache.insert({L, LP});
7409 assert(InsertPair.second && "We just checked!");
7410 Itr = InsertPair.first;
7411 }
7412
7413 return Itr->second;
7414}
7415
7417 // A mustprogress loop without side effects must be finite.
7418 // TODO: The check used here is very conservative. It's only *specific*
7419 // side effects which are well defined in infinite loops.
7420 return isFinite(L) || (isMustProgress(L) && loopHasNoSideEffects(L));
7421}
7422
7423const SCEV *ScalarEvolution::createSCEVIter(Value *V) {
7424 // Worklist item with a Value and a bool indicating whether all operands have
7425 // been visited already.
7428
7429 Stack.emplace_back(V, false);
7430 while (!Stack.empty()) {
7431 auto E = Stack.back();
7432 Value *CurV = E.getPointer();
7433
7434 if (getExistingSCEV(CurV)) {
7435 Stack.pop_back();
7436 continue;
7437 }
7438
7440 const SCEV *CreatedSCEV = nullptr;
7441 // If all operands have been visited already, create the SCEV.
7442 if (E.getInt()) {
7443 CreatedSCEV = createSCEV(CurV);
7444 } else {
7445 // Otherwise get the operands we need to create SCEV's for before creating
7446 // the SCEV for CurV. If the SCEV for CurV can be constructed trivially,
7447 // just use it.
7448 CreatedSCEV = getOperandsToCreate(CurV, Ops);
7449 }
7450
7451 if (CreatedSCEV) {
7452 insertValueToMap(CurV, CreatedSCEV);
7453 Stack.pop_back();
7454 } else {
7455 Stack.back().setInt(true);
7456 // Queue its operands which need to be constructed.
7457 for (Value *Op : Ops)
7458 Stack.emplace_back(Op, false);
7459 }
7460 }
7461
7462 return getExistingSCEV(V);
7463}
7464
7465const SCEV *
7466ScalarEvolution::getOperandsToCreate(Value *V, SmallVectorImpl<Value *> &Ops) {
7467 if (!isSCEVable(V->getType()))
7468 return getUnknown(V);
7469
7470 if (Instruction *I = dyn_cast<Instruction>(V)) {
7471 // Don't attempt to analyze instructions in blocks that aren't
7472 // reachable. Such instructions don't matter, and they aren't required
7473 // to obey basic rules for definitions dominating uses which this
7474 // analysis depends on.
7475 if (!DT.isReachableFromEntry(I->getParent()))
7476 return getUnknown(PoisonValue::get(V->getType()));
7477 } else if (ConstantInt *CI = dyn_cast<ConstantInt>(V))
7478 return getConstant(CI);
7479 else if (isa<GlobalAlias>(V))
7480 return getUnknown(V);
7481 else if (!isa<ConstantExpr>(V))
7482 return getUnknown(V);
7483
7485 if (auto BO = MatchBinaryOp(U, DT)) {
7486 bool IsConstArg = isa<ConstantInt>(BO->RHS);
7487 switch (BO->Opcode) {
7488 case Instruction::Add:
7489 case Instruction::Mul: {
7490 // For additions and multiplications, traverse add/mul chains for which we
7491 // can potentially create a single SCEV, to reduce the number of
7492 // get{Add,Mul}Expr calls.
7493 do {
7494 if (BO->Op) {
7495 if (BO->Op != V && getExistingSCEV(BO->Op)) {
7496 Ops.push_back(BO->Op);
7497 break;
7498 }
7499 }
7500 Ops.push_back(BO->RHS);
7501 auto NewBO = MatchBinaryOp(BO->LHS, DT);
7502 if (!NewBO ||
7503 (BO->Opcode == Instruction::Add &&
7504 (NewBO->Opcode != Instruction::Add &&
7505 NewBO->Opcode != Instruction::Sub)) ||
7506 (BO->Opcode == Instruction::Mul &&
7507 NewBO->Opcode != Instruction::Mul)) {
7508 Ops.push_back(BO->LHS);
7509 break;
7510 }
7511 // CreateSCEV calls getNoWrapFlagsFromUB, which under certain conditions
7512 // requires a SCEV for the LHS.
7513 if (BO->Op && (BO->IsNSW || BO->IsNUW)) {
7514 auto *I = dyn_cast<Instruction>(BO->Op);
7515 if (I && programUndefinedIfPoison(I)) {
7516 Ops.push_back(BO->LHS);
7517 break;
7518 }
7519 }
7520 BO = NewBO;
7521 } while (true);
7522 return nullptr;
7523 }
7524 case Instruction::Sub:
7525 case Instruction::UDiv:
7526 case Instruction::URem:
7527 break;
7528 case Instruction::AShr:
7529 case Instruction::Shl:
7530 case Instruction::Xor:
7531 if (!IsConstArg)
7532 return nullptr;
7533 break;
7534 case Instruction::And:
7535 case Instruction::Or:
7536 if (!IsConstArg && !BO->LHS->getType()->isIntegerTy(1))
7537 return nullptr;
7538 break;
7539 case Instruction::LShr:
7540 return getUnknown(V);
7541 default:
7542 llvm_unreachable("Unhandled binop");
7543 break;
7544 }
7545
7546 Ops.push_back(BO->LHS);
7547 Ops.push_back(BO->RHS);
7548 return nullptr;
7549 }
7550
7551 switch (U->getOpcode()) {
7552 case Instruction::Trunc:
7553 case Instruction::ZExt:
7554 case Instruction::SExt:
7555 case Instruction::PtrToAddr:
7556 case Instruction::PtrToInt:
7557 Ops.push_back(U->getOperand(0));
7558 return nullptr;
7559
7560 case Instruction::BitCast:
7561 if (isSCEVable(U->getType()) && isSCEVable(U->getOperand(0)->getType())) {
7562 Ops.push_back(U->getOperand(0));
7563 return nullptr;
7564 }
7565 return getUnknown(V);
7566
7567 case Instruction::SDiv:
7568 case Instruction::SRem:
7569 Ops.push_back(U->getOperand(0));
7570 Ops.push_back(U->getOperand(1));
7571 return nullptr;
7572
7573 case Instruction::GetElementPtr:
7574 assert(cast<GEPOperator>(U)->getSourceElementType()->isSized() &&
7575 "GEP source element type must be sized");
7576 llvm::append_range(Ops, U->operands());
7577 return nullptr;
7578
7579 case Instruction::IntToPtr:
7580 return getUnknown(V);
7581
7582 case Instruction::PHI:
7583 // getNodeForPHI has four ways to turn a PHI into a SCEV; retrieve the
7584 // relevant nodes for each of them.
7585 //
7586 // The first is just to call simplifyInstruction, and get something back
7587 // that isn't a PHI.
7589 cast<PHINode>(U),
7590 {getDataLayout(), &TLI, &DT, &AC, /*CtxI=*/nullptr,
7591 /*UseInstrInfo=*/true, /*CanUseUndef=*/false})) {
7592 assert(V);
7593 Ops.push_back(V);
7594 return nullptr;
7595 }
7596 // The second is createNodeForPHIWithIdenticalOperands: this looks for
7597 // operands which all perform the same operation, but haven't been
7598 // CSE'ed for whatever reason.
7599 if (BinaryOperator *BO = getCommonInstForPHI(cast<PHINode>(U))) {
7600 assert(BO);
7601 Ops.push_back(BO);
7602 return nullptr;
7603 }
7604 // The third is createNodeFromSelectLikePHI; this takes a PHI which
7605 // is equivalent to a select, and analyzes it like a select.
7606 {
7607 Value *Cond = nullptr, *LHS = nullptr, *RHS = nullptr;
7609 assert(Cond);
7610 assert(LHS);
7611 assert(RHS);
7612 if (auto *CondICmp = dyn_cast<ICmpInst>(Cond)) {
7613 Ops.push_back(CondICmp->getOperand(0));
7614 Ops.push_back(CondICmp->getOperand(1));
7615 }
7616 Ops.push_back(Cond);
7617 Ops.push_back(LHS);
7618 Ops.push_back(RHS);
7619 return nullptr;
7620 }
7621 }
7622 // The fourth way is createAddRecFromPHI. It's complicated to handle here,
7623 // so just construct it recursively.
7624 //
7625 // In addition to getNodeForPHI, also construct nodes which might be needed
7626 // by getRangeRef.
7628 for (Value *V : cast<PHINode>(U)->operands())
7629 Ops.push_back(V);
7630 return nullptr;
7631 }
7632 return nullptr;
7633
7634 case Instruction::Select: {
7635 // Check if U is a select that can be simplified to a SCEVUnknown.
7636 auto CanSimplifyToUnknown = [this, U]() {
7637 if (U->getType()->isIntegerTy(1) || isa<ConstantInt>(U->getOperand(0)))
7638 return false;
7639
7640 auto *ICI = dyn_cast<ICmpInst>(U->getOperand(0));
7641 if (!ICI)
7642 return false;
7643 Value *LHS = ICI->getOperand(0);
7644 Value *RHS = ICI->getOperand(1);
7645 if (ICI->getPredicate() == CmpInst::ICMP_EQ ||
7646 ICI->getPredicate() == CmpInst::ICMP_NE) {
7648 return true;
7649 } else if (getTypeSizeInBits(LHS->getType()) >
7650 getTypeSizeInBits(U->getType()))
7651 return true;
7652 return false;
7653 };
7654 if (CanSimplifyToUnknown())
7655 return getUnknown(U);
7656
7657 llvm::append_range(Ops, U->operands());
7658 return nullptr;
7659 break;
7660 }
7661 case Instruction::Call:
7662 case Instruction::Invoke:
7663 if (Value *RV = cast<CallBase>(U)->getReturnedArgOperand()) {
7664 Ops.push_back(RV);
7665 return nullptr;
7666 }
7667
7668 if (auto *II = dyn_cast<IntrinsicInst>(U)) {
7669 switch (II->getIntrinsicID()) {
7670 case Intrinsic::abs:
7671 Ops.push_back(II->getArgOperand(0));
7672 return nullptr;
7673 case Intrinsic::umax:
7674 case Intrinsic::umin:
7675 case Intrinsic::smax:
7676 case Intrinsic::smin:
7677 case Intrinsic::usub_sat:
7678 case Intrinsic::uadd_sat:
7679 Ops.push_back(II->getArgOperand(0));
7680 Ops.push_back(II->getArgOperand(1));
7681 return nullptr;
7682 case Intrinsic::start_loop_iterations:
7683 case Intrinsic::annotation:
7684 case Intrinsic::ptr_annotation:
7685 Ops.push_back(II->getArgOperand(0));
7686 return nullptr;
7687 default:
7688 break;
7689 }
7690 }
7691 break;
7692 }
7693
7694 return nullptr;
7695}
7696
7697const SCEV *ScalarEvolution::createSCEV(Value *V) {
7698 if (!isSCEVable(V->getType()))
7699 return getUnknown(V);
7700
7701 if (Instruction *I = dyn_cast<Instruction>(V)) {
7702 // Don't attempt to analyze instructions in blocks that aren't
7703 // reachable. Such instructions don't matter, and they aren't required
7704 // to obey basic rules for definitions dominating uses which this
7705 // analysis depends on.
7706 if (!DT.isReachableFromEntry(I->getParent()))
7707 return getUnknown(PoisonValue::get(V->getType()));
7708 } else if (ConstantInt *CI = dyn_cast<ConstantInt>(V))
7709 return getConstant(CI);
7710 else if (isa<GlobalAlias>(V))
7711 return getUnknown(V);
7712 else if (!isa<ConstantExpr>(V))
7713 return getUnknown(V);
7714
7715 const SCEV *LHS;
7716 const SCEV *RHS;
7717
7719 if (auto BO = MatchBinaryOp(U, DT)) {
7720 switch (BO->Opcode) {
7721 case Instruction::Add: {
7722 // The simple thing to do would be to just call getSCEV on both operands
7723 // and call getAddExpr with the result. However if we're looking at a
7724 // bunch of things all added together, this can be quite inefficient,
7725 // because it leads to N-1 getAddExpr calls for N ultimate operands.
7726 // Instead, gather up all the operands and make a single getAddExpr call.
7727 // LLVM IR canonical form means we need only traverse the left operands.
7729 do {
7730 if (BO->Op) {
7731 if (auto *OpSCEV = getExistingSCEV(BO->Op)) {
7732 AddOps.push_back(OpSCEV);
7733 break;
7734 }
7735
7736 // If a NUW or NSW flag can be applied to the SCEV for this
7737 // addition, then compute the SCEV for this addition by itself
7738 // with a separate call to getAddExpr. We need to do that
7739 // instead of pushing the operands of the addition onto AddOps,
7740 // since the flags are only known to apply to this particular
7741 // addition - they may not apply to other additions that can be
7742 // formed with operands from AddOps.
7743 const SCEV *RHS = getSCEV(BO->RHS);
7744 SCEVFlags Flags = getNoWrapFlagsFromUB(BO->Op);
7745 if (Flags != SCEV::FlagNone) {
7746 const SCEV *LHS = getSCEV(BO->LHS);
7747 if (BO->Opcode == Instruction::Sub)
7748 AddOps.push_back(getMinusSCEV(LHS, RHS, Flags));
7749 else
7750 AddOps.push_back(getAddExpr(LHS, RHS, Flags));
7751 break;
7752 }
7753 }
7754
7755 if (BO->Opcode == Instruction::Sub)
7756 AddOps.push_back(getNegativeSCEV(getSCEV(BO->RHS)));
7757 else
7758 AddOps.push_back(getSCEV(BO->RHS));
7759
7760 auto NewBO = MatchBinaryOp(BO->LHS, DT);
7761 if (!NewBO || (NewBO->Opcode != Instruction::Add &&
7762 NewBO->Opcode != Instruction::Sub)) {
7763 AddOps.push_back(getSCEV(BO->LHS));
7764 break;
7765 }
7766 BO = NewBO;
7767 } while (true);
7768
7769 return getAddExpr(AddOps);
7770 }
7771
7772 case Instruction::Mul: {
7774 do {
7775 if (BO->Op) {
7776 if (auto *OpSCEV = getExistingSCEV(BO->Op)) {
7777 MulOps.push_back(OpSCEV);
7778 break;
7779 }
7780
7781 SCEVFlags Flags = getNoWrapFlagsFromUB(BO->Op);
7782 if (Flags != SCEV::FlagNone) {
7783 LHS = getSCEV(BO->LHS);
7784 RHS = getSCEV(BO->RHS);
7785 MulOps.push_back(getMulExpr(LHS, RHS, Flags));
7786 break;
7787 }
7788 }
7789
7790 MulOps.push_back(getSCEV(BO->RHS));
7791 auto NewBO = MatchBinaryOp(BO->LHS, DT);
7792 if (!NewBO || NewBO->Opcode != Instruction::Mul) {
7793 MulOps.push_back(getSCEV(BO->LHS));
7794 break;
7795 }
7796 BO = NewBO;
7797 } while (true);
7798
7799 return getMulExpr(MulOps);
7800 }
7801 case Instruction::UDiv:
7802 LHS = getSCEV(BO->LHS);
7803 RHS = getSCEV(BO->RHS);
7804 return getUDivExpr(LHS, RHS);
7805 case Instruction::URem:
7806 LHS = getSCEV(BO->LHS);
7807 RHS = getSCEV(BO->RHS);
7808 return getURemExpr(LHS, RHS);
7809 case Instruction::Sub: {
7811 if (BO->Op)
7812 Flags = getNoWrapFlagsFromUB(BO->Op);
7813
7814 // Try to use ptrtoaddr for subtracts with at least one ptrtoint
7815 // operand. While we don't model ptrtoint directly in SCEV, the
7816 // difference between two pointer addresses is well-defined.
7817 Value *PtrLHS = nullptr, *PtrRHS = nullptr;
7818 bool HasPtrLHS = match(BO->LHS, m_PtrToInt(m_Value(PtrLHS)));
7819 bool HasPtrRHS = match(BO->RHS, m_PtrToInt(m_Value(PtrRHS)));
7820 if (HasPtrLHS || HasPtrRHS) {
7821 // Convert a ptrtoint operand (OrigOp) to ptrtoaddr of its pointer
7822 // PtrOp. When only one side is ptrtoint (BothPtr is false), skip
7823 // SCEVUnknown pointers since wrapping them in ptrtoaddr adds no
7824 // useful structure.
7825 auto GetOp = [&](bool HasPtr, Value *PtrOp, Value *OrigOp,
7826 bool BothPtr) -> const SCEV * {
7827 if (!HasPtr)
7828 return getSCEV(OrigOp);
7829 const SCEV *PtrSCEV = getSCEV(PtrOp);
7830 if (BothPtr || !isa<SCEVUnknown>(PtrSCEV)) {
7831 const SCEV *Addr = getPtrToAddrExpr(PtrSCEV);
7832 if (!isa<SCEVCouldNotCompute>(Addr) &&
7833 getTypeSizeInBits(OrigOp->getType()) <=
7834 getTypeSizeInBits(Addr->getType()))
7835 return getTruncateOrNoop(Addr, OrigOp->getType());
7836 }
7837 return getSCEV(OrigOp);
7838 };
7839 const SCEV *L = GetOp(HasPtrLHS, PtrLHS, BO->LHS, HasPtrRHS);
7840 const SCEV *R = GetOp(HasPtrRHS, PtrRHS, BO->RHS, HasPtrLHS);
7841 return getMinusSCEV(L, R, Flags);
7842 }
7843
7844 LHS = getSCEV(BO->LHS);
7845 RHS = getSCEV(BO->RHS);
7846 return getMinusSCEV(LHS, RHS, Flags);
7847 }
7848 case Instruction::And:
7849 // For an expression like x&255 that merely masks off the high bits,
7850 // use zext(trunc(x)) as the SCEV expression.
7851 if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->RHS)) {
7852 if (CI->isZero())
7853 return getSCEV(BO->RHS);
7854 if (CI->isMinusOne())
7855 return getSCEV(BO->LHS);
7856 const APInt &A = CI->getValue();
7857
7858 // Instcombine's ShrinkDemandedConstant may strip bits out of
7859 // constants, obscuring what would otherwise be a low-bits mask.
7860 // Use computeKnownBits to compute what ShrinkDemandedConstant
7861 // knew about to reconstruct a low-bits mask value.
7862 unsigned LZ = A.countl_zero();
7863 unsigned TZ = A.countr_zero();
7864 unsigned BitWidth = A.getBitWidth();
7865 KnownBits Known(BitWidth);
7866 computeKnownBits(BO->LHS, Known, getDataLayout(), &AC, nullptr, &DT);
7867
7868 APInt EffectiveMask =
7869 APInt::getLowBitsSet(BitWidth, BitWidth - LZ - TZ).shl(TZ);
7870 if ((LZ != 0 || TZ != 0) && !((~A & ~Known.Zero) & EffectiveMask)) {
7871 const SCEV *MulCount = getConstant(APInt::getOneBitSet(BitWidth, TZ));
7872 const SCEV *LHS = getSCEV(BO->LHS);
7873 const SCEV *ShiftedLHS = nullptr;
7874 if (auto *LHSMul = dyn_cast<SCEVMulExpr>(LHS)) {
7875 if (auto *OpC = dyn_cast<SCEVConstant>(LHSMul->getOperand(0))) {
7876 // For an expression like (x * 8) & 8, simplify the multiply.
7877 unsigned MulZeros = OpC->getAPInt().countr_zero();
7878 unsigned GCD = std::min(MulZeros, TZ);
7879 APInt DivAmt = APInt::getOneBitSet(BitWidth, TZ - GCD);
7881 MulOps.push_back(getConstant(OpC->getAPInt().ashr(GCD)));
7882 append_range(MulOps, LHSMul->operands().drop_front());
7883 const SCEV *NewMul = getMulExpr(MulOps, LHSMul->getNoWrapFlags());
7884 ShiftedLHS = getUDivExpr(NewMul, getConstant(DivAmt));
7885 }
7886 }
7887 if (!ShiftedLHS)
7888 ShiftedLHS = getUDivExpr(LHS, MulCount);
7889 return getMulExpr(
7891 getTruncateExpr(ShiftedLHS,
7892 IntegerType::get(getContext(), BitWidth - LZ - TZ)),
7893 BO->LHS->getType()),
7894 MulCount);
7895 }
7896 }
7897 // Binary `and` is a bit-wise `umin`.
7898 if (BO->LHS->getType()->isIntegerTy(1)) {
7899 LHS = getSCEV(BO->LHS);
7900 RHS = getSCEV(BO->RHS);
7901 return getUMinExpr(LHS, RHS);
7902 }
7903 break;
7904
7905 case Instruction::Or:
7906 // Binary `or` is a bit-wise `umax`.
7907 if (BO->LHS->getType()->isIntegerTy(1)) {
7908 LHS = getSCEV(BO->LHS);
7909 RHS = getSCEV(BO->RHS);
7910 return getUMaxExpr(LHS, RHS);
7911 }
7912 break;
7913
7914 case Instruction::Xor:
7915 if (ConstantInt *CI = dyn_cast<ConstantInt>(BO->RHS)) {
7916 // If the RHS of xor is -1, then this is a not operation.
7917 if (CI->isMinusOne())
7918 return getNotSCEV(getSCEV(BO->LHS));
7919
7920 // Model xor(and(x, C), C) as and(~x, C), if C is a low-bits mask.
7921 // This is a variant of the check for xor with -1, and it handles
7922 // the case where instcombine has trimmed non-demanded bits out
7923 // of an xor with -1.
7924 if (auto *LBO = dyn_cast<BinaryOperator>(BO->LHS))
7925 if (ConstantInt *LCI = dyn_cast<ConstantInt>(LBO->getOperand(1)))
7926 if (LBO->getOpcode() == Instruction::And &&
7927 LCI->getValue() == CI->getValue())
7928 if (const SCEVZeroExtendExpr *Z =
7930 Type *UTy = BO->LHS->getType();
7931 const SCEV *Z0 = Z->getOperand();
7932 Type *Z0Ty = Z0->getType();
7933 unsigned Z0TySize = getTypeSizeInBits(Z0Ty);
7934
7935 // If C is a low-bits mask, the zero extend is serving to
7936 // mask off the high bits. Complement the operand and
7937 // re-apply the zext.
7938 if (CI->getValue().isMask(Z0TySize))
7939 return getZeroExtendExpr(getNotSCEV(Z0), UTy);
7940
7941 // If C is a single bit, it may be in the sign-bit position
7942 // before the zero-extend. In this case, represent the xor
7943 // using an add, which is equivalent, and re-apply the zext.
7944 APInt Trunc = CI->getValue().trunc(Z0TySize);
7945 if (Trunc.zext(getTypeSizeInBits(UTy)) == CI->getValue() &&
7946 Trunc.isSignMask())
7947 return getZeroExtendExpr(getAddExpr(Z0, getConstant(Trunc)),
7948 UTy);
7949 }
7950 }
7951 break;
7952
7953 case Instruction::Shl:
7954 // Turn shift left of a constant amount into a multiply.
7955 if (ConstantInt *SA = dyn_cast<ConstantInt>(BO->RHS)) {
7956 uint32_t BitWidth = cast<IntegerType>(SA->getType())->getBitWidth();
7957
7958 // If the shift count is not less than the bitwidth, the result of
7959 // the shift is undefined. Don't try to analyze it, because the
7960 // resolution chosen here may differ from the resolution chosen in
7961 // other parts of the compiler.
7962 if (SA->getValue().uge(BitWidth))
7963 break;
7964
7965 // We can safely preserve the nuw flag in all cases. It's also safe to
7966 // turn a nuw nsw shl into a nuw nsw mul. However, nsw in isolation
7967 // requires special handling. It can be preserved as long as we're not
7968 // left shifting by bitwidth - 1.
7969 auto Flags = SCEV::FlagNone;
7970 if (BO->Op) {
7971 auto MulFlags = getNoWrapFlagsFromUB(BO->Op);
7972 if (any(MulFlags & SCEV::FlagNSW) &&
7973 (any(MulFlags & SCEV::FlagNUW) ||
7974 SA->getValue().ult(BitWidth - 1)))
7976 if (any(MulFlags & SCEV::FlagNUW))
7978 }
7979
7980 ConstantInt *X = ConstantInt::get(
7981 getContext(), APInt::getOneBitSet(BitWidth, SA->getZExtValue()));
7982 return getMulExpr(getSCEV(BO->LHS), getConstant(X), Flags);
7983 }
7984 break;
7985
7986 case Instruction::AShr:
7987 // AShr X, C, where C is a constant.
7988 ConstantInt *CI = dyn_cast<ConstantInt>(BO->RHS);
7989 if (!CI)
7990 break;
7991
7992 Type *OuterTy = BO->LHS->getType();
7994 // If the shift count is not less than the bitwidth, the result of
7995 // the shift is undefined. Don't try to analyze it, because the
7996 // resolution chosen here may differ from the resolution chosen in
7997 // other parts of the compiler.
7998 if (CI->getValue().uge(BitWidth))
7999 break;
8000
8001 if (CI->isZero())
8002 return getSCEV(BO->LHS); // shift by zero --> noop
8003
8004 uint64_t AShrAmt = CI->getZExtValue();
8005 Type *TruncTy = IntegerType::get(getContext(), BitWidth - AShrAmt);
8006
8007 Operator *L = dyn_cast<Operator>(BO->LHS);
8008 const SCEV *AddTruncateExpr = nullptr;
8009 ConstantInt *ShlAmtCI = nullptr;
8010 const SCEV *AddConstant = nullptr;
8011
8012 if (L && L->getOpcode() == Instruction::Add) {
8013 // X = Shl A, n
8014 // Y = Add X, c
8015 // Z = AShr Y, m
8016 // n, c and m are constants.
8017
8018 Operator *LShift = dyn_cast<Operator>(L->getOperand(0));
8019 ConstantInt *AddOperandCI = dyn_cast<ConstantInt>(L->getOperand(1));
8020 if (LShift && LShift->getOpcode() == Instruction::Shl) {
8021 if (AddOperandCI) {
8022 const SCEV *ShlOp0SCEV = getSCEV(LShift->getOperand(0));
8023 ShlAmtCI = dyn_cast<ConstantInt>(LShift->getOperand(1));
8024 // since we truncate to TruncTy, the AddConstant should be of the
8025 // same type, so create a new Constant with type same as TruncTy.
8026 // Also, the Add constant should be shifted right by AShr amount.
8027 APInt AddOperand = AddOperandCI->getValue().ashr(AShrAmt);
8028 AddConstant = getConstant(AddOperand.trunc(BitWidth - AShrAmt));
8029 // we model the expression as sext(add(trunc(A), c << n)), since the
8030 // sext(trunc) part is already handled below, we create a
8031 // AddExpr(TruncExp) which will be used later.
8032 AddTruncateExpr = getTruncateExpr(ShlOp0SCEV, TruncTy);
8033 }
8034 }
8035 } else if (L && L->getOpcode() == Instruction::Shl) {
8036 // X = Shl A, n
8037 // Y = AShr X, m
8038 // Both n and m are constant.
8039
8040 const SCEV *ShlOp0SCEV = getSCEV(L->getOperand(0));
8041 ShlAmtCI = dyn_cast<ConstantInt>(L->getOperand(1));
8042 AddTruncateExpr = getTruncateExpr(ShlOp0SCEV, TruncTy);
8043 }
8044
8045 if (AddTruncateExpr && ShlAmtCI) {
8046 // We can merge the two given cases into a single SCEV statement,
8047 // incase n = m, the mul expression will be 2^0, so it gets resolved to
8048 // a simpler case. The following code handles the two cases:
8049 //
8050 // 1) For a two-shift sext-inreg, i.e. n = m,
8051 // use sext(trunc(x)) as the SCEV expression.
8052 //
8053 // 2) When n > m, use sext(mul(trunc(x), 2^(n-m)))) as the SCEV
8054 // expression. We already checked that ShlAmt < BitWidth, so
8055 // the multiplier, 1 << (ShlAmt - AShrAmt), fits into TruncTy as
8056 // ShlAmt - AShrAmt < Amt.
8057 const APInt &ShlAmt = ShlAmtCI->getValue();
8058 if (ShlAmt.ult(BitWidth) && ShlAmt.uge(AShrAmt)) {
8059 APInt Mul = APInt::getOneBitSet(BitWidth - AShrAmt,
8060 ShlAmtCI->getZExtValue() - AShrAmt);
8061 const SCEV *CompositeExpr =
8062 getMulExpr(AddTruncateExpr, getConstant(Mul));
8063 if (L->getOpcode() != Instruction::Shl)
8064 CompositeExpr = getAddExpr(CompositeExpr, AddConstant);
8065
8066 return getSignExtendExpr(CompositeExpr, OuterTy);
8067 }
8068 }
8069 break;
8070 }
8071 }
8072
8073 switch (U->getOpcode()) {
8074 case Instruction::Trunc:
8075 return getTruncateExpr(getSCEV(U->getOperand(0)), U->getType());
8076
8077 case Instruction::ZExt:
8078 return getZeroExtendExpr(getSCEV(U->getOperand(0)), U->getType());
8079
8080 case Instruction::SExt:
8081 if (auto BO = MatchBinaryOp(U->getOperand(0), DT)) {
8082 // The NSW flag of a subtract does not always survive the conversion to
8083 // A + (-1)*B. By pushing sign extension onto its operands we are much
8084 // more likely to preserve NSW and allow later AddRec optimisations.
8085 //
8086 // NOTE: This is effectively duplicating this logic from getSignExtend:
8087 // sext((A + B + ...)<nsw>) --> (sext(A) + sext(B) + ...)<nsw>
8088 // but by that point the NSW information has potentially been lost.
8089 if (BO->Opcode == Instruction::Sub && BO->IsNSW) {
8090 Type *Ty = U->getType();
8091 auto *V1 = getSignExtendExpr(getSCEV(BO->LHS), Ty);
8092 auto *V2 = getSignExtendExpr(getSCEV(BO->RHS), Ty);
8093 return getMinusSCEV(V1, V2, SCEV::FlagNSW);
8094 }
8095 }
8096 return getSignExtendExpr(getSCEV(U->getOperand(0)), U->getType());
8097
8098 case Instruction::BitCast:
8099 // BitCasts are no-op casts so we just eliminate the cast.
8100 if (isSCEVable(U->getType()) && isSCEVable(U->getOperand(0)->getType()))
8101 return getSCEV(U->getOperand(0));
8102 break;
8103
8104 case Instruction::PtrToAddr: {
8105 const SCEV *IntOp = getPtrToAddrExpr(getSCEV(U->getOperand(0)));
8106 if (isa<SCEVCouldNotCompute>(IntOp))
8107 return getUnknown(V);
8108 return IntOp;
8109 }
8110
8111 case Instruction::PtrToInt:
8112 // SCEV only models ptrtoaddr.
8113 return getUnknown(V);
8114
8115 case Instruction::IntToPtr:
8116 // Just don't deal with inttoptr casts.
8117 return getUnknown(V);
8118
8119 case Instruction::SDiv:
8120 // If both operands are non-negative, this is just an udiv.
8121 if (isKnownNonNegative(getSCEV(U->getOperand(0))) &&
8122 isKnownNonNegative(getSCEV(U->getOperand(1))))
8123 return getUDivExpr(getSCEV(U->getOperand(0)), getSCEV(U->getOperand(1)));
8124 break;
8125
8126 case Instruction::SRem:
8127 // If both operands are non-negative, this is just an urem.
8128 if (isKnownNonNegative(getSCEV(U->getOperand(0))) &&
8129 isKnownNonNegative(getSCEV(U->getOperand(1))))
8130 return getURemExpr(getSCEV(U->getOperand(0)), getSCEV(U->getOperand(1)));
8131 break;
8132
8133 case Instruction::GetElementPtr:
8134 return createNodeForGEP(cast<GEPOperator>(U));
8135
8136 case Instruction::PHI:
8137 return createNodeForPHI(cast<PHINode>(U));
8138
8139 case Instruction::Select:
8140 return createNodeForSelectOrPHI(U, U->getOperand(0), U->getOperand(1),
8141 U->getOperand(2));
8142
8143 case Instruction::Call:
8144 case Instruction::Invoke:
8145 if (Value *RV = cast<CallBase>(U)->getReturnedArgOperand())
8146 return getSCEV(RV);
8147
8148 if (auto *II = dyn_cast<IntrinsicInst>(U)) {
8149 switch (II->getIntrinsicID()) {
8150 case Intrinsic::abs:
8151 return getAbsExpr(
8152 getSCEV(II->getArgOperand(0)),
8153 /*IsNSW=*/cast<ConstantInt>(II->getArgOperand(1))->isOne());
8154 case Intrinsic::umax:
8155 LHS = getSCEV(II->getArgOperand(0));
8156 RHS = getSCEV(II->getArgOperand(1));
8157 return getUMaxExpr(LHS, RHS);
8158 case Intrinsic::umin:
8159 LHS = getSCEV(II->getArgOperand(0));
8160 RHS = getSCEV(II->getArgOperand(1));
8161 return getUMinExpr(LHS, RHS);
8162 case Intrinsic::smax:
8163 LHS = getSCEV(II->getArgOperand(0));
8164 RHS = getSCEV(II->getArgOperand(1));
8165 return getSMaxExpr(LHS, RHS);
8166 case Intrinsic::smin:
8167 LHS = getSCEV(II->getArgOperand(0));
8168 RHS = getSCEV(II->getArgOperand(1));
8169 return getSMinExpr(LHS, RHS);
8170 case Intrinsic::usub_sat: {
8171 const SCEV *X = getSCEV(II->getArgOperand(0));
8172 const SCEV *Y = getSCEV(II->getArgOperand(1));
8173 const SCEV *ClampedY = getUMinExpr(X, Y);
8174 return getMinusSCEV(X, ClampedY, SCEV::FlagNUW);
8175 }
8176 case Intrinsic::uadd_sat: {
8177 const SCEV *X = getSCEV(II->getArgOperand(0));
8178 const SCEV *Y = getSCEV(II->getArgOperand(1));
8179 const SCEV *ClampedX = getUMinExpr(X, getNotSCEV(Y));
8180 return getAddExpr(ClampedX, Y, SCEV::FlagNUW);
8181 }
8182 case Intrinsic::start_loop_iterations:
8183 case Intrinsic::annotation:
8184 case Intrinsic::ptr_annotation:
8185 // A start_loop_iterations or llvm.annotation or llvm.prt.annotation is
8186 // just eqivalent to the first operand for SCEV purposes.
8187 return getSCEV(II->getArgOperand(0));
8188 case Intrinsic::vscale:
8189 return getVScale(II->getType());
8190 default:
8191 break;
8192 }
8193 }
8194 break;
8195 }
8196
8197 return getUnknown(V);
8198}
8199
8200//===----------------------------------------------------------------------===//
8201// Iteration Count Computation Code
8202//
8203
8205 if (isa<SCEVCouldNotCompute>(ExitCount))
8206 return getCouldNotCompute();
8207
8208 auto *ExitCountType = ExitCount->getType();
8209 assert(ExitCountType->isIntegerTy());
8210 auto *EvalTy = Type::getIntNTy(ExitCountType->getContext(),
8211 1 + ExitCountType->getScalarSizeInBits());
8212 return getTripCountFromExitCount(ExitCount, EvalTy, nullptr);
8213}
8214
8216 Type *EvalTy,
8217 const Loop *L) {
8218 if (isa<SCEVCouldNotCompute>(ExitCount))
8219 return getCouldNotCompute();
8220
8221 unsigned ExitCountSize = getTypeSizeInBits(ExitCount->getType());
8222 unsigned EvalSize = EvalTy->getPrimitiveSizeInBits();
8223
8224 auto CanAddOneWithoutOverflow = [&]() {
8225 ConstantRange ExitCountRange =
8226 getRangeRef(ExitCount, RangeSignHint::HINT_RANGE_UNSIGNED);
8227 if (!ExitCountRange.contains(APInt::getMaxValue(ExitCountSize)))
8228 return true;
8229
8230 return L && isLoopEntryGuardedByCond(L, ICmpInst::ICMP_NE, ExitCount,
8231 getMinusOne(ExitCount->getType()));
8232 };
8233
8234 // If we need to zero extend the backedge count, check if we can add one to
8235 // it prior to zero extending without overflow. Provided this is safe, it
8236 // allows better simplification of the +1.
8237 if (EvalSize > ExitCountSize && CanAddOneWithoutOverflow())
8238 return getZeroExtendExpr(
8239 getAddExpr(ExitCount, getOne(ExitCount->getType())), EvalTy);
8240
8241 // Get the total trip count from the count by adding 1. This may wrap.
8242 return getAddExpr(getTruncateOrZeroExtend(ExitCount, EvalTy), getOne(EvalTy));
8243}
8244
8245static unsigned getConstantTripCount(const SCEVConstant *ExitCount) {
8246 if (!ExitCount)
8247 return 0;
8248
8249 ConstantInt *ExitConst = ExitCount->getValue();
8250
8251 // Guard against huge trip counts.
8252 if (ExitConst->getValue().getActiveBits() > 32)
8253 return 0;
8254
8255 // In case of integer overflow, this returns 0, which is correct.
8256 return ((unsigned)ExitConst->getZExtValue()) + 1;
8257}
8258
8260 auto *ExitCount = dyn_cast<SCEVConstant>(getBackedgeTakenCount(L, Exact));
8261 return getConstantTripCount(ExitCount);
8262}
8263
8264unsigned
8266 const BasicBlock *ExitingBlock) {
8267 assert(ExitingBlock && "Must pass a non-null exiting block!");
8268 assert(L->isLoopExiting(ExitingBlock) &&
8269 "Exiting block must actually branch out of the loop!");
8270 const SCEVConstant *ExitCount =
8271 dyn_cast<SCEVConstant>(getExitCount(L, ExitingBlock));
8272 return getConstantTripCount(ExitCount);
8273}
8274
8276 const Loop *L, SmallVectorImpl<const SCEVPredicate *> *Predicates) {
8277
8278 const auto *MaxExitCount =
8279 Predicates ? getPredicatedConstantMaxBackedgeTakenCount(L, *Predicates)
8281 return getConstantTripCount(dyn_cast<SCEVConstant>(MaxExitCount));
8282}
8283
8285 SmallVector<BasicBlock *, 8> ExitingBlocks;
8286 L->getExitingBlocks(ExitingBlocks);
8287
8288 // An exit with an uncomputable exit count makes the result 1.
8289 if (ExitingBlocks.empty() ||
8290 any_of(ExitingBlocks, [this, L](BasicBlock *ExitingBB) {
8291 return isa<SCEVCouldNotCompute>(getExitCount(L, ExitingBB));
8292 }))
8293 return 1;
8294
8295 LoopGuards Guards = LoopGuards::collectOnDemand(L, *this);
8296 unsigned Res = 0;
8297 for (BasicBlock *ExitingBB : ExitingBlocks)
8298 Res = std::gcd(
8299 Res, getSmallConstantTripMultiple(getExitCount(L, ExitingBB), Guards));
8300 return Res;
8301}
8302
8303unsigned ScalarEvolution::getSmallConstantTripMultiple(const SCEV *ExitCount,
8304 LoopGuards &Guards) {
8305 assert(!isa<SCEVCouldNotCompute>(ExitCount) && "Must be computable!");
8306
8307 // Get the trip count
8308 const SCEV *TCExpr =
8309 getTripCountFromExitCount(applyLoopGuards(ExitCount, Guards));
8310
8311 APInt Multiple = getNonZeroConstantMultiple(TCExpr);
8312 // If a trip multiple is huge (>=2^32), the trip count is still divisible by
8313 // the greatest power of 2 divisor less than 2^32.
8314 return Multiple.getActiveBits() > 32
8315 ? 1U << std::min(31U, Multiple.countTrailingZeros())
8316 : (unsigned)Multiple.getZExtValue();
8317}
8318
8320 const SCEV *ExitCount) {
8321 if (isa<SCEVCouldNotCompute>(ExitCount))
8322 return 1;
8323
8324 LoopGuards Guards = LoopGuards::collectOnDemand(L, *this);
8325 return getSmallConstantTripMultiple(ExitCount, Guards);
8326}
8327
8328/// Returns the largest constant divisor of the trip count of this loop as a
8329/// normal unsigned value, if possible. This means that the actual trip count is
8330/// always a multiple of the returned value (don't forget the trip count could
8331/// very well be zero as well!).
8332///
8333/// Returns 1 if the trip count is unknown or not guaranteed to be the
8334/// multiple of a constant (which is also the case if the trip count is simply
8335/// constant, use getSmallConstantTripCount for that case), Will also return 1
8336/// if the trip count is very large (>= 2^32).
8337///
8338/// As explained in the comments for getSmallConstantTripCount, this assumes
8339/// that control exits the loop via ExitingBlock.
8340unsigned
8342 const BasicBlock *ExitingBlock) {
8343 assert(ExitingBlock && "Must pass a non-null exiting block!");
8344 assert(L->isLoopExiting(ExitingBlock) &&
8345 "Exiting block must actually branch out of the loop!");
8346 const SCEV *ExitCount = getExitCount(L, ExitingBlock);
8347 return getSmallConstantTripMultiple(L, ExitCount);
8348}
8349
8351 const BasicBlock *ExitingBlock,
8352 ExitCountKind Kind) {
8353 switch (Kind) {
8354 case Exact:
8355 return getBackedgeTakenInfo(L).getExact(ExitingBlock, this);
8356 case SymbolicMaximum:
8357 return getBackedgeTakenInfo(L).getSymbolicMax(ExitingBlock, this);
8358 case ConstantMaximum:
8359 return getBackedgeTakenInfo(L).getConstantMax(ExitingBlock, this);
8360 };
8361 llvm_unreachable("Invalid ExitCountKind!");
8362}
8363
8365 const Loop *L, const BasicBlock *ExitingBlock,
8367 switch (Kind) {
8368 case Exact:
8369 return getPredicatedBackedgeTakenInfo(L).getExact(ExitingBlock, this,
8370 Predicates);
8371 case SymbolicMaximum:
8372 return getPredicatedBackedgeTakenInfo(L).getSymbolicMax(ExitingBlock, this,
8373 Predicates);
8374 case ConstantMaximum:
8375 return getPredicatedBackedgeTakenInfo(L).getConstantMax(ExitingBlock, this,
8376 Predicates);
8377 };
8378 llvm_unreachable("Invalid ExitCountKind!");
8379}
8380
8383 return getPredicatedBackedgeTakenInfo(L).getExact(L, this, &Preds);
8384}
8385
8387 ExitCountKind Kind) {
8388 switch (Kind) {
8389 case Exact:
8390 return getBackedgeTakenInfo(L).getExact(L, this);
8391 case ConstantMaximum:
8392 return getBackedgeTakenInfo(L).getConstantMax(this);
8393 case SymbolicMaximum:
8394 return getBackedgeTakenInfo(L).getSymbolicMax(L, this);
8395 };
8396 llvm_unreachable("Invalid ExitCountKind!");
8397}
8398
8401 return getPredicatedBackedgeTakenInfo(L).getSymbolicMax(L, this, &Preds);
8402}
8403
8406 return getPredicatedBackedgeTakenInfo(L).getConstantMax(this, &Preds);
8407}
8408
8410 return getBackedgeTakenInfo(L).isConstantMaxOrZero(this);
8411}
8412
8413/// Push PHI nodes in the header of the given loop onto the given Worklist.
8414static void PushLoopPHIs(const Loop *L,
8417 BasicBlock *Header = L->getHeader();
8418
8419 // Push all Loop-header PHIs onto the Worklist stack.
8420 for (PHINode &PN : Header->phis())
8421 if (Visited.insert(&PN).second)
8422 Worklist.push_back(&PN);
8423}
8424
8425ScalarEvolution::BackedgeTakenInfo &
8426ScalarEvolution::getPredicatedBackedgeTakenInfo(const Loop *L) {
8427 auto &BTI = getBackedgeTakenInfo(L);
8428 if (BTI.hasFullInfo())
8429 return BTI;
8430
8431 auto Pair = PredicatedBackedgeTakenCounts.try_emplace(L);
8432
8433 if (!Pair.second)
8434 return Pair.first->second;
8435
8436 BackedgeTakenInfo Result =
8437 computeBackedgeTakenCount(L, /*AllowPredicates=*/true);
8438
8439 return PredicatedBackedgeTakenCounts.find(L)->second = std::move(Result);
8440}
8441
8442ScalarEvolution::BackedgeTakenInfo &
8443ScalarEvolution::getBackedgeTakenInfo(const Loop *L) {
8444 // Initially insert an invalid entry for this loop. If the insertion
8445 // succeeds, proceed to actually compute a backedge-taken count and
8446 // update the value. The temporary CouldNotCompute value tells SCEV
8447 // code elsewhere that it shouldn't attempt to request a new
8448 // backedge-taken count, which could result in infinite recursion.
8449 std::pair<DenseMap<const Loop *, BackedgeTakenInfo>::iterator, bool> Pair =
8450 BackedgeTakenCounts.try_emplace(L);
8451 if (!Pair.second)
8452 return Pair.first->second;
8453
8454 // computeBackedgeTakenCount may allocate memory for its result. Inserting it
8455 // into the BackedgeTakenCounts map transfers ownership. Otherwise, the result
8456 // must be cleared in this scope.
8457 BackedgeTakenInfo Result = computeBackedgeTakenCount(L);
8458
8459 // Now that we know more about the trip count for this loop, forget any
8460 // existing SCEV values for PHI nodes in this loop since they are only
8461 // conservative estimates made without the benefit of trip count
8462 // information. This invalidation is not necessary for correctness, and is
8463 // only done to produce more precise results.
8464 if (Result.hasAnyInfo()) {
8465 // Invalidate any expression using an addrec in this loop.
8466 SmallVector<SCEVUse, 8> ToForget;
8467 auto LoopUsersIt = LoopUsers.find(L);
8468 if (LoopUsersIt != LoopUsers.end())
8469 append_range(ToForget, LoopUsersIt->second);
8470 forgetMemoizedResults(ToForget);
8471
8472 // Invalidate constant-evolved loop header phis.
8473 for (PHINode &PN : L->getHeader()->phis())
8474 ConstantEvolutionLoopExitValue.erase(&PN);
8475 }
8476
8477 // Re-lookup the insert position, since the call to
8478 // computeBackedgeTakenCount above could result in a
8479 // recusive call to getBackedgeTakenInfo (on a different
8480 // loop), which would invalidate the iterator computed
8481 // earlier.
8482 return BackedgeTakenCounts.find(L)->second = std::move(Result);
8483}
8484
8486 // This method is intended to forget all info about loops. It should
8487 // invalidate caches as if the following happened:
8488 // - The trip counts of all loops have changed arbitrarily
8489 // - Every llvm::Value has been updated in place to produce a different
8490 // result.
8491 BackedgeTakenCounts.clear();
8492 PredicatedBackedgeTakenCounts.clear();
8493 BECountUsers.clear();
8494 LoopPropertiesCache.clear();
8495 ConstantEvolutionLoopExitValue.clear();
8496 ValueExprMap.clear();
8497 ValuesAtScopes.clear();
8498 ValuesAtScopesUsers.clear();
8499 LoopDispositions.clear();
8500 BlockDispositions.clear();
8501 UnsignedRanges.clear();
8502 SignedRanges.clear();
8503 ExprValueMap.clear();
8504 HasRecMap.clear();
8505 ConstantMultipleCache.clear();
8506 PredicatedSCEVRewrites.clear();
8507 FoldCache.clear();
8508 FoldCacheUser.clear();
8509}
8510void ScalarEvolution::visitAndClearUsers(
8513 SmallVectorImpl<SCEVUse> &ToForget) {
8514 // Nothing can be invalidated if no value has a SCEV yet.
8515 if (ValueExprMap.empty()) {
8516 Worklist.clear();
8517 return;
8518 }
8519 while (!Worklist.empty()) {
8520 Instruction *I = Worklist.pop_back_val();
8521 if (!isSCEVable(I->getType()) && !isa<WithOverflowInst>(I))
8522 continue;
8523
8525 ValueExprMap.find_as(static_cast<Value *>(I));
8526 if (It != ValueExprMap.end()) {
8527 ToForget.push_back(It->second);
8528 eraseValueFromMap(It->first);
8529 if (PHINode *PN = dyn_cast<PHINode>(I))
8530 ConstantEvolutionLoopExitValue.erase(PN);
8531 }
8532
8533 PushDefUseChildren(I, Worklist, Visited);
8534 }
8535}
8536
8538 SmallVector<const Loop *, 16> LoopWorklist(1, L);
8541 SmallVector<SCEVUse, 16> ToForget;
8542
8543 // Iterate over all the loops and sub-loops to drop SCEV information.
8544 while (!LoopWorklist.empty()) {
8545 auto *CurrL = LoopWorklist.pop_back_val();
8546
8547 // Drop any stored trip count value.
8548 forgetBackedgeTakenCounts(CurrL, /* Predicated */ false);
8549 forgetBackedgeTakenCounts(CurrL, /* Predicated */ true);
8550
8551 // Drop information about predicated SCEV rewrites for this loop.
8552 PredicatedSCEVRewrites.remove_if(
8553 [&](const auto &Entry) { return Entry.first.second == CurrL; });
8554
8555 auto LoopUsersItr = LoopUsers.find(CurrL);
8556 if (LoopUsersItr != LoopUsers.end())
8557 llvm::append_range(ToForget, LoopUsersItr->second);
8558
8559 // Drop information about expressions based on loop-header PHIs.
8560 PushLoopPHIs(CurrL, Worklist, Visited);
8561 visitAndClearUsers(Worklist, Visited, ToForget);
8562
8563 LoopPropertiesCache.erase(CurrL);
8564 // Forget all contained loops too, to avoid dangling entries in the
8565 // ValuesAtScopes map.
8566 LoopWorklist.append(CurrL->begin(), CurrL->end());
8567 }
8568 forgetMemoizedResults(ToForget);
8569}
8570
8572 forgetLoop(L->getOutermostLoop());
8573}
8574
8577 if (!I) return;
8578
8579 // Drop information about expressions based on loop-header PHIs.
8582 SmallVector<SCEVUse, 8> ToForget;
8583 Worklist.push_back(I);
8584 Visited.insert(I);
8585 visitAndClearUsers(Worklist, Visited, ToForget);
8586
8587 forgetMemoizedResults(ToForget);
8588}
8589
8593 SmallVector<SCEVUse, 8> ToForget;
8594 for (Value *V : Values)
8595 if (auto *I = dyn_cast<Instruction>(V))
8596 if (Visited.insert(I).second)
8597 Worklist.push_back(I);
8598 visitAndClearUsers(Worklist, Visited, ToForget);
8599
8600 forgetMemoizedResults(ToForget);
8601}
8602
8604 // If SCEV looked through a trivial LCSSA phi node, we might have SCEV's
8605 // directly using a SCEVUnknown/SCEVAddRec defined in the loop. After an
8606 // extra predecessor is added, this is no longer valid. Find all Unknowns and
8607 // AddRecs defined in the loop and invalidate any SCEV's making use of them.
8608 auto InvalidateValue = [&](Value *Val) {
8609 if (!isSCEVable(Val->getType()))
8610 return;
8611 if (const SCEV *S = getExistingSCEV(Val)) {
8612 struct InvalidationRootCollector {
8613 Loop *L;
8615
8616 InvalidationRootCollector(Loop *L) : L(L) {}
8617
8618 bool follow(const SCEV *S) {
8619 if (auto *SU = dyn_cast<SCEVUnknown>(S)) {
8620 if (auto *I = dyn_cast<Instruction>(SU->getValue()))
8621 if (L->contains(I))
8622 Roots.push_back(S);
8623 } else if (auto *AddRec = dyn_cast<SCEVAddRecExpr>(S)) {
8624 if (L->contains(AddRec->getLoop()))
8625 Roots.push_back(S);
8626 }
8627 return true;
8628 }
8629 bool isDone() const { return false; }
8630 };
8631
8632 InvalidationRootCollector C(L);
8633 visitAll(S, C);
8634 forgetMemoizedResults(C.Roots);
8635 }
8636 };
8637
8638 InvalidateValue(V);
8639
8640 // If V has a non-SCEV-able type (e.g. {i64, i1} from a with.overflow
8641 // intrinsic), its users (e.g. extractvalue) may have stale SCEV
8642 // expressions referencing loop-internal values.
8643 if (!isSCEVable(V->getType()) &&
8644 any_of(V->incoming_values(), IsaPred<WithOverflowInst>))
8645 for (User *U : V->users())
8646 InvalidateValue(U);
8647 // Also perform the normal invalidation.
8648 forgetValue(V);
8649}
8650
8651void ScalarEvolution::forgetLoopDispositions() { LoopDispositions.clear(); }
8652
8654 // Unless a specific value is passed to invalidation, completely clear both
8655 // caches.
8656 if (!V) {
8657 BlockDispositions.clear();
8658 LoopDispositions.clear();
8659 return;
8660 }
8661
8662 if (!isSCEVable(V->getType()))
8663 return;
8664
8665 const SCEV *S = getExistingSCEV(V);
8666 if (!S)
8667 return;
8668
8669 // Invalidate the block and loop dispositions cached for S. Dispositions of
8670 // S's users may change if S's disposition changes (i.e. a user may change to
8671 // loop-invariant, if S changes to loop invariant), so also invalidate
8672 // dispositions of S's users recursively.
8673 SmallVector<SCEVUse, 8> Worklist = {S};
8675 while (!Worklist.empty()) {
8676 const SCEV *Curr = Worklist.pop_back_val();
8677 bool LoopDispoRemoved = LoopDispositions.erase(Curr);
8678 bool BlockDispoRemoved = BlockDispositions.erase(Curr);
8679 if (!LoopDispoRemoved && !BlockDispoRemoved)
8680 continue;
8681 auto Users = SCEVUsers.find(Curr);
8682 if (Users != SCEVUsers.end())
8683 for (const auto *User : Users->second)
8684 if (Seen.insert(User).second)
8685 Worklist.push_back(User);
8686 }
8687}
8688
8689/// Get the exact loop backedge taken count considering all loop exits. A
8690/// computable result can only be returned for loops with all exiting blocks
8691/// dominating the latch. howFarToZero assumes that the limit of each loop test
8692/// is never skipped. This is a valid assumption as long as the loop exits via
8693/// that test. For precise results, it is the caller's responsibility to specify
8694/// the relevant loop exiting block using getExact(ExitingBlock, SE).
8695const SCEV *ScalarEvolution::BackedgeTakenInfo::getExact(
8696 const Loop *L, ScalarEvolution *SE,
8698 // If any exits were not computable, the loop is not computable.
8699 if (!isComplete() || ExitNotTaken.empty())
8700 return SE->getCouldNotCompute();
8701
8702 const BasicBlock *Latch = L->getLoopLatch();
8703 // All exiting blocks we have collected must dominate the only backedge.
8704 if (!Latch)
8705 return SE->getCouldNotCompute();
8706
8707 // All exiting blocks we have gathered dominate loop's latch, so exact trip
8708 // count is simply a minimum out of all these calculated exit counts.
8710 for (const auto &ENT : ExitNotTaken) {
8711 const SCEV *BECount = ENT.ExactNotTaken;
8712 assert(BECount != SE->getCouldNotCompute() && "Bad exit SCEV!");
8713 assert(SE->DT.dominates(ENT.ExitingBlock, Latch) &&
8714 "We should only have known counts for exiting blocks that dominate "
8715 "latch!");
8716
8717 Ops.push_back(BECount);
8718
8719 if (Preds)
8720 append_range(*Preds, ENT.Predicates);
8721
8722 assert((Preds || ENT.hasAlwaysTruePredicate()) &&
8723 "Predicate should be always true!");
8724 }
8725
8726 // If an earlier exit exits on the first iteration (exit count zero), then
8727 // a later poison exit count should not propagate into the result. This are
8728 // exactly the semantics provided by umin_seq.
8729 return SE->getUMinFromMismatchedTypes(Ops, /* Sequential */ true);
8730}
8731
8732const ScalarEvolution::ExitNotTakenInfo *
8733ScalarEvolution::BackedgeTakenInfo::getExitNotTaken(
8734 const BasicBlock *ExitingBlock,
8735 SmallVectorImpl<const SCEVPredicate *> *Predicates) const {
8736 for (const auto &ENT : ExitNotTaken)
8737 if (ENT.ExitingBlock == ExitingBlock) {
8738 if (ENT.hasAlwaysTruePredicate())
8739 return &ENT;
8740 else if (Predicates) {
8741 append_range(*Predicates, ENT.Predicates);
8742 return &ENT;
8743 }
8744 }
8745
8746 return nullptr;
8747}
8748
8749/// getConstantMax - Get the constant max backedge taken count for the loop.
8750const SCEV *ScalarEvolution::BackedgeTakenInfo::getConstantMax(
8751 ScalarEvolution *SE,
8752 SmallVectorImpl<const SCEVPredicate *> *Predicates) const {
8753 if (!getConstantMax())
8754 return SE->getCouldNotCompute();
8755
8756 for (const auto &ENT : ExitNotTaken)
8757 if (!ENT.hasAlwaysTruePredicate()) {
8758 if (!Predicates)
8759 return SE->getCouldNotCompute();
8760 append_range(*Predicates, ENT.Predicates);
8761 }
8762
8763 assert((isa<SCEVCouldNotCompute>(getConstantMax()) ||
8764 isa<SCEVConstant>(getConstantMax())) &&
8765 "No point in having a non-constant max backedge taken count!");
8766 return getConstantMax();
8767}
8768
8769const SCEV *ScalarEvolution::BackedgeTakenInfo::getSymbolicMax(
8770 const Loop *L, ScalarEvolution *SE,
8771 SmallVectorImpl<const SCEVPredicate *> *Predicates) {
8772 if (!SymbolicMax) {
8773 // Form an expression for the maximum exit count possible for this loop. We
8774 // merge the max and exact information to approximate a version of
8775 // getConstantMaxBackedgeTakenCount which isn't restricted to just
8776 // constants.
8777 SmallVector<SCEVUse, 4> ExitCounts;
8778
8779 for (const auto &ENT : ExitNotTaken) {
8780 const SCEV *ExitCount = ENT.SymbolicMaxNotTaken;
8781 if (!isa<SCEVCouldNotCompute>(ExitCount)) {
8782 assert(SE->DT.dominates(ENT.ExitingBlock, L->getLoopLatch()) &&
8783 "We should only have known counts for exiting blocks that "
8784 "dominate latch!");
8785 ExitCounts.push_back(ExitCount);
8786 if (Predicates)
8787 append_range(*Predicates, ENT.Predicates);
8788
8789 assert((Predicates || ENT.hasAlwaysTruePredicate()) &&
8790 "Predicate should be always true!");
8791 }
8792 }
8793 if (ExitCounts.empty())
8794 SymbolicMax = SE->getCouldNotCompute();
8795 else
8796 SymbolicMax =
8797 SE->getUMinFromMismatchedTypes(ExitCounts, /*Sequential*/ true);
8798 }
8799 return SymbolicMax;
8800}
8801
8802bool ScalarEvolution::BackedgeTakenInfo::isConstantMaxOrZero(
8803 ScalarEvolution *SE) const {
8804 auto PredicateNotAlwaysTrue = [](const ExitNotTakenInfo &ENT) {
8805 return !ENT.hasAlwaysTruePredicate();
8806 };
8807 return MaxOrZero && !any_of(ExitNotTaken, PredicateNotAlwaysTrue);
8808}
8809
8812
8814 const SCEV *E, const SCEV *ConstantMaxNotTaken,
8815 const SCEV *SymbolicMaxNotTaken, bool MaxOrZero,
8819 // If we prove the max count is zero, so is the symbolic bound. This happens
8820 // in practice due to differences in a) how context sensitive we've chosen
8821 // to be and b) how we reason about bounds implied by UB.
8822 if (ConstantMaxNotTaken->isZero()) {
8823 this->ExactNotTaken = E = ConstantMaxNotTaken;
8824 this->SymbolicMaxNotTaken = SymbolicMaxNotTaken = ConstantMaxNotTaken;
8825 }
8826
8829 "Exact is not allowed to be less precise than Constant Max");
8832 "Exact is not allowed to be less precise than Symbolic Max");
8835 "Symbolic Max is not allowed to be less precise than Constant Max");
8838 "No point in having a non-constant max backedge taken count!");
8840 for (const auto PredList : PredLists)
8841 for (const auto *P : PredList) {
8842 if (SeenPreds.contains(P))
8843 continue;
8844 assert(!isa<SCEVUnionPredicate>(P) && "Only add leaf predicates here!");
8845 SeenPreds.insert(P);
8846 Predicates.push_back(P);
8847 }
8848 assert((isa<SCEVCouldNotCompute>(E) || !E->getType()->isPointerTy()) &&
8849 "Backedge count should be int");
8851 !ConstantMaxNotTaken->getType()->isPointerTy()) &&
8852 "Max backedge count should be int");
8853}
8854
8862
8863/// Allocate memory for BackedgeTakenInfo and copy the not-taken count of each
8864/// computable exit into a persistent ExitNotTakenInfo array.
8865ScalarEvolution::BackedgeTakenInfo::BackedgeTakenInfo(
8867 bool IsComplete, const SCEV *ConstantMax, bool MaxOrZero)
8868 : ConstantMax(ConstantMax), IsComplete(IsComplete), MaxOrZero(MaxOrZero) {
8869 using EdgeExitInfo = ScalarEvolution::BackedgeTakenInfo::EdgeExitInfo;
8870
8871 ExitNotTaken.reserve(ExitCounts.size());
8872 std::transform(ExitCounts.begin(), ExitCounts.end(),
8873 std::back_inserter(ExitNotTaken),
8874 [&](const EdgeExitInfo &EEI) {
8875 BasicBlock *ExitBB = EEI.first;
8876 const ExitLimit &EL = EEI.second;
8877 return ExitNotTakenInfo(ExitBB, EL.ExactNotTaken,
8878 EL.ConstantMaxNotTaken, EL.SymbolicMaxNotTaken,
8879 EL.Predicates);
8880 });
8881 assert((isa<SCEVCouldNotCompute>(ConstantMax) ||
8882 isa<SCEVConstant>(ConstantMax)) &&
8883 "No point in having a non-constant max backedge taken count!");
8884}
8885
8886/// Compute the number of times the backedge of the specified loop will execute.
8887ScalarEvolution::BackedgeTakenInfo
8888ScalarEvolution::computeBackedgeTakenCount(const Loop *L,
8889 bool AllowPredicates) {
8890 SmallVector<BasicBlock *, 8> ExitingBlocks;
8891 L->getExitingBlocks(ExitingBlocks);
8892
8893 using EdgeExitInfo = ScalarEvolution::BackedgeTakenInfo::EdgeExitInfo;
8894
8896 bool CouldComputeBECount = true;
8897 BasicBlock *Latch = L->getLoopLatch(); // may be NULL.
8898 const SCEV *MustExitMaxBECount = nullptr;
8899 const SCEV *MayExitMaxBECount = nullptr;
8900 bool MustExitMaxOrZero = false;
8901 bool IsOnlyExit = ExitingBlocks.size() == 1;
8902
8903 // Compute the ExitLimit for each loop exit. Use this to populate ExitCounts
8904 // and compute maxBECount.
8905 // Do a union of all the predicates here.
8906 for (BasicBlock *ExitBB : ExitingBlocks) {
8907 // We canonicalize untaken exits to br (constant), ignore them so that
8908 // proving an exit untaken doesn't negatively impact our ability to reason
8909 // about the loop as whole.
8910 if (auto *BI = dyn_cast<CondBrInst>(ExitBB->getTerminator()))
8911 if (auto *CI = dyn_cast<ConstantInt>(BI->getCondition())) {
8912 bool ExitIfTrue = !L->contains(BI->getSuccessor(0));
8913 if (ExitIfTrue == CI->isZero())
8914 continue;
8915 }
8916
8917 ExitLimit EL = computeExitLimit(L, ExitBB, IsOnlyExit, AllowPredicates);
8918
8919 assert((AllowPredicates || EL.Predicates.empty()) &&
8920 "Predicated exit limit when predicates are not allowed!");
8921
8922 // 1. For each exit that can be computed, add an entry to ExitCounts.
8923 // CouldComputeBECount is true only if all exits can be computed.
8924 if (EL.ExactNotTaken != getCouldNotCompute())
8925 ++NumExitCountsComputed;
8926 else
8927 // We couldn't compute an exact value for this exit, so
8928 // we won't be able to compute an exact value for the loop.
8929 CouldComputeBECount = false;
8930 // Remember exit count if either exact or symbolic is known. Because
8931 // Exact always implies symbolic, only check symbolic.
8932 if (EL.SymbolicMaxNotTaken != getCouldNotCompute())
8933 ExitCounts.emplace_back(ExitBB, EL);
8934 else {
8935 assert(EL.ExactNotTaken == getCouldNotCompute() &&
8936 "Exact is known but symbolic isn't?");
8937 ++NumExitCountsNotComputed;
8938 }
8939
8940 // 2. Derive the loop's MaxBECount from each exit's max number of
8941 // non-exiting iterations. Partition the loop exits into two kinds:
8942 // LoopMustExits and LoopMayExits.
8943 //
8944 // If the exit dominates the loop latch, it is a LoopMustExit otherwise it
8945 // is a LoopMayExit. If any computable LoopMustExit is found, then
8946 // MaxBECount is the minimum EL.ConstantMaxNotTaken of computable
8947 // LoopMustExits. Otherwise, MaxBECount is conservatively the maximum
8948 // EL.ConstantMaxNotTaken, where CouldNotCompute is considered greater than
8949 // any
8950 // computable EL.ConstantMaxNotTaken.
8951 if (EL.ConstantMaxNotTaken != getCouldNotCompute() && Latch &&
8952 DT.dominates(ExitBB, Latch)) {
8953 if (!MustExitMaxBECount) {
8954 MustExitMaxBECount = EL.ConstantMaxNotTaken;
8955 MustExitMaxOrZero = EL.MaxOrZero;
8956 } else {
8957 MustExitMaxBECount = getUMinFromMismatchedTypes(MustExitMaxBECount,
8958 EL.ConstantMaxNotTaken);
8959 }
8960 } else if (MayExitMaxBECount != getCouldNotCompute()) {
8961 if (!MayExitMaxBECount || EL.ConstantMaxNotTaken == getCouldNotCompute())
8962 MayExitMaxBECount = EL.ConstantMaxNotTaken;
8963 else {
8964 MayExitMaxBECount = getUMaxFromMismatchedTypes(MayExitMaxBECount,
8965 EL.ConstantMaxNotTaken);
8966 }
8967 }
8968 }
8969 const SCEV *MaxBECount = MustExitMaxBECount ? MustExitMaxBECount :
8970 (MayExitMaxBECount ? MayExitMaxBECount : getCouldNotCompute());
8971 // The loop backedge will be taken the maximum or zero times if there's
8972 // a single exit that must be taken the maximum or zero times.
8973 bool MaxOrZero = (MustExitMaxOrZero && ExitingBlocks.size() == 1);
8974
8975 // Remember which SCEVs are used in exit limits for invalidation purposes.
8976 // We only care about non-constant SCEVs here, so we can ignore
8977 // EL.ConstantMaxNotTaken
8978 // and MaxBECount, which must be SCEVConstant.
8979 for (const auto &Pair : ExitCounts) {
8980 if (!isa<SCEVConstant>(Pair.second.ExactNotTaken))
8981 BECountUsers[Pair.second.ExactNotTaken].insert({L, AllowPredicates});
8982 if (!isa<SCEVConstant>(Pair.second.SymbolicMaxNotTaken))
8983 BECountUsers[Pair.second.SymbolicMaxNotTaken].insert(
8984 {L, AllowPredicates});
8985 }
8986 return BackedgeTakenInfo(std::move(ExitCounts), CouldComputeBECount,
8987 MaxBECount, MaxOrZero);
8988}
8989
8990ScalarEvolution::ExitLimit
8991ScalarEvolution::computeExitLimit(const Loop *L, BasicBlock *ExitingBlock,
8992 bool IsOnlyExit, bool AllowPredicates) {
8993 assert(L->contains(ExitingBlock) && "Exit count for non-loop block?");
8994 // If our exiting block does not dominate the latch, then its connection with
8995 // loop's exit limit may be far from trivial.
8996 const BasicBlock *Latch = L->getLoopLatch();
8997 if (!Latch || !DT.dominates(ExitingBlock, Latch))
8998 return getCouldNotCompute();
8999
9000 Instruction *Term = ExitingBlock->getTerminator();
9001 if (CondBrInst *BI = dyn_cast<CondBrInst>(Term)) {
9002 bool ExitIfTrue = !L->contains(BI->getSuccessor(0));
9003 assert(ExitIfTrue == L->contains(BI->getSuccessor(1)) &&
9004 "It should have one successor in loop and one exit block!");
9005 // Proceed to the next level to examine the exit condition expression.
9006 return computeExitLimitFromCond(L, BI->getCondition(), ExitIfTrue,
9007 /*ControlsOnlyExit=*/IsOnlyExit,
9008 AllowPredicates);
9009 }
9010
9011 if (SwitchInst *SI = dyn_cast<SwitchInst>(Term)) {
9012 // For switch, make sure that there is a single exit from the loop.
9013 BasicBlock *Exit = nullptr;
9014 for (auto *SBB : successors(ExitingBlock))
9015 if (!L->contains(SBB)) {
9016 if (Exit) // Multiple exit successors.
9017 return getCouldNotCompute();
9018 Exit = SBB;
9019 }
9020 assert(Exit && "Exiting block must have at least one exit");
9021 return computeExitLimitFromSingleExitSwitch(
9022 L, SI, Exit, /*ControlsOnlyExit=*/IsOnlyExit);
9023 }
9024
9025 return getCouldNotCompute();
9026}
9027
9029 const Loop *L, Value *ExitCond, bool ExitIfTrue, bool ControlsOnlyExit,
9030 bool AllowPredicates) {
9031 ScalarEvolution::ExitLimitCacheTy Cache(L, ExitIfTrue, AllowPredicates);
9032 return computeExitLimitFromCondCached(Cache, L, ExitCond, ExitIfTrue,
9033 ControlsOnlyExit, AllowPredicates);
9034}
9035
9036std::optional<ScalarEvolution::ExitLimit>
9037ScalarEvolution::ExitLimitCache::find(const Loop *L, Value *ExitCond,
9038 bool ExitIfTrue, bool ControlsOnlyExit,
9039 bool AllowPredicates) {
9040 (void)this->L;
9041 (void)this->ExitIfTrue;
9042 (void)this->AllowPredicates;
9043
9044 assert(this->L == L && this->ExitIfTrue == ExitIfTrue &&
9045 this->AllowPredicates == AllowPredicates &&
9046 "Variance in assumed invariant key components!");
9047 auto Itr = TripCountMap.find({ExitCond, ControlsOnlyExit});
9048 if (Itr == TripCountMap.end())
9049 return std::nullopt;
9050 return Itr->second;
9051}
9052
9053void ScalarEvolution::ExitLimitCache::insert(const Loop *L, Value *ExitCond,
9054 bool ExitIfTrue,
9055 bool ControlsOnlyExit,
9056 bool AllowPredicates,
9057 const ExitLimit &EL) {
9058 assert(this->L == L && this->ExitIfTrue == ExitIfTrue &&
9059 this->AllowPredicates == AllowPredicates &&
9060 "Variance in assumed invariant key components!");
9061
9062 auto InsertResult = TripCountMap.insert({{ExitCond, ControlsOnlyExit}, EL});
9063 assert(InsertResult.second && "Expected successful insertion!");
9064 (void)InsertResult;
9065 (void)ExitIfTrue;
9066}
9067
9068ScalarEvolution::ExitLimit ScalarEvolution::computeExitLimitFromCondCached(
9069 ExitLimitCacheTy &Cache, const Loop *L, Value *ExitCond, bool ExitIfTrue,
9070 bool ControlsOnlyExit, bool AllowPredicates) {
9071
9072 if (auto MaybeEL = Cache.find(L, ExitCond, ExitIfTrue, ControlsOnlyExit,
9073 AllowPredicates))
9074 return *MaybeEL;
9075
9076 ExitLimit EL = computeExitLimitFromCondImpl(
9077 Cache, L, ExitCond, ExitIfTrue, ControlsOnlyExit, AllowPredicates);
9078 Cache.insert(L, ExitCond, ExitIfTrue, ControlsOnlyExit, AllowPredicates, EL);
9079 return EL;
9080}
9081
9082ScalarEvolution::ExitLimit ScalarEvolution::computeExitLimitFromCondImpl(
9083 ExitLimitCacheTy &Cache, const Loop *L, Value *ExitCond, bool ExitIfTrue,
9084 bool ControlsOnlyExit, bool AllowPredicates) {
9085 // Handle BinOp conditions (And, Or).
9086 if (auto LimitFromBinOp = computeExitLimitFromCondFromBinOp(
9087 Cache, L, ExitCond, ExitIfTrue, AllowPredicates))
9088 return *LimitFromBinOp;
9089
9090 // With an icmp, it may be feasible to compute an exact backedge-taken count.
9091 // Proceed to the next level to examine the icmp.
9092 if (ICmpInst *ExitCondICmp = dyn_cast<ICmpInst>(ExitCond)) {
9093 ExitLimit EL =
9094 computeExitLimitFromICmp(L, ExitCondICmp, ExitIfTrue, ControlsOnlyExit);
9095 if (EL.hasFullInfo() || !AllowPredicates)
9096 return EL;
9097
9098 // Try again, but use SCEV predicates this time.
9099 return computeExitLimitFromICmp(L, ExitCondICmp, ExitIfTrue,
9100 ControlsOnlyExit,
9101 /*AllowPredicates=*/true);
9102 }
9103
9104 // Check for a constant condition. These are normally stripped out by
9105 // SimplifyCFG, but ScalarEvolution may be used by a pass which wishes to
9106 // preserve the CFG and is temporarily leaving constant conditions
9107 // in place.
9108 if (ConstantInt *CI = dyn_cast<ConstantInt>(ExitCond)) {
9109 if (ExitIfTrue == !CI->getZExtValue())
9110 // The backedge is always taken.
9111 return getCouldNotCompute();
9112 // The backedge is never taken.
9113 return getZero(CI->getType());
9114 }
9115
9116 // If we're exiting based on the overflow flag of an x.with.overflow intrinsic
9117 // with a constant step, we can form an equivalent icmp predicate and figure
9118 // out how many iterations will be taken before we exit.
9119 const WithOverflowInst *WO;
9120 const APInt *C;
9121 if (match(ExitCond, m_ExtractValue<1>(m_WithOverflowInst(WO))) &&
9122 match(WO->getRHS(), m_APInt(C))) {
9123 ConstantRange NWR =
9125 WO->getNoWrapKind());
9127 APInt NewRHSC, Offset;
9128 NWR.getEquivalentICmp(Pred, NewRHSC, Offset);
9129 if (!ExitIfTrue)
9131 auto *LHS = getSCEV(WO->getLHS());
9132 if (Offset != 0)
9134 auto EL = computeExitLimitFromICmp(L, Pred, LHS, getConstant(NewRHSC),
9135 ControlsOnlyExit, AllowPredicates);
9136 if (EL.hasAnyInfo())
9137 return EL;
9138 }
9139
9140 // If it's not an integer or pointer comparison then compute it the hard way.
9141 return computeExitCountExhaustively(L, ExitCond, ExitIfTrue);
9142}
9143
9144std::optional<ScalarEvolution::ExitLimit>
9145ScalarEvolution::computeExitLimitFromCondFromBinOp(ExitLimitCacheTy &Cache,
9146 const Loop *L,
9147 Value *ExitCond,
9148 bool ExitIfTrue,
9149 bool AllowPredicates) {
9150 // Check if the controlling expression for this loop is an And or Or.
9151 Value *Op0, *Op1;
9152 bool IsAnd;
9153 if (match(ExitCond, m_LogicalAnd(m_Value(Op0), m_Value(Op1))))
9154 IsAnd = true;
9155 else if (match(ExitCond, m_LogicalOr(m_Value(Op0), m_Value(Op1))))
9156 IsAnd = false;
9157 else
9158 return std::nullopt;
9159
9160 // A sub-condition of a non-trivial binop never solely controls the exit,
9161 // whether we exit always depends on both conditions.
9162 ExitLimit EL0 = computeExitLimitFromCondCached(
9163 Cache, L, Op0, ExitIfTrue, /*ControlsOnlyExit=*/false, AllowPredicates);
9164 ExitLimit EL1 = computeExitLimitFromCondCached(
9165 Cache, L, Op1, ExitIfTrue, /*ControlsOnlyExit=*/false, AllowPredicates);
9166
9167 // EitherMayExit is true in these two cases:
9168 // br (and Op0 Op1), loop, exit
9169 // br (or Op0 Op1), exit, loop
9170 bool EitherMayExit = IsAnd ^ ExitIfTrue;
9171
9172 const SCEV *BECount = getCouldNotCompute();
9173 const SCEV *ConstantMaxBECount = getCouldNotCompute();
9174 const SCEV *SymbolicMaxBECount = getCouldNotCompute();
9175 if (EitherMayExit) {
9176 bool UseSequentialUMin = !isa<BinaryOperator>(ExitCond);
9177 // Both conditions must be same for the loop to continue executing.
9178 // Choose the less conservative count.
9179 if (EL0.ExactNotTaken != getCouldNotCompute() &&
9180 EL1.ExactNotTaken != getCouldNotCompute()) {
9181 BECount = getUMinFromMismatchedTypes(EL0.ExactNotTaken, EL1.ExactNotTaken,
9182 UseSequentialUMin);
9183 }
9184 if (EL0.ConstantMaxNotTaken == getCouldNotCompute())
9185 ConstantMaxBECount = EL1.ConstantMaxNotTaken;
9186 else if (EL1.ConstantMaxNotTaken == getCouldNotCompute())
9187 ConstantMaxBECount = EL0.ConstantMaxNotTaken;
9188 else
9189 ConstantMaxBECount = getUMinFromMismatchedTypes(EL0.ConstantMaxNotTaken,
9190 EL1.ConstantMaxNotTaken);
9191 if (EL0.SymbolicMaxNotTaken == getCouldNotCompute())
9192 SymbolicMaxBECount = EL1.SymbolicMaxNotTaken;
9193 else if (EL1.SymbolicMaxNotTaken == getCouldNotCompute())
9194 SymbolicMaxBECount = EL0.SymbolicMaxNotTaken;
9195 else
9196 SymbolicMaxBECount = getUMinFromMismatchedTypes(
9197 EL0.SymbolicMaxNotTaken, EL1.SymbolicMaxNotTaken, UseSequentialUMin);
9198 } else {
9199 // Both conditions must be same at the same time for the loop to exit.
9200 // For now, be conservative.
9201 if (EL0.ExactNotTaken == EL1.ExactNotTaken)
9202 BECount = EL0.ExactNotTaken;
9203 }
9204
9205 // There are cases (e.g. PR26207) where computeExitLimitFromCond is able
9206 // to be more aggressive when computing BECount than when computing
9207 // ConstantMaxBECount. In these cases it is possible for EL0.ExactNotTaken
9208 // and
9209 // EL1.ExactNotTaken to match, but for EL0.ConstantMaxNotTaken and
9210 // EL1.ConstantMaxNotTaken to not.
9211 if (isa<SCEVCouldNotCompute>(ConstantMaxBECount) &&
9212 !isa<SCEVCouldNotCompute>(BECount))
9213 ConstantMaxBECount = getConstant(getUnsignedRangeMax(BECount));
9214 if (isa<SCEVCouldNotCompute>(SymbolicMaxBECount))
9215 SymbolicMaxBECount =
9216 isa<SCEVCouldNotCompute>(BECount) ? ConstantMaxBECount : BECount;
9217 return ExitLimit(BECount, ConstantMaxBECount, SymbolicMaxBECount, false,
9218 {ArrayRef(EL0.Predicates), ArrayRef(EL1.Predicates)});
9219}
9220
9221ScalarEvolution::ExitLimit ScalarEvolution::computeExitLimitFromICmp(
9222 const Loop *L, ICmpInst *ExitCond, bool ExitIfTrue, bool ControlsOnlyExit,
9223 bool AllowPredicates) {
9224 // If the condition was exit on true, convert the condition to exit on false
9225 CmpPredicate Pred;
9226 if (!ExitIfTrue)
9227 Pred = ExitCond->getCmpPredicate();
9228 else
9229 Pred = ExitCond->getInverseCmpPredicate();
9230 const ICmpInst::Predicate OriginalPred = Pred;
9231
9232 const SCEV *LHS = getSCEV(ExitCond->getOperand(0));
9233 const SCEV *RHS = getSCEV(ExitCond->getOperand(1));
9234
9235 ExitLimit EL = computeExitLimitFromICmp(L, Pred, LHS, RHS, ControlsOnlyExit,
9236 AllowPredicates);
9237 if (EL.hasAnyInfo())
9238 return EL;
9239
9240 auto *ExhaustiveCount =
9241 computeExitCountExhaustively(L, ExitCond, ExitIfTrue);
9242
9243 if (!isa<SCEVCouldNotCompute>(ExhaustiveCount))
9244 return ExhaustiveCount;
9245
9246 return computeShiftCompareExitLimit(ExitCond->getOperand(0),
9247 ExitCond->getOperand(1), L, OriginalPred);
9248}
9249ScalarEvolution::ExitLimit ScalarEvolution::computeExitLimitFromICmp(
9250 const Loop *L, CmpPredicate Pred, SCEVUse LHS, SCEVUse RHS,
9251 bool ControlsOnlyExit, bool AllowPredicates) {
9252
9253 // Try to evaluate any dependencies out of the loop.
9254 LHS = getSCEVAtScope(LHS, L);
9255 RHS = getSCEVAtScope(RHS, L);
9256
9257 // At this point, we would like to compute how many iterations of the
9258 // loop the predicate will return true for these inputs.
9259 if (isLoopInvariant(LHS, L) && !isLoopInvariant(RHS, L)) {
9260 // If there is a loop-invariant, force it into the RHS.
9261 std::swap(LHS, RHS);
9263 }
9264
9265 bool ControllingFiniteLoop = ControlsOnlyExit && loopHasNoAbnormalExits(L) &&
9267 // Simplify the operands before analyzing them.
9268 (void)SimplifyICmpOperands(Pred, LHS, RHS, /*Depth=*/0);
9269
9270 // If we have a comparison of a chrec against a constant, try to use value
9271 // ranges to answer this query.
9272 if (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(RHS))
9273 if (const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(LHS))
9274 if (AddRec->getLoop() == L) {
9275 // Form the constant range.
9276 ConstantRange CompRange =
9277 ConstantRange::makeExactICmpRegion(Pred, RHSC->getAPInt());
9278
9279 const SCEV *Ret = AddRec->getNumIterationsInRange(CompRange, *this);
9280 if (!isa<SCEVCouldNotCompute>(Ret)) return Ret;
9281 }
9282
9283 // If this loop must exit based on this condition (or execute undefined
9284 // behaviour), see if we can improve wrap flags. This is essentially
9285 // a must execute style proof.
9286 if (ControllingFiniteLoop && isLoopInvariant(RHS, L)) {
9287 // If we can prove the test sequence produced must repeat the same values
9288 // on self-wrap of the IV, then we can infer that IV doesn't self wrap
9289 // because if it did, we'd have an infinite (undefined) loop.
9290 // TODO: We can peel off any functions which are invertible *in L*. Loop
9291 // invariant terms are effectively constants for our purposes here.
9292 SCEVUse InnerLHS = LHS;
9293 if (auto *ZExt = dyn_cast<SCEVZeroExtendExpr>(LHS))
9294 InnerLHS = ZExt->getOperand();
9295 if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(InnerLHS);
9296 AR && !AR->hasNoSelfWrap() && AR->getLoop() == L && AR->isAffine() &&
9297 isKnownToBeAPowerOfTwo(AR->getStepRecurrence(*this), /*OrZero=*/true,
9298 /*OrNegative=*/true)) {
9299 auto Flags = AR->getNoWrapFlags();
9300 Flags = setFlags(Flags, SCEV::FlagNW);
9303 setNoWrapFlags(const_cast<SCEVAddRecExpr *>(AR), Flags);
9304 }
9305
9306 // For a slt/ult condition with a positive step, can we prove nsw/nuw?
9307 // From no-self-wrap, this follows trivially from the fact that every
9308 // (un)signed-wrapped, but not self-wrapped value must be LT than the
9309 // last value before (un)signed wrap. Since we know that last value
9310 // didn't exit, nor will any smaller one.
9312 auto WrapType = Pred == ICmpInst::ICMP_SLT ? SCEV::FlagNSW : SCEV::FlagNUW;
9313 if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(LHS);
9314 AR && AR->getLoop() == L && AR->isAffine() &&
9315 !AR->getNoWrapFlags(WrapType) && AR->hasNoSelfWrap() &&
9316 isKnownPositive(AR->getStepRecurrence(*this))) {
9317 auto Flags = AR->getNoWrapFlags();
9318 Flags = setFlags(Flags, WrapType);
9321 setNoWrapFlags(const_cast<SCEVAddRecExpr *>(AR), Flags);
9322 }
9323 }
9324 }
9325
9326 switch (Pred) {
9327 case ICmpInst::ICMP_NE: { // while (X != Y)
9328 // Convert to: while (X-Y != 0)
9329 if (LHS->getType()->isPointerTy()) {
9332 return LHS;
9333 }
9334 if (RHS->getType()->isPointerTy()) {
9337 return RHS;
9338 }
9339 ExitLimit EL = howFarToZero(getMinusSCEV(LHS, RHS), L, ControlsOnlyExit,
9340 AllowPredicates);
9341 if (EL.hasAnyInfo())
9342 return EL;
9343 break;
9344 }
9345 case ICmpInst::ICMP_EQ: { // while (X == Y)
9346 // Convert to: while (X-Y == 0)
9347 if (LHS->getType()->isPointerTy()) {
9350 return LHS;
9351 }
9352 if (RHS->getType()->isPointerTy()) {
9355 return RHS;
9356 }
9357 ExitLimit EL = howFarToNonZero(getMinusSCEV(LHS, RHS), L);
9358 if (EL.hasAnyInfo()) return EL;
9359 break;
9360 }
9361 case ICmpInst::ICMP_SLE:
9362 case ICmpInst::ICMP_ULE:
9363 // Since the loop is finite, an invariant RHS cannot include the boundary
9364 // value, otherwise it would loop forever.
9365 if (!Opts.scalar_evolution_finite_loop || !ControllingFiniteLoop ||
9366 !isLoopInvariant(RHS, L)) {
9367 // Otherwise, perform the addition in a wider type, to avoid overflow.
9368 // If the LHS is an addrec with the appropriate nowrap flag, the
9369 // extension will be sunk into it and the exit count can be analyzed.
9370 auto *OldType = dyn_cast<IntegerType>(LHS->getType());
9371 if (!OldType)
9372 break;
9373 // Prefer doubling the bitwidth over adding a single bit to make it more
9374 // likely that we use a legal type.
9375 auto *NewType =
9376 Type::getIntNTy(OldType->getContext(), OldType->getBitWidth() * 2);
9377 if (ICmpInst::isSigned(Pred)) {
9378 LHS = getSignExtendExpr(LHS, NewType);
9379 RHS = getSignExtendExpr(RHS, NewType);
9380 } else {
9381 LHS = getZeroExtendExpr(LHS, NewType);
9382 RHS = getZeroExtendExpr(RHS, NewType);
9383 }
9384 }
9386 [[fallthrough]];
9387 case ICmpInst::ICMP_SLT:
9388 case ICmpInst::ICMP_ULT: { // while (X < Y)
9389 bool IsSigned = ICmpInst::isSigned(Pred);
9390 ExitLimit EL = howManyLessThans(LHS, RHS, L, IsSigned, /*Invert=*/false,
9391 ControlsOnlyExit, AllowPredicates);
9392 if (EL.hasAnyInfo())
9393 return EL;
9394 break;
9395 }
9396 case ICmpInst::ICMP_SGE:
9397 case ICmpInst::ICMP_UGE:
9398 // Since the loop is finite, an invariant RHS cannot include the boundary
9399 // value, otherwise it would loop forever.
9400 if (!Opts.scalar_evolution_finite_loop || !ControllingFiniteLoop ||
9401 !isLoopInvariant(RHS, L))
9402 break;
9404 [[fallthrough]];
9405 case ICmpInst::ICMP_SGT:
9406 case ICmpInst::ICMP_UGT: { // while (X > Y)
9407 // "X > Y" is analyzed as the equivalent "~X < ~Y".
9408 bool IsSigned = ICmpInst::isSigned(Pred);
9409 ExitLimit EL = howManyLessThans(LHS, RHS, L, IsSigned, /*Invert=*/true,
9410 ControlsOnlyExit, AllowPredicates);
9411 if (EL.hasAnyInfo())
9412 return EL;
9413 break;
9414 }
9415 default:
9416 break;
9417 }
9418
9419 return getCouldNotCompute();
9420}
9421
9422ScalarEvolution::ExitLimit
9423ScalarEvolution::computeExitLimitFromSingleExitSwitch(const Loop *L,
9424 SwitchInst *Switch,
9425 BasicBlock *ExitingBlock,
9426 bool ControlsOnlyExit) {
9427 assert(!L->contains(ExitingBlock) && "Not an exiting block!");
9428
9429 // Give up if the exit is the default dest of a switch.
9430 if (Switch->getDefaultDest() == ExitingBlock)
9431 return getCouldNotCompute();
9432
9433 assert(L->contains(Switch->getDefaultDest()) &&
9434 "Default case must not exit the loop!");
9435 const SCEV *LHS = getSCEVAtScope(Switch->getCondition(), L);
9436 const SCEV *RHS = getConstant(Switch->findCaseDest(ExitingBlock));
9437
9438 // while (X != Y) --> while (X-Y != 0)
9439 ExitLimit EL = howFarToZero(getMinusSCEV(LHS, RHS), L, ControlsOnlyExit);
9440 if (EL.hasAnyInfo())
9441 return EL;
9442
9443 return getCouldNotCompute();
9444}
9445
9446static ConstantInt *
9448 ScalarEvolution &SE) {
9449 const SCEV *InVal = SE.getConstant(C);
9450 const SCEV *Val = AddRec->evaluateAtIteration(InVal, SE);
9452 "Evaluation of SCEV at constant didn't fold correctly?");
9453 return cast<SCEVConstant>(Val)->getValue();
9454}
9455
9456ScalarEvolution::ExitLimit ScalarEvolution::computeShiftCompareExitLimit(
9457 Value *LHS, Value *RHSV, const Loop *L, ICmpInst::Predicate Pred) {
9458 ConstantInt *RHS = dyn_cast<ConstantInt>(RHSV);
9459 if (!RHS)
9460 return getCouldNotCompute();
9461
9462 const BasicBlock *Latch = L->getLoopLatch();
9463 if (!Latch)
9464 return getCouldNotCompute();
9465
9466 const BasicBlock *Predecessor = L->getLoopPredecessor();
9467 if (!Predecessor)
9468 return getCouldNotCompute();
9469
9470 // Return true if V is of the form "LHS `shift_op` <positive constant>".
9471 // Return LHS in OutLHS, shift_op in OutOpCode, and the shift amount in
9472 // OutShiftAmt.
9473 auto MatchPositiveShift = [](Value *V, Value *&OutLHS,
9474 Instruction::BinaryOps &OutOpCode,
9475 unsigned &OutShiftAmt) {
9476 using namespace PatternMatch;
9477
9478 ConstantInt *ShiftAmt;
9479 if (match(V, m_LShr(m_Value(OutLHS), m_ConstantInt(ShiftAmt))))
9480 OutOpCode = Instruction::LShr;
9481 else if (match(V, m_AShr(m_Value(OutLHS), m_ConstantInt(ShiftAmt))))
9482 OutOpCode = Instruction::AShr;
9483 else if (match(V, m_Shl(m_Value(OutLHS), m_ConstantInt(ShiftAmt))))
9484 OutOpCode = Instruction::Shl;
9485 else
9486 return false;
9487
9488 uint64_t Amt = ShiftAmt->getValue().getLimitedValue();
9489 if (Amt == 0 || Amt >= OutLHS->getType()->getScalarSizeInBits())
9490 return false;
9491 OutShiftAmt = Amt;
9492 return true;
9493 };
9494
9495 // Recognize a "shift recurrence" either of the form %iv or of %iv.shifted in
9496 //
9497 // loop:
9498 // %iv = phi i32 [ %iv.shifted, %loop ], [ %val, %preheader ]
9499 // %iv.shifted = lshr i32 %iv, <positive constant>
9500 //
9501 // Return true on a successful match. Return the corresponding PHI node (%iv
9502 // above) in PNOut, the opcode of the shift operation in OpCodeOut, and the
9503 // shift amount in ShiftAmtOut.
9504 auto MatchShiftRecurrence = [&](Value *V, PHINode *&PNOut,
9505 Instruction::BinaryOps &OpCodeOut,
9506 unsigned &ShiftAmtOut) {
9507 std::optional<Instruction::BinaryOps> PostShiftOpCode;
9508
9509 {
9511 Value *V;
9512 unsigned Amt;
9513
9514 // If we encounter a shift instruction, "peel off" the shift operation,
9515 // and remember that we did so. Later when we inspect %iv's backedge
9516 // value, we will make sure that the backedge value uses the same
9517 // operation.
9518 //
9519 // Note: the peeled shift operation does not have to be the same
9520 // instruction as the one feeding into the PHI's backedge value. We only
9521 // really care about it being the same *kind* of shift instruction --
9522 // that's all that is required for our later inferences to hold.
9523 if (MatchPositiveShift(LHS, V, OpC, Amt)) {
9524 PostShiftOpCode = OpC;
9525 LHS = V;
9526 }
9527 }
9528
9529 PNOut = dyn_cast<PHINode>(LHS);
9530 if (!PNOut || PNOut->getParent() != L->getHeader())
9531 return false;
9532
9533 Value *BEValue = PNOut->getIncomingValueForBlock(Latch);
9534 Value *OpLHS;
9535
9536 return
9537 // The backedge value for the PHI node must be a shift by a positive
9538 // amount
9539 MatchPositiveShift(BEValue, OpLHS, OpCodeOut, ShiftAmtOut) &&
9540
9541 // of the PHI node itself
9542 OpLHS == PNOut &&
9543
9544 // and the kind of shift should be match the kind of shift we peeled
9545 // off, if any.
9546 (!PostShiftOpCode || *PostShiftOpCode == OpCodeOut);
9547 };
9548
9549 PHINode *PN;
9551 unsigned ShiftAmt;
9552 if (!MatchShiftRecurrence(LHS, PN, OpCode, ShiftAmt))
9553 return getCouldNotCompute();
9554
9555 const DataLayout &DL = getDataLayout();
9556
9557 // The key rationale for this optimization is that for some kinds of shift
9558 // recurrences, the value of the recurrence "stabilizes" to either 0 or -1
9559 // within a finite number of iterations. If the condition guarding the
9560 // backedge (in the sense that the backedge is taken if the condition is true)
9561 // is false for the value the shift recurrence stabilizes to, then we know
9562 // that the backedge is taken only a finite number of times.
9563
9564 ConstantInt *StableValue = nullptr;
9565 switch (OpCode) {
9566 default:
9567 llvm_unreachable("Impossible case!");
9568
9569 case Instruction::AShr: {
9570 // {K,ashr,<positive-constant>} stabilizes to signum(K) in at most
9571 // bitwidth(K) iterations.
9572 Value *FirstValue = PN->getIncomingValueForBlock(Predecessor);
9573 KnownBits Known = computeKnownBits(FirstValue, DL, &AC,
9574 Predecessor->getTerminator(), &DT);
9575 auto *Ty = cast<IntegerType>(RHS->getType());
9576 if (Known.isNonNegative())
9577 StableValue = ConstantInt::get(Ty, 0);
9578 else if (Known.isNegative())
9579 StableValue = ConstantInt::get(Ty, -1, true);
9580 else
9581 return getCouldNotCompute();
9582
9583 break;
9584 }
9585 case Instruction::LShr:
9586 case Instruction::Shl:
9587 // Both {K,lshr,<positive-constant>} and {K,shl,<positive-constant>}
9588 // stabilize to 0 in at most bitwidth(K) iterations.
9589 StableValue = ConstantInt::get(cast<IntegerType>(RHS->getType()), 0);
9590 break;
9591 }
9592
9593 auto *Result =
9594 ConstantFoldCompareInstOperands(Pred, StableValue, RHS, DL, &TLI);
9595 assert(Result->getType()->isIntegerTy(1) &&
9596 "Otherwise cannot be an operand to a branch instruction");
9597
9598 if (Result->isNullValue()) {
9599 unsigned BitWidth = getTypeSizeInBits(RHS->getType());
9600 unsigned MaxBTC = BitWidth;
9601
9602 // For right-shift recurrences (lshr/ashr with non-negative start), we can
9603 // compute a tighter max backedge-taken count from the range of the start
9604 // value. After k shifts of ShiftAmt, value = start >> (k * ShiftAmt).
9605 // The value reaches 0 (the stable value) when k * ShiftAmt >=
9606 // activeBits(start), so max BTC = ceil(activeBits(maxStart) / ShiftAmt).
9607 if (OpCode == Instruction::LShr || OpCode == Instruction::AShr) {
9608 Value *StartValue = PN->getIncomingValueForBlock(Predecessor);
9609 const SCEV *StartSCEV = getSCEV(StartValue);
9610 APInt MaxStart = getUnsignedRangeMax(StartSCEV);
9611 if (MaxStart.isStrictlyPositive()) {
9612 unsigned ActiveBits = MaxStart.getActiveBits();
9613 unsigned RangeBTC = divideCeil(ActiveBits, ShiftAmt);
9614 MaxBTC = std::min(MaxBTC, RangeBTC);
9615 }
9616 }
9617
9618 const SCEV *UpperBound =
9620 return ExitLimit(getCouldNotCompute(), UpperBound, UpperBound, false);
9621 }
9622
9623 return getCouldNotCompute();
9624}
9625
9626/// Return true if we can constant fold an instruction of the specified type,
9627/// assuming that all operands were constants.
9628static bool canConstantFold(const Instruction *I,
9629 const TargetLibraryInfo *TLI) {
9633 return true;
9634
9635 if (const CallInst *CI = dyn_cast<CallInst>(I))
9636 if (const Function *F = CI->getCalledFunction())
9637 return canConstantFoldCallTo(CI, F, TLI);
9638 return false;
9639}
9640
9641/// Determine whether this instruction can constant evolve within this loop
9642/// assuming its operands can all constant evolve.
9643static bool canConstantEvolve(Instruction *I, const Loop *L,
9644 const TargetLibraryInfo *TLI) {
9645 // An instruction outside of the loop can't be derived from a loop PHI.
9646 if (!L->contains(I)) return false;
9647
9648 if (isa<PHINode>(I)) {
9649 // We don't currently keep track of the control flow needed to evaluate
9650 // PHIs, so we cannot handle PHIs inside of loops.
9651 return L->getHeader() == I->getParent();
9652 }
9653
9654 // If we won't be able to constant fold this expression even if the operands
9655 // are constants, bail early.
9656 return canConstantFold(I, TLI);
9657}
9658
9659/// getConstantEvolvingPHIOperands - Implement getConstantEvolvingPHI by
9660/// recursing through each instruction operand until reaching a loop header phi.
9661static PHINode *
9662getConstantEvolvingPHIOperands(const AnalysisOptions &Opts,
9663 Instruction *UseInst, const Loop *L,
9665 const TargetLibraryInfo *TLI, unsigned Depth) {
9666 if (Depth > Opts.scalar_evolution_max_constant_evolving_depth)
9667 return nullptr;
9668
9669 // Otherwise, we can evaluate this instruction if all of its operands are
9670 // constant or derived from a PHI node themselves.
9671 PHINode *PHI = nullptr;
9672 for (Value *Op : UseInst->operands()) {
9673 if (isa<Constant>(Op)) continue;
9674
9676 if (!OpInst || !canConstantEvolve(OpInst, L, TLI))
9677 return nullptr;
9678
9679 PHINode *P = dyn_cast<PHINode>(OpInst);
9680 if (!P)
9681 // If this operand is already visited, reuse the prior result.
9682 // We may have P != PHI if this is the deepest point at which the
9683 // inconsistent paths meet.
9684 P = PHIMap.lookup(OpInst);
9685 if (!P) {
9686 // Recurse and memoize the results, whether a phi is found or not.
9687 // This recursive call invalidates pointers into PHIMap.
9688 P = getConstantEvolvingPHIOperands(Opts, OpInst, L, PHIMap, TLI,
9689 Depth + 1);
9690 PHIMap[OpInst] = P;
9691 }
9692 if (!P)
9693 return nullptr; // Not evolving from PHI
9694 if (PHI && PHI != P)
9695 return nullptr; // Evolving from multiple different PHIs.
9696 PHI = P;
9697 }
9698 // This is a expression evolving from a constant PHI!
9699 return PHI;
9700}
9701
9702/// getConstantEvolvingPHI - Given an LLVM value and a loop, return a PHI node
9703/// in the loop that V is derived from. We allow arbitrary operations along the
9704/// way, but the operands of an operation must either be constants or a value
9705/// derived from a constant PHI. If this expression does not fit with these
9706/// constraints, return null.
9707static PHINode *getConstantEvolvingPHI(const AnalysisOptions &Opts, Value *V,
9708 const Loop *L,
9709 const TargetLibraryInfo *TLI) {
9711 if (!I || !canConstantEvolve(I, L, TLI))
9712 return nullptr;
9713
9714 if (PHINode *PN = dyn_cast<PHINode>(I))
9715 return PN;
9716
9717 // Record non-constant instructions contained by the loop.
9719 return getConstantEvolvingPHIOperands(Opts, I, L, PHIMap, TLI, 0);
9720}
9721
9722/// EvaluateExpression - Given an expression that passes the
9723/// getConstantEvolvingPHI predicate, evaluate its value assuming the PHI node
9724/// in the loop has the value PHIVal. If we can't fold this expression for some
9725/// reason, return null.
9728 const DataLayout &DL,
9729 const TargetLibraryInfo *TLI) {
9730 // Convenient constant check, but redundant for recursive calls.
9731 if (Constant *C = dyn_cast<Constant>(V)) return C;
9733 if (!I) return nullptr;
9734
9735 if (Constant *C = Vals.lookup(I)) return C;
9736
9737 // An instruction inside the loop depends on a value outside the loop that we
9738 // weren't given a mapping for, or a value such as a call inside the loop.
9739 if (!canConstantEvolve(I, L, TLI))
9740 return nullptr;
9741
9742 // An unmapped PHI can be due to a branch or another loop inside this loop,
9743 // or due to this not being the initial iteration through a loop where we
9744 // couldn't compute the evolution of this particular PHI last time.
9745 if (isa<PHINode>(I)) return nullptr;
9746
9747 std::vector<Constant*> Operands(I->getNumOperands());
9748
9749 for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) {
9750 Instruction *Operand = dyn_cast<Instruction>(I->getOperand(i));
9751 if (!Operand) {
9752 Operands[i] = dyn_cast<Constant>(I->getOperand(i));
9753 if (!Operands[i]) return nullptr;
9754 continue;
9755 }
9756 Constant *C = EvaluateExpression(Operand, L, Vals, DL, TLI);
9757 Vals[Operand] = C;
9758 if (!C) return nullptr;
9759 Operands[i] = C;
9760 }
9761
9763 /*AllowNonDeterministic=*/false);
9764}
9765
9766
9767// If every incoming value to PN except the one for BB is a specific Constant,
9768// return that, else return nullptr.
9770 Constant *IncomingVal = nullptr;
9771
9772 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
9773 if (PN->getIncomingBlock(i) == BB)
9774 continue;
9775
9776 auto *CurrentVal = dyn_cast<Constant>(PN->getIncomingValue(i));
9777 if (!CurrentVal)
9778 return nullptr;
9779
9780 if (IncomingVal != CurrentVal) {
9781 if (IncomingVal)
9782 return nullptr;
9783 IncomingVal = CurrentVal;
9784 }
9785 }
9786
9787 return IncomingVal;
9788}
9789
9790/// getConstantEvolutionLoopExitValue - If we know that the specified Phi is
9791/// in the header of its containing loop, we know the loop executes a
9792/// constant number of times, and the PHI node is just a recurrence
9793/// involving constants, fold it.
9794Constant *
9795ScalarEvolution::getConstantEvolutionLoopExitValue(PHINode *PN,
9796 const APInt &BEs,
9797 const Loop *L) {
9798 auto [I, Inserted] = ConstantEvolutionLoopExitValue.try_emplace(PN);
9799 if (!Inserted)
9800 return I->second;
9801
9802 if (BEs.ugt(Opts.scalar_evolution_max_iterations))
9803 return nullptr; // Not going to evaluate it.
9804
9805 Constant *&RetVal = I->second;
9806
9807 DenseMap<Instruction *, Constant *> CurrentIterVals;
9808 BasicBlock *Header = L->getHeader();
9809 assert(PN->getParent() == Header && "Can't evaluate PHI not in loop header!");
9810
9811 BasicBlock *Latch = L->getLoopLatch();
9812 if (!Latch)
9813 return nullptr;
9814
9815 for (PHINode &PHI : Header->phis()) {
9816 if (auto *StartCST = getOtherIncomingValue(&PHI, Latch))
9817 CurrentIterVals[&PHI] = StartCST;
9818 }
9819 if (!CurrentIterVals.count(PN))
9820 return RetVal = nullptr;
9821
9822 Value *BEValue = PN->getIncomingValueForBlock(Latch);
9823
9824 // Execute the loop symbolically to determine the exit value.
9825 assert(BEs.getActiveBits() < CHAR_BIT * sizeof(unsigned) &&
9826 "BEs is <= -scalar-evolution-max-iterations which is an 'unsigned'!");
9827
9828 unsigned NumIterations = BEs.getZExtValue(); // must be in range
9829 unsigned IterationNum = 0;
9830 const DataLayout &DL = getDataLayout();
9831 for (; ; ++IterationNum) {
9832 if (IterationNum == NumIterations)
9833 return RetVal = CurrentIterVals[PN]; // Got exit value!
9834
9835 // Compute the value of the PHIs for the next iteration.
9836 // EvaluateExpression adds non-phi values to the CurrentIterVals map.
9837 DenseMap<Instruction *, Constant *> NextIterVals;
9838 Constant *NextPHI =
9839 EvaluateExpression(BEValue, L, CurrentIterVals, DL, &TLI);
9840 if (!NextPHI)
9841 return nullptr; // Couldn't evaluate!
9842 NextIterVals[PN] = NextPHI;
9843
9844 bool StoppedEvolving = NextPHI == CurrentIterVals[PN];
9845
9846 // Also evaluate the other PHI nodes. However, we don't get to stop if we
9847 // cease to be able to evaluate one of them or if they stop evolving,
9848 // because that doesn't necessarily prevent us from computing PN.
9850 for (const auto &I : CurrentIterVals) {
9851 PHINode *PHI = dyn_cast<PHINode>(I.first);
9852 if (!PHI || PHI == PN || PHI->getParent() != Header) continue;
9853 PHIsToCompute.emplace_back(PHI, I.second);
9854 }
9855 // We use two distinct loops because EvaluateExpression may invalidate any
9856 // iterators into CurrentIterVals.
9857 for (const auto &I : PHIsToCompute) {
9858 PHINode *PHI = I.first;
9859 Constant *&NextPHI = NextIterVals[PHI];
9860 if (!NextPHI) { // Not already computed.
9861 Value *BEValue = PHI->getIncomingValueForBlock(Latch);
9862 NextPHI = EvaluateExpression(BEValue, L, CurrentIterVals, DL, &TLI);
9863 }
9864 if (NextPHI != I.second)
9865 StoppedEvolving = false;
9866 }
9867
9868 // If all entries in CurrentIterVals == NextIterVals then we can stop
9869 // iterating, the loop can't continue to change.
9870 if (StoppedEvolving)
9871 return RetVal = CurrentIterVals[PN];
9872
9873 CurrentIterVals.swap(NextIterVals);
9874 }
9875}
9876
9877const SCEV *ScalarEvolution::computeExitCountExhaustively(const Loop *L,
9878 Value *Cond,
9879 bool ExitWhen) {
9880 PHINode *PN = getConstantEvolvingPHI(Opts, Cond, L, &TLI);
9881 if (!PN) return getCouldNotCompute();
9882
9883 // If the loop is canonicalized, the PHI will have exactly two entries.
9884 // That's the only form we support here.
9885 if (PN->getNumIncomingValues() != 2) return getCouldNotCompute();
9886
9887 DenseMap<Instruction *, Constant *> CurrentIterVals;
9888 BasicBlock *Header = L->getHeader();
9889 assert(PN->getParent() == Header && "Can't evaluate PHI not in loop header!");
9890
9891 BasicBlock *Latch = L->getLoopLatch();
9892 assert(Latch && "Should follow from NumIncomingValues == 2!");
9893
9894 for (PHINode &PHI : Header->phis()) {
9895 if (auto *StartCST = getOtherIncomingValue(&PHI, Latch))
9896 CurrentIterVals[&PHI] = StartCST;
9897 }
9898 if (!CurrentIterVals.count(PN))
9899 return getCouldNotCompute();
9900
9901 // Okay, we find a PHI node that defines the trip count of this loop. Execute
9902 // the loop symbolically to determine when the condition gets a value of
9903 // "ExitWhen".
9904 unsigned MaxIterations =
9905 Opts.scalar_evolution_max_iterations; // Limit analysis.
9906 const DataLayout &DL = getDataLayout();
9907 for (unsigned IterationNum = 0; IterationNum != MaxIterations;++IterationNum){
9908 auto *CondVal = dyn_cast_or_null<ConstantInt>(
9909 EvaluateExpression(Cond, L, CurrentIterVals, DL, &TLI));
9910
9911 // Couldn't symbolically evaluate.
9912 if (!CondVal) return getCouldNotCompute();
9913
9914 if (CondVal->getValue() == uint64_t(ExitWhen)) {
9915 ++NumBruteForceTripCountsComputed;
9916 return getConstant(Type::getInt32Ty(getContext()), IterationNum);
9917 }
9918
9919 // Update all the PHI nodes for the next iteration.
9920 DenseMap<Instruction *, Constant *> NextIterVals;
9921
9922 // Create a list of which PHIs we need to compute. We want to do this before
9923 // calling EvaluateExpression on them because that may invalidate iterators
9924 // into CurrentIterVals.
9925 SmallVector<PHINode *, 8> PHIsToCompute;
9926 for (const auto &I : CurrentIterVals) {
9927 PHINode *PHI = dyn_cast<PHINode>(I.first);
9928 if (!PHI || PHI->getParent() != Header) continue;
9929 PHIsToCompute.push_back(PHI);
9930 }
9931 for (PHINode *PHI : PHIsToCompute) {
9932 Constant *&NextPHI = NextIterVals[PHI];
9933 if (NextPHI) continue; // Already computed!
9934
9935 Value *BEValue = PHI->getIncomingValueForBlock(Latch);
9936 NextPHI = EvaluateExpression(BEValue, L, CurrentIterVals, DL, &TLI);
9937 }
9938 CurrentIterVals.swap(NextIterVals);
9939 }
9940
9941 // Too many iterations were needed to evaluate.
9942 return getCouldNotCompute();
9943}
9944
9946 if (isa<SCEVConstant>(V))
9947 return V;
9948
9949 auto &Values = ValuesAtScopes[V];
9950 // Check to see if we've folded this expression at this loop before.
9951 for (auto &LS : Values)
9952 if (LS.first == L)
9953 return LS.second ? LS.second : SCEVUse(V);
9954
9955 Values.emplace_back(L, nullptr);
9956
9957 // Otherwise compute it.
9958 SCEVUse C = computeSCEVAtScope(V, L);
9959 for (auto &LS : reverse(ValuesAtScopes[V]))
9960 if (LS.first == L) {
9961 LS.second = C;
9962 // Record the dependency under the bare expression: invalidation walks
9963 // expressions, and any use flags on C do not change which expression
9964 // this is the value at scope of.
9965 if (!isa<SCEVConstant>(C))
9966 ValuesAtScopesUsers[C.getPointer()].push_back({L, V});
9967 break;
9968 }
9969 return C;
9970}
9971
9973 const BasicBlock *ExitingBlock) {
9974 SCEVUse ExitValue = getSCEVAtScope(V, L->getParentLoop());
9975 if (!isLoopInvariant(ExitValue, L)) {
9976 // If we failed to evaluate it in the outer scope, try to evaluate an
9977 // addrec for the specific exit.
9978 // TODO: Generalize this to other expressions.
9979 const SCEV *ExitCount = getExitCount(L, ExitingBlock);
9980 if (!isa<SCEVCouldNotCompute>(ExitCount))
9981 if (auto *AddRec = dyn_cast<SCEVAddRecExpr>(V))
9982 if (AddRec->getLoop() == L)
9983 ExitValue = AddRec->evaluateAtIteration(ExitCount, *this);
9984 }
9985 return ExitValue;
9986}
9987
9988/// This builds up a Constant using the ConstantExpr interface. That way, we
9989/// will return Constants for objects which aren't represented by a
9990/// SCEVConstant, because SCEVConstant is restricted to ConstantInt.
9991/// Returns NULL if the SCEV isn't representable as a Constant.
9993 switch (V->getSCEVType()) {
9994 case scCouldNotCompute:
9995 case scAddRecExpr:
9996 case scVScale:
9997 return nullptr;
9998 case scConstant:
9999 return cast<SCEVConstant>(V)->getValue();
10000 case scUnknown:
10002 case scPtrToAddr: {
10004 if (Constant *CastOp = BuildConstantFromSCEV(P2I->getOperand()))
10005 return ConstantExpr::getPtrToAddr(CastOp, P2I->getType());
10006
10007 return nullptr;
10008 }
10009 case scTruncate: {
10011 if (Constant *CastOp = BuildConstantFromSCEV(ST->getOperand()))
10012 return ConstantExpr::getTrunc(CastOp, ST->getType());
10013 return nullptr;
10014 }
10015 case scAddExpr: {
10016 const SCEVAddExpr *SA = cast<SCEVAddExpr>(V);
10017 Constant *C = nullptr;
10018 for (const SCEV *Op : SA->operands()) {
10020 if (!OpC)
10021 return nullptr;
10022 if (!C) {
10023 C = OpC;
10024 continue;
10025 }
10026 assert(!C->getType()->isPointerTy() &&
10027 "Can only have one pointer, and it must be last");
10028 if (OpC->getType()->isPointerTy()) {
10029 // The offsets have been converted to bytes. We can add bytes using
10030 // an i8 GEP.
10031 C = ConstantExpr::getPtrAdd(OpC, C);
10032 } else {
10033 C = ConstantExpr::getAdd(C, OpC);
10034 }
10035 }
10036 return C;
10037 }
10038 case scMulExpr:
10039 case scSignExtend:
10040 case scZeroExtend:
10041 case scUDivExpr:
10042 case scSMaxExpr:
10043 case scUMaxExpr:
10044 case scSMinExpr:
10045 case scUMinExpr:
10047 return nullptr;
10048 }
10049 llvm_unreachable("Unknown SCEV kind!");
10050}
10051
10052const SCEV *ScalarEvolution::getWithOperands(const SCEV *S,
10053 SmallVectorImpl<SCEVUse> &NewOps) {
10054 switch (S->getSCEVType()) {
10055 case scTruncate:
10056 case scZeroExtend:
10057 case scSignExtend:
10058 case scPtrToAddr:
10059 return getCastExpr(S->getSCEVType(), NewOps[0], S->getType());
10060 case scAddRecExpr: {
10061 auto *AddRec = cast<SCEVAddRecExpr>(S);
10062 return getAddRecExpr(NewOps, AddRec->getLoop(), AddRec->getNoWrapFlags());
10063 }
10064 case scAddExpr:
10065 return getAddExpr(NewOps, cast<SCEVAddExpr>(S)->getNoWrapFlags());
10066 case scMulExpr:
10067 return getMulExpr(NewOps, cast<SCEVMulExpr>(S)->getNoWrapFlags());
10068 case scUDivExpr:
10069 return getUDivExpr(NewOps[0], NewOps[1]);
10070 case scUMaxExpr:
10071 case scSMaxExpr:
10072 case scUMinExpr:
10073 case scSMinExpr:
10074 return getMinMaxExpr(S->getSCEVType(), NewOps);
10076 return getSequentialMinMaxExpr(S->getSCEVType(), NewOps);
10077 case scConstant:
10078 case scVScale:
10079 case scUnknown:
10080 return S;
10081 case scCouldNotCompute:
10082 llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!");
10083 }
10084 llvm_unreachable("Unknown SCEV kind!");
10085}
10086
10087SCEVUse ScalarEvolution::computeSCEVAtScope(const SCEV *V, const Loop *L) {
10088 switch (V->getSCEVType()) {
10089 case scConstant:
10090 case scVScale:
10091 return V;
10092 case scAddRecExpr: {
10093 // If this is a loop recurrence for a loop that does not contain L, then we
10094 // are dealing with the final value computed by the loop.
10095 const SCEVAddRecExpr *AddRec = cast<SCEVAddRecExpr>(V);
10096 // First, attempt to evaluate each operand.
10097 // Avoid performing the look-up in the common case where the specified
10098 // expression has no loop-variant portions.
10099 for (unsigned i = 0, e = AddRec->getNumOperands(); i != e; ++i) {
10100 SCEVUse OpAtScope = getSCEVAtScope(AddRec->getOperand(i), L);
10101 if (OpAtScope == AddRec->getOperand(i))
10102 continue;
10103
10104 // Okay, at least one of these operands is loop variant but might be
10105 // foldable. Build a new instance of the folded commutative expression.
10107 NewOps.reserve(AddRec->getNumOperands());
10108 append_range(NewOps, AddRec->operands().take_front(i));
10109 NewOps.push_back(OpAtScope);
10110 for (++i; i != e; ++i)
10111 NewOps.push_back(getSCEVAtScope(AddRec->getOperand(i), L));
10112
10113 const SCEV *FoldedRec = getAddRecExpr(
10114 NewOps, AddRec->getLoop(), AddRec->getNoWrapFlags(SCEV::FlagNW));
10115 AddRec = dyn_cast<SCEVAddRecExpr>(FoldedRec);
10116 // The addrec may be folded to a nonrecurrence, for example, if the
10117 // induction variable is multiplied by zero after constant folding. Go
10118 // ahead and return the folded value.
10119 if (!AddRec)
10120 return FoldedRec;
10121 break;
10122 }
10123
10124 // If the scope is outside the addrec's loop, evaluate it by using the
10125 // loop exit value of the addrec.
10126 if (!AddRec->getLoop()->contains(L)) {
10127 SCEVUse ExitValue = AddRec->getExitValue(*this);
10128 if (isa<SCEVCouldNotCompute>(ExitValue))
10129 return AddRec;
10130 return ExitValue;
10131 }
10132
10133 return AddRec;
10134 }
10135 case scTruncate:
10136 case scZeroExtend:
10137 case scSignExtend:
10138 case scPtrToAddr:
10139 case scAddExpr:
10140 case scMulExpr:
10141 case scUDivExpr:
10142 case scUMaxExpr:
10143 case scSMaxExpr:
10144 case scUMinExpr:
10145 case scSMinExpr:
10146 case scSequentialUMinExpr: {
10147 ArrayRef<SCEVUse> Ops = V->operands();
10148 // Avoid performing the look-up in the common case where the specified
10149 // expression has no loop-variant portions.
10150 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
10151 SCEVUse OpAtScope = getSCEVAtScope(Ops[i].getPointer(), L);
10152 if (OpAtScope != Ops[i].getPointer()) {
10153 // Okay, at least one of these operands is loop variant but might be
10154 // foldable. Build a new instance of the folded commutative expression.
10156 NewOps.reserve(Ops.size());
10157 append_range(NewOps, Ops.take_front(i));
10158 NewOps.push_back(OpAtScope);
10159
10160 for (++i; i != e; ++i) {
10161 OpAtScope = getSCEVAtScope(Ops[i].getPointer(), L);
10162 NewOps.push_back(OpAtScope);
10163 }
10164
10165 return getWithOperands(V, NewOps);
10166 }
10167 }
10168 // If we got here, all operands are loop invariant.
10169 return V;
10170 }
10171 case scUnknown: {
10172 // If this instruction is evolved from a constant-evolving PHI, compute the
10173 // exit value from the loop without using SCEVs.
10174 const SCEVUnknown *SU = cast<SCEVUnknown>(V);
10176 if (!I)
10177 return V; // This is some other type of SCEVUnknown, just return it.
10178
10179 if (PHINode *PN = dyn_cast<PHINode>(I)) {
10180 const Loop *CurrLoop = this->LI[I->getParent()];
10181 // Looking for loop exit value.
10182 if (CurrLoop && CurrLoop->getParentLoop() == L &&
10183 PN->getParent() == CurrLoop->getHeader()) {
10184 // Okay, there is no closed form solution for the PHI node. Check
10185 // to see if the loop that contains it has a known backedge-taken
10186 // count. If so, we may be able to force computation of the exit
10187 // value.
10188 const SCEV *BackedgeTakenCount = getBackedgeTakenCount(CurrLoop);
10189 // This trivial case can show up in some degenerate cases where
10190 // the incoming IR has not yet been fully simplified.
10191 if (BackedgeTakenCount->isZero()) {
10192 Value *InitValue = nullptr;
10193 bool MultipleInitValues = false;
10194 for (unsigned i = 0; i < PN->getNumIncomingValues(); i++) {
10195 if (!CurrLoop->contains(PN->getIncomingBlock(i))) {
10196 if (!InitValue)
10197 InitValue = PN->getIncomingValue(i);
10198 else if (InitValue != PN->getIncomingValue(i)) {
10199 MultipleInitValues = true;
10200 break;
10201 }
10202 }
10203 }
10204 if (!MultipleInitValues && InitValue)
10205 return getSCEV(InitValue);
10206 }
10207 // Do we have a loop invariant value flowing around the backedge
10208 // for a loop which must execute the backedge?
10209 if (!isa<SCEVCouldNotCompute>(BackedgeTakenCount) &&
10210 isKnownNonZero(BackedgeTakenCount) &&
10211 PN->getNumIncomingValues() == 2) {
10212
10213 unsigned InLoopPred =
10214 CurrLoop->contains(PN->getIncomingBlock(0)) ? 0 : 1;
10215 Value *BackedgeVal = PN->getIncomingValue(InLoopPred);
10216 if (CurrLoop->isLoopInvariant(BackedgeVal))
10217 return getSCEV(BackedgeVal);
10218 }
10219 if (auto *BTCC = dyn_cast<SCEVConstant>(BackedgeTakenCount)) {
10220 // Okay, we know how many times the containing loop executes. If
10221 // this is a constant evolving PHI node, get the final value at
10222 // the specified iteration number.
10223 Constant *RV =
10224 getConstantEvolutionLoopExitValue(PN, BTCC->getAPInt(), CurrLoop);
10225 if (RV)
10226 return getSCEV(RV);
10227 }
10228 }
10229 }
10230
10231 // Okay, this is an expression that we cannot symbolically evaluate
10232 // into a SCEV. Check to see if it's possible to symbolically evaluate
10233 // the arguments into constants, and if so, try to constant propagate the
10234 // result. This is particularly useful for computing loop exit values.
10235 if (!canConstantFold(I, &TLI))
10236 return V; // This is some other type of SCEVUnknown, just return it.
10237
10238 SmallVector<Constant *, 4> Operands;
10239 Operands.reserve(I->getNumOperands());
10240 bool MadeImprovement = false;
10241 for (Value *Op : I->operands()) {
10242 if (Constant *C = dyn_cast<Constant>(Op)) {
10243 Operands.push_back(C);
10244 continue;
10245 }
10246
10247 // If any of the operands is non-constant and if they are
10248 // non-integer and non-pointer, don't even try to analyze them
10249 // with scev techniques.
10250 if (!isSCEVable(Op->getType()))
10251 return V;
10252
10253 const SCEV *OrigV = getSCEV(Op);
10254 const SCEV *OpV = getSCEVAtScope(OrigV, L);
10255 MadeImprovement |= OrigV != OpV;
10256
10258 if (!C)
10259 return V;
10260 assert(C->getType() == Op->getType() && "Type mismatch");
10261 Operands.push_back(C);
10262 }
10263
10264 // Check to see if getSCEVAtScope actually made an improvement.
10265 if (!MadeImprovement)
10266 return V; // This is some other type of SCEVUnknown, just return it.
10267
10268 Constant *C = nullptr;
10269 const DataLayout &DL = getDataLayout();
10270 C = ConstantFoldInstOperands(I, Operands, DL, &TLI,
10271 /*AllowNonDeterministic=*/false);
10272 if (!C)
10273 return V;
10274 return getSCEV(C);
10275 }
10276 case scCouldNotCompute:
10277 llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!");
10278 }
10279 llvm_unreachable("Unknown SCEV type!");
10280}
10281
10283 return getSCEVAtScope(getSCEV(V), L);
10284}
10285
10286const SCEV *ScalarEvolution::stripInjectiveFunctions(const SCEV *S) const {
10288 return stripInjectiveFunctions(ZExt->getOperand());
10290 return stripInjectiveFunctions(SExt->getOperand());
10291 return S;
10292}
10293
10294/// Finds the minimum unsigned root of the following equation:
10295///
10296/// A * X = B (mod N)
10297///
10298/// where N = 2^BW and BW is the common bit width of A and B. The signedness of
10299/// A and B isn't important.
10300///
10301/// If the equation does not have a solution, SCEVCouldNotCompute is returned.
10302static const SCEV *
10305 ScalarEvolution &SE, const Loop *L) {
10306 uint32_t BW = A.getBitWidth();
10307 assert(BW == SE.getTypeSizeInBits(B->getType()));
10308 assert(A != 0 && "A must be non-zero.");
10309
10310 // 1. D = gcd(A, N)
10311 //
10312 // The gcd of A and N may have only one prime factor: 2. The number of
10313 // trailing zeros in A is its multiplicity
10314 uint32_t Mult2 = A.countr_zero();
10315 // D = 2^Mult2
10316
10317 // 2. Check if B is divisible by D.
10318 //
10319 // B is divisible by D if and only if the multiplicity of prime factor 2 for B
10320 // is not less than multiplicity of this prime factor for D.
10321 unsigned MinTZ = SE.getMinTrailingZeros(B);
10322 // Try again with the terminator of the loop predecessor for context-specific
10323 // result, if MinTZ s too small.
10324 if (MinTZ < Mult2 && L->getLoopPredecessor())
10325 MinTZ = SE.getMinTrailingZeros(B, L->getLoopPredecessor()->getTerminator());
10326 if (MinTZ < Mult2) {
10327 // Check if we can prove there's no remainder using URem.
10328 const SCEV *URem =
10329 SE.getURemExpr(B, SE.getConstant(APInt::getOneBitSet(BW, Mult2)));
10330 const SCEV *Zero = SE.getZero(B->getType());
10331 if (!SE.isKnownPredicate(CmpInst::ICMP_EQ, URem, Zero)) {
10332 // Try to add a predicate ensuring B is a multiple of 1 << Mult2.
10333 if (!Predicates)
10334 return SE.getCouldNotCompute();
10335
10336 // Avoid adding a predicate that is known to be false.
10337 if (SE.isKnownPredicate(CmpInst::ICMP_NE, URem, Zero))
10338 return SE.getCouldNotCompute();
10339 Predicates->push_back(SE.getEqualPredicate(URem, Zero));
10340 }
10341 }
10342
10343 // 3. Compute I: the multiplicative inverse of (A / D) in arithmetic
10344 // modulo (N / D).
10345 //
10346 // If D == 1, (N / D) == N == 2^BW, so we need one extra bit to represent
10347 // (N / D) in general. The inverse itself always fits into BW bits, though,
10348 // so we immediately truncate it.
10349 APInt AD = A.lshr(Mult2).trunc(BW - Mult2); // AD = A / D
10350 APInt I = AD.multiplicativeInverse().zext(BW);
10351
10352 // 4. Compute the minimum unsigned root of the equation:
10353 // I * (B / D) mod (N / D)
10354 // To simplify the computation, we factor out the divide by D:
10355 // (I * B mod N) / D
10356 const SCEV *D = SE.getConstant(APInt::getOneBitSet(BW, Mult2));
10357 return SE.getUDivExactExpr(SE.getMulExpr(B, SE.getConstant(I)), D);
10358}
10359
10360/// For a given quadratic addrec, generate coefficients of the corresponding
10361/// quadratic equation, multiplied by a common value to ensure that they are
10362/// integers.
10363/// The returned value is a tuple { A, B, C, M, BitWidth }, where
10364/// Ax^2 + Bx + C is the quadratic function, M is the value that A, B and C
10365/// were multiplied by, and BitWidth is the bit width of the original addrec
10366/// coefficients.
10367/// This function returns std::nullopt if the addrec coefficients are not
10368/// compile- time constants.
10369static std::optional<std::tuple<APInt, APInt, APInt, APInt, unsigned>>
10371 assert(AddRec->getNumOperands() == 3 && "This is not a quadratic chrec!");
10372 const SCEVConstant *LC = dyn_cast<SCEVConstant>(AddRec->getOperand(0));
10373 const SCEVConstant *MC = dyn_cast<SCEVConstant>(AddRec->getOperand(1));
10374 const SCEVConstant *NC = dyn_cast<SCEVConstant>(AddRec->getOperand(2));
10375 LLVM_DEBUG(dbgs() << __func__ << ": analyzing quadratic addrec: "
10376 << *AddRec << '\n');
10377
10378 // We currently can only solve this if the coefficients are constants.
10379 if (!LC || !MC || !NC) {
10380 LLVM_DEBUG(dbgs() << __func__ << ": coefficients are not constant\n");
10381 return std::nullopt;
10382 }
10383
10384 APInt L = LC->getAPInt();
10385 APInt M = MC->getAPInt();
10386 APInt N = NC->getAPInt();
10387 assert(!N.isZero() && "This is not a quadratic addrec");
10388
10389 unsigned BitWidth = LC->getAPInt().getBitWidth();
10390 unsigned NewWidth = BitWidth + 1;
10391 LLVM_DEBUG(dbgs() << __func__ << ": addrec coeff bw: "
10392 << BitWidth << '\n');
10393 // The sign-extension (as opposed to a zero-extension) here matches the
10394 // extension used in SolveQuadraticEquationWrap (with the same motivation).
10395 N = N.sext(NewWidth);
10396 M = M.sext(NewWidth);
10397 L = L.sext(NewWidth);
10398
10399 // The increments are M, M+N, M+2N, ..., so the accumulated values are
10400 // L+M, (L+M)+(M+N), (L+M)+(M+N)+(M+2N), ..., that is,
10401 // L+M, L+2M+N, L+3M+3N, ...
10402 // After n iterations the accumulated value Acc is L + nM + n(n-1)/2 N.
10403 //
10404 // The equation Acc = 0 is then
10405 // L + nM + n(n-1)/2 N = 0, or 2L + 2M n + n(n-1) N = 0.
10406 // In a quadratic form it becomes:
10407 // N n^2 + (2M-N) n + 2L = 0.
10408
10409 APInt A = N;
10410 APInt B = 2 * M - A;
10411 APInt C = 2 * L;
10412 APInt T = APInt(NewWidth, 2);
10413 LLVM_DEBUG(dbgs() << __func__ << ": equation " << A << "x^2 + " << B
10414 << "x + " << C << ", coeff bw: " << NewWidth
10415 << ", multiplied by " << T << '\n');
10416 return std::make_tuple(A, B, C, T, BitWidth);
10417}
10418
10419/// Helper function to compare optional APInts:
10420/// (a) if X and Y both exist, return min(X, Y),
10421/// (b) if neither X nor Y exist, return std::nullopt,
10422/// (c) if exactly one of X and Y exists, return that value.
10423static std::optional<APInt> MinOptional(std::optional<APInt> X,
10424 std::optional<APInt> Y) {
10425 if (X && Y) {
10426 unsigned W = std::max(X->getBitWidth(), Y->getBitWidth());
10427 APInt XW = X->sext(W);
10428 APInt YW = Y->sext(W);
10429 return XW.slt(YW) ? *X : *Y;
10430 }
10431 if (!X && !Y)
10432 return std::nullopt;
10433 return X ? *X : *Y;
10434}
10435
10436/// Helper function to truncate an optional APInt to a given BitWidth.
10437/// When solving addrec-related equations, it is preferable to return a value
10438/// that has the same bit width as the original addrec's coefficients. If the
10439/// solution fits in the original bit width, truncate it (except for i1).
10440/// Returning a value of a different bit width may inhibit some optimizations.
10441///
10442/// In general, a solution to a quadratic equation generated from an addrec
10443/// may require BW+1 bits, where BW is the bit width of the addrec's
10444/// coefficients. The reason is that the coefficients of the quadratic
10445/// equation are BW+1 bits wide (to avoid truncation when converting from
10446/// the addrec to the equation).
10447static std::optional<APInt> TruncIfPossible(std::optional<APInt> X,
10448 unsigned BitWidth) {
10449 if (!X)
10450 return std::nullopt;
10451 unsigned W = X->getBitWidth();
10453 return X->trunc(BitWidth);
10454 return X;
10455}
10456
10457/// Let c(n) be the value of the quadratic chrec {L,+,M,+,N} after n
10458/// iterations. The values L, M, N are assumed to be signed, and they
10459/// should all have the same bit widths.
10460/// Find the least n >= 0 such that c(n) = 0 in the arithmetic modulo 2^BW,
10461/// where BW is the bit width of the addrec's coefficients.
10462/// If the calculated value is a BW-bit integer (for BW > 1), it will be
10463/// returned as such, otherwise the bit width of the returned value may
10464/// be greater than BW.
10465///
10466/// This function returns std::nullopt if
10467/// (a) the addrec coefficients are not constant, or
10468/// (b) SolveQuadraticEquationWrap was unable to find a solution. For cases
10469/// like x^2 = 5, no integer solutions exist, in other cases an integer
10470/// solution may exist, but SolveQuadraticEquationWrap may fail to find it.
10471static std::optional<APInt>
10473 APInt A, B, C, M;
10474 unsigned BitWidth;
10475 auto T = GetQuadraticEquation(AddRec);
10476 if (!T)
10477 return std::nullopt;
10478
10479 std::tie(A, B, C, M, BitWidth) = *T;
10480 LLVM_DEBUG(dbgs() << __func__ << ": solving for unsigned overflow\n");
10481 std::optional<APInt> X =
10483 if (!X)
10484 return std::nullopt;
10485
10486 ConstantInt *CX = ConstantInt::get(SE.getContext(), *X);
10488 if (!V->isZero())
10489 return std::nullopt;
10490
10491 return TruncIfPossible(X, BitWidth);
10492}
10493
10494/// Let c(n) be the value of the quadratic chrec {0,+,M,+,N} after n
10495/// iterations. The values M, N are assumed to be signed, and they
10496/// should all have the same bit widths.
10497/// Find the least n such that c(n) does not belong to the given range,
10498/// while c(n-1) does.
10499///
10500/// This function returns std::nullopt if
10501/// (a) the addrec coefficients are not constant, or
10502/// (b) SolveQuadraticEquationWrap was unable to find a solution for the
10503/// bounds of the range.
10504static std::optional<APInt>
10506 const ConstantRange &Range, ScalarEvolution &SE) {
10507 assert(AddRec->getOperand(0)->isZero() &&
10508 "Starting value of addrec should be 0");
10509 LLVM_DEBUG(dbgs() << __func__ << ": solving boundary crossing for range "
10510 << Range << ", addrec " << *AddRec << '\n');
10511 // This case is handled in getNumIterationsInRange. Here we can assume that
10512 // we start in the range.
10513 assert(Range.contains(APInt(SE.getTypeSizeInBits(AddRec->getType()), 0)) &&
10514 "Addrec's initial value should be in range");
10515
10516 APInt A, B, C, M;
10517 unsigned BitWidth;
10518 auto T = GetQuadraticEquation(AddRec);
10519 if (!T)
10520 return std::nullopt;
10521
10522 // Be careful about the return value: there can be two reasons for not
10523 // returning an actual number. First, if no solutions to the equations
10524 // were found, and second, if the solutions don't leave the given range.
10525 // The first case means that the actual solution is "unknown", the second
10526 // means that it's known, but not valid. If the solution is unknown, we
10527 // cannot make any conclusions.
10528 // Return a pair: the optional solution and a flag indicating if the
10529 // solution was found.
10530 auto SolveForBoundary =
10531 [&](APInt Bound) -> std::pair<std::optional<APInt>, bool> {
10532 // Solve for signed overflow and unsigned overflow, pick the lower
10533 // solution.
10534 LLVM_DEBUG(dbgs() << "SolveQuadraticAddRecRange: checking boundary "
10535 << Bound << " (before multiplying by " << M << ")\n");
10536 Bound *= M; // The quadratic equation multiplier.
10537
10538 std::optional<APInt> SO;
10539 if (BitWidth > 1) {
10540 LLVM_DEBUG(dbgs() << "SolveQuadraticAddRecRange: solving for "
10541 "signed overflow\n");
10543 }
10544 LLVM_DEBUG(dbgs() << "SolveQuadraticAddRecRange: solving for "
10545 "unsigned overflow\n");
10546 std::optional<APInt> UO =
10548
10549 auto LeavesRange = [&] (const APInt &X) {
10550 ConstantInt *C0 = ConstantInt::get(SE.getContext(), X);
10552 if (Range.contains(V0->getValue()))
10553 return false;
10554 // X should be at least 1, so X-1 is non-negative.
10555 ConstantInt *C1 = ConstantInt::get(SE.getContext(), X-1);
10557 if (Range.contains(V1->getValue()))
10558 return true;
10559 return false;
10560 };
10561
10562 // If SolveQuadraticEquationWrap returns std::nullopt, it means that there
10563 // can be a solution, but the function failed to find it. We cannot treat it
10564 // as "no solution".
10565 if (!SO || !UO)
10566 return {std::nullopt, false};
10567
10568 // Check the smaller value first to see if it leaves the range.
10569 // At this point, both SO and UO must have values.
10570 std::optional<APInt> Min = MinOptional(SO, UO);
10571 if (LeavesRange(*Min))
10572 return { Min, true };
10573 std::optional<APInt> Max = Min == SO ? UO : SO;
10574 if (LeavesRange(*Max))
10575 return { Max, true };
10576
10577 // Solutions were found, but were eliminated, hence the "true".
10578 return {std::nullopt, true};
10579 };
10580
10581 std::tie(A, B, C, M, BitWidth) = *T;
10582 // Lower bound is inclusive, subtract 1 to represent the exiting value.
10583 APInt Lower = Range.getLower().sext(A.getBitWidth()) - 1;
10584 APInt Upper = Range.getUpper().sext(A.getBitWidth());
10585 auto SL = SolveForBoundary(Lower);
10586 auto SU = SolveForBoundary(Upper);
10587 // If any of the solutions was unknown, no meaninigful conclusions can
10588 // be made.
10589 if (!SL.second || !SU.second)
10590 return std::nullopt;
10591
10592 // Claim: The correct solution is not some value between Min and Max.
10593 //
10594 // Justification: Assuming that Min and Max are different values, one of
10595 // them is when the first signed overflow happens, the other is when the
10596 // first unsigned overflow happens. Crossing the range boundary is only
10597 // possible via an overflow (treating 0 as a special case of it, modeling
10598 // an overflow as crossing k*2^W for some k).
10599 //
10600 // The interesting case here is when Min was eliminated as an invalid
10601 // solution, but Max was not. The argument is that if there was another
10602 // overflow between Min and Max, it would also have been eliminated if
10603 // it was considered.
10604 //
10605 // For a given boundary, it is possible to have two overflows of the same
10606 // type (signed/unsigned) without having the other type in between: this
10607 // can happen when the vertex of the parabola is between the iterations
10608 // corresponding to the overflows. This is only possible when the two
10609 // overflows cross k*2^W for the same k. In such case, if the second one
10610 // left the range (and was the first one to do so), the first overflow
10611 // would have to enter the range, which would mean that either we had left
10612 // the range before or that we started outside of it. Both of these cases
10613 // are contradictions.
10614 //
10615 // Claim: In the case where SolveForBoundary returns std::nullopt, the correct
10616 // solution is not some value between the Max for this boundary and the
10617 // Min of the other boundary.
10618 //
10619 // Justification: Assume that we had such Max_A and Min_B corresponding
10620 // to range boundaries A and B and such that Max_A < Min_B. If there was
10621 // a solution between Max_A and Min_B, it would have to be caused by an
10622 // overflow corresponding to either A or B. It cannot correspond to B,
10623 // since Min_B is the first occurrence of such an overflow. If it
10624 // corresponded to A, it would have to be either a signed or an unsigned
10625 // overflow that is larger than both eliminated overflows for A. But
10626 // between the eliminated overflows and this overflow, the values would
10627 // cover the entire value space, thus crossing the other boundary, which
10628 // is a contradiction.
10629
10630 return TruncIfPossible(MinOptional(SL.first, SU.first), BitWidth);
10631}
10632
10633ScalarEvolution::ExitLimit ScalarEvolution::howFarToZero(const SCEV *V,
10634 const Loop *L,
10635 bool ControlsOnlyExit,
10636 bool AllowPredicates) {
10637
10638 // This is only used for loops with a "x != y" exit test. The exit condition
10639 // is now expressed as a single expression, V = x-y. So the exit test is
10640 // effectively V != 0. We know and take advantage of the fact that this
10641 // expression only being used in a comparison by zero context.
10642
10644 // If the value is a constant
10645 if (const SCEVConstant *C = dyn_cast<SCEVConstant>(V)) {
10646 // If the value is already zero, the branch will execute zero times.
10647 if (C->getValue()->isZero()) return C;
10648 return getCouldNotCompute(); // Otherwise it will loop infinitely.
10649 }
10650
10651 const SCEVAddRecExpr *AddRec =
10652 dyn_cast<SCEVAddRecExpr>(stripInjectiveFunctions(V));
10653
10654 if (!AddRec && AllowPredicates)
10655 // Try to make this an AddRec using runtime tests, in the first X
10656 // iterations of this loop, where X is the SCEV expression found by the
10657 // algorithm below.
10658 AddRec = convertSCEVToAddRecWithPredicates(V, L, Predicates);
10659
10660 if (!AddRec || AddRec->getLoop() != L)
10661 return getCouldNotCompute();
10662
10663 // If this is a quadratic (3-term) AddRec {L,+,M,+,N}, find the roots of
10664 // the quadratic equation to solve it.
10665 if (AddRec->isQuadratic() && AddRec->getType()->isIntegerTy()) {
10666 // We can only use this value if the chrec ends up with an exact zero
10667 // value at this index. When solving for "X*X != 5", for example, we
10668 // should not accept a root of 2.
10669 if (auto S = SolveQuadraticAddRecExact(AddRec, *this)) {
10670 const auto *R = cast<SCEVConstant>(getConstant(*S));
10671 return ExitLimit(R, R, R, false, Predicates);
10672 }
10673 return getCouldNotCompute();
10674 }
10675
10676 // Otherwise we can only handle this if it is affine.
10677 if (!AddRec->isAffine())
10678 return getCouldNotCompute();
10679
10680 // If this is an affine expression, the execution count of this branch is
10681 // the minimum unsigned root of the following equation:
10682 //
10683 // Start + Step*N = 0 (mod 2^BW)
10684 //
10685 // equivalent to:
10686 //
10687 // Step*N = -Start (mod 2^BW)
10688 //
10689 // where BW is the common bit width of Start and Step.
10690
10691 // Get the initial value for the loop.
10692 const SCEV *Start = getSCEVAtScope(AddRec->getStart(), L->getParentLoop());
10693 const SCEV *Step = getSCEVAtScope(AddRec->getOperand(1), L->getParentLoop());
10694
10695 if (!isLoopInvariant(Step, L))
10696 return getCouldNotCompute();
10697
10698 LoopGuards Guards = LoopGuards::collectOnDemand(L, *this);
10699 // Specialize step for this loop so we get context sensitive facts below.
10700 const SCEV *StepWLG = applyLoopGuards(Step, Guards);
10701
10702 // For positive steps (counting up until unsigned overflow):
10703 // N = -Start/Step (as unsigned)
10704 // For negative steps (counting down to zero):
10705 // N = Start/-Step
10706 // First compute the unsigned distance from zero in the direction of Step.
10707 bool CountDown = isKnownNegative(StepWLG);
10708 if (!CountDown && !isKnownNonNegative(StepWLG))
10709 return getCouldNotCompute();
10710
10711 const SCEV *Distance = CountDown ? Start : getNegativeSCEV(Start);
10712 // Handle unitary steps, which cannot wraparound.
10713 // 1*N = -Start; -1*N = Start (mod 2^BW), so:
10714 // N = Distance (as unsigned)
10715
10716 if (match(Step, m_CombineOr(m_scev_One(), m_scev_AllOnes()))) {
10717 APInt MaxBECount = getUnsignedRangeMax(applyLoopGuards(Distance, Guards));
10718 MaxBECount = APIntOps::umin(MaxBECount, getUnsignedRangeMax(Distance));
10719
10720 // When a loop like "for (int i = 0; i != n; ++i) { /* body */ }" is rotated,
10721 // we end up with a loop whose backedge-taken count is n - 1. Detect this
10722 // case, and see if we can improve the bound.
10723 //
10724 // Explicitly handling this here is necessary because getUnsignedRange
10725 // isn't context-sensitive; it doesn't know that we only care about the
10726 // range inside the loop.
10727 const SCEV *Zero = getZero(Distance->getType());
10728 const SCEV *One = getOne(Distance->getType());
10729 const SCEV *DistancePlusOne = getAddExpr(Distance, One);
10730 if (isLoopEntryGuardedByCond(L, ICmpInst::ICMP_NE, DistancePlusOne, Zero)) {
10731 // If Distance + 1 doesn't overflow, we can compute the maximum distance
10732 // as "unsigned_max(Distance + 1) - 1". Also apply the loop guards to
10733 // Distance + 1; the range of Distance itself may be a wrapped set even
10734 // when the guards bound Distance + 1 tightly.
10735 APInt Max = APIntOps::umin(
10736 getUnsignedRangeMax(applyLoopGuards(DistancePlusOne, Guards)),
10737 getUnsignedRangeMax(DistancePlusOne));
10738 MaxBECount = APIntOps::umin(MaxBECount, Max - 1);
10739 }
10740 return ExitLimit(Distance, getConstant(MaxBECount), Distance, false,
10741 Predicates);
10742 }
10743
10744 // If the condition controls loop exit (the loop exits only if the expression
10745 // is true) and the addition is no-wrap we can use unsigned divide to
10746 // compute the backedge count. In this case, the step may not divide the
10747 // distance, but we don't care because if the condition is "missed" the loop
10748 // will have undefined behavior due to wrapping.
10749 if (ControlsOnlyExit && AddRec->hasNoSelfWrap() &&
10750 loopHasNoAbnormalExits(AddRec->getLoop())) {
10751
10752 // If the stride is zero and the start is non-zero, the loop must be
10753 // infinite. In C++, most loops are finite by assumption, in which case the
10754 // step being zero implies UB must execute if the loop is entered.
10755 if (!(loopIsFiniteByAssumption(L) && isKnownNonZero(Start)) &&
10756 !isKnownNonZero(StepWLG))
10757 return getCouldNotCompute();
10758
10759 const SCEV *Exact =
10760 getUDivExpr(Distance, CountDown ? getNegativeSCEV(Step) : Step);
10761 const SCEV *ConstantMax = getCouldNotCompute();
10762 if (Exact != getCouldNotCompute()) {
10763 APInt MaxInt = getUnsignedRangeMax(applyLoopGuards(Exact, Guards));
10764 ConstantMax =
10766 }
10767 const SCEV *SymbolicMax =
10768 isa<SCEVCouldNotCompute>(Exact) ? ConstantMax : Exact;
10769 return ExitLimit(Exact, ConstantMax, SymbolicMax, false, Predicates);
10770 }
10771
10772 // Solve the general equation.
10773 const SCEVConstant *StepC = dyn_cast<SCEVConstant>(Step);
10774 if (!StepC || StepC->getValue()->isZero())
10775 return getCouldNotCompute();
10776 const SCEV *E = SolveLinEquationWithOverflow(
10777 StepC->getAPInt(), getNegativeSCEV(Start),
10778 AllowPredicates ? &Predicates : nullptr, *this, L);
10779
10780 const SCEV *M = E;
10781 if (E != getCouldNotCompute()) {
10782 APInt MaxWithGuards = getUnsignedRangeMax(applyLoopGuards(E, Guards));
10783 M = getConstant(APIntOps::umin(MaxWithGuards, getUnsignedRangeMax(E)));
10784 }
10785 auto *S = isa<SCEVCouldNotCompute>(E) ? M : E;
10786 return ExitLimit(E, M, S, false, Predicates);
10787}
10788
10789ScalarEvolution::ExitLimit
10790ScalarEvolution::howFarToNonZero(const SCEV *V, const Loop *L) {
10791 // Loops that look like: while (X == 0) are very strange indeed. We don't
10792 // handle them yet except for the trivial case. This could be expanded in the
10793 // future as needed.
10794
10795 // If the value is a constant, check to see if it is known to be non-zero
10796 // already. If so, the backedge will execute zero times.
10797 if (const SCEVConstant *C = dyn_cast<SCEVConstant>(V)) {
10798 if (!C->getValue()->isZero())
10799 return getZero(C->getType());
10800 return getCouldNotCompute(); // Otherwise it will loop infinitely.
10801 }
10802
10803 // We could implement others, but I really doubt anyone writes loops like
10804 // this, and if they did, they would already be constant folded.
10805 return getCouldNotCompute();
10806}
10807
10808std::pair<const BasicBlock *, const BasicBlock *>
10809ScalarEvolution::getPredecessorWithUniqueSuccessorForBB(const BasicBlock *BB)
10810 const {
10811 // If the block has a unique predecessor, then there is no path from the
10812 // predecessor to the block that does not go through the direct edge
10813 // from the predecessor to the block.
10814 if (const BasicBlock *Pred = BB->getSinglePredecessor())
10815 return {Pred, BB};
10816
10817 // A loop's header is defined to be a block that dominates the loop.
10818 // If the header has a unique predecessor outside the loop, it must be
10819 // a block that has exactly one successor that can reach the loop.
10820 if (const Loop *L = LI.getLoopFor(BB))
10821 return {L->getLoopPredecessor(), L->getHeader()};
10822
10823 return {nullptr, BB};
10824}
10825
10826/// SCEV structural equivalence is usually sufficient for testing whether two
10827/// expressions are equal, however for the purposes of looking for a condition
10828/// guarding a loop, it can be useful to be a little more general, since a
10829/// front-end may have replicated the controlling expression.
10830static bool HasSameValue(const SCEV *A, const SCEV *B) {
10831 // Quick check to see if they are the same SCEV.
10832 if (A == B) return true;
10833
10834 auto ComputesEqualValues = [](const Instruction *A, const Instruction *B) {
10835 // Not all instructions that are "identical" compute the same value. For
10836 // instance, two distinct alloca instructions allocating the same type are
10837 // identical and do not read memory; but compute distinct values.
10838 return A->isIdenticalTo(B) && (isa<BinaryOperator>(A) || isa<GetElementPtrInst>(A));
10839 };
10840
10841 // Otherwise, if they're both SCEVUnknown, it's possible that they hold
10842 // two different instructions with the same value. Check for this case.
10843 if (const SCEVUnknown *AU = dyn_cast<SCEVUnknown>(A))
10844 if (const SCEVUnknown *BU = dyn_cast<SCEVUnknown>(B))
10845 if (const Instruction *AI = dyn_cast<Instruction>(AU->getValue()))
10846 if (const Instruction *BI = dyn_cast<Instruction>(BU->getValue()))
10847 if (ComputesEqualValues(AI, BI))
10848 return true;
10849
10850 // Otherwise assume they may have a different value.
10851 return false;
10852}
10853
10854static bool MatchBinarySub(const SCEV *S, SCEVUse &LHS, SCEVUse &RHS) {
10855 const SCEV *Op0, *Op1;
10856 if (!match(S, m_scev_Add(m_SCEV(Op0), m_SCEV(Op1))))
10857 return false;
10858 if (match(Op0, m_scev_Mul(m_scev_AllOnes(), m_SCEV(RHS)))) {
10859 LHS = Op1;
10860 return true;
10861 }
10862 if (match(Op1, m_scev_Mul(m_scev_AllOnes(), m_SCEV(RHS)))) {
10863 LHS = Op0;
10864 return true;
10865 }
10866 return false;
10867}
10868
10870 SCEVUse &RHS, unsigned Depth) {
10871 bool Changed = false;
10872 // Simplifies ICMP to trivial true or false by turning it into '0 == 0' or
10873 // '0 != 0'.
10874 auto TrivialCase = [&](bool TriviallyTrue) {
10876 Pred = TriviallyTrue ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE;
10877 return true;
10878 };
10879 // If we hit the max recursion limit bail out.
10880 if (Depth >= 3)
10881 return false;
10882
10883 const SCEV *NewLHS, *NewRHS;
10884 if (match(LHS, m_scev_c_Mul(m_SCEV(NewLHS), m_SCEVVScale())) &&
10885 match(RHS, m_scev_c_Mul(m_SCEV(NewRHS), m_SCEVVScale()))) {
10886 const SCEVMulExpr *LMul = cast<SCEVMulExpr>(LHS);
10887 const SCEVMulExpr *RMul = cast<SCEVMulExpr>(RHS);
10888
10889 // (X * vscale) pred (Y * vscale) ==> X pred Y
10890 // when both multiples are NSW.
10891 // (X * vscale) uicmp/eq/ne (Y * vscale) ==> X uicmp/eq/ne Y
10892 // when both multiples are NUW.
10893 if ((LMul->hasNoSignedWrap() && RMul->hasNoSignedWrap()) ||
10894 (LMul->hasNoUnsignedWrap() && RMul->hasNoUnsignedWrap() &&
10895 !ICmpInst::isSigned(Pred))) {
10896 LHS = NewLHS;
10897 RHS = NewRHS;
10898 Changed = true;
10899 }
10900 }
10901
10902 // Canonicalize a constant to the right side.
10903 if (const SCEVConstant *LHSC = dyn_cast<SCEVConstant>(LHS)) {
10904 // Check for both operands constant.
10905 if (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(RHS)) {
10906 if (!ICmpInst::compare(LHSC->getAPInt(), RHSC->getAPInt(), Pred))
10907 return TrivialCase(false);
10908 return TrivialCase(true);
10909 }
10910 // Otherwise swap the operands to put the constant on the right.
10911 std::swap(LHS, RHS);
10913 Changed = true;
10914 }
10915
10916 // (K + A) pred (K + B) --> A pred B
10917 // For equality, no flags are needed.
10918 // For signed, both adds must be NSW. For unsigned, both must be NUW.
10919 {
10920 const SCEVConstant *C = nullptr;
10921 if (match(LHS, m_scev_Add(m_SCEVConstant(C), m_SCEV(NewLHS))) &&
10922 match(RHS, m_scev_Add(m_scev_Specific(C), m_SCEV(NewRHS)))) {
10923 const auto *LAdd = cast<SCEVAddExpr>(LHS);
10924 const auto *RAdd = cast<SCEVAddExpr>(RHS);
10925 if (ICmpInst::isEquality(Pred) ||
10926 (ICmpInst::isSigned(Pred) && LAdd->hasNoSignedWrap() &&
10927 RAdd->hasNoSignedWrap()) ||
10928 (ICmpInst::isUnsigned(Pred) && LAdd->hasNoUnsignedWrap() &&
10929 RAdd->hasNoUnsignedWrap())) {
10930 LHS = NewLHS;
10931 RHS = NewRHS;
10932 Changed = true;
10933 }
10934 }
10935 }
10936
10937 // (C * A) pred (C * B) --> A pred B
10938 // For equality predicates, both muls must be NUW or both must be NSW
10939 // (either suffices to make multiplication by C injective; C == 0 is
10940 // impossible because SCEV folds 0 * X to 0).
10941 // For signed ordering, C must be positive and both muls must be NSW.
10942 // For unsigned ordering, both muls must be NUW.
10943 {
10944 const SCEVConstant *C = nullptr;
10945 if (match(LHS, m_scev_Mul(m_SCEVConstant(C), m_SCEV(NewLHS))) &&
10946 match(RHS, m_scev_Mul(m_scev_Specific(C), m_SCEV(NewRHS)))) {
10947 const auto *LMul = cast<SCEVMulExpr>(LHS);
10948 const auto *RMul = cast<SCEVMulExpr>(RHS);
10949 bool BothNUW = LMul->hasNoUnsignedWrap() && RMul->hasNoUnsignedWrap();
10950 bool BothNSW = LMul->hasNoSignedWrap() && RMul->hasNoSignedWrap();
10951 if ((ICmpInst::isEquality(Pred) && (BothNUW || BothNSW)) ||
10952 (ICmpInst::isSigned(Pred) && BothNSW &&
10953 C->getAPInt().isStrictlyPositive()) ||
10954 (ICmpInst::isUnsigned(Pred) && BothNUW)) {
10955 LHS = NewLHS;
10956 RHS = NewRHS;
10957 Changed = true;
10958 }
10959 }
10960 }
10961
10962 // If we're comparing an addrec with a value which is loop-invariant in the
10963 // addrec's loop, put the addrec on the left. Also make a dominance check,
10964 // as both operands could be addrecs loop-invariant in each other's loop.
10965 if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(RHS)) {
10966 const Loop *L = AR->getLoop();
10967 if (isLoopInvariant(LHS, L) && properlyDominates(LHS, L->getHeader())) {
10968 std::swap(LHS, RHS);
10970 Changed = true;
10971 }
10972 }
10973
10974 // If there's a constant operand, canonicalize comparisons with boundary
10975 // cases, and canonicalize *-or-equal comparisons to regular comparisons.
10976 if (const SCEVConstant *RC = dyn_cast<SCEVConstant>(RHS)) {
10977 const APInt &RA = RC->getAPInt();
10978
10979 bool SimplifiedByConstantRange = false;
10980
10981 if (!ICmpInst::isEquality(Pred)) {
10983 if (ExactCR.isFullSet())
10984 return TrivialCase(true);
10985 if (ExactCR.isEmptySet())
10986 return TrivialCase(false);
10987
10988 APInt NewRHS;
10989 CmpInst::Predicate NewPred;
10990 if (ExactCR.getEquivalentICmp(NewPred, NewRHS) &&
10991 ICmpInst::isEquality(NewPred)) {
10992 // We were able to convert an inequality to an equality.
10993 Pred = NewPred;
10994 RHS = getConstant(NewRHS);
10995 Changed = SimplifiedByConstantRange = true;
10996 }
10997 }
10998
10999 if (!SimplifiedByConstantRange) {
11000 switch (Pred) {
11001 default:
11002 break;
11003 case ICmpInst::ICMP_EQ:
11004 case ICmpInst::ICMP_NE:
11005 // Fold ((-1) * %a) + %b == 0 (equivalent to %b-%a == 0) into %a == %b.
11006 if (RA.isZero() && MatchBinarySub(LHS, LHS, RHS))
11007 Changed = true;
11008 break;
11009
11010 // The "Should have been caught earlier!" messages refer to the fact
11011 // that the ExactCR.isFullSet() or ExactCR.isEmptySet() check above
11012 // should have fired on the corresponding cases, and canonicalized the
11013 // check to trivial case.
11014
11015 case ICmpInst::ICMP_UGE:
11016 assert(!RA.isMinValue() && "Should have been caught earlier!");
11017 Pred = ICmpInst::ICMP_UGT;
11018 RHS = getConstant(RA - 1);
11019 Changed = true;
11020 break;
11021 case ICmpInst::ICMP_ULE:
11022 assert(!RA.isMaxValue() && "Should have been caught earlier!");
11023 Pred = ICmpInst::ICMP_ULT;
11024 RHS = getConstant(RA + 1);
11025 Changed = true;
11026 break;
11027 case ICmpInst::ICMP_SGE:
11028 assert(!RA.isMinSignedValue() && "Should have been caught earlier!");
11029 Pred = ICmpInst::ICMP_SGT;
11030 RHS = getConstant(RA - 1);
11031 Changed = true;
11032 break;
11033 case ICmpInst::ICMP_SLE:
11034 assert(!RA.isMaxSignedValue() && "Should have been caught earlier!");
11035 Pred = ICmpInst::ICMP_SLT;
11036 RHS = getConstant(RA + 1);
11037 Changed = true;
11038 break;
11039 }
11040 }
11041 }
11042
11043 // a /u b == 0 => a < b
11044 // a /u b != 0 => a >= b
11045 if (ICmpInst::isEquality(Pred) && RHS->isZero() &&
11046 match(LHS, m_scev_UDiv(m_SCEV(LHS), m_SCEV(RHS)))) {
11048 Changed = true;
11049 }
11050
11051 // Check for obvious equality.
11052 if (HasSameValue(LHS, RHS)) {
11053 if (ICmpInst::isTrueWhenEqual(Pred))
11054 return TrivialCase(true);
11056 return TrivialCase(false);
11057 }
11058
11059 // If possible, canonicalize GE/LE comparisons to GT/LT comparisons, by
11060 // adding or subtracting 1 from one of the operands.
11061 switch (Pred) {
11062 case ICmpInst::ICMP_SLE:
11063 if (!getSignedRangeMax(RHS).isMaxSignedValue()) {
11064 RHS = getAddExpr(getConstant(RHS->getType(), 1, true), RHS,
11066 Pred = ICmpInst::ICMP_SLT;
11067 Changed = true;
11068 } else if (!getSignedRangeMin(LHS).isMinSignedValue()) {
11069 LHS = getAddExpr(getConstant(RHS->getType(), (uint64_t)-1, true), LHS,
11071 Pred = ICmpInst::ICMP_SLT;
11072 Changed = true;
11073 }
11074 break;
11075 case ICmpInst::ICMP_SGE:
11076 if (!getSignedRangeMin(RHS).isMinSignedValue()) {
11077 RHS = getAddExpr(getConstant(RHS->getType(), (uint64_t)-1, true), RHS,
11079 Pred = ICmpInst::ICMP_SGT;
11080 Changed = true;
11081 } else if (!getSignedRangeMax(LHS).isMaxSignedValue()) {
11082 LHS = getAddExpr(getConstant(RHS->getType(), 1, true), LHS,
11084 Pred = ICmpInst::ICMP_SGT;
11085 Changed = true;
11086 }
11087 break;
11088 case ICmpInst::ICMP_ULE:
11089 if (!getUnsignedRangeMax(RHS).isMaxValue()) {
11090 RHS = getAddExpr(getConstant(RHS->getType(), 1, true), RHS,
11092 Pred = ICmpInst::ICMP_ULT;
11093 Changed = true;
11094 } else if (!getUnsignedRangeMin(LHS).isMinValue()) {
11095 LHS = getAddExpr(getConstant(RHS->getType(), (uint64_t)-1, true), LHS);
11096 Pred = ICmpInst::ICMP_ULT;
11097 Changed = true;
11098 }
11099 break;
11100 case ICmpInst::ICMP_UGE:
11101 // If RHS is an op we can fold the -1, try that first.
11102 // Otherwise prefer LHS to preserve the nuw flag.
11103 if ((isa<SCEVConstant>(RHS) ||
11105 isa<SCEVConstant>(cast<SCEVNAryExpr>(RHS)->getOperand(0)))) &&
11106 !getUnsignedRangeMin(RHS).isMinValue()) {
11107 RHS = getAddExpr(getConstant(RHS->getType(), (uint64_t)-1, true), RHS);
11108 Pred = ICmpInst::ICMP_UGT;
11109 Changed = true;
11110 } else if (!getUnsignedRangeMax(LHS).isMaxValue()) {
11111 LHS = getAddExpr(getConstant(RHS->getType(), 1, true), LHS,
11113 Pred = ICmpInst::ICMP_UGT;
11114 Changed = true;
11115 } else if (!getUnsignedRangeMin(RHS).isMinValue()) {
11116 RHS = getAddExpr(getConstant(RHS->getType(), (uint64_t)-1, true), RHS);
11117 Pred = ICmpInst::ICMP_UGT;
11118 Changed = true;
11119 }
11120 break;
11121 default:
11122 break;
11123 }
11124
11125 // TODO: More simplifications are possible here.
11126
11127 // Recursively simplify until we either hit a recursion limit or nothing
11128 // changes.
11129 if (Changed)
11130 (void)SimplifyICmpOperands(Pred, LHS, RHS, Depth + 1);
11131
11132 return Changed;
11133}
11134
11136 return getSignedRangeMax(S).isNegative();
11137}
11138
11142
11144 return !getSignedRangeMin(S).isNegative();
11145}
11146
11150
11152 // Query push down for cases where the unsigned range is
11153 // less than sufficient.
11154 if (const auto *SExt = dyn_cast<SCEVSignExtendExpr>(S))
11155 return isKnownNonZero(SExt->getOperand(0));
11156 return getUnsignedRangeMin(S) != 0;
11157}
11158
11160 bool OrNegative) {
11161 auto NonRecursive = [OrNegative](const SCEV *S) {
11162 if (auto *C = dyn_cast<SCEVConstant>(S))
11163 return C->getAPInt().isPowerOf2() ||
11164 (OrNegative && C->getAPInt().isNegatedPowerOf2());
11165
11166 // vscale is a power-of-two.
11167 return isa<SCEVVScale>(S);
11168 };
11169
11170 if (NonRecursive(S))
11171 return true;
11172
11173 auto *Mul = dyn_cast<SCEVMulExpr>(S);
11174 if (!Mul)
11175 return false;
11176 return all_of(Mul->operands(), NonRecursive) && (OrZero || isKnownNonZero(S));
11177}
11178
11180 const SCEV *S, uint64_t M,
11182 if (M == 0)
11183 return false;
11184 if (M == 1)
11185 return true;
11186
11187 // For a constant, check that "S % M == 0".
11188 if (auto *Cst = dyn_cast<SCEVConstant>(S)) {
11189 APInt C = Cst->getAPInt();
11190 return C.urem(M) == 0;
11191 }
11192
11193 // Basic tests have failed.
11194 // Check "S % M == 0" at compile time and record runtime Assumptions.
11195 auto *STy = dyn_cast<IntegerType>(S->getType());
11196 const SCEV *SmodM =
11197 getURemExpr(S, getConstant(ConstantInt::get(STy, M, false)));
11198 const SCEV *Zero = getZero(STy);
11199
11200 // Check whether "S % M == 0" is known at compile time.
11202 return true;
11203
11204 // Check whether "S % M != 0" is known at compile time.
11206 return false;
11207
11208 if (!Predicates)
11209 return false;
11210
11211 // Look through Add and AddRec expressions with nuw to improve the
11212 // precision of added predicates. S is a multiple of M if S starts with a
11213 // multiple of M and at every iteration step S only adds multiples of M.
11216 all_of(S->operands(),
11217 [&](SCEVUse Op) { return isKnownMultipleOf(Op, M, Predicates); }))
11218 return true;
11219
11220 // Similarly, look through Mul with nuw, where any operand being a
11221 // known-multiple is sufficient.
11222 if (auto *Mul = dyn_cast<SCEVMulExpr>(S))
11223 if (Mul->hasNoUnsignedWrap() && any_of(S->operands(), [&](SCEVUse Op) {
11224 return isKnownMultipleOf(Op, M, Predicates);
11225 }))
11226 return true;
11227
11228 // Similarly, look through MinMax, with no wrapping arithmetic to consider.
11229 if (isa<SCEVMinMaxExpr>(S) && all_of(S->operands(), [&](SCEVUse Op) {
11230 return isKnownMultipleOf(Op, M, Predicates);
11231 }))
11232 return true;
11233
11235
11236 // Detect redundant predicates.
11237 for (auto *A : *Predicates)
11238 if (A->implies(P, *this))
11239 return true;
11240
11241 // Only record non-redundant predicates.
11242 Predicates->push_back(P);
11243 return true;
11244}
11245
11247 return ((isKnownNonNegative(S1) && isKnownNonNegative(S2)) ||
11249}
11250
11251std::pair<const SCEV *, const SCEV *>
11253 // Compute SCEV on entry of loop L.
11254 const SCEV *Start = SCEVInitRewriter::rewrite(S, L, *this);
11255 if (Start == getCouldNotCompute())
11256 return { Start, Start };
11257 // Compute post increment SCEV for loop L.
11258 const SCEV *PostInc = SCEVPostIncRewriter::rewrite(S, L, *this);
11259 assert(PostInc != getCouldNotCompute() && "Unexpected could not compute");
11260 return { Start, PostInc };
11261}
11262
11264 SCEVUse RHS) {
11265 // First collect all loops.
11267 getUsedLoops(LHS, LoopsUsed);
11268 getUsedLoops(RHS, LoopsUsed);
11269
11270 if (LoopsUsed.empty())
11271 return false;
11272
11273 // Domination relationship must be a linear order on collected loops.
11274#ifndef NDEBUG
11275 for (const auto *L1 : LoopsUsed)
11276 for (const auto *L2 : LoopsUsed)
11277 assert((DT.dominates(L1->getHeader(), L2->getHeader()) ||
11278 DT.dominates(L2->getHeader(), L1->getHeader())) &&
11279 "Domination relationship is not a linear order");
11280#endif
11281
11282 const Loop *MDL =
11283 *llvm::max_element(LoopsUsed, [&](const Loop *L1, const Loop *L2) {
11284 return DT.properlyDominates(L1->getHeader(), L2->getHeader());
11285 });
11286
11287 // Get init and post increment value for LHS.
11288 auto SplitLHS = SplitIntoInitAndPostInc(MDL, LHS);
11289 // if LHS contains unknown non-invariant SCEV then bail out.
11290 if (SplitLHS.first == getCouldNotCompute())
11291 return false;
11292 assert (SplitLHS.second != getCouldNotCompute() && "Unexpected CNC");
11293 // Get init and post increment value for RHS.
11294 auto SplitRHS = SplitIntoInitAndPostInc(MDL, RHS);
11295 // if RHS contains unknown non-invariant SCEV then bail out.
11296 if (SplitRHS.first == getCouldNotCompute())
11297 return false;
11298 assert (SplitRHS.second != getCouldNotCompute() && "Unexpected CNC");
11299 // It is possible that init SCEV contains an invariant load but it does
11300 // not dominate MDL and is not available at MDL loop entry, so we should
11301 // check it here.
11302 if (!isAvailableAtLoopEntry(SplitLHS.first, MDL) ||
11303 !isAvailableAtLoopEntry(SplitRHS.first, MDL))
11304 return false;
11305
11306 // It seems backedge guard check is faster than entry one so in some cases
11307 // it can speed up whole estimation by short circuit
11308 return isLoopBackedgeGuardedByCond(MDL, Pred, SplitLHS.second,
11309 SplitRHS.second) &&
11310 isLoopEntryGuardedByCond(MDL, Pred, SplitLHS.first, SplitRHS.first);
11311}
11312
11314 SCEVUse RHS) {
11315 // Canonicalize the inputs first.
11316 (void)SimplifyICmpOperands(Pred, LHS, RHS);
11317
11318 return isKnownViaInduction(Pred, LHS, RHS) ||
11319 isKnownPredicateViaSplitting(Pred, LHS, RHS) ||
11320 isKnownViaNonRecursiveReasoning(Pred, LHS, RHS);
11321}
11322
11324 const SCEV *LHS,
11325 const SCEV *RHS) {
11326 if (isKnownPredicate(Pred, LHS, RHS))
11327 return true;
11329 return false;
11330 return std::nullopt;
11331}
11332
11334 const SCEV *RHS,
11335 const Instruction *CtxI) {
11336 // TODO: Analyze guards and assumes from Context's block.
11337 return isKnownPredicate(Pred, LHS, RHS) ||
11338 isBasicBlockEntryGuardedByCond(CtxI->getParent(), Pred, LHS, RHS);
11339}
11340
11341std::optional<bool>
11343 const SCEV *RHS, const Instruction *CtxI) {
11344 std::optional<bool> KnownWithoutContext = evaluatePredicate(Pred, LHS, RHS);
11345 if (KnownWithoutContext)
11346 return KnownWithoutContext;
11347
11348 if (isBasicBlockEntryGuardedByCond(CtxI->getParent(), Pred, LHS, RHS))
11349 return true;
11351 CtxI->getParent(), ICmpInst::getInverseCmpPredicate(Pred), LHS, RHS))
11352 return false;
11353 return std::nullopt;
11354}
11355
11357 const SCEVAddRecExpr *LHS,
11358 const SCEV *RHS) {
11359 const Loop *L = LHS->getLoop();
11360 return isLoopEntryGuardedByCond(L, Pred, LHS->getStart(), RHS) &&
11361 isLoopBackedgeGuardedByCond(L, Pred, LHS->getPostIncExpr(*this), RHS);
11362}
11363
11364std::optional<ScalarEvolution::MonotonicPredicateType>
11366 ICmpInst::Predicate Pred) {
11367 auto Result = getMonotonicPredicateTypeImpl(LHS, Pred);
11368
11369#ifndef NDEBUG
11370 // Verify an invariant: inverting the predicate should turn a monotonically
11371 // increasing change to a monotonically decreasing one, and vice versa.
11372 if (Result) {
11373 auto ResultSwapped =
11374 getMonotonicPredicateTypeImpl(LHS, ICmpInst::getSwappedPredicate(Pred));
11375
11376 assert(*ResultSwapped != *Result &&
11377 "monotonicity should flip as we flip the predicate");
11378 }
11379#endif
11380
11381 return Result;
11382}
11383
11384std::optional<ScalarEvolution::MonotonicPredicateType>
11385ScalarEvolution::getMonotonicPredicateTypeImpl(const SCEVAddRecExpr *LHS,
11386 ICmpInst::Predicate Pred) {
11387 // A zero step value for LHS means the induction variable is essentially a
11388 // loop invariant value. We don't really depend on the predicate actually
11389 // flipping from false to true (for increasing predicates, and the other way
11390 // around for decreasing predicates), all we care about is that *if* the
11391 // predicate changes then it only changes from false to true.
11392 //
11393 // A zero step value in itself is not very useful, but there may be places
11394 // where SCEV can prove X >= 0 but not prove X > 0, so it is helpful to be
11395 // as general as possible.
11396
11397 // Only handle LE/LT/GE/GT predicates.
11398 if (!ICmpInst::isRelational(Pred))
11399 return std::nullopt;
11400
11401 bool IsGreater = ICmpInst::isGE(Pred) || ICmpInst::isGT(Pred);
11402 assert((IsGreater || ICmpInst::isLE(Pred) || ICmpInst::isLT(Pred)) &&
11403 "Should be greater or less!");
11404
11405 // Check that AR does not wrap.
11406 if (ICmpInst::isUnsigned(Pred)) {
11407 if (!LHS->hasNoUnsignedWrap())
11408 return std::nullopt;
11410 }
11412 "Relational predicate is either signed or unsigned!");
11413 if (!LHS->hasNoSignedWrap())
11414 return std::nullopt;
11415
11416 const SCEV *Step = LHS->getStepRecurrence(*this);
11417
11418 if (isKnownNonNegative(Step))
11420
11421 if (isKnownNonPositive(Step))
11423
11424 return std::nullopt;
11425}
11426
11427std::optional<ScalarEvolution::LoopInvariantPredicate>
11429 const SCEV *RHS, const Loop *L,
11430 const Instruction *CtxI) {
11431 // If there is a loop-invariant, force it into the RHS, otherwise bail out.
11432 if (!isLoopInvariant(RHS, L)) {
11433 if (!isLoopInvariant(LHS, L))
11434 return std::nullopt;
11435
11436 std::swap(LHS, RHS);
11438 }
11439
11440 const SCEVAddRecExpr *ArLHS = dyn_cast<SCEVAddRecExpr>(LHS);
11441 if (!ArLHS || ArLHS->getLoop() != L)
11442 return std::nullopt;
11443
11444 // Even if both are valid, we need to consistently choose the unsigned or the
11445 // signed predicate for the monotonicity and backedge checks below, not
11446 // mixtures of both. For now, prefer the unsigned predicate.
11447 Pred = Pred.dropSameSign();
11448 auto MonotonicType = getMonotonicPredicateType(ArLHS, Pred);
11449 if (!MonotonicType)
11450 return std::nullopt;
11451 // If the predicate "ArLHS `Pred` RHS" monotonically increases from false to
11452 // true as the loop iterates, and the backedge is control dependent on
11453 // "ArLHS `Pred` RHS" == true then we can reason as follows:
11454 //
11455 // * if the predicate was false in the first iteration then the predicate
11456 // is never evaluated again, since the loop exits without taking the
11457 // backedge.
11458 // * if the predicate was true in the first iteration then it will
11459 // continue to be true for all future iterations since it is
11460 // monotonically increasing.
11461 //
11462 // For both the above possibilities, we can replace the loop varying
11463 // predicate with its value on the first iteration of the loop (which is
11464 // loop invariant).
11465 //
11466 // A similar reasoning applies for a monotonically decreasing predicate, by
11467 // replacing true with false and false with true in the above two bullets.
11469 auto P = Increasing ? Pred : ICmpInst::getInverseCmpPredicate(Pred);
11470
11471 if (isLoopBackedgeGuardedByCond(L, P, LHS, RHS))
11473 RHS);
11474
11475 if (!CtxI)
11476 return std::nullopt;
11477 // Try to prove via context.
11478 // TODO: Support other cases.
11479 switch (Pred) {
11480 default:
11481 break;
11482 case ICmpInst::ICMP_ULE:
11483 case ICmpInst::ICMP_ULT: {
11484 assert(ArLHS->hasNoUnsignedWrap() && "Is a requirement of monotonicity!");
11485 // Given preconditions
11486 // (1) ArLHS does not cross the border of positive and negative parts of
11487 // range because of:
11488 // - Positive step; (TODO: lift this limitation)
11489 // - nuw - does not cross zero boundary;
11490 // - nsw - does not cross SINT_MAX boundary;
11491 // (2) ArLHS <s RHS
11492 // (3) RHS >=s 0
11493 // we can replace the loop variant ArLHS <u RHS condition with loop
11494 // invariant Start(ArLHS) <u RHS.
11495 //
11496 // Because of (1) there are two options:
11497 // - ArLHS is always negative. It means that ArLHS <u RHS is always false;
11498 // - ArLHS is always non-negative. Because of (3) RHS is also non-negative.
11499 // It means that ArLHS <s RHS <=> ArLHS <u RHS.
11500 // Because of (2) ArLHS <u RHS is trivially true.
11501 // All together it means that ArLHS <u RHS <=> Start(ArLHS) >=s 0.
11502 // We can strengthen this to Start(ArLHS) <u RHS.
11503 auto SignFlippedPred = ICmpInst::getFlippedSignednessPredicate(Pred);
11504 if (ArLHS->hasNoSignedWrap() && ArLHS->isAffine() &&
11505 isKnownPositive(ArLHS->getStepRecurrence(*this)) &&
11506 isKnownNonNegative(RHS) &&
11507 isKnownPredicateAt(SignFlippedPred, ArLHS, RHS, CtxI))
11509 RHS);
11510 }
11511 }
11512
11513 return std::nullopt;
11514}
11515
11516std::optional<ScalarEvolution::LoopInvariantPredicate>
11518 CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const Loop *L,
11519 const Instruction *CtxI, const SCEV *MaxIter) {
11521 Pred, LHS, RHS, L, CtxI, MaxIter))
11522 return LIP;
11523 if (auto *UMin = dyn_cast<SCEVUMinExpr>(MaxIter))
11524 // Number of iterations expressed as UMIN isn't always great for expressing
11525 // the value on the last iteration. If the straightforward approach didn't
11526 // work, try the following trick: if the a predicate is invariant for X, it
11527 // is also invariant for umin(X, ...). So try to find something that works
11528 // among subexpressions of MaxIter expressed as umin.
11529 for (SCEVUse Op : UMin->operands())
11531 Pred, LHS, RHS, L, CtxI, Op))
11532 return LIP;
11533 return std::nullopt;
11534}
11535
11536std::optional<ScalarEvolution::LoopInvariantPredicate>
11538 CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const Loop *L,
11539 const Instruction *CtxI, const SCEV *MaxIter) {
11540 // Try to prove the following set of facts:
11541 // - The predicate is monotonic in the iteration space.
11542 // - If the check does not fail on the 1st iteration:
11543 // - No overflow will happen during first MaxIter iterations;
11544 // - It will not fail on the MaxIter'th iteration.
11545 // If the check does fail on the 1st iteration, we leave the loop and no
11546 // other checks matter.
11547
11548 // If there is a loop-invariant, force it into the RHS, otherwise bail out.
11549 if (!isLoopInvariant(RHS, L)) {
11550 if (!isLoopInvariant(LHS, L))
11551 return std::nullopt;
11552
11553 std::swap(LHS, RHS);
11555 }
11556
11557 auto *AR = dyn_cast<SCEVAddRecExpr>(LHS);
11558 if (!AR || AR->getLoop() != L)
11559 return std::nullopt;
11560
11561 // Even if both are valid, we need to consistently chose the unsigned or the
11562 // signed predicate below, not mixtures of both. For now, prefer the unsigned
11563 // predicate.
11564 Pred = Pred.dropSameSign();
11565
11566 // The predicate must be relational (i.e. <, <=, >=, >).
11567 if (!ICmpInst::isRelational(Pred))
11568 return std::nullopt;
11569
11570 // TODO: Support steps other than +/- 1.
11571 const SCEV *Step = AR->getStepRecurrence(*this);
11572 auto *One = getOne(Step->getType());
11573 auto *MinusOne = getNegativeSCEV(One);
11574 if (Step != One && Step != MinusOne)
11575 return std::nullopt;
11576
11577 // Type mismatch here means that MaxIter is potentially larger than max
11578 // unsigned value in start type, which mean we cannot prove no wrap for the
11579 // indvar.
11580 if (AR->getType() != MaxIter->getType())
11581 return std::nullopt;
11582
11583 // Value of IV on suggested last iteration.
11584 const SCEV *Last = AR->evaluateAtIteration(MaxIter, *this);
11585 // Does it still meet the requirement?
11586 if (!isLoopBackedgeGuardedByCond(L, Pred, Last, RHS))
11587 return std::nullopt;
11588 // Because step is +/- 1 and MaxIter has same type as Start (i.e. it does
11589 // not exceed max unsigned value of this type), this effectively proves
11590 // that there is no wrap during the iteration. To prove that there is no
11591 // signed/unsigned wrap, we need to check that
11592 // Start <= Last for step = 1 or Start >= Last for step = -1.
11593 ICmpInst::Predicate NoOverflowPred =
11595 if (Step == MinusOne)
11596 NoOverflowPred = ICmpInst::getSwappedPredicate(NoOverflowPred);
11597 const SCEV *Start = AR->getStart();
11598 if (!isKnownPredicateAt(NoOverflowPred, Start, Last, CtxI))
11599 return std::nullopt;
11600
11601 // Everything is fine.
11602 return ScalarEvolution::LoopInvariantPredicate(Pred, Start, RHS);
11603}
11604
11605bool ScalarEvolution::isKnownPredicateViaConstantRanges(CmpPredicate Pred,
11606 SCEVUse LHS,
11607 SCEVUse RHS) {
11608 if (HasSameValue(LHS, RHS))
11609 return ICmpInst::isTrueWhenEqual(Pred);
11610
11611 auto CheckRange = [&](bool IsSigned) {
11612 auto RangeLHS = IsSigned ? getSignedRange(LHS) : getUnsignedRange(LHS);
11613 auto RangeRHS = IsSigned ? getSignedRange(RHS) : getUnsignedRange(RHS);
11614 return RangeLHS.icmp(Pred, RangeRHS);
11615 };
11616
11617 // The check at the top of the function catches the case where the values are
11618 // known to be equal.
11619 if (Pred == CmpInst::ICMP_EQ)
11620 return false;
11621
11622 if (Pred == CmpInst::ICMP_NE) {
11623 if (CheckRange(true) || CheckRange(false))
11624 return true;
11625 auto *Diff = getMinusSCEV(LHS, RHS);
11626 return !isa<SCEVCouldNotCompute>(Diff) && isKnownNonZero(Diff);
11627 }
11628
11629 return CheckRange(CmpInst::isSigned(Pred));
11630}
11631
11632bool ScalarEvolution::isKnownPredicateViaNoOverflow(CmpPredicate Pred,
11634 // Match X to (A + C1)<ExpectedFlags> and Y to (A + C2)<ExpectedFlags>, where
11635 // C1 and C2 are constant integers. If either X or Y are not add expressions,
11636 // consider them as X + 0 and Y + 0 respectively. C1 and C2 are returned via
11637 // OutC1 and OutC2.
11638 auto MatchBinaryAddToConst = [this](SCEVUse X, SCEVUse Y, APInt &OutC1,
11639 APInt &OutC2, SCEVFlags ExpectedFlags) {
11640 SCEVUse XNonConstOp, XConstOp;
11641 SCEVUse YNonConstOp, YConstOp;
11642 SCEVFlags XFlagsPresent;
11643 SCEVFlags YFlagsPresent;
11644
11645 // Use nullptr for 0, to avoid creating a zero SCEV.
11646 if (!splitBinaryAdd(X, XConstOp, XNonConstOp, XFlagsPresent)) {
11647 XConstOp = nullptr;
11648 XNonConstOp = X;
11649 XFlagsPresent = ExpectedFlags;
11650 }
11651 if (XConstOp && !isa<SCEVConstant>(XConstOp))
11652 return false;
11653
11654 if (!splitBinaryAdd(Y, YConstOp, YNonConstOp, YFlagsPresent)) {
11655 YConstOp = nullptr;
11656 YNonConstOp = Y;
11657 YFlagsPresent = ExpectedFlags;
11658 }
11659
11660 if (YNonConstOp != XNonConstOp)
11661 return false;
11662
11663 if (YConstOp && !isa<SCEVConstant>(YConstOp))
11664 return false;
11665
11666 // When matching ADDs with NUW flags (and unsigned predicates), only the
11667 // second ADD (with the larger constant) requires NUW.
11668 if ((YFlagsPresent & ExpectedFlags) != ExpectedFlags)
11669 return false;
11671 (XFlagsPresent & ExpectedFlags) != ExpectedFlags) {
11672 return false;
11673 }
11674
11675 OutC1 = XConstOp ? cast<SCEVConstant>(XConstOp)->getAPInt()
11676 : APInt::getZero(getTypeSizeInBits(X->getType()));
11677 OutC2 = YConstOp ? cast<SCEVConstant>(YConstOp)->getAPInt()
11678 : APInt::getZero(getTypeSizeInBits(Y->getType()));
11679
11680 return true;
11681 };
11682
11683 APInt C1;
11684 APInt C2;
11685
11686 switch (Pred) {
11687 default:
11688 break;
11689
11690 case ICmpInst::ICMP_SGE:
11691 std::swap(LHS, RHS);
11692 [[fallthrough]];
11693 case ICmpInst::ICMP_SLE:
11694 // (X + C1)<nsw> s<= (X + C2)<nsw> if C1 s<= C2.
11695 if (MatchBinaryAddToConst(LHS, RHS, C1, C2, SCEV::FlagNSW) && C1.sle(C2))
11696 return true;
11697
11698 break;
11699
11700 case ICmpInst::ICMP_SGT:
11701 std::swap(LHS, RHS);
11702 [[fallthrough]];
11703 case ICmpInst::ICMP_SLT:
11704 // (X + C1)<nsw> s< (X + C2)<nsw> if C1 s< C2.
11705 if (MatchBinaryAddToConst(LHS, RHS, C1, C2, SCEV::FlagNSW) && C1.slt(C2))
11706 return true;
11707
11708 break;
11709
11710 case ICmpInst::ICMP_UGE:
11711 std::swap(LHS, RHS);
11712 [[fallthrough]];
11713 case ICmpInst::ICMP_ULE:
11714 // (X + C1) u<= (X + C2)<nuw> for C1 u<= C2.
11715 if (MatchBinaryAddToConst(LHS, RHS, C1, C2, SCEV::FlagNUW) && C1.ule(C2))
11716 return true;
11717
11718 break;
11719
11720 case ICmpInst::ICMP_UGT:
11721 std::swap(LHS, RHS);
11722 [[fallthrough]];
11723 case ICmpInst::ICMP_ULT:
11724 // (X + C1) u< (X + C2)<nuw> if C1 u< C2.
11725 if (MatchBinaryAddToConst(LHS, RHS, C1, C2, SCEV::FlagNUW) && C1.ult(C2))
11726 return true;
11727 break;
11728 }
11729
11730 return false;
11731}
11732
11733bool ScalarEvolution::isKnownPredicateViaSplitting(CmpPredicate Pred,
11735 if (Pred != ICmpInst::ICMP_ULT || ProvingSplitPredicate)
11736 return false;
11737
11738 // Allowing arbitrary number of activations of isKnownPredicateViaSplitting on
11739 // the stack can result in exponential time complexity.
11740 SaveAndRestore Restore(ProvingSplitPredicate, true);
11741
11742 // If L >= 0 then I `ult` L <=> I >= 0 && I `slt` L
11743 //
11744 // To prove L >= 0 we use isKnownNonNegative whereas to prove I >= 0 we use
11745 // isKnownPredicate. isKnownPredicate is more powerful, but also more
11746 // expensive; and using isKnownNonNegative(RHS) is sufficient for most of the
11747 // interesting cases seen in practice. We can consider "upgrading" L >= 0 to
11748 // use isKnownPredicate later if needed.
11749 return isKnownNonNegative(RHS) &&
11752}
11753
11754bool ScalarEvolution::isImpliedViaGuard(const BasicBlock *BB, CmpPredicate Pred,
11755 const SCEV *LHS, const SCEV *RHS) {
11756 // No need to even try if we know the module has no guards.
11757 if (!HasGuards)
11758 return false;
11759
11760 return any_of(*BB, [&](const Instruction &I) {
11761 using namespace llvm::PatternMatch;
11762
11763 Value *Condition;
11765 m_Value(Condition))) &&
11766 isImpliedCond(Pred, LHS, RHS, Condition, false);
11767 });
11768}
11769
11770/// isLoopBackedgeGuardedByCond - Test whether the backedge of the loop is
11771/// protected by a conditional between LHS and RHS. This is used to
11772/// to eliminate casts.
11774 CmpPredicate Pred,
11775 const SCEV *LHS,
11776 const SCEV *RHS) {
11777 // Interpret a null as meaning no loop, where there is obviously no guard
11778 // (interprocedural conditions notwithstanding). Do not bother about
11779 // unreachable loops.
11780 if (!L || !DT.isReachableFromEntry(L->getHeader()))
11781 return true;
11782
11783 if (Opts.scev_verify_ir)
11784 assert(!verifyFunction(*L->getHeader()->getParent(), &dbgs()) &&
11785 "This cannot be done on broken IR!");
11786
11787
11788 if (isKnownViaNonRecursiveReasoning(Pred, LHS, RHS))
11789 return true;
11790
11791 BasicBlock *Latch = L->getLoopLatch();
11792 if (!Latch)
11793 return false;
11794
11795 CondBrInst *LoopContinuePredicate =
11797 if (LoopContinuePredicate &&
11798 isImpliedCond(Pred, LHS, RHS, LoopContinuePredicate->getCondition(),
11799 LoopContinuePredicate->getSuccessor(0) != L->getHeader()))
11800 return true;
11801
11802 // We don't want more than one activation of the following loops on the stack
11803 // -- that can lead to O(n!) time complexity.
11804 if (WalkingBEDominatingConds)
11805 return false;
11806
11807 SaveAndRestore ClearOnExit(WalkingBEDominatingConds, true);
11808
11809 // See if we can exploit a trip count to prove the predicate.
11810 const auto &BETakenInfo = getBackedgeTakenInfo(L);
11811 const SCEV *LatchBECount = BETakenInfo.getExact(Latch, this);
11812 if (LatchBECount != getCouldNotCompute()) {
11813 // We know that Latch branches back to the loop header exactly
11814 // LatchBECount times. This means the backdege condition at Latch is
11815 // equivalent to "{0,+,1} u< LatchBECount".
11816 Type *Ty = LatchBECount->getType();
11817 auto NoWrapFlags = SCEVFlags(SCEV::FlagNUW | SCEV::FlagNW);
11818 const SCEV *LoopCounter =
11819 getAddRecExpr(getZero(Ty), getOne(Ty), L, NoWrapFlags);
11820 if (isImpliedCond(Pred, LHS, RHS, ICmpInst::ICMP_ULT, LoopCounter,
11821 LatchBECount))
11822 return true;
11823 }
11824
11825 // Check conditions due to any @llvm.assume intrinsics.
11826 for (auto &AssumeVH : AC.assumptions()) {
11827 if (!AssumeVH)
11828 continue;
11829 auto *CI = cast<CallInst>(AssumeVH);
11830 if (!DT.dominates(CI, Latch->getTerminator()))
11831 continue;
11832
11833 if (isImpliedCond(Pred, LHS, RHS, CI->getArgOperand(0), false))
11834 return true;
11835 }
11836
11837 if (isImpliedViaGuard(Latch, Pred, LHS, RHS))
11838 return true;
11839
11840 for (DomTreeNode *DTN = DT[Latch], *HeaderDTN = DT[L->getHeader()];
11841 DTN != HeaderDTN; DTN = DTN->getIDom()) {
11842 assert(DTN && "should reach the loop header before reaching the root!");
11843
11844 BasicBlock *BB = DTN->getBlock();
11845 if (isImpliedViaGuard(BB, Pred, LHS, RHS))
11846 return true;
11847
11848 BasicBlock *PBB = BB->getSinglePredecessor();
11849 if (!PBB)
11850 continue;
11851
11853 if (!ContBr || ContBr->getSuccessor(0) == ContBr->getSuccessor(1))
11854 continue;
11855
11856 // If we have an edge `E` within the loop body that dominates the only
11857 // latch, the condition guarding `E` also guards the backedge. This
11858 // reasoning works only for loops with a single latch.
11859 // We're constructively (and conservatively) enumerating edges within the
11860 // loop body that dominate the latch. The dominator tree better agree
11861 // with us on this:
11862 assert(DT.dominates(BasicBlockEdge(PBB, BB), Latch) && "should be!");
11863 if (isImpliedCond(Pred, LHS, RHS, ContBr->getCondition(),
11864 BB != ContBr->getSuccessor(0)))
11865 return true;
11866 }
11867
11868 return false;
11869}
11870
11872 CmpPredicate Pred,
11873 const SCEV *LHS,
11874 const SCEV *RHS) {
11875 // Do not bother proving facts for unreachable code.
11876 if (!DT.isReachableFromEntry(BB))
11877 return true;
11878 if (Opts.scev_verify_ir)
11879 assert(!verifyFunction(*BB->getParent(), &dbgs()) &&
11880 "This cannot be done on broken IR!");
11881
11882 // If we cannot prove strict comparison (e.g. a > b), maybe we can prove
11883 // the facts (a >= b && a != b) separately. A typical situation is when the
11884 // non-strict comparison is known from ranges and non-equality is known from
11885 // dominating predicates. If we are proving strict comparison, we always try
11886 // to prove non-equality and non-strict comparison separately.
11887 CmpPredicate NonStrictPredicate = ICmpInst::getNonStrictCmpPredicate(Pred);
11888 const bool ProvingStrictComparison =
11889 Pred != NonStrictPredicate.dropSameSign();
11890 const Instruction *CtxI = &BB->front();
11892
11893 // Try to prove (Pred, LHS, RHS) using isImpliedCond.
11894 auto ProveViaCond = [&](const Value *Condition, bool Inverse) {
11895 Conds.emplace_back(Condition, Inverse);
11896 return isImpliedCond(Pred, LHS, RHS, Condition, Inverse, CtxI);
11897 };
11898
11899 // Starting at the block's predecessor, climb up the predecessor chain, as long
11900 // as there are predecessors that can be found that have unique successors
11901 // leading to the original block.
11902 const Loop *ContainingLoop = LI.getLoopFor(BB);
11903 const BasicBlock *PredBB;
11904 if (ContainingLoop && ContainingLoop->getHeader() == BB)
11905 PredBB = ContainingLoop->getLoopPredecessor();
11906 else
11907 PredBB = BB->getSinglePredecessor();
11908 for (std::pair<const BasicBlock *, const BasicBlock *> Pair(PredBB, BB);
11909 Pair.first; Pair = getPredecessorWithUniqueSuccessorForBB(Pair.first)) {
11910 const CondBrInst *BlockEntryPredicate =
11911 dyn_cast<CondBrInst>(Pair.first->getTerminator());
11912 if (!BlockEntryPredicate)
11913 continue;
11914
11915 if (ProveViaCond(BlockEntryPredicate->getCondition(),
11916 BlockEntryPredicate->getSuccessor(0) != Pair.second))
11917 return true;
11918 }
11919
11920 // Check conditions due to any @llvm.assume intrinsics.
11921 for (auto &AssumeVH : AC.assumptions()) {
11922 if (!AssumeVH)
11923 continue;
11924 auto *CI = cast<CallInst>(AssumeVH);
11925 if (!DT.dominates(CI, BB))
11926 continue;
11927
11928 if (ProveViaCond(CI->getArgOperand(0), false))
11929 return true;
11930 }
11931
11932 // Check conditions due to any @llvm.experimental.guard intrinsics.
11933 auto *GuardDecl = Intrinsic::getDeclarationIfExists(
11934 F.getParent(), Intrinsic::experimental_guard);
11935 if (GuardDecl)
11936 for (const auto *GU : GuardDecl->users())
11937 if (const auto *Guard = dyn_cast<IntrinsicInst>(GU))
11938 if (Guard->getFunction() == BB->getParent() && DT.dominates(Guard, BB))
11939 if (ProveViaCond(Guard->getArgOperand(0), false))
11940 return true;
11941
11942 // First try to prove conditions directly, then fall back to proving via the
11943 // non-strict predicate and not-equal.
11944 if (!ProvingStrictComparison)
11945 return false;
11946 auto ProveViaAll = [&](CmpPredicate P) {
11947 return isKnownViaNonRecursiveReasoning(P, LHS, RHS) ||
11948 any_of(Conds, [&](const auto &C) {
11949 return isImpliedCond(P, LHS, RHS, C.first, C.second, CtxI);
11950 });
11951 };
11952 return ProveViaAll(NonStrictPredicate) && ProveViaAll(ICmpInst::ICMP_NE);
11953}
11954
11956 const SCEV *LHS,
11957 const SCEV *RHS) {
11958 // Interpret a null as meaning no loop, where there is obviously no guard
11959 // (interprocedural conditions notwithstanding).
11960 if (!L)
11961 return false;
11962
11963 // Both LHS and RHS must be available at loop entry.
11965 "LHS is not available at Loop Entry");
11967 "RHS is not available at Loop Entry");
11968
11969 if (isKnownViaNonRecursiveReasoning(Pred, LHS, RHS))
11970 return true;
11971
11972 return isBasicBlockEntryGuardedByCond(L->getHeader(), Pred, LHS, RHS);
11973}
11974
11975bool ScalarEvolution::isImpliedCond(CmpPredicate Pred, const SCEV *LHS,
11976 const SCEV *RHS,
11977 const Value *FoundCondValue, bool Inverse,
11978 const Instruction *CtxI) {
11979 // False conditions implies anything. Do not bother analyzing it further.
11980 if (FoundCondValue ==
11981 ConstantInt::getBool(FoundCondValue->getContext(), Inverse))
11982 return true;
11983
11984 if (!PendingLoopPredicates.insert(FoundCondValue).second)
11985 return false;
11986
11987 llvm::scope_exit ClearOnExit(
11988 [&]() { PendingLoopPredicates.erase(FoundCondValue); });
11989
11990 // Recursively handle And and Or conditions.
11991 const Value *Op0, *Op1;
11992 if (match(FoundCondValue, m_LogicalAnd(m_Value(Op0), m_Value(Op1)))) {
11993 if (!Inverse)
11994 return isImpliedCond(Pred, LHS, RHS, Op0, Inverse, CtxI) ||
11995 isImpliedCond(Pred, LHS, RHS, Op1, Inverse, CtxI);
11996 } else if (match(FoundCondValue, m_LogicalOr(m_Value(Op0), m_Value(Op1)))) {
11997 if (Inverse)
11998 return isImpliedCond(Pred, LHS, RHS, Op0, Inverse, CtxI) ||
11999 isImpliedCond(Pred, LHS, RHS, Op1, Inverse, CtxI);
12000 }
12001
12002 const ICmpInst *ICI = dyn_cast<ICmpInst>(FoundCondValue);
12003 if (!ICI) return false;
12004
12005 // Now that we found a conditional branch that dominates the loop or controls
12006 // the loop latch. Check to see if it is the comparison we are looking for.
12007 CmpPredicate FoundPred;
12008 if (Inverse)
12009 FoundPred = ICI->getInverseCmpPredicate();
12010 else
12011 FoundPred = ICI->getCmpPredicate();
12012
12013 const SCEV *FoundLHS = getSCEV(ICI->getOperand(0));
12014 const SCEV *FoundRHS = getSCEV(ICI->getOperand(1));
12015
12016 return isImpliedCond(Pred, LHS, RHS, FoundPred, FoundLHS, FoundRHS, CtxI);
12017}
12018
12019bool ScalarEvolution::isImpliedCond(CmpPredicate Pred, const SCEV *LHS,
12020 const SCEV *RHS, CmpPredicate FoundPred,
12021 const SCEV *FoundLHS, const SCEV *FoundRHS,
12022 const Instruction *CtxI) {
12023 // Balance the types.
12024 if (getTypeSizeInBits(LHS->getType()) <
12025 getTypeSizeInBits(FoundLHS->getType())) {
12026 // For unsigned and equality predicates, try to prove that both found
12027 // operands fit into narrow unsigned range. If so, try to prove facts in
12028 // narrow types.
12029 if (!CmpInst::isSigned(FoundPred) && !FoundLHS->getType()->isPointerTy() &&
12030 !FoundRHS->getType()->isPointerTy()) {
12031 auto *NarrowType = LHS->getType();
12032 auto *WideType = FoundLHS->getType();
12033 auto BitWidth = getTypeSizeInBits(NarrowType);
12034 const SCEV *MaxValue = getZeroExtendExpr(
12036 if (isKnownViaNonRecursiveReasoning(ICmpInst::ICMP_ULE, FoundLHS,
12037 MaxValue) &&
12038 isKnownViaNonRecursiveReasoning(ICmpInst::ICMP_ULE, FoundRHS,
12039 MaxValue)) {
12040 const SCEV *TruncFoundLHS = getTruncateExpr(FoundLHS, NarrowType);
12041 const SCEV *TruncFoundRHS = getTruncateExpr(FoundRHS, NarrowType);
12042 // We cannot preserve samesign after truncation.
12043 if (isImpliedCondBalancedTypes(Pred, LHS, RHS, FoundPred.dropSameSign(),
12044 TruncFoundLHS, TruncFoundRHS, CtxI))
12045 return true;
12046 }
12047 }
12048
12049 if (LHS->getType()->isPointerTy() || RHS->getType()->isPointerTy())
12050 return false;
12051 if (CmpInst::isSigned(Pred)) {
12052 LHS = getSignExtendExpr(LHS, FoundLHS->getType());
12053 RHS = getSignExtendExpr(RHS, FoundLHS->getType());
12054 } else {
12055 LHS = getZeroExtendExpr(LHS, FoundLHS->getType());
12056 RHS = getZeroExtendExpr(RHS, FoundLHS->getType());
12057 }
12058 } else if (getTypeSizeInBits(LHS->getType()) >
12059 getTypeSizeInBits(FoundLHS->getType())) {
12060 if (FoundLHS->getType()->isPointerTy() || FoundRHS->getType()->isPointerTy())
12061 return false;
12062 if (CmpInst::isSigned(FoundPred)) {
12063 FoundLHS = getSignExtendExpr(FoundLHS, LHS->getType());
12064 FoundRHS = getSignExtendExpr(FoundRHS, LHS->getType());
12065 } else {
12066 FoundLHS = getZeroExtendExpr(FoundLHS, LHS->getType());
12067 FoundRHS = getZeroExtendExpr(FoundRHS, LHS->getType());
12068 }
12069 }
12070 return isImpliedCondBalancedTypes(Pred, LHS, RHS, FoundPred, FoundLHS,
12071 FoundRHS, CtxI);
12072}
12073
12074bool ScalarEvolution::isImpliedCondBalancedTypes(
12075 CmpPredicate Pred, SCEVUse LHS, SCEVUse RHS, CmpPredicate FoundPred,
12076 SCEVUse FoundLHS, SCEVUse FoundRHS, const Instruction *CtxI) {
12078 getTypeSizeInBits(FoundLHS->getType()) &&
12079 "Types should be balanced!");
12080 // Canonicalize the query to match the way instcombine will have
12081 // canonicalized the comparison.
12083 if (LHS == RHS)
12085 if (SimplifyICmpOperands(FoundPred, FoundLHS, FoundRHS))
12086 if (FoundLHS == FoundRHS)
12087 return CmpInst::isFalseWhenEqual(FoundPred);
12088
12089 // Check to see if we can make the LHS or RHS match.
12090 if (LHS == FoundRHS || RHS == FoundLHS) {
12091 if (isa<SCEVConstant>(RHS)) {
12092 std::swap(FoundLHS, FoundRHS);
12093 FoundPred = ICmpInst::getSwappedCmpPredicate(FoundPred);
12094 } else {
12095 std::swap(LHS, RHS);
12097 }
12098 }
12099
12100 // Check whether the found predicate is the same as the desired predicate.
12101 if (auto P = CmpPredicate::getMatching(FoundPred, Pred))
12102 return isImpliedCondOperands(*P, LHS, RHS, FoundLHS, FoundRHS, CtxI);
12103
12104 // Check whether swapping the found predicate makes it the same as the
12105 // desired predicate.
12106 if (auto P = CmpPredicate::getMatching(
12108 // We can write the implication
12109 // 0. LHS Pred RHS <- FoundLHS SwapPred FoundRHS
12110 // using one of the following ways:
12111 // 1. LHS Pred RHS <- FoundRHS Pred FoundLHS
12112 // 2. RHS SwapPred LHS <- FoundLHS SwapPred FoundRHS
12113 // Both require swapping the operands of one condition. Don't do this if it
12114 // would break canonical constant/addrec ordering.
12116 return isImpliedCondOperands(ICmpInst::getSwappedCmpPredicate(*P), RHS,
12117 LHS, FoundLHS, FoundRHS, CtxI);
12118 if (!isa<SCEVConstant>(FoundRHS) && !isa<SCEVAddRecExpr>(FoundLHS))
12119 return isImpliedCondOperands(*P, LHS, RHS, FoundRHS, FoundLHS, CtxI);
12120
12121 return false;
12122 }
12123
12124 // Try the query as is and with its operands swapped. E.g. "x >s -1" is
12125 // tried as "-1 <s x" too, to match the found condition "x <u y".
12126 auto IsSignFlippedPredicate = [](CmpInst::Predicate P1,
12128 return CmpInst::isRelational(P2) &&
12130 };
12131 if (IsSignFlippedPredicate(Pred, FoundPred) &&
12132 isImpliedCondViaSignFlippedPred(Pred, LHS, RHS, FoundLHS, FoundRHS, CtxI))
12133 return true;
12134 CmpPredicate SwappedPred = ICmpInst::getSwappedCmpPredicate(Pred);
12135 if (IsSignFlippedPredicate(SwappedPred, FoundPred) &&
12136 isImpliedCondViaSignFlippedPred(SwappedPred, RHS, LHS, FoundLHS, FoundRHS,
12137 CtxI))
12138 return true;
12139
12140 // Check if we can make progress by sharpening ranges.
12141 if (FoundPred == ICmpInst::ICMP_NE &&
12142 (isa<SCEVConstant>(FoundLHS) || isa<SCEVConstant>(FoundRHS))) {
12143
12144 const SCEVConstant *C = nullptr;
12145 const SCEV *V = nullptr;
12146
12147 if (isa<SCEVConstant>(FoundLHS)) {
12148 C = cast<SCEVConstant>(FoundLHS);
12149 V = FoundRHS;
12150 } else {
12151 C = cast<SCEVConstant>(FoundRHS);
12152 V = FoundLHS;
12153 }
12154
12155 // The guarding predicate tells us that C != V. If the known range
12156 // of V is [C, t), we can sharpen the range to [C + 1, t). The
12157 // range we consider has to correspond to same signedness as the
12158 // predicate we're interested in folding.
12159
12160 APInt Min = ICmpInst::isSigned(Pred) ?
12162
12163 if (Min == C->getAPInt()) {
12164 // Given (V >= Min && V != Min) we conclude V >= (Min + 1).
12165 // This is true even if (Min + 1) wraps around -- in case of
12166 // wraparound, (Min + 1) < Min, so (V >= Min => V >= (Min + 1)).
12167
12168 APInt SharperMin = Min + 1;
12169
12170 switch (Pred) {
12171 case ICmpInst::ICMP_SGE:
12172 case ICmpInst::ICMP_UGE:
12173 // We know V `Pred` SharperMin. If this implies LHS `Pred`
12174 // RHS, we're done.
12175 if (isImpliedCondOperands(Pred, LHS, RHS, V, getConstant(SharperMin),
12176 CtxI))
12177 return true;
12178 [[fallthrough]];
12179
12180 case ICmpInst::ICMP_SGT:
12181 case ICmpInst::ICMP_UGT:
12182 // We know from the range information that (V `Pred` Min ||
12183 // V == Min). We know from the guarding condition that !(V
12184 // == Min). This gives us
12185 //
12186 // V `Pred` Min || V == Min && !(V == Min)
12187 // => V `Pred` Min
12188 //
12189 // If V `Pred` Min implies LHS `Pred` RHS, we're done.
12190
12191 if (isImpliedCondOperands(Pred, LHS, RHS, V, getConstant(Min), CtxI))
12192 return true;
12193 break;
12194
12195 // `LHS < RHS` and `LHS <= RHS` are handled in the same way as `RHS > LHS` and `RHS >= LHS` respectively.
12196 case ICmpInst::ICMP_SLE:
12197 case ICmpInst::ICMP_ULE:
12198 if (isImpliedCondOperands(ICmpInst::getSwappedCmpPredicate(Pred), RHS,
12199 LHS, V, getConstant(SharperMin), CtxI))
12200 return true;
12201 [[fallthrough]];
12202
12203 case ICmpInst::ICMP_SLT:
12204 case ICmpInst::ICMP_ULT:
12205 if (isImpliedCondOperands(ICmpInst::getSwappedCmpPredicate(Pred), RHS,
12206 LHS, V, getConstant(Min), CtxI))
12207 return true;
12208 break;
12209
12210 default:
12211 // No change
12212 break;
12213 }
12214 }
12215 }
12216
12217 // Check whether the actual condition is beyond sufficient.
12218 if (FoundPred == ICmpInst::ICMP_EQ)
12220 if (isImpliedCondOperands(Pred, LHS, RHS, FoundLHS, FoundRHS, CtxI))
12221 return true;
12222 if (Pred == ICmpInst::ICMP_NE)
12223 if (!ICmpInst::isTrueWhenEqual(FoundPred))
12224 if (isImpliedCondOperands(FoundPred, LHS, RHS, FoundLHS, FoundRHS, CtxI))
12225 return true;
12226
12227 if (isImpliedCondOperandsViaRanges(Pred, LHS, RHS, FoundPred, FoundLHS, FoundRHS))
12228 return true;
12229
12230 // Otherwise assume the worst.
12231 return false;
12232}
12233
12234bool ScalarEvolution::isImpliedCondViaSignFlippedPred(
12235 CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const SCEV *FoundLHS,
12236 const SCEV *FoundRHS, const Instruction *CtxI) {
12237 CmpPredicate FoundPred = ICmpInst::getFlippedSignednessPredicate(Pred);
12238 // Unsigned comparison is the same as signed comparison when both the
12239 // operands are non-negative or negative.
12240 if (haveSameSign(FoundLHS, FoundRHS))
12241 return isImpliedCondOperands(Pred, LHS, RHS, FoundLHS, FoundRHS, CtxI);
12242 // Canonicalize both conditions to "le/lt".
12245 FoundPred = ICmpInst::getSwappedCmpPredicate(FoundPred);
12246 std::swap(LHS, RHS);
12247 std::swap(FoundLHS, FoundRHS);
12248 }
12249 assert((ICmpInst::isLT(Pred) || ICmpInst::isLE(Pred)) && "Must be!");
12250 assert((ICmpInst::isLT(FoundPred) || ICmpInst::isLE(FoundPred)) &&
12251 "Must be!");
12252 if (ICmpInst::isSigned(Pred)) {
12253 // Use implication:
12254 // x <u y && y <=u 2^(n-1) --> x >=s 0,
12255 // x <=u y && y <u 2^(n-1) --> x >=s 0,
12256 // where n is the bit width of x and y.
12257 // In both cases x <u 2^(n-1), so x >=s 0.
12258 // y <=u 2^(n-1) means y >=s 0 or y == INT_MIN.
12259 // If the implication's left part holds, try proving the query from x >=s
12260 // 0.
12261 Type *Ty = FoundLHS->getType();
12262 unsigned BitWidth = getTypeSizeInBits(Ty);
12263 const SCEV *SignedMin = getConstant(APInt::getSignedMinValue(BitWidth));
12264 CmpPredicate BoundPred =
12266 if (isKnownViaNonRecursiveReasoning(BoundPred, FoundRHS, SignedMin)) {
12267 // x >=s 0, written as 0 <=s x, or as -1 <s x to match a strict query.
12268 const SCEV *Bound = ICmpInst::isLE(Pred) ? getZero(Ty) : getMinusOne(Ty);
12269 if (isImpliedCondOperands(Pred, LHS, RHS, Bound, FoundLHS, CtxI))
12270 return true;
12271 }
12272 }
12274 // Use implication:
12275 // x <u y && y >=s 0 --> x <s y.
12276 // If we can prove the left part, the right part is also proven.
12277 return isImpliedCondOperands(FoundPred, LHS, RHS, FoundLHS, FoundRHS);
12278 }
12280 // Use implication:
12281 // x <s y && y <s 0 --> x <u y.
12282 // If we can prove the left part, the right part is also proven.
12283 return isImpliedCondOperands(FoundPred, LHS, RHS, FoundLHS, FoundRHS);
12284 }
12285 return false;
12286}
12287
12288bool ScalarEvolution::splitBinaryAdd(SCEVUse Expr, SCEVUse &L, SCEVUse &R,
12289 SCEVFlags &Flags) {
12290 if (!match(Expr, m_scev_Add(m_SCEV(L), m_SCEV(R))))
12291 return false;
12292
12293 Flags = cast<SCEVAddExpr>(Expr)->getNoWrapFlags();
12294 return true;
12295}
12296
12297std::optional<APInt>
12299 // We avoid subtracting expressions here because this function is usually
12300 // fairly deep in the call stack (i.e. is called many times).
12301
12302 unsigned BW = getTypeSizeInBits(More->getType());
12303 APInt Diff(BW, 0);
12304 APInt DiffMul(BW, 1);
12305 // Try various simplifications to reduce the difference to a constant. Limit
12306 // the number of allowed simplifications to keep compile-time low.
12307 for (unsigned I = 0; I < 8; ++I) {
12308 if (More == Less)
12309 return Diff;
12310
12311 // Reduce addrecs with identical steps to their start value.
12313 const auto *LAR = cast<SCEVAddRecExpr>(Less);
12314 const auto *MAR = cast<SCEVAddRecExpr>(More);
12315
12316 if (LAR->getLoop() != MAR->getLoop())
12317 return std::nullopt;
12318
12319 // We look at affine expressions only; not for correctness but to keep
12320 // getStepRecurrence cheap.
12321 if (!LAR->isAffine() || !MAR->isAffine())
12322 return std::nullopt;
12323
12324 if (LAR->getStepRecurrence(*this) != MAR->getStepRecurrence(*this))
12325 return std::nullopt;
12326
12327 Less = LAR->getStart();
12328 More = MAR->getStart();
12329 continue;
12330 }
12331
12332 // Try to match a common constant multiply.
12333 auto MatchConstMul =
12334 [](const SCEV *S) -> std::optional<std::pair<const SCEV *, APInt>> {
12335 const APInt *C;
12336 const SCEV *Op;
12337 if (match(S, m_scev_Mul(m_scev_APInt(C), m_SCEV(Op))))
12338 return {{Op, *C}};
12339 return std::nullopt;
12340 };
12341 if (auto MatchedMore = MatchConstMul(More)) {
12342 if (auto MatchedLess = MatchConstMul(Less)) {
12343 if (MatchedMore->second == MatchedLess->second) {
12344 More = MatchedMore->first;
12345 Less = MatchedLess->first;
12346 DiffMul *= MatchedMore->second;
12347 continue;
12348 }
12349 }
12350 }
12351
12352 // Try to cancel out common factors in two add expressions.
12354 auto Add = [&](const SCEV *S, int Mul) {
12355 if (auto *C = dyn_cast<SCEVConstant>(S)) {
12356 if (Mul == 1) {
12357 Diff += C->getAPInt() * DiffMul;
12358 } else {
12359 assert(Mul == -1);
12360 Diff -= C->getAPInt() * DiffMul;
12361 }
12362 } else
12363 Multiplicity[S] += Mul;
12364 };
12365 auto Decompose = [&](const SCEV *S, int Mul) {
12366 if (isa<SCEVAddExpr>(S)) {
12367 for (const SCEV *Op : S->operands())
12368 Add(Op, Mul);
12369 } else
12370 Add(S, Mul);
12371 };
12372 Decompose(More, 1);
12373 Decompose(Less, -1);
12374
12375 // Check whether all the non-constants cancel out, or reduce to new
12376 // More/Less values.
12377 const SCEV *NewMore = nullptr, *NewLess = nullptr;
12378 for (const auto &[S, Mul] : Multiplicity) {
12379 if (Mul == 0)
12380 continue;
12381 if (Mul == 1) {
12382 if (NewMore)
12383 return std::nullopt;
12384 NewMore = S;
12385 } else if (Mul == -1) {
12386 if (NewLess)
12387 return std::nullopt;
12388 NewLess = S;
12389 } else
12390 return std::nullopt;
12391 }
12392
12393 // Values stayed the same, no point in trying further.
12394 if (NewMore == More || NewLess == Less)
12395 return std::nullopt;
12396
12397 More = NewMore;
12398 Less = NewLess;
12399
12400 // Reduced to constant.
12401 if (!More && !Less)
12402 return Diff;
12403
12404 // Left with variable on only one side, bail out.
12405 if (!More || !Less)
12406 return std::nullopt;
12407 }
12408
12409 // Did not reduce to constant.
12410 return std::nullopt;
12411}
12412
12413bool ScalarEvolution::isImpliedCondOperandsViaAddRecStart(
12414 CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const SCEV *FoundLHS,
12415 const SCEV *FoundRHS, const Instruction *CtxI) {
12416 // Try to recognize the following pattern:
12417 //
12418 // FoundRHS = ...
12419 // ...
12420 // loop:
12421 // FoundLHS = {Start,+,W}
12422 // context_bb: // Basic block from the same loop
12423 // known(Pred, FoundLHS, FoundRHS)
12424 //
12425 // If some predicate is known in the context of a loop, it is also known on
12426 // each iteration of this loop, including the first iteration. Therefore, in
12427 // this case, `FoundLHS Pred FoundRHS` implies `Start Pred FoundRHS`. Try to
12428 // prove the original pred using this fact.
12429 if (!CtxI)
12430 return false;
12431 const BasicBlock *ContextBB = CtxI->getParent();
12432 // Make sure AR varies in the context block.
12433 if (auto *AR = dyn_cast<SCEVAddRecExpr>(FoundLHS)) {
12434 const Loop *L = AR->getLoop();
12435 const auto *Latch = L->getLoopLatch();
12436 // Make sure that context belongs to the loop and executes on 1st iteration
12437 // (if it ever executes at all).
12438 if (!L->contains(ContextBB) || !Latch || !DT.dominates(ContextBB, Latch))
12439 return false;
12440 if (!isAvailableAtLoopEntry(FoundRHS, AR->getLoop()))
12441 return false;
12442 return isImpliedCondOperands(Pred, LHS, RHS, AR->getStart(), FoundRHS);
12443 }
12444
12445 if (auto *AR = dyn_cast<SCEVAddRecExpr>(FoundRHS)) {
12446 const Loop *L = AR->getLoop();
12447 const auto *Latch = L->getLoopLatch();
12448 // Make sure that context belongs to the loop and executes on 1st iteration
12449 // (if it ever executes at all).
12450 if (!L->contains(ContextBB) || !Latch || !DT.dominates(ContextBB, Latch))
12451 return false;
12452 if (!isAvailableAtLoopEntry(FoundLHS, AR->getLoop()))
12453 return false;
12454 return isImpliedCondOperands(Pred, LHS, RHS, FoundLHS, AR->getStart());
12455 }
12456
12457 return false;
12458}
12459
12460bool ScalarEvolution::isImpliedCondOperandsViaNoOverflow(CmpPredicate Pred,
12461 const SCEV *LHS,
12462 const SCEV *RHS,
12463 const SCEV *FoundLHS,
12464 const SCEV *FoundRHS) {
12466 return false;
12467
12468 const auto *AddRecLHS = dyn_cast<SCEVAddRecExpr>(LHS);
12469 if (!AddRecLHS)
12470 return false;
12471
12472 const auto *AddRecFoundLHS = dyn_cast<SCEVAddRecExpr>(FoundLHS);
12473 if (!AddRecFoundLHS)
12474 return false;
12475
12476 // We'd like to let SCEV reason about control dependencies, so we constrain
12477 // both the inequalities to be about add recurrences on the same loop. This
12478 // way we can use isLoopEntryGuardedByCond later.
12479
12480 const Loop *L = AddRecFoundLHS->getLoop();
12481 if (L != AddRecLHS->getLoop())
12482 return false;
12483
12484 // FoundLHS u< FoundRHS u< -C => (FoundLHS + C) u< (FoundRHS + C) ... (1)
12485 //
12486 // FoundLHS s< FoundRHS s< INT_MIN - C => (FoundLHS + C) s< (FoundRHS + C)
12487 // ... (2)
12488 //
12489 // Informal proof for (2), assuming (1) [*]:
12490 //
12491 // We'll also assume (A s< B) <=> ((A + INT_MIN) u< (B + INT_MIN)) ... (3)[**]
12492 //
12493 // Then
12494 //
12495 // FoundLHS s< FoundRHS s< INT_MIN - C
12496 // <=> (FoundLHS + INT_MIN) u< (FoundRHS + INT_MIN) u< -C [ using (3) ]
12497 // <=> (FoundLHS + INT_MIN + C) u< (FoundRHS + INT_MIN + C) [ using (1) ]
12498 // <=> (FoundLHS + INT_MIN + C + INT_MIN) s<
12499 // (FoundRHS + INT_MIN + C + INT_MIN) [ using (3) ]
12500 // <=> FoundLHS + C s< FoundRHS + C
12501 //
12502 // [*]: (1) can be proved by ruling out overflow.
12503 //
12504 // [**]: This can be proved by analyzing all the four possibilities:
12505 // (A s< 0, B s< 0), (A s< 0, B s>= 0), (A s>= 0, B s< 0) and
12506 // (A s>= 0, B s>= 0).
12507 //
12508 // Note:
12509 // Despite (2), "FoundRHS s< INT_MIN - C" does not mean that "FoundRHS + C"
12510 // will not sign underflow. For instance, say FoundLHS = (i8 -128), FoundRHS
12511 // = (i8 -127) and C = (i8 -100). Then INT_MIN - C = (i8 -28), and FoundRHS
12512 // s< (INT_MIN - C). Lack of sign overflow / underflow in "FoundRHS + C" is
12513 // neither necessary nor sufficient to prove "(FoundLHS + C) s< (FoundRHS +
12514 // C)".
12515
12516 std::optional<APInt> LDiff = computeConstantDifference(LHS, FoundLHS);
12517 if (!LDiff)
12518 return false;
12519 std::optional<APInt> RDiff = computeConstantDifference(RHS, FoundRHS);
12520 if (!RDiff || *LDiff != *RDiff)
12521 return false;
12522
12523 if (LDiff->isMinValue())
12524 return true;
12525
12526 APInt FoundRHSLimit;
12527
12528 if (Pred == CmpInst::ICMP_ULT) {
12529 FoundRHSLimit = -(*RDiff);
12530 } else {
12531 assert(Pred == CmpInst::ICMP_SLT && "Checked above!");
12532 FoundRHSLimit = APInt::getSignedMinValue(getTypeSizeInBits(RHS->getType())) - *RDiff;
12533 }
12534
12535 // Try to prove (1) or (2), as needed.
12536 return isAvailableAtLoopEntry(FoundRHS, L) &&
12537 isLoopEntryGuardedByCond(L, Pred, FoundRHS,
12538 getConstant(FoundRHSLimit));
12539}
12540
12541bool ScalarEvolution::isImpliedViaMerge(CmpPredicate Pred, const SCEV *LHS,
12542 const SCEV *RHS, const SCEV *FoundLHS,
12543 const SCEV *FoundRHS, unsigned Depth) {
12544 const PHINode *LPhi = nullptr, *RPhi = nullptr;
12545
12546 llvm::scope_exit ClearOnExit([&]() {
12547 if (LPhi) {
12548 bool Erased = PendingMerges.erase(LPhi);
12549 assert(Erased && "Failed to erase LPhi!");
12550 (void)Erased;
12551 }
12552 if (RPhi) {
12553 bool Erased = PendingMerges.erase(RPhi);
12554 assert(Erased && "Failed to erase RPhi!");
12555 (void)Erased;
12556 }
12557 });
12558
12559 // Find respective Phis and check that they are not being pending.
12560 if (const SCEVUnknown *LU = dyn_cast<SCEVUnknown>(LHS))
12561 if (auto *Phi = dyn_cast<PHINode>(LU->getValue())) {
12562 if (!PendingMerges.insert(Phi).second)
12563 return false;
12564 LPhi = Phi;
12565 }
12566 if (const SCEVUnknown *RU = dyn_cast<SCEVUnknown>(RHS))
12567 if (auto *Phi = dyn_cast<PHINode>(RU->getValue())) {
12568 // If we detect a loop of Phi nodes being processed by this method, for
12569 // example:
12570 //
12571 // %a = phi i32 [ %some1, %preheader ], [ %b, %latch ]
12572 // %b = phi i32 [ %some2, %preheader ], [ %a, %latch ]
12573 //
12574 // we don't want to deal with a case that complex, so return conservative
12575 // answer false.
12576 if (!PendingMerges.insert(Phi).second)
12577 return false;
12578 RPhi = Phi;
12579 }
12580
12581 // If none of LHS, RHS is a Phi, nothing to do here.
12582 if (!LPhi && !RPhi)
12583 return false;
12584
12585 // If there is a SCEVUnknown Phi we are interested in, make it left.
12586 if (!LPhi) {
12587 std::swap(LHS, RHS);
12588 std::swap(FoundLHS, FoundRHS);
12589 std::swap(LPhi, RPhi);
12591 }
12592
12593 assert(LPhi && "LPhi should definitely be a SCEVUnknown Phi!");
12594 const BasicBlock *LBB = LPhi->getParent();
12595 const SCEVAddRecExpr *RAR = dyn_cast<SCEVAddRecExpr>(RHS);
12596
12597 auto ProvedEasily = [&](const SCEV *S1, const SCEV *S2) {
12598 return isKnownViaNonRecursiveReasoning(Pred, S1, S2) ||
12599 isImpliedCondOperandsViaRanges(Pred, S1, S2, Pred, FoundLHS, FoundRHS) ||
12600 isImpliedViaOperations(Pred, S1, S2, FoundLHS, FoundRHS, Depth);
12601 };
12602
12603 if (RPhi && RPhi->getParent() == LBB) {
12604 // Case one: RHS is also a SCEVUnknown Phi from the same basic block.
12605 // If we compare two Phis from the same block, and for each entry block
12606 // the predicate is true for incoming values from this block, then the
12607 // predicate is also true for the Phis.
12608 for (const BasicBlock *IncBB : predecessors(LBB)) {
12609 const SCEV *L = getSCEV(LPhi->getIncomingValueForBlock(IncBB));
12610 const SCEV *R = getSCEV(RPhi->getIncomingValueForBlock(IncBB));
12611 if (!ProvedEasily(L, R))
12612 return false;
12613 }
12614 } else if (RAR && RAR->getLoop()->getHeader() == LBB) {
12615 // Case two: RHS is also a Phi from the same basic block, and it is an
12616 // AddRec. It means that there is a loop which has both AddRec and Unknown
12617 // PHIs, for it we can compare incoming values of AddRec from above the loop
12618 // and latch with their respective incoming values of LPhi.
12619 // TODO: Generalize to handle loops with many inputs in a header.
12620 if (LPhi->getNumIncomingValues() != 2) return false;
12621
12622 auto *RLoop = RAR->getLoop();
12623 auto *Predecessor = RLoop->getLoopPredecessor();
12624 assert(Predecessor && "Loop with AddRec with no predecessor?");
12625 const SCEV *L1 = getSCEV(LPhi->getIncomingValueForBlock(Predecessor));
12626 if (!ProvedEasily(L1, RAR->getStart()))
12627 return false;
12628 auto *Latch = RLoop->getLoopLatch();
12629 assert(Latch && "Loop with AddRec with no latch?");
12630 const SCEV *L2 = getSCEV(LPhi->getIncomingValueForBlock(Latch));
12631 if (!ProvedEasily(L2, RAR->getPostIncExpr(*this)))
12632 return false;
12633 } else {
12634 // In all other cases go over inputs of LHS and compare each of them to RHS,
12635 // the predicate is true for (LHS, RHS) if it is true for all such pairs.
12636 // At this point RHS is either a non-Phi, or it is a Phi from some block
12637 // different from LBB.
12638 for (const BasicBlock *IncBB : predecessors(LBB)) {
12639 // Check that RHS is available in this block.
12640 if (!dominates(RHS, IncBB))
12641 return false;
12642 const SCEV *L = getSCEV(LPhi->getIncomingValueForBlock(IncBB));
12643 // Make sure L does not refer to a value from a potentially previous
12644 // iteration of a loop.
12645 if (!properlyDominates(L, LBB))
12646 return false;
12647 // Addrecs are considered to properly dominate their loop, so are missed
12648 // by the previous check. Discard any values that have computable
12649 // evolution in this loop.
12650 if (auto *Loop = LI.getLoopFor(LBB))
12652 return false;
12653 if (!ProvedEasily(L, RHS))
12654 return false;
12655 }
12656 }
12657 return true;
12658}
12659
12660bool ScalarEvolution::isImpliedCondOperandsViaShift(CmpPredicate Pred,
12661 const SCEV *LHS,
12662 const SCEV *RHS,
12663 const SCEV *FoundLHS,
12664 const SCEV *FoundRHS) {
12665 // We want to imply LHS < RHS from LHS < (RHS >> shiftvalue). First, make
12666 // sure that we are dealing with same LHS.
12667 if (RHS == FoundRHS) {
12668 std::swap(LHS, RHS);
12669 std::swap(FoundLHS, FoundRHS);
12671 }
12672 if (LHS != FoundLHS)
12673 return false;
12674
12675 auto *SUFoundRHS = dyn_cast<SCEVUnknown>(FoundRHS);
12676 if (!SUFoundRHS)
12677 return false;
12678
12679 Value *Shiftee, *ShiftValue;
12680
12681 using namespace PatternMatch;
12682 if (match(SUFoundRHS->getValue(),
12683 m_LShr(m_Value(Shiftee), m_Value(ShiftValue)))) {
12684 auto *ShifteeS = getSCEV(Shiftee);
12685 // Prove one of the following:
12686 // LHS <u (shiftee >> shiftvalue) && shiftee <=u RHS ---> LHS <u RHS
12687 // LHS <=u (shiftee >> shiftvalue) && shiftee <=u RHS ---> LHS <=u RHS
12688 // LHS <s (shiftee >> shiftvalue) && shiftee <=s RHS && shiftee >=s 0
12689 // ---> LHS <s RHS
12690 // LHS <=s (shiftee >> shiftvalue) && shiftee <=s RHS && shiftee >=s 0
12691 // ---> LHS <=s RHS
12693 return isKnownPredicate(ICmpInst::ICMP_ULE, ShifteeS, RHS);
12695 if (isKnownNonNegative(ShifteeS))
12696 return isKnownPredicate(ICmpInst::ICMP_SLE, ShifteeS, RHS);
12697 }
12698
12699 return false;
12700}
12701
12702bool ScalarEvolution::isImpliedCondOperandsViaMatchingDiff(
12703 CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const SCEV *FoundLHS,
12704 const SCEV *FoundRHS) {
12705 // Only valid for equality predicates: (A == B) implies (C == D) when
12706 // the SCEV difference A - B equals C - D (they check the same
12707 // underlying relationship at every iteration).
12709 return false;
12710
12711 // Restrict to cases involving loop recurrences - that's where this
12712 // pattern arises (correlated IV comparisons). This avoids calling
12713 // getMinusSCEV on arbitrary non-loop expressions.
12715 (!isa<SCEVAddRecExpr>(FoundLHS) && !isa<SCEVAddRecExpr>(FoundRHS)))
12716 return false;
12717
12718 // AddRecs from different loops can never produce matching differences.
12719 const SCEVAddRecExpr *QueryAddRec = dyn_cast<SCEVAddRecExpr>(LHS);
12720 if (!QueryAddRec)
12721 QueryAddRec = cast<SCEVAddRecExpr>(RHS);
12722 const SCEVAddRecExpr *FoundAddRec = dyn_cast<SCEVAddRecExpr>(FoundLHS);
12723 if (!FoundAddRec)
12724 FoundAddRec = cast<SCEVAddRecExpr>(FoundRHS);
12725 if (QueryAddRec->getLoop() != FoundAddRec->getLoop())
12726 return false;
12727
12728 // If the strides differ, the differences can never match.
12729 if (QueryAddRec->getStepRecurrence(*this) !=
12730 FoundAddRec->getStepRecurrence(*this))
12731 return false;
12732
12733 // Compute differences. For pointer-typed operands sharing the same base,
12734 // getMinusSCEV strips the common base and returns an integer SCEV.
12735 // For example, {base,+,8} - (base+8*n) = {-8n,+,8}
12736 const SCEV *FoundDiff = getMinusSCEV(FoundLHS, FoundRHS);
12737 if (isa<SCEVCouldNotCompute>(FoundDiff))
12738 return false;
12739
12740 const SCEV *Diff = getMinusSCEV(LHS, RHS);
12741 if (isa<SCEVCouldNotCompute>(Diff))
12742 return false;
12743
12744 return Diff == FoundDiff;
12745}
12746
12747bool ScalarEvolution::isImpliedCondOperands(CmpPredicate Pred, const SCEV *LHS,
12748 const SCEV *RHS,
12749 const SCEV *FoundLHS,
12750 const SCEV *FoundRHS,
12751 const Instruction *CtxI) {
12752 return isImpliedCondOperandsViaRanges(Pred, LHS, RHS, Pred, FoundLHS,
12753 FoundRHS) ||
12754 isImpliedCondOperandsViaNoOverflow(Pred, LHS, RHS, FoundLHS,
12755 FoundRHS) ||
12756 isImpliedCondOperandsViaShift(Pred, LHS, RHS, FoundLHS, FoundRHS) ||
12757 isImpliedCondOperandsViaAddRecStart(Pred, LHS, RHS, FoundLHS, FoundRHS,
12758 CtxI) ||
12759 isImpliedCondOperandsViaMatchingDiff(Pred, LHS, RHS, FoundLHS,
12760 FoundRHS) ||
12761 isImpliedCondOperandsHelper(Pred, LHS, RHS, FoundLHS, FoundRHS);
12762}
12763
12764/// Is MaybeMinMaxExpr an (U|S)(Min|Max) of Candidate and some other values?
12765template <typename MinMaxExprType>
12766static bool IsMinMaxConsistingOf(const SCEV *MaybeMinMaxExpr,
12767 const SCEV *Candidate) {
12768 const MinMaxExprType *MinMaxExpr = dyn_cast<MinMaxExprType>(MaybeMinMaxExpr);
12769 if (!MinMaxExpr)
12770 return false;
12771
12772 return is_contained(MinMaxExpr->operands(), Candidate);
12773}
12774
12776 CmpPredicate Pred, const SCEV *LHS,
12777 const SCEV *RHS) {
12778 // If both sides are affine addrecs for the same loop, with equal
12779 // steps, and we know the recurrences don't wrap, then we only
12780 // need to check the predicate on the starting values.
12781
12783 return false;
12784
12785 const SCEV *LStart, *RStart, *Step;
12786 const Loop *L;
12787 if (!match(LHS,
12788 m_scev_AffineAddRec(m_SCEV(LStart), m_SCEV(Step), m_Loop(L))) ||
12790 m_SpecificLoop(L))))
12791 return false;
12795 if (!LAR->getNoWrapFlags(NW) || !RAR->getNoWrapFlags(NW))
12796 return false;
12797
12798 return SE.isKnownPredicate(Pred, LStart, RStart);
12799}
12800
12801/// Is LHS `Pred` RHS true because one of them is an AddRec that is known not to
12802/// go below its own start value?
12805 const SCEV *LHS,
12806 const SCEV *RHS) {
12807 // Normalize to (AddRec Pred Start).
12810 std::swap(LHS, RHS);
12811 }
12812
12813 // The recurrence is equal to Start in the first iteration, so only the
12814 // non-strict predicate holds.
12816 return false;
12817
12818 const auto *AR = dyn_cast<SCEVAddRecExpr>(LHS);
12819 if (!AR || AR->getStart() != RHS)
12820 return false;
12821
12822 return SE.getMonotonicPredicateType(AR, Pred) ==
12824}
12825
12826/// Is LHS `Pred` RHS true on the virtue of LHS or RHS being a Min or Max
12827/// expression?
12829 const SCEV *LHS, const SCEV *RHS) {
12830 switch (Pred) {
12831 default:
12832 return false;
12833
12834 case ICmpInst::ICMP_SGE:
12835 std::swap(LHS, RHS);
12836 [[fallthrough]];
12837 case ICmpInst::ICMP_SLE:
12838 return
12839 // min(A, ...) <= A
12841 // A <= max(A, ...)
12843
12844 case ICmpInst::ICMP_UGE:
12845 std::swap(LHS, RHS);
12846 [[fallthrough]];
12847 case ICmpInst::ICMP_ULE:
12848 return
12849 // min(A, ...) <= A
12850 // FIXME: what about umin_seq?
12852 // A <= max(A, ...)
12854
12855 case ICmpInst::ICMP_UGT:
12856 std::swap(LHS, RHS);
12857 [[fallthrough]];
12858 case ICmpInst::ICMP_ULT:
12859 // umin(Ops) u<= each Op, so proving Op u< RHS for any Op proves
12860 // umin(Ops) u< RHS.
12861 //
12862 // Use computeConstantDifference instead of the more powerful
12863 // isKnownPredicate to keep this check cheap: isKnownPredicateViaMinOrMax
12864 // is called from isKnownViaNonRecursiveReasoning, so recursing into
12865 // the full predicate prover would be expensive.
12866 if (const auto *Min = dyn_cast<SCEVUMinExpr>(LHS)) {
12867 for (SCEVUse Op : Min->operands()) {
12868 std::optional<APInt> Diff = SE.computeConstantDifference(RHS, Op);
12869 // When Op and RHS share a common base differing by a
12870 // constant offset D (RHS - Op = D), Op u< RHS holds iff D != 0 and
12871 // RHS >= D (unsigned), i.e. the subtraction doesn't underflow.
12872 if (Diff && !Diff->isZero() && SE.getUnsignedRangeMin(RHS).uge(*Diff))
12873 return true;
12874 }
12875 }
12876 return false;
12877 }
12878
12879 llvm_unreachable("covered switch fell through?!");
12880}
12881
12882bool ScalarEvolution::isImpliedViaOperations(CmpPredicate Pred, const SCEV *LHS,
12883 const SCEV *RHS,
12884 const SCEV *FoundLHS,
12885 const SCEV *FoundRHS,
12886 unsigned Depth) {
12889 "LHS and RHS have different sizes?");
12890 assert(getTypeSizeInBits(FoundLHS->getType()) ==
12891 getTypeSizeInBits(FoundRHS->getType()) &&
12892 "FoundLHS and FoundRHS have different sizes?");
12893 // We want to avoid hurting the compile time with analysis of too big trees.
12894 if (Depth > Opts.scalar_evolution_max_scev_operations_implication_depth)
12895 return false;
12896
12897 // We only want to work with GT comparison so far.
12898 if (ICmpInst::isLT(Pred)) {
12900 std::swap(LHS, RHS);
12901 std::swap(FoundLHS, FoundRHS);
12902 }
12903
12904 CmpInst::Predicate P = Pred.getPreferredSignedPredicate();
12905
12906 // For unsigned, try to reduce it to corresponding signed comparison.
12907 if (P == ICmpInst::ICMP_UGT)
12908 // We can replace unsigned predicate with its signed counterpart if all
12909 // involved values are non-negative.
12910 // TODO: We could have better support for unsigned.
12911 if (isKnownNonNegative(FoundLHS) && isKnownNonNegative(FoundRHS)) {
12912 // Knowing that both FoundLHS and FoundRHS are non-negative, and knowing
12913 // FoundLHS >u FoundRHS, we also know that FoundLHS >s FoundRHS. Let us
12914 // use this fact to prove that LHS and RHS are non-negative.
12915 const SCEV *MinusOne = getMinusOne(LHS->getType());
12916 if (isImpliedCondOperands(ICmpInst::ICMP_SGT, LHS, MinusOne, FoundLHS,
12917 FoundRHS) &&
12918 isImpliedCondOperands(ICmpInst::ICMP_SGT, RHS, MinusOne, FoundLHS,
12919 FoundRHS))
12921 }
12922
12923 if (P != ICmpInst::ICMP_SGT)
12924 return false;
12925
12926 auto GetOpFromSExt = [&](const SCEV *S) -> const SCEV * {
12927 if (auto *Ext = dyn_cast<SCEVSignExtendExpr>(S))
12928 return Ext->getOperand();
12929 // TODO: If S is a SCEVConstant then you can cheaply "strip" the sext off
12930 // the constant in some cases.
12931 return S;
12932 };
12933
12934 // Acquire values from extensions.
12935 auto *OrigLHS = LHS;
12936 auto *OrigFoundLHS = FoundLHS;
12937 LHS = GetOpFromSExt(LHS);
12938 FoundLHS = GetOpFromSExt(FoundLHS);
12939
12940 // Is the SGT predicate can be proved trivially or using the found context.
12941 auto IsSGTViaContext = [&](const SCEV *S1, const SCEV *S2) {
12942 return isKnownViaNonRecursiveReasoning(ICmpInst::ICMP_SGT, S1, S2) ||
12943 isImpliedViaOperations(ICmpInst::ICMP_SGT, S1, S2, OrigFoundLHS,
12944 FoundRHS, Depth + 1);
12945 };
12946
12947 SCEVUse LL;
12948 SCEVUse LR;
12949 if (match(LHS, m_scev_NSWAdd(m_SCEV(LL), m_SCEV(LR)))) {
12950 // We want to avoid creation of any new non-constant SCEV. Since we are
12951 // going to compare the operands to RHS, we should be certain that we don't
12952 // need any size extensions for this. So let's decline all cases when the
12953 // sizes of types of LHS and RHS do not match.
12954 // TODO: Maybe try to get RHS from sext to catch more cases?
12956 return false;
12957
12958 auto *MinusOne = getMinusOne(RHS->getType());
12959
12960 // Checks that S1 >= 0 && S2 > RHS, trivially or using the found context.
12961 auto IsSumGreaterThanRHS = [&](const SCEV *S1, const SCEV *S2) {
12962 return IsSGTViaContext(S1, MinusOne) && IsSGTViaContext(S2, RHS);
12963 };
12964 // Try to prove the following rule:
12965 // (LHS = LL + LR) && (LL >= 0) && (LR > RHS) => (LHS > RHS).
12966 // (LHS = LL + LR) && (LR >= 0) && (LL > RHS) => (LHS > RHS).
12967 if (IsSumGreaterThanRHS(LL, LR) || IsSumGreaterThanRHS(LR, LL))
12968 return true;
12969 } else if (auto *LHSUnknownExpr = dyn_cast<SCEVUnknown>(LHS)) {
12970 Value *LL, *LR;
12971 // FIXME: Once we have SDiv implemented, we can get rid of this matching.
12972
12973 using namespace llvm::PatternMatch;
12974
12975 if (match(LHSUnknownExpr->getValue(), m_SDiv(m_Value(LL), m_Value(LR)))) {
12976 // Rules for division.
12977 // We are going to perform some comparisons with Denominator and its
12978 // derivative expressions. In general case, creating a SCEV for it may
12979 // lead to a complex analysis of the entire graph, and in particular it
12980 // can request trip count recalculation for the same loop. This would
12981 // cache as SCEVCouldNotCompute to avoid the infinite recursion. To avoid
12982 // this, we only want to create SCEVs that are constants in this section.
12983 // So we bail if Denominator is not a constant.
12984 if (!isa<ConstantInt>(LR))
12985 return false;
12986
12987 auto *Denominator = cast<SCEVConstant>(getSCEV(LR));
12988
12989 // We want to make sure that LHS = FoundLHS / Denominator. If it is so,
12990 // then a SCEV for the numerator already exists and matches with FoundLHS.
12991 auto *Numerator = getExistingSCEV(LL);
12992 if (!Numerator || Numerator->getType() != FoundLHS->getType())
12993 return false;
12994
12995 // Make sure that the numerator matches with FoundLHS and the denominator
12996 // is positive.
12997 if (!HasSameValue(Numerator, FoundLHS) || !isKnownPositive(Denominator))
12998 return false;
12999
13000 auto *DTy = Denominator->getType();
13001 auto *FRHSTy = FoundRHS->getType();
13002 if (DTy->isPointerTy() != FRHSTy->isPointerTy())
13003 // One of types is a pointer and another one is not. We cannot extend
13004 // them properly to a wider type, so let us just reject this case.
13005 // TODO: Usage of getEffectiveSCEVType for DTy, FRHSTy etc should help
13006 // to avoid this check.
13007 return false;
13008
13009 // Given that:
13010 // FoundLHS > FoundRHS, LHS = FoundLHS / Denominator, Denominator > 0.
13011 auto *WTy = getWiderType(DTy, FRHSTy);
13012 auto *DenominatorExt = getNoopOrSignExtend(Denominator, WTy);
13013 auto *FoundRHSExt = getNoopOrSignExtend(FoundRHS, WTy);
13014
13015 // Try to prove the following rule:
13016 // (FoundRHS > Denominator - 2) && (RHS <= 0) => (LHS > RHS).
13017 // For example, given that FoundLHS > 2. It means that FoundLHS is at
13018 // least 3. If we divide it by Denominator < 4, we will have at least 1.
13019 auto *DenomMinusTwo = getMinusSCEV(DenominatorExt, getConstant(WTy, 2));
13020 if (isKnownNonPositive(RHS) &&
13021 IsSGTViaContext(FoundRHSExt, DenomMinusTwo))
13022 return true;
13023
13024 // Try to prove the following rule:
13025 // (FoundRHS > -1 - Denominator) && (RHS < 0) => (LHS > RHS).
13026 // For example, given that FoundLHS > -3. Then FoundLHS is at least -2.
13027 // If we divide it by Denominator > 2, then:
13028 // 1. If FoundLHS is negative, then the result is 0.
13029 // 2. If FoundLHS is non-negative, then the result is non-negative.
13030 // Anyways, the result is non-negative.
13031 auto *MinusOne = getMinusOne(WTy);
13032 auto *NegDenomMinusOne = getMinusSCEV(MinusOne, DenominatorExt);
13033 if (isKnownNegative(RHS) &&
13034 IsSGTViaContext(FoundRHSExt, NegDenomMinusOne))
13035 return true;
13036 }
13037 }
13038
13039 // If our expression contained SCEVUnknown Phis, and we split it down and now
13040 // need to prove something for them, try to prove the predicate for every
13041 // possible incoming values of those Phis.
13042 if (isImpliedViaMerge(Pred, OrigLHS, RHS, OrigFoundLHS, FoundRHS, Depth + 1))
13043 return true;
13044
13045 return false;
13046}
13047
13049 const SCEV *RHS) {
13050 // zext x u<= sext x, sext x s<= zext x
13051 const SCEV *Op;
13052 switch (Pred) {
13053 case ICmpInst::ICMP_SGE:
13054 std::swap(LHS, RHS);
13055 [[fallthrough]];
13056 case ICmpInst::ICMP_SLE: {
13057 // If operand >=s 0 then ZExt == SExt. If operand <s 0 then SExt <s ZExt.
13058 return match(LHS, m_scev_SExt(m_SCEV(Op))) &&
13060 }
13061 case ICmpInst::ICMP_UGE:
13062 std::swap(LHS, RHS);
13063 [[fallthrough]];
13064 case ICmpInst::ICMP_ULE: {
13065 // If operand >=u 0 then ZExt == SExt. If operand <u 0 then ZExt <u SExt.
13066 return match(LHS, m_scev_ZExt(m_SCEV(Op))) &&
13068 }
13069 default:
13070 return false;
13071 };
13072 llvm_unreachable("unhandled case");
13073}
13074
13075bool ScalarEvolution::isKnownViaNonRecursiveReasoning(CmpPredicate Pred,
13076 SCEVUse LHS,
13077 SCEVUse RHS) {
13079 isKnownPredicateViaConstantRanges(Pred, LHS, RHS) ||
13083 isKnownPredicateViaNoOverflow(Pred, LHS, RHS);
13084}
13085
13086bool ScalarEvolution::isImpliedCondOperandsHelper(CmpPredicate Pred,
13087 const SCEV *LHS,
13088 const SCEV *RHS,
13089 const SCEV *FoundLHS,
13090 const SCEV *FoundRHS) {
13092 if (HasSameValue(LHS, FoundLHS) && HasSameValue(RHS, FoundRHS))
13093 return true;
13094 } else {
13096 if (isKnownViaNonRecursiveReasoning(NonStrictPred, LHS, FoundLHS) &&
13097 isKnownViaNonRecursiveReasoning(
13098 ICmpInst::getSwappedPredicate(NonStrictPred), RHS, FoundRHS))
13099 return true;
13100 }
13101
13102 // Maybe it can be proved via operations?
13103 return isImpliedViaOperations(Pred, LHS, RHS, FoundLHS, FoundRHS);
13104}
13105
13106bool ScalarEvolution::isImpliedCondOperandsViaRanges(
13107 CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, CmpPredicate FoundPred,
13108 const SCEV *FoundLHS, const SCEV *FoundRHS) {
13109 if (!isa<SCEVConstant>(RHS) || !isa<SCEVConstant>(FoundRHS))
13110 // The restriction on `FoundRHS` be lifted easily -- it exists only to
13111 // reduce the compile time impact of this optimization.
13112 return false;
13113
13114 std::optional<APInt> Addend = computeConstantDifference(LHS, FoundLHS);
13115 if (!Addend)
13116 return false;
13117
13118 const APInt &ConstFoundRHS = cast<SCEVConstant>(FoundRHS)->getAPInt();
13119
13120 // `FoundLHSRange` is the range we know `FoundLHS` to be in by virtue of the
13121 // antecedent "`FoundLHS` `FoundPred` `FoundRHS`".
13122 ConstantRange FoundLHSRange =
13123 ConstantRange::makeExactICmpRegion(FoundPred, ConstFoundRHS);
13124
13125 // Since `LHS` is `FoundLHS` + `Addend`, we can compute a range for `LHS`:
13126 ConstantRange LHSRange = FoundLHSRange.add(ConstantRange(*Addend));
13127
13128 // We can also compute the range of values for `LHS` that satisfy the
13129 // consequent, "`LHS` `Pred` `RHS`":
13130 const APInt &ConstRHS = cast<SCEVConstant>(RHS)->getAPInt();
13131 // The antecedent implies the consequent if every value of `LHS` that
13132 // satisfies the antecedent also satisfies the consequent.
13133 return LHSRange.icmp(Pred, ConstRHS);
13134}
13135
13136bool ScalarEvolution::canIVOverflowOnLT(const SCEV *RHS, const SCEV *Stride,
13137 bool IsSigned, bool Invert) {
13138 assert(isKnownPositive(Stride) && "Positive stride expected!");
13139
13140 unsigned BitWidth = getTypeSizeInBits(RHS->getType());
13141 const SCEV *One = getOne(Stride->getType());
13142
13143 if (IsSigned) {
13144 APInt MaxRHS = getRangeMax(RHS, /*IsSigned=*/true, Invert);
13145 APInt MaxValue = APInt::getSignedMaxValue(BitWidth);
13146 APInt MaxStrideMinusOne = getSignedRangeMax(getMinusSCEV(Stride, One));
13147
13148 // SMaxRHS + SMaxStrideMinusOne > SMaxValue => overflow!
13149 return (std::move(MaxValue) - MaxStrideMinusOne).slt(MaxRHS);
13150 }
13151
13152 APInt MaxRHS = getRangeMax(RHS, /*IsSigned=*/false, Invert);
13153 APInt MaxValue = APInt::getMaxValue(BitWidth);
13154 APInt MaxStrideMinusOne = getUnsignedRangeMax(getMinusSCEV(Stride, One));
13155
13156 // UMaxRHS + UMaxStrideMinusOne > UMaxValue => overflow!
13157 return (std::move(MaxValue) - MaxStrideMinusOne).ult(MaxRHS);
13158}
13159
13161 // umin(N, 1) + floor((N - umin(N, 1)) / D)
13162 // This is equivalent to "1 + floor((N - 1) / D)" for N != 0. The umin
13163 // expression fixes the case of N=0.
13164 const SCEV *MinNOne = getUMinExpr(N, getOne(N->getType()));
13165 const SCEV *NMinusOne = getMinusSCEV(N, MinNOne);
13166 return getAddExpr(MinNOne, getUDivExpr(NMinusOne, D));
13167}
13168
13169const SCEV *
13170ScalarEvolution::computeMaxBECountForLT(const SCEV *Start, const SCEV *Stride,
13171 const SCEV *End, unsigned BitWidth,
13172 bool IsSigned, bool Invert) {
13173 // The logic in this function assumes we can represent a positive stride.
13174 // If we can't, the backedge-taken count must be zero.
13175 if (IsSigned && BitWidth == 1)
13176 return getZero(Stride->getType());
13177
13178 // This code below only been closely audited for negative strides in the
13179 // unsigned comparison case, it may be correct for signed comparison, but
13180 // that needs to be established.
13181 if (IsSigned && isKnownNegative(Stride))
13182 return getCouldNotCompute();
13183
13184 // Calculate the maximum backedge count based on the range of values
13185 // permitted by Start, End, and Stride. If Invert is true, both Start and End
13186 // need inverting. Stride was already negated by the caller.
13187 APInt MinStart = getRangeMin(Start, IsSigned, Invert);
13188
13189 APInt MinStride =
13190 IsSigned ? getSignedRangeMin(Stride) : getUnsignedRangeMin(Stride);
13191
13192 // We assume either the stride is positive, or the backedge-taken count
13193 // is zero. So force StrideForMaxBECount to be at least one.
13194 APInt One(BitWidth, 1);
13195 APInt StrideForMaxBECount = IsSigned ? APIntOps::smax(One, MinStride)
13196 : APIntOps::umax(One, MinStride);
13197
13198 APInt MaxValue = IsSigned ? APInt::getSignedMaxValue(BitWidth)
13199 : APInt::getMaxValue(BitWidth);
13200 APInt Limit = MaxValue - (StrideForMaxBECount - 1);
13201
13202 // Although End can be a MAX expression we estimate MaxEnd considering only
13203 // the case End = RHS of the loop termination condition. This is safe because
13204 // in the other case (End - Start) is zero, leading to a zero maximum backedge
13205 // taken count.
13206 APInt MaxEnd = getRangeMax(End, IsSigned, Invert);
13207 MaxEnd =
13208 IsSigned ? APIntOps::smin(MaxEnd, Limit) : APIntOps::umin(MaxEnd, Limit);
13209
13210 // MaxBECount = ceil((max(MaxEnd, MinStart) - MinStart) / Stride)
13211 MaxEnd = IsSigned ? APIntOps::smax(MaxEnd, MinStart)
13212 : APIntOps::umax(MaxEnd, MinStart);
13213
13214 APInt Delta = MaxEnd - MinStart;
13215
13216 // Try to refine Delta in case End - Start (or Start - End if Invert) gives a
13217 // tighter bound after folding.
13218 const SCEV *DeltaExpr =
13219 Invert ? getMinusSCEV(Start, End) : getMinusSCEV(End, Start);
13220 Delta = APIntOps::umin(Delta, getUnsignedRangeMax(DeltaExpr));
13221
13222 return getUDivCeilSCEV(getConstant(Delta), getConstant(StrideForMaxBECount));
13223}
13224
13226ScalarEvolution::howManyLessThans(const SCEV *LHS, const SCEV *RHS,
13227 const Loop *L, bool IsSigned, bool Invert,
13228 bool ControlsOnlyExit, bool AllowPredicates) {
13230
13231 LoopGuards Guards = LoopGuards::collectOnDemand(L, *this);
13232
13233 // FIXME: Extend the non-invariant RHS analysis to greater-than comparisons.
13234 if (Invert && !isLoopInvariant(RHS, L))
13235 return getCouldNotCompute();
13236
13238 bool PredicatedIV = false;
13239 // FIXME: Generalize the NUW inference below to decreasing IVs.
13240 if (!IV && !Invert) {
13241 if (auto *ZExt = dyn_cast<SCEVZeroExtendExpr>(LHS)) {
13242 const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(ZExt->getOperand());
13243 if (AR && AR->getLoop() == L && AR->isAffine()) {
13244 auto canProveNUW = [&]() {
13245 // We can use the comparison to infer no-wrap flags only if it fully
13246 // controls the loop exit.
13247 if (!ControlsOnlyExit)
13248 return false;
13249
13250 if (!isLoopInvariant(RHS, L))
13251 return false;
13252
13253 if (!isKnownNonZero(AR->getStepRecurrence(*this)))
13254 // We need the sequence defined by AR to strictly increase in the
13255 // unsigned integer domain for the logic below to hold.
13256 return false;
13257
13258 const unsigned InnerBitWidth = getTypeSizeInBits(AR->getType());
13259 const unsigned OuterBitWidth = getTypeSizeInBits(RHS->getType());
13260 // If RHS <=u Limit, then there must exist a value V in the sequence
13261 // defined by AR (e.g. {Start,+,Step}) such that V >u RHS, and
13262 // V <=u UINT_MAX. Thus, we must exit the loop before unsigned
13263 // overflow occurs. This limit also implies that a signed comparison
13264 // (in the wide bitwidth) is equivalent to an unsigned comparison as
13265 // the high bits on both sides must be zero.
13266 APInt StrideMax = getUnsignedRangeMax(AR->getStepRecurrence(*this));
13267 APInt Limit = APInt::getMaxValue(InnerBitWidth) - (StrideMax - 1);
13268 Limit = Limit.zext(OuterBitWidth);
13269 return getUnsignedRangeMax(applyLoopGuards(RHS, Guards)).ule(Limit);
13270 };
13271 auto Flags = AR->getNoWrapFlags();
13272 if (!hasFlags(Flags, SCEV::FlagNUW) && canProveNUW())
13273 Flags = setFlags(Flags, SCEV::FlagNUW);
13274
13275 setNoWrapFlags(const_cast<SCEVAddRecExpr *>(AR), Flags);
13276 if (AR->hasNoUnsignedWrap()) {
13277 // Emulate what getZeroExtendExpr would have done during construction
13278 // if we'd been able to infer the fact just above at that time.
13279 const SCEV *Step = AR->getStepRecurrence(*this);
13280 Type *Ty = ZExt->getType();
13281 const SCEV *S = getAddRecExpr(
13283 getZeroExtendExpr(Step, Ty, 0), L, AR->getNoWrapFlags());
13285 }
13286 }
13287 }
13288 }
13289
13290 if (!IV && AllowPredicates) {
13291 // Try to make this an AddRec using runtime tests, in the first X
13292 // iterations of this loop, where X is the SCEV expression found by the
13293 // algorithm below.
13294 IV = convertSCEVToAddRecWithPredicates(LHS, L, Predicates);
13295 PredicatedIV = true;
13296 }
13297
13298 // Avoid weird loops
13299 if (!IV || IV->getLoop() != L || !IV->isAffine())
13300 return getCouldNotCompute();
13301
13302 // A precondition of this method is that the condition being analyzed
13303 // reaches an exiting branch which dominates the latch. Given that, we can
13304 // assume that an increment which violates the nowrap specification and
13305 // produces poison must cause undefined behavior when the resulting poison
13306 // value is branched upon and thus we can conclude that the backedge is
13307 // taken no more often than would be required to produce that poison value.
13308 // Note that a well defined loop can exit on the iteration which violates
13309 // the nowrap specification if there is another exit (either explicit or
13310 // implicit/exceptional) which causes the loop to execute before the
13311 // exiting instruction we're analyzing would trigger UB.
13312 auto WrapType = IsSigned ? SCEV::FlagNSW : SCEV::FlagNUW;
13313 bool NoWrap = ControlsOnlyExit && any(IV->getNoWrapFlags(WrapType));
13314 // Reverse the ordering for greater-than comparisons.
13316 if (Invert)
13318
13319 // The step of ~IV is the negated step of IV.
13320 const SCEV *Stride = IV->getStepRecurrence(*this);
13321 if (Invert)
13322 Stride = getNegativeSCEV(Stride);
13323 const SCEV *GuardedStride = Stride;
13324
13325 // Whether the IV may reach the maximum (or minimum if inverted) value
13326 // before the exit is taken.
13327 bool IVMayOverflow = true;
13328
13329 bool PositiveStride = isKnownPositive(Stride);
13330 // A dominating guard may prove the stride positive.
13331 if (!PositiveStride) {
13332 const SCEV *LoopGuardedStride = applyLoopGuards(Stride, Guards);
13333 if (isKnownPositive(LoopGuardedStride)) {
13334 GuardedStride = LoopGuardedStride;
13335 PositiveStride = true;
13336 // Encode the context-sensitive stride > 0 fact into the expression
13337 Stride = getUMaxExpr(Stride, getOne(Stride->getType()));
13338 }
13339 }
13340
13341 // Avoid negative or zero stride values.
13342 if (!PositiveStride) {
13343 // FIXME: Generalize the unknown-stride analysis to decreasing IVs.
13344 if (Invert)
13345 return getCouldNotCompute();
13346
13347 // We can compute the correct backedge taken count for loops with unknown
13348 // strides if we can prove that the loop is not an infinite loop with side
13349 // effects. Here's the loop structure we are trying to handle -
13350 //
13351 // i = start
13352 // do {
13353 // A[i] = i;
13354 // i += s;
13355 // } while (i < end);
13356 //
13357 // The backedge taken count for such loops is evaluated as -
13358 // (max(end, start + stride) - start - 1) /u stride
13359 //
13360 // The additional preconditions that we need to check to prove correctness
13361 // of the above formula is as follows -
13362 //
13363 // a) IV is either nuw or nsw depending upon signedness (indicated by the
13364 // NoWrap flag).
13365 // b) the loop is guaranteed to be finite (e.g. is mustprogress and has
13366 // b) the loop is guaranteed to be finite (e.g. is mustprogress and has
13367 // no side effects within the loop) or a predicate is added to ensure
13368 // stride is positive.
13369 // c) loop has a single static exit (with no abnormal exits)
13370 //
13371 // Precondition a) implies that if the stride is negative, this is a single
13372 // trip loop. The backedge taken count formula reduces to zero in this case.
13373 //
13374 // Precondition b) and c) combine to imply that if rhs is invariant in L,
13375 // then a zero stride means the backedge can't be taken without executing
13376 // undefined behavior.
13377 //
13378 // The positive stride case is the same as isKnownPositive(Stride) returning
13379 // true (original behavior of the function).
13380 //
13381 if (PredicatedIV || !NoWrap || !loopHasNoAbnormalExits(L))
13382 return getCouldNotCompute();
13383
13384 if (!loopIsFiniteByAssumption(L)) {
13385 // If the loop may be infinite, add a predicate ensuring Stride is
13386 // positive, to guarantee forward progress.
13387 if (!AllowPredicates || !isLoopInvariant(Stride, L))
13388 return getCouldNotCompute();
13389
13390 const SCEV *Zero = getZero(Stride->getType());
13391 const SCEVPredicate *P =
13393 Predicates.push_back(P);
13394 // When the predicate holds (Stride > 0), umax(Stride, 1) == Stride,
13395 // so the result is unchanged. To prevent div by zero.
13396 Stride = getUMaxExpr(Stride, getOne(Stride->getType()));
13397 } else if (!isKnownNonZero(Stride)) {
13398 // If we have a step of zero, and RHS isn't invariant in L, we don't know
13399 // if it might eventually be greater than start and if so, on which
13400 // iteration. We can't even produce a useful upper bound.
13401 if (!isLoopInvariant(RHS, L))
13402 return getCouldNotCompute();
13403
13404 // We allow a potentially zero stride, but we need to divide by stride
13405 // below. Since the loop can't be infinite and this check must control
13406 // the sole exit, we can infer the exit must be taken on the first
13407 // iteration (e.g. backedge count = 0) if the stride is zero. Given that,
13408 // we know the numerator in the divides below must be zero, so we can
13409 // pick an arbitrary non-zero value for the denominator (e.g. stride)
13410 // and produce the right result.
13411 // FIXME: Handle the case where Stride is poison?
13412 auto wouldZeroStrideBeUB = [&]() {
13413 // Proof by contradiction. Suppose the stride were zero. If we can
13414 // prove that the backedge *is* taken on the first iteration, then since
13415 // we know this condition controls the sole exit, we must have an
13416 // infinite loop. We can't have a (well defined) infinite loop per
13417 // check just above.
13418 // Note: The (Start - Stride) term is used to get the start' term from
13419 // (start' + stride,+,stride). Remember that we only care about the
13420 // result of this expression when stride == 0 at runtime.
13421 auto *StartIfZero = getMinusSCEV(IV->getStart(), Stride);
13422 return isLoopEntryGuardedByCond(L, Cond, StartIfZero, RHS);
13423 };
13424 if (!wouldZeroStrideBeUB()) {
13425 Stride = getUMaxExpr(Stride, getOne(Stride->getType()));
13426 }
13427 }
13428 } else {
13429 // Avoid proven overflow cases: this will ensure that the backedge taken
13430 // count will not generate any unsigned overflow.
13431 IVMayOverflow = canIVOverflowOnLT(RHS, GuardedStride, IsSigned, Invert) &&
13432 canIVOverflowOnLT(applyLoopGuards(RHS, Guards),
13433 GuardedStride, IsSigned, Invert);
13434 if (IVMayOverflow && !NoWrap)
13435 return getCouldNotCompute();
13436 }
13437
13438 // On all paths just preceeding, we established the following invariant:
13439 // IV can be assumed not to overflow up to and including the exiting
13440 // iteration. We proved this in one of two ways:
13441 // 1) We can show overflow doesn't occur before the exiting iteration
13442 // 1a) canIVOverflowOnLT, and b) step of one
13443 // 2) We can show that if overflow occurs, the loop must execute UB
13444 // before any possible exit.
13445 // Note that we have not yet proved RHS invariant (in general).
13446
13447 const SCEV *Start = IV->getStart();
13448
13449 // Preserve pointer-typed Start/RHS to pass to isLoopEntryGuardedByCond.
13450 // If we convert to integers, isLoopEntryGuardedByCond will miss some cases.
13451 // Use integer-typed versions for actual computation; we can't subtract
13452 // pointers in general.
13453 const SCEV *OrigStart = Start;
13454 const SCEV *OrigRHS = RHS;
13455 if (Start->getType()->isPointerTy()) {
13456 Start = getPtrToAddrExpr(Start);
13457 if (isa<SCEVCouldNotCompute>(Start))
13458 return Start;
13459 }
13460 if (RHS->getType()->isPointerTy()) {
13463 return RHS;
13464 }
13465
13466 const SCEV *End = nullptr, *BECount = getCouldNotCompute(),
13467 *BECountIfBackedgeTaken = getCouldNotCompute();
13468 if (!isLoopInvariant(RHS, L)) {
13469 assert(!Invert && "RHS must be loop-invariant for Invert");
13470 const auto *RHSAddRec = dyn_cast<SCEVAddRecExpr>(RHS);
13471 if (PositiveStride && RHSAddRec != nullptr && RHSAddRec->getLoop() == L &&
13472 any(RHSAddRec->getNoWrapFlags())) {
13473 // The structure of loop we are trying to calculate backedge count of:
13474 //
13475 // left = left_start
13476 // right = right_start
13477 //
13478 // while(left < right){
13479 // ... do something here ...
13480 // left += s1; // stride of left is s1 (s1 > 0)
13481 // right += s2; // stride of right is s2 (s2 < 0)
13482 // }
13483 //
13484
13485 const SCEV *RHSStart = RHSAddRec->getStart();
13486 const SCEV *RHSStride = RHSAddRec->getStepRecurrence(*this);
13487
13488 // If Stride - RHSStride is positive and does not overflow, we can write
13489 // backedge count as ->
13490 // ceil((End - Start) /u (Stride - RHSStride))
13491 // Where, End = max(RHSStart, Start)
13492
13493 // Check if RHSStride < 0 and Stride - RHSStride will not overflow.
13494 if (isKnownNegative(RHSStride) &&
13495 willNotOverflow(Instruction::Sub, /*Signed=*/true, Stride,
13496 RHSStride)) {
13497
13498 const SCEV *Denominator = getMinusSCEV(Stride, RHSStride);
13499 if (isKnownPositive(Denominator)) {
13500 End = IsSigned ? getSMaxExpr(RHSStart, Start)
13501 : getUMaxExpr(RHSStart, Start);
13502
13503 // We can do this because End >= Start, as End = max(RHSStart, Start)
13504 const SCEV *Delta = getMinusSCEV(End, Start);
13505
13506 BECount = getUDivCeilSCEV(Delta, Denominator);
13507 BECountIfBackedgeTaken =
13508 getUDivCeilSCEV(getMinusSCEV(RHSStart, Start), Denominator);
13509 }
13510 }
13511 }
13512 } else {
13513 // Let End = max(RHS,Start). We use the expression (End-Start)/Stride to
13514 // describe the backedge count: if the backedge is taken at least once then
13515 // End is RHS, and if not End is Start so we get a backedge count of zero.
13516 // Inverted, End is min(RHS, Start).
13517 //
13518 // AddingStrideMinusOneMayOverflow has the following preconditions:
13519 //
13520 // 1. Start <= End, signed if IsSigned (inverted: End <= Start)
13521 // 2. The index variable doesn't overflow.
13522 //
13523 // Therefore, we know N exists such that
13524 // (Start + Stride * N) >= End, and computing "(Start + Stride * N)"
13525 // doesn't overflow.
13526 //
13527 // Using this information, try to prove whether the addition in
13528 // "(End - Start) + (Stride - 1)" has unsigned overflow.
13529 //
13530 // If the IV cannot overflow, RHS is at least Stride - 1 below the maximum
13531 // value, so the distance End - Start is at most UMAX - (Stride - 1) and
13532 // the (Stride - 1) addition below cannot overflow.
13533 const SCEV *One = getOne(Stride->getType());
13534 bool AddingStrideMinusOneMayOverflow = IVMayOverflow && [&] {
13535 if (isKnownToBeAPowerOfTwo(Stride)) {
13536 // Suppose Stride is a power of two, and Start/End are unsigned
13537 // integers. Let UMAX be the largest representable unsigned
13538 // integer.
13539 //
13540 // By the preconditions of this function, we know
13541 // "(Start + Stride * N) >= End", and this doesn't overflow.
13542 // As a formula:
13543 //
13544 // End <= (Start + Stride * N) <= UMAX
13545 //
13546 // Subtracting Start from all the terms:
13547 //
13548 // End - Start <= Stride * N <= UMAX - Start
13549 //
13550 // Since Start is unsigned, UMAX - Start <= UMAX. Therefore:
13551 //
13552 // End - Start <= Stride * N <= UMAX
13553 //
13554 // Stride * N is a multiple of Stride. Therefore,
13555 //
13556 // End - Start <= Stride * N <= UMAX - (UMAX mod Stride)
13557 //
13558 // Since Stride is a power of two, UMAX + 1 is divisible by
13559 // Stride. Therefore, UMAX mod Stride == Stride - 1. So we can
13560 // write:
13561 //
13562 // End - Start <= Stride * N <= UMAX - Stride - 1
13563 //
13564 // Dropping the middle term:
13565 //
13566 // End - Start <= UMAX - Stride - 1
13567 //
13568 // Adding Stride - 1 to both sides:
13569 //
13570 // (End - Start) + (Stride - 1) <= UMAX
13571 //
13572 // In other words, the addition doesn't have unsigned overflow.
13573 //
13574 // A similar proof works if we treat Start/End as signed values.
13575 // Just rewrite steps before "End - Start <= Stride * N <= UMAX"
13576 // to use signed max instead of unsigned max. Note that we're
13577 // trying to prove a lack of unsigned overflow in either case.
13578 // Inverted: "Start - End <= Stride * N <= Start - MIN <= UMAX", same.
13579 return false;
13580 }
13581 if (!Invert && (Start == Stride || Start == getMinusSCEV(Stride, One))) {
13582 // If Start is equal to Stride, (End - Start) + (Stride - 1) == End
13583 // - 1. If !IsSigned, 0 <u Stride == Start <=u End; so 0 <u End - 1
13584 // <u End. If IsSigned, 0 <s Stride == Start <=s End; so 0 <s End -
13585 // 1 <s End.
13586 //
13587 // If Start is equal to Stride - 1, (End - Start) + Stride - 1 ==
13588 // End.
13589 //
13590 // Both need Start to be the smaller value, so neither applies inverted.
13591 return false;
13592 }
13593 return true;
13594 }();
13595
13596 // If inverted, the analyzed values are complements: "~V - Offset" is "~(V +
13597 // Offset)" and "~To - ~From" is "From - To".
13598 auto StepBack = [&](const SCEV *V, const SCEV *Offset) -> const SCEV * {
13599 if (Invert)
13600 return getAddExpr(V, Offset);
13601 return getMinusSCEV(V, Offset);
13602 };
13603 auto Distance = [&](const SCEV *From, const SCEV *To) {
13604 return Invert ? getMinusSCEV(From, To) : getMinusSCEV(To, From);
13605 };
13606
13607 const SCEV *OrigPrevStart = StepBack(OrigStart, Stride);
13608 assert(isAvailableAtLoopEntry(OrigPrevStart, L) && "Must be!");
13609 assert(isAvailableAtLoopEntry(OrigStart, L) && "Must be!");
13610 assert(isAvailableAtLoopEntry(OrigRHS, L) && "Must be!");
13611 // Can we prove Start - Stride < RHS, and either Start - Stride < Start or
13612 // (via !AddingStrideMinusOneMayOverflow) that (RHS - Start) + (Stride - 1)
13613 // does not overflow?
13614 if ((!AddingStrideMinusOneMayOverflow ||
13615 isLoopEntryGuardedByCond(L, Cond, OrigPrevStart, OrigStart)) &&
13616 isLoopEntryGuardedByCond(L, Cond, OrigPrevStart, OrigRHS)) {
13617 // In this case, we can use a refined formula for computing backedge
13618 // taken count. The general formula remains:
13619 // "End-Start /uceiling Stride"
13620 // We want to use the alternate formula:
13621 // "((RHS - 1) - (Start - Stride)) /u Stride"
13622 // Let's do a quick case analysis to show these are equivalent under
13623 // our preconditions. When inverted, the proof uses complemented Start,
13624 // RHS and End; Stride remains positive.
13625 // * For RHS <= Start (End is Start), the backedge-taken count must be
13626 // zero. Together with the precondition "Start - Stride < RHS", we have
13627 // "Start - Stride < RHS <= Start". Subtracting Start - Stride from
13628 // all sides we get "0 < RHS - (Start - Stride) <= Stride".
13629 // Subtracting 1 we get "0 <= (RHS - 1) - (Start - Stride) < Stride".
13630 // So dividing that by Stride gives zero.
13631 //
13632 // * For RHS > Start (End is RHS), the backedge count must be
13633 // "RHS-Start /uceil Stride", so it is sufficient to show that the
13634 // numerator "((RHS - 1) - (Start - Stride))" does not overflow.
13635 //
13636 // If "Start - Stride < Start" holds, we have
13637 // "RHS > Start > Start - Stride". As such
13638 // "RHS - (Start - Stride) - 1" does not overflow, which is the
13639 // reassociated numerator.
13640 //
13641 // Otherwise !AddingStrideMinusOneMayOverflow guarantees that
13642 // "(End - Start) + (Stride - 1)" does not overflow unsigned. Here
13643 // "End" is "RHS", as "RHS > Start", so this is the reassociated
13644 // numerator. Neither sub-term wraps unsigned: "RHS - Start"
13645 // due to "RHS > Start", and "Stride - 1", as Stride is non-zero.
13646 const SCEV *Numerator =
13647 getMinusSCEV(Distance(StepBack(Start, Stride), RHS), One);
13648 BECount = getUDivExpr(Numerator, Stride);
13649 }
13650
13651 if (isa<SCEVCouldNotCompute>(BECount)) {
13652 auto canProveRHSIsAtOrBeyondStart = [&]() {
13653 // Inverted, the claim is "Start >= RHS". Reverse the comparisons below
13654 // by swapping their operands rather than their predicates:
13655 // isLoopEntryGuardedByCond is sensitive to operand order and loses the
13656 // proof if the IV bound moves to the other side.
13657 auto SwapIfInverted = [&](const SCEV *A, const SCEV *B) {
13658 return Invert ? std::pair(B, A) : std::pair(A, B);
13659 };
13660
13661 auto CondGE = IsSigned ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE;
13662 const SCEV *GuardedRHS = applyLoopGuards(OrigRHS, Guards);
13663 const SCEV *GuardedStart = applyLoopGuards(OrigStart, Guards);
13664 if (Invert)
13665 std::swap(GuardedRHS, GuardedStart);
13666
13667 auto [GELHS, GERHS] = SwapIfInverted(OrigRHS, OrigStart);
13668 if (isLoopEntryGuardedByCond(L, CondGE, GELHS, GERHS) ||
13669 isKnownPredicate(CondGE, GuardedRHS, GuardedStart))
13670 return true;
13671
13672 if ((GuardedRHS != GELHS || GuardedStart != GERHS) &&
13673 isKnownPredicate(CondGE, GELHS, GERHS))
13674 return true;
13675
13676 // (RHS > Start - 1) implies RHS >= Start.
13677 // * "RHS >= Start" is trivially equivalent to "RHS > Start - 1" if
13678 // "Start - 1" doesn't overflow.
13679 // * For signed comparison, if Start - 1 does overflow, it's equal
13680 // to INT_MAX, and "RHS >s INT_MAX" is trivially false.
13681 // * For unsigned comparison, if Start - 1 does overflow, it's equal
13682 // to UINT_MAX, and "RHS >u UINT_MAX" is trivially false.
13683 //
13684 // FIXME: Should isLoopEntryGuardedByCond do this for us?
13685 auto CondGT = IsSigned ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
13686 auto [GTLHS, GTRHS] = SwapIfInverted(OrigRHS, StepBack(OrigStart, One));
13687 return isLoopEntryGuardedByCond(L, CondGT, GTLHS, GTRHS);
13688 };
13689
13690 // If we know that RHS >= Start in the context of loop, then we know
13691 // that max(RHS, Start) = RHS at this point.
13692 if (canProveRHSIsAtOrBeyondStart()) {
13693 End = RHS;
13694 } else {
13695 // If RHS < Start, the backedge will be taken zero times. So in
13696 // general, we can write the backedge-taken count as:
13697 //
13698 // RHS >= Start ? ceil(RHS - Start) / Stride : 0
13699 //
13700 // We convert it to the following to make it more convenient for SCEV:
13701 //
13702 // ceil(max(RHS, Start) - Start) / Stride
13703 //
13704 // Inverted, this is ceil(Start - min(RHS, Start)) / Stride.
13705 if (Invert)
13706 End = IsSigned ? getSMinExpr(RHS, Start) : getUMinExpr(RHS, Start);
13707 else
13708 End = IsSigned ? getSMaxExpr(RHS, Start) : getUMaxExpr(RHS, Start);
13709
13710 // See what would happen if we assume the backedge is taken. This is
13711 // used to compute MaxBECount.
13712 BECountIfBackedgeTaken = getUDivCeilSCEV(Distance(Start, RHS), Stride);
13713 }
13714
13715 const SCEV *Delta = Distance(Start, End);
13716 if (!AddingStrideMinusOneMayOverflow) {
13717 // floor((D + (S - 1)) / S)
13718 // We prefer this formulation if it's legal because it's fewer
13719 // operations.
13720 BECount =
13721 getUDivExpr(getAddExpr(Delta, getMinusSCEV(Stride, One)), Stride);
13722 } else {
13723 BECount = getUDivCeilSCEV(Delta, Stride);
13724 }
13725 }
13726 }
13727
13728 const SCEV *ConstantMaxBECount;
13729 bool MaxOrZero = false;
13730 if (isa<SCEVConstant>(BECount)) {
13731 ConstantMaxBECount = BECount;
13732 } else {
13733 ConstantMaxBECount = computeMaxBECountForLT(
13734 Start, Stride, RHS, getTypeSizeInBits(LHS->getType()), IsSigned,
13735 Invert);
13736 // If we know exactly how many times the backedge will be taken if it's
13737 // taken at least once, then the backedge count will either be that or
13738 // zero. If that count exceeds the range-based bound, the backedge can
13739 // never be taken.
13740 const APInt *IfTaken, *RangeMax;
13741 if (match(BECountIfBackedgeTaken, m_scev_APInt(IfTaken))) {
13742 if (match(ConstantMaxBECount, m_scev_APInt(RangeMax)) &&
13743 IfTaken->ugt(*RangeMax)) {
13744 ConstantMaxBECount = getZero(BECountIfBackedgeTaken->getType());
13745 } else {
13746 ConstantMaxBECount = BECountIfBackedgeTaken;
13747 MaxOrZero = true;
13748 }
13749 }
13750 }
13751
13752 if (isa<SCEVCouldNotCompute>(ConstantMaxBECount) &&
13753 !isa<SCEVCouldNotCompute>(BECount))
13754 ConstantMaxBECount = getConstant(getUnsignedRangeMax(BECount));
13755
13756 const SCEV *SymbolicMaxBECount =
13757 isa<SCEVCouldNotCompute>(BECount) ? ConstantMaxBECount : BECount;
13758 return ExitLimit(BECount, ConstantMaxBECount, SymbolicMaxBECount, MaxOrZero,
13759 Predicates);
13760}
13761
13763 ScalarEvolution &SE) const {
13764 if (Range.isFullSet()) // Infinite loop.
13765 return SE.getCouldNotCompute();
13766
13767 // If the start is a non-zero constant, shift the range to simplify things.
13768 if (const SCEVConstant *SC = dyn_cast<SCEVConstant>(getStart()))
13769 if (!SC->getValue()->isZero()) {
13771 Operands[0] = SE.getZero(SC->getType());
13772 const SCEV *Shifted = SE.getAddRecExpr(Operands, getLoop(),
13774 if (const auto *ShiftedAddRec = dyn_cast<SCEVAddRecExpr>(Shifted))
13775 return ShiftedAddRec->getNumIterationsInRange(
13776 Range.subtract(SC->getAPInt()), SE);
13777 // This is strange and shouldn't happen.
13778 return SE.getCouldNotCompute();
13779 }
13780
13781 // The only time we can solve this is when we have all constant indices.
13782 // Otherwise, we cannot determine the overflow conditions.
13784 return SE.getCouldNotCompute();
13785
13786 // Okay at this point we know that all elements of the chrec are constants and
13787 // that the start element is zero.
13788
13789 // First check to see if the range contains zero. If not, the first
13790 // iteration exits.
13791 unsigned BitWidth = SE.getTypeSizeInBits(getType());
13792 if (!Range.contains(APInt(BitWidth, 0)))
13793 return SE.getZero(getType());
13794
13795 if (isAffine()) {
13796 // If this is an affine expression then we have this situation:
13797 // Solve {0,+,A} in Range === Ax in Range
13798
13799 // We know that zero is in the range. If A is positive then we know that
13800 // the upper value of the range must be the first possible exit value.
13801 // If A is negative then the lower of the range is the last possible loop
13802 // value. Also note that we already checked for a full range.
13803 APInt A = cast<SCEVConstant>(getOperand(1))->getAPInt();
13804 APInt End = A.sge(1) ? (Range.getUpper() - 1) : Range.getLower();
13805
13806 // The exit value should be (End+A)/A.
13807 APInt ExitVal = (End + A).udiv(A);
13808 ConstantInt *ExitValue = ConstantInt::get(SE.getContext(), ExitVal);
13809
13810 // Evaluate at the exit value. If we really did fall out of the valid
13811 // range, then we computed our trip count, otherwise wrap around or other
13812 // things must have happened.
13813 ConstantInt *Val = EvaluateConstantChrecAtConstant(this, ExitValue, SE);
13814 if (Range.contains(Val->getValue()))
13815 return SE.getCouldNotCompute(); // Something strange happened
13816
13817 // Ensure that the previous value is in the range.
13818 assert(Range.contains(
13820 ConstantInt::get(SE.getContext(), ExitVal - 1), SE)->getValue()) &&
13821 "Linear scev computation is off in a bad way!");
13822 return SE.getConstant(ExitValue);
13823 }
13824
13825 if (isQuadratic()) {
13826 if (auto S = SolveQuadraticAddRecRange(this, Range, SE))
13827 return SE.getConstant(*S);
13828 }
13829
13830 return SE.getCouldNotCompute();
13831}
13832
13833const SCEVAddRecExpr *
13835 assert(getNumOperands() > 1 && "AddRec with zero step?");
13836 // There is a temptation to just call getAddExpr(this, getStepRecurrence(SE)),
13837 // but in this case we cannot guarantee that the value returned will be an
13838 // AddRec because SCEV does not have a fixed point where it stops
13839 // simplification: it is legal to return ({rec1} + {rec2}). For example, it
13840 // may happen if we reach arithmetic depth limit while simplifying. So we
13841 // construct the returned value explicitly.
13843 // If this is {A,+,B,+,C,...,+,N}, then its step is {B,+,C,+,...,+,N}, and
13844 // (this + Step) is {A+B,+,B+C,+...,+,N}.
13845 for (unsigned i = 0, e = getNumOperands() - 1; i < e; ++i)
13846 Ops.push_back(SE.getAddExpr(getOperand(i), getOperand(i + 1)));
13847 // We know that the last operand is not a constant zero (otherwise it would
13848 // have been popped out earlier). This guarantees us that if the result has
13849 // the same last operand, then it will also not be popped out, meaning that
13850 // the returned value will be an AddRec.
13851 const SCEV *Last = getOperand(getNumOperands() - 1);
13852 assert(!Last->isZero() && "Recurrency with zero step?");
13853 Ops.push_back(Last);
13855}
13856
13857// Return true when S contains at least an undef value.
13859 return SCEVExprContains(
13860 S, [](const SCEV *S) { return match(S, m_scev_UndefOrPoison()); });
13861}
13862
13863// Return true when S contains a value that is a nullptr.
13865 return SCEVExprContains(S, [](const SCEV *S) {
13866 if (const auto *SU = dyn_cast<SCEVUnknown>(S))
13867 return SU->getValue() == nullptr;
13868 return false;
13869 });
13870}
13871
13872/// Return the size of an element read or written by Inst.
13874 if (!isa<LoadInst, StoreInst>(Inst))
13875 return nullptr;
13877 return getSizeOfExpr(ETy, getLoadStoreType(Inst));
13878}
13879
13880//===----------------------------------------------------------------------===//
13881// SCEVCallbackVH Class Implementation
13882//===----------------------------------------------------------------------===//
13883
13885 assert(SE && "SCEVCallbackVH called with a null ScalarEvolution!");
13886 if (PHINode *PN = dyn_cast<PHINode>(getValPtr()))
13887 SE->ConstantEvolutionLoopExitValue.erase(PN);
13888 SE->eraseValueFromMap(getValPtr());
13889 // this now dangles!
13890}
13891
13892void ScalarEvolution::SCEVCallbackVH::allUsesReplacedWith(Value *V) {
13893 assert(SE && "SCEVCallbackVH called with a null ScalarEvolution!");
13894
13895 // Forget all the expressions associated with users of the old value,
13896 // so that future queries will recompute the expressions using the new
13897 // value.
13898 SE->forgetValue(getValPtr());
13899 // this now dangles!
13900}
13901
13902ScalarEvolution::SCEVCallbackVH::SCEVCallbackVH(Value *V, ScalarEvolution *se)
13903 : CallbackVH(V), SE(se) {}
13904
13905//===----------------------------------------------------------------------===//
13906// ScalarEvolution Class Implementation
13907//===----------------------------------------------------------------------===//
13908
13911 LoopInfo &LI)
13912 : Opts(getAnalysisOptions(F)), F(F), DL(F.getDataLayout()), TLI(TLI),
13913 AC(AC), DT(DT), LI(LI), CouldNotCompute(new SCEVCouldNotCompute()),
13914 ValuesAtScopes(64), LoopDispositions(64), BlockDispositions(64) {
13915 // To use guards for proving predicates, we need to scan every instruction in
13916 // relevant basic blocks, and not just terminators. Doing this is a waste of
13917 // time if the IR does not actually contain any calls to
13918 // @llvm.experimental.guard, so do a quick check and remember this beforehand.
13919 //
13920 // This pessimizes the case where a pass that preserves ScalarEvolution wants
13921 // to _add_ guards to the module when there weren't any before, and wants
13922 // ScalarEvolution to optimize based on those guards. For now we prefer to be
13923 // efficient in lieu of being smart in that rather obscure case.
13924
13925 auto *GuardDecl = Intrinsic::getDeclarationIfExists(
13926 F.getParent(), Intrinsic::experimental_guard);
13927 HasGuards = GuardDecl && !GuardDecl->use_empty();
13928}
13929
13931 : Opts(Arg.Opts), F(Arg.F), DL(Arg.DL), HasGuards(Arg.HasGuards),
13932 TLI(Arg.TLI), AC(Arg.AC), DT(Arg.DT), LI(Arg.LI),
13933 CouldNotCompute(std::move(Arg.CouldNotCompute)),
13934 ValueExprMap(std::move(Arg.ValueExprMap)),
13935 PendingLoopPredicates(std::move(Arg.PendingLoopPredicates)),
13936 PendingMerges(std::move(Arg.PendingMerges)),
13937 ConstantMultipleCache(std::move(Arg.ConstantMultipleCache)),
13938 BackedgeTakenCounts(std::move(Arg.BackedgeTakenCounts)),
13939 PredicatedBackedgeTakenCounts(
13940 std::move(Arg.PredicatedBackedgeTakenCounts)),
13941 BECountUsers(std::move(Arg.BECountUsers)),
13942 ConstantEvolutionLoopExitValue(
13943 std::move(Arg.ConstantEvolutionLoopExitValue)),
13944 ValuesAtScopes(std::move(Arg.ValuesAtScopes)),
13945 ValuesAtScopesUsers(std::move(Arg.ValuesAtScopesUsers)),
13946 LoopDispositions(std::move(Arg.LoopDispositions)),
13947 LoopPropertiesCache(std::move(Arg.LoopPropertiesCache)),
13948 BlockDispositions(std::move(Arg.BlockDispositions)),
13949 SCEVUsers(std::move(Arg.SCEVUsers)),
13950 UnsignedRanges(std::move(Arg.UnsignedRanges)),
13951 SignedRanges(std::move(Arg.SignedRanges)),
13952 UniqueSCEVs(std::move(Arg.UniqueSCEVs)),
13953 UniquePreds(std::move(Arg.UniquePreds)),
13954 SCEVAllocator(std::move(Arg.SCEVAllocator)),
13955 ConstantSCEVs(std::move(Arg.ConstantSCEVs)),
13956 LoopUsers(std::move(Arg.LoopUsers)),
13957 PredicatedSCEVRewrites(std::move(Arg.PredicatedSCEVRewrites)),
13958 FirstUnknown(Arg.FirstUnknown),
13959 NextUnknownOrderID(Arg.NextUnknownOrderID) {
13960 Arg.FirstUnknown = nullptr;
13961}
13962
13964 // Iterate through all the SCEVUnknown instances and call their
13965 // destructors, so that they release their references to their values.
13966 for (SCEVUnknown *U = FirstUnknown; U;) {
13967 SCEVUnknown *Tmp = U;
13968 U = U->Next;
13969 Tmp->~SCEVUnknown();
13970 }
13971 FirstUnknown = nullptr;
13972
13973 ExprValueMap.clear();
13974 ValueExprMap.clear();
13975 HasRecMap.clear();
13976 BackedgeTakenCounts.clear();
13977 PredicatedBackedgeTakenCounts.clear();
13978
13979 assert(PendingLoopPredicates.empty() && "isImpliedCond garbage");
13980 assert(PendingMerges.empty() && "isImpliedViaMerge garbage");
13981 assert(!WalkingBEDominatingConds && "isLoopBackedgeGuardedByCond garbage!");
13982 assert(!ProvingSplitPredicate && "ProvingSplitPredicate garbage!");
13983}
13984
13988
13989/// When printing a top-level SCEV for trip counts, it's helpful to include
13990/// a type for constants which are otherwise hard to disambiguate.
13991static void PrintSCEVWithTypeHint(raw_ostream &OS, const SCEV* S) {
13992 if (isa<SCEVConstant>(S))
13993 OS << *S->getType() << " ";
13994 OS << *S;
13995}
13996
13998 const Loop *L) {
13999 // Print all inner loops first
14000 for (Loop *I : *L)
14001 PrintLoopInfo(OS, SE, I);
14002
14003 OS << "Loop ";
14004 L->getHeader()->printAsOperand(OS, /*PrintType=*/false);
14005 OS << ": ";
14006
14007 SmallVector<BasicBlock *, 8> ExitingBlocks;
14008 L->getExitingBlocks(ExitingBlocks);
14009 if (ExitingBlocks.size() != 1)
14010 OS << "<multiple exits> ";
14011
14012 auto *BTC = SE->getBackedgeTakenCount(L);
14013 if (!isa<SCEVCouldNotCompute>(BTC)) {
14014 OS << "backedge-taken count is ";
14015 PrintSCEVWithTypeHint(OS, BTC);
14016 } else
14017 OS << "Unpredictable backedge-taken count.";
14018 OS << "\n";
14019
14020 if (ExitingBlocks.size() > 1)
14021 for (BasicBlock *ExitingBlock : ExitingBlocks) {
14022 OS << " exit count for " << ExitingBlock->getName() << ": ";
14023 const SCEV *EC = SE->getExitCount(L, ExitingBlock);
14024 PrintSCEVWithTypeHint(OS, EC);
14025 if (isa<SCEVCouldNotCompute>(EC)) {
14026 // Retry with predicates.
14028 EC = SE->getPredicatedExitCount(L, ExitingBlock, &Predicates);
14029 if (!isa<SCEVCouldNotCompute>(EC)) {
14030 OS << "\n predicated exit count for " << ExitingBlock->getName()
14031 << ": ";
14032 PrintSCEVWithTypeHint(OS, EC);
14033 OS << "\n Predicates:\n";
14034 for (const auto *P : Predicates)
14035 P->print(OS, 4);
14036 }
14037 }
14038 OS << "\n";
14039 }
14040
14041 OS << "Loop ";
14042 L->getHeader()->printAsOperand(OS, /*PrintType=*/false);
14043 OS << ": ";
14044
14045 auto *ConstantBTC = SE->getConstantMaxBackedgeTakenCount(L);
14046 if (!isa<SCEVCouldNotCompute>(ConstantBTC)) {
14047 OS << "constant max backedge-taken count is ";
14048 PrintSCEVWithTypeHint(OS, ConstantBTC);
14050 OS << ", actual taken count either this or zero.";
14051 } else {
14052 OS << "Unpredictable constant max backedge-taken count. ";
14053 }
14054
14055 OS << "\n"
14056 "Loop ";
14057 L->getHeader()->printAsOperand(OS, /*PrintType=*/false);
14058 OS << ": ";
14059
14060 auto *SymbolicBTC = SE->getSymbolicMaxBackedgeTakenCount(L);
14061 if (!isa<SCEVCouldNotCompute>(SymbolicBTC)) {
14062 OS << "symbolic max backedge-taken count is ";
14063 PrintSCEVWithTypeHint(OS, SymbolicBTC);
14065 OS << ", actual taken count either this or zero.";
14066 } else {
14067 OS << "Unpredictable symbolic max backedge-taken count. ";
14068 }
14069 OS << "\n";
14070
14071 if (ExitingBlocks.size() > 1)
14072 for (BasicBlock *ExitingBlock : ExitingBlocks) {
14073 OS << " symbolic max exit count for " << ExitingBlock->getName() << ": ";
14074 auto *ExitBTC = SE->getExitCount(L, ExitingBlock,
14076 PrintSCEVWithTypeHint(OS, ExitBTC);
14077 if (isa<SCEVCouldNotCompute>(ExitBTC)) {
14078 // Retry with predicates.
14080 ExitBTC = SE->getPredicatedExitCount(L, ExitingBlock, &Predicates,
14082 if (!isa<SCEVCouldNotCompute>(ExitBTC)) {
14083 OS << "\n predicated symbolic max exit count for "
14084 << ExitingBlock->getName() << ": ";
14085 PrintSCEVWithTypeHint(OS, ExitBTC);
14086 OS << "\n Predicates:\n";
14087 for (const auto *P : Predicates)
14088 P->print(OS, 4);
14089 }
14090 }
14091 OS << "\n";
14092 }
14093
14095 auto *PBT = SE->getPredicatedBackedgeTakenCount(L, Preds);
14096 if (PBT != BTC) {
14097 OS << "Loop ";
14098 L->getHeader()->printAsOperand(OS, /*PrintType=*/false);
14099 OS << ": ";
14100 if (!isa<SCEVCouldNotCompute>(PBT)) {
14101 OS << "Predicated backedge-taken count is ";
14102 PrintSCEVWithTypeHint(OS, PBT);
14103 } else
14104 OS << "Unpredictable predicated backedge-taken count.";
14105 OS << "\n";
14106 OS << " Predicates:\n";
14107 for (const auto *P : Preds)
14108 P->print(OS, 4);
14109 }
14110 Preds.clear();
14111
14112 auto *PredConstantMax =
14114 if (PredConstantMax != ConstantBTC) {
14115 OS << "Loop ";
14116 L->getHeader()->printAsOperand(OS, /*PrintType=*/false);
14117 OS << ": ";
14118 if (!isa<SCEVCouldNotCompute>(PredConstantMax)) {
14119 OS << "Predicated constant max backedge-taken count is ";
14120 PrintSCEVWithTypeHint(OS, PredConstantMax);
14121 } else
14122 OS << "Unpredictable predicated constant max backedge-taken count.";
14123 OS << "\n";
14124 OS << " Predicates:\n";
14125 for (const auto *P : Preds)
14126 P->print(OS, 4);
14127 }
14128 Preds.clear();
14129
14130 auto *PredSymbolicMax =
14132 if (SymbolicBTC != PredSymbolicMax) {
14133 OS << "Loop ";
14134 L->getHeader()->printAsOperand(OS, /*PrintType=*/false);
14135 OS << ": ";
14136 if (!isa<SCEVCouldNotCompute>(PredSymbolicMax)) {
14137 OS << "Predicated symbolic max backedge-taken count is ";
14138 PrintSCEVWithTypeHint(OS, PredSymbolicMax);
14139 } else
14140 OS << "Unpredictable predicated symbolic max backedge-taken count.";
14141 OS << "\n";
14142 OS << " Predicates:\n";
14143 for (const auto *P : Preds)
14144 P->print(OS, 4);
14145 }
14146
14148 OS << "Loop ";
14149 L->getHeader()->printAsOperand(OS, /*PrintType=*/false);
14150 OS << ": ";
14151 OS << "Trip multiple is " << SE->getSmallConstantTripMultiple(L) << "\n";
14152 }
14153}
14154
14155namespace llvm {
14156// Note: these overloaded operators need to be in the llvm namespace for them
14157// to be resolved correctly. If we put them outside the llvm namespace, the
14158//
14159// OS << ": " << SE.getLoopDisposition(SV, InnerL);
14160//
14161// code below "breaks" and start printing raw enum values as opposed to the
14162// string values.
14165 switch (LD) {
14167 OS << "Variant";
14168 break;
14170 OS << "Invariant";
14171 break;
14173 OS << "Uniform";
14174 break;
14176 OS << "Computable";
14177 break;
14178 }
14179 return OS;
14180}
14181
14184 switch (BD) {
14186 OS << "DoesNotDominate";
14187 break;
14189 OS << "Dominates";
14190 break;
14192 OS << "ProperlyDominates";
14193 break;
14194 }
14195 return OS;
14196}
14197} // namespace llvm
14198
14200 // ScalarEvolution's implementation of the print method is to print
14201 // out SCEV values of all instructions that are interesting. Doing
14202 // this potentially causes it to create new SCEV objects though,
14203 // which technically conflicts with the const qualifier. This isn't
14204 // observable from outside the class though, so casting away the
14205 // const isn't dangerous.
14206 ScalarEvolution &SE = *const_cast<ScalarEvolution *>(this);
14207
14208 if (Opts.scalar_evolution_classify_expressions) {
14209 OS << "Classifying expressions for: ";
14210 F.printAsOperand(OS, /*PrintType=*/false);
14211 OS << "\n";
14212 for (Instruction &I : instructions(F))
14213 if (isSCEVable(I.getType()) && !isa<CmpInst>(I)) {
14214 OS << I << '\n';
14215 OS << " --> ";
14216 const SCEV *SV = SE.getSCEV(&I);
14217 SV->print(OS);
14218 if (!isa<SCEVCouldNotCompute>(SV)) {
14219 OS << " U: ";
14220 SE.getUnsignedRange(SV).print(OS);
14221 OS << " S: ";
14222 SE.getSignedRange(SV).print(OS);
14223 }
14224
14225 const Loop *L = LI.getLoopFor(I.getParent());
14226
14227 SCEVUse AtUse = SE.getSCEVAtScope(SV, L);
14228 if (AtUse != SV) {
14229 OS << " --> ";
14230 OS << AtUse;
14231 if (!isa<SCEVCouldNotCompute>(AtUse)) {
14232 OS << " U: ";
14233 SE.getUnsignedRange(AtUse).print(OS);
14234 OS << " S: ";
14235 SE.getSignedRange(AtUse).print(OS);
14236 }
14237 }
14238
14239 if (L) {
14240 OS << "\t\t" "Exits: ";
14241 SCEVUse ExitValue = SE.getSCEVAtScope(SV, L->getParentLoop());
14242 if (!SE.isLoopInvariant(ExitValue, L)) {
14243 OS << "<<Unknown>>";
14244 } else {
14245 OS << ExitValue;
14246 }
14247
14248 ListSeparator LS(", ", "\t\tLoopDispositions: { ");
14249 for (const auto *Iter = L; Iter; Iter = Iter->getParentLoop()) {
14250 OS << LS;
14251 Iter->getHeader()->printAsOperand(OS, /*PrintType=*/false);
14252 OS << ": " << SE.getLoopDisposition(SV, Iter);
14253 }
14254
14255 for (const auto *InnerL : depth_first(L)) {
14256 if (InnerL == L)
14257 continue;
14258 OS << LS;
14259 InnerL->getHeader()->printAsOperand(OS, /*PrintType=*/false);
14260 OS << ": " << SE.getLoopDisposition(SV, InnerL);
14261 }
14262
14263 OS << " }";
14264 }
14265
14266 OS << "\n";
14267 }
14268 }
14269
14270 OS << "Determining loop execution counts for: ";
14271 F.printAsOperand(OS, /*PrintType=*/false);
14272 OS << "\n";
14273 for (Loop *I : LI)
14274 PrintLoopInfo(OS, &SE, I);
14275}
14276
14279 if (isa<SCEVConstant>(S))
14280 return LoopInvariant;
14281
14282 auto &Values = LoopDispositions[S];
14283 for (auto &V : Values) {
14284 if (V.getPointer() == L)
14285 return V.getInt();
14286 }
14287 Values.emplace_back(L, LoopVariant);
14288 LoopDisposition D = computeLoopDisposition(S, L);
14289 auto &Values2 = LoopDispositions[S];
14290 for (auto &V : llvm::reverse(Values2)) {
14291 if (V.getPointer() == L) {
14292 V.setInt(D);
14293 break;
14294 }
14295 }
14296 return D;
14297}
14298
14300ScalarEvolution::computeLoopDisposition(const SCEV *S, const Loop *L) {
14301 switch (S->getSCEVType()) {
14302 case scConstant:
14303 case scVScale:
14304 return LoopInvariant;
14305 case scAddRecExpr: {
14306 const SCEVAddRecExpr *AR = cast<SCEVAddRecExpr>(S);
14307
14308 // If L is the addrec's loop, it's computable.
14309 if (AR->getLoop() == L)
14310 return LoopComputable;
14311
14312 // Add recurrences are never invariant in the function-body (null loop).
14313 if (!L)
14314 return LoopVariant;
14315
14316 // Everything that is not defined at loop entry is variant.
14317 if (DT.dominates(L->getHeader(), AR->getLoop()->getHeader())) {
14318 if (L->contains(AR->getLoop()) &&
14319 llvm::all_of(AR->operands(),
14320 [&](const SCEV *Op) { return isLoopUniform(Op, L); }))
14321 return LoopUniform;
14322
14323 return LoopVariant;
14324 }
14325 assert(!L->contains(AR->getLoop()) && "Containing loop's header does not"
14326 " dominate the contained loop's header?");
14327
14328 // This recurrence is invariant w.r.t. L if AR's loop contains L.
14329 if (AR->getLoop()->contains(L))
14330 return LoopInvariant;
14331
14332 // This recurrence is variant w.r.t. L if any of its operands
14333 // are variant.
14334 for (SCEVUse Op : AR->operands())
14335 if (!isLoopInvariant(Op, L))
14336 return LoopVariant;
14337
14338 // Otherwise it's loop-invariant.
14339 return LoopInvariant;
14340 }
14341 case scTruncate:
14342 case scZeroExtend:
14343 case scSignExtend:
14344 case scPtrToAddr:
14345 case scAddExpr:
14346 case scMulExpr:
14347 case scUDivExpr:
14348 case scUMaxExpr:
14349 case scSMaxExpr:
14350 case scUMinExpr:
14351 case scSMinExpr:
14352 case scSequentialUMinExpr: {
14353 bool HasVarying = false;
14354 bool HasUniform = false;
14355 for (SCEVUse Op : S->operands()) {
14357 if (D == LoopVariant)
14358 return LoopVariant;
14359 if (D == LoopComputable)
14360 HasVarying = true;
14361 if (D == LoopUniform)
14362 HasUniform = true;
14363 }
14364 return HasVarying ? (HasUniform ? LoopVariant : LoopComputable)
14365 : (HasUniform ? LoopUniform : LoopInvariant);
14366 }
14367 case scUnknown:
14368 // All non-instruction values are loop invariant. All instructions are loop
14369 // invariant if they are not contained in the specified loop.
14370 // Instructions are never considered invariant in the function body
14371 // (null loop) because they are defined within the "loop".
14373 return (L && !L->contains(I)) ? LoopInvariant : LoopVariant;
14374 return LoopInvariant;
14375 case scCouldNotCompute:
14376 llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!");
14377 }
14378 llvm_unreachable("Unknown SCEV kind!");
14379}
14380
14381bool ScalarEvolution::isLoopUniform(const SCEV *S, const Loop *L) {
14383 return D == LoopUniform || D == LoopInvariant;
14384}
14385
14387 return getLoopDisposition(S, L) == LoopInvariant;
14388}
14389
14391 return getLoopDisposition(S, L) == LoopComputable;
14392}
14393
14396 if (isa<SCEVConstant>(S))
14398
14399 auto &Values = BlockDispositions[S];
14400 for (auto &V : Values) {
14401 if (V.getPointer() == BB)
14402 return V.getInt();
14403 }
14404 Values.emplace_back(BB, DoesNotDominateBlock);
14405 BlockDisposition D = computeBlockDisposition(S, BB);
14406 auto &Values2 = BlockDispositions[S];
14407 for (auto &V : llvm::reverse(Values2)) {
14408 if (V.getPointer() == BB) {
14409 V.setInt(D);
14410 break;
14411 }
14412 }
14413 return D;
14414}
14415
14417ScalarEvolution::computeBlockDisposition(const SCEV *S, const BasicBlock *BB) {
14418 switch (S->getSCEVType()) {
14419 case scConstant:
14420 case scVScale:
14422 case scAddRecExpr: {
14423 // This uses a "dominates" query instead of "properly dominates" query
14424 // to test for proper dominance too, because the instruction which
14425 // produces the addrec's value is a PHI, and a PHI effectively properly
14426 // dominates its entire containing block.
14427 const SCEVAddRecExpr *AR = cast<SCEVAddRecExpr>(S);
14428 if (!DT.dominates(AR->getLoop()->getHeader(), BB))
14429 return DoesNotDominateBlock;
14430
14431 // Fall through into SCEVNAryExpr handling.
14432 [[fallthrough]];
14433 }
14434 case scTruncate:
14435 case scZeroExtend:
14436 case scSignExtend:
14437 case scPtrToAddr:
14438 case scAddExpr:
14439 case scMulExpr:
14440 case scUDivExpr:
14441 case scUMaxExpr:
14442 case scSMaxExpr:
14443 case scUMinExpr:
14444 case scSMinExpr:
14445 case scSequentialUMinExpr: {
14446 bool Proper = true;
14447 for (const SCEV *NAryOp : S->operands()) {
14449 if (D == DoesNotDominateBlock)
14450 return DoesNotDominateBlock;
14451 if (D == DominatesBlock)
14452 Proper = false;
14453 }
14454 return Proper ? ProperlyDominatesBlock : DominatesBlock;
14455 }
14456 case scUnknown:
14457 if (Instruction *I =
14459 if (I->getParent() == BB)
14460 return DominatesBlock;
14461 if (DT.properlyDominates(I->getParent(), BB))
14463 return DoesNotDominateBlock;
14464 }
14466 case scCouldNotCompute:
14467 llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!");
14468 }
14469 llvm_unreachable("Unknown SCEV kind!");
14470}
14471
14472bool ScalarEvolution::dominates(const SCEV *S, const BasicBlock *BB) {
14473 return getBlockDisposition(S, BB) >= DominatesBlock;
14474}
14475
14478}
14479
14480void ScalarEvolution::forgetBackedgeTakenCounts(const Loop *L,
14481 bool Predicated) {
14482 auto &BECounts =
14483 Predicated ? PredicatedBackedgeTakenCounts : BackedgeTakenCounts;
14484 auto It = BECounts.find(L);
14485 if (It != BECounts.end()) {
14486 for (const ExitNotTakenInfo &ENT : It->second.ExitNotTaken) {
14487 for (const SCEV *S : {ENT.ExactNotTaken, ENT.SymbolicMaxNotTaken}) {
14488 if (!isa<SCEVConstant>(S)) {
14489 auto UserIt = BECountUsers.find(S);
14490 assert(UserIt != BECountUsers.end());
14491 UserIt->second.erase({L, Predicated});
14492 }
14493 }
14494 }
14495 BECounts.erase(It);
14496 }
14497}
14498
14499void ScalarEvolution::forgetMemoizedResults(ArrayRef<SCEVUse> SCEVs) {
14500 SmallPtrSet<const SCEV *, 8> ToForget(llvm::from_range, SCEVs);
14501 SmallVector<SCEVUse, 8> Worklist(ToForget.begin(), ToForget.end());
14502
14503 while (!Worklist.empty()) {
14504 const SCEV *Curr = Worklist.pop_back_val();
14505 auto Users = SCEVUsers.find(Curr);
14506 if (Users != SCEVUsers.end())
14507 for (const auto *User : Users->second)
14508 if (ToForget.insert(User).second)
14509 Worklist.push_back(User);
14510 }
14511
14512 for (const auto *S : ToForget)
14513 forgetMemoizedResultsImpl(S);
14514
14515 PredicatedSCEVRewrites.remove_if(
14516 [&](const auto &Entry) { return ToForget.count(Entry.first.first); });
14517}
14518
14519void ScalarEvolution::forgetMemoizedResultsImpl(const SCEV *S) {
14520 LoopDispositions.erase(S);
14521 BlockDispositions.erase(S);
14522 UnsignedRanges.erase(S);
14523 SignedRanges.erase(S);
14524 HasRecMap.erase(S);
14525 ConstantMultipleCache.erase(S);
14526
14527 if (auto *AR = dyn_cast<SCEVAddRecExpr>(S)) {
14528 UnsignedWrapViaInductionTried.erase(AR);
14529 SignedWrapViaInductionTried.erase(AR);
14530 }
14531
14532 auto ExprIt = ExprValueMap.find(S);
14533 if (ExprIt != ExprValueMap.end()) {
14534 for (Value *V : ExprIt->second) {
14535 auto ValueIt = ValueExprMap.find_as(V);
14536 if (ValueIt != ValueExprMap.end())
14537 ValueExprMap.erase(ValueIt);
14538 }
14539 ExprValueMap.erase(ExprIt);
14540 }
14541
14542 auto ScopeIt = ValuesAtScopes.find(S);
14543 if (ScopeIt != ValuesAtScopes.end()) {
14544 for (const auto &Pair : ScopeIt->second)
14545 if (!isa_and_nonnull<SCEVConstant>(Pair.second))
14546 llvm::erase(ValuesAtScopesUsers[Pair.second.getPointer()],
14547 std::make_pair(Pair.first, S));
14548 ValuesAtScopes.erase(ScopeIt);
14549 }
14550
14551 auto ScopeUserIt = ValuesAtScopesUsers.find(S);
14552 if (ScopeUserIt != ValuesAtScopesUsers.end()) {
14553 for (const auto &Pair : ScopeUserIt->second)
14554 // The recorded value at scope is a use of S, which may carry no-wrap
14555 // flags that are not part of this key.
14556 llvm::erase_if(ValuesAtScopes[Pair.second], [&](const auto &LS) {
14557 return LS.first == Pair.first && LS.second.getPointer() == S;
14558 });
14559 ValuesAtScopesUsers.erase(ScopeUserIt);
14560 }
14561
14562 auto BEUsersIt = BECountUsers.find(S);
14563 if (BEUsersIt != BECountUsers.end()) {
14564 // Work on a copy, as forgetBackedgeTakenCounts() will modify the original.
14565 auto Copy = BEUsersIt->second;
14566 for (const auto &Pair : Copy)
14567 forgetBackedgeTakenCounts(Pair.getPointer(), Pair.getInt());
14568 BECountUsers.erase(BEUsersIt);
14569 }
14570
14571 auto FoldUser = FoldCacheUser.find(S);
14572 if (FoldUser != FoldCacheUser.end())
14573 for (auto &KV : FoldUser->second)
14574 FoldCache.erase(KV);
14575 FoldCacheUser.erase(S);
14576}
14577
14578void
14579ScalarEvolution::getUsedLoops(const SCEV *S,
14580 SmallPtrSetImpl<const Loop *> &LoopsUsed) {
14581 struct FindUsedLoops {
14582 FindUsedLoops(SmallPtrSetImpl<const Loop *> &LoopsUsed)
14583 : LoopsUsed(LoopsUsed) {}
14584 SmallPtrSetImpl<const Loop *> &LoopsUsed;
14585 bool follow(const SCEV *S) {
14586 if (auto *AR = dyn_cast<SCEVAddRecExpr>(S))
14587 LoopsUsed.insert(AR->getLoop());
14588 return true;
14589 }
14590
14591 bool isDone() const { return false; }
14592 };
14593
14594 FindUsedLoops F(LoopsUsed);
14595 SCEVTraversal<FindUsedLoops>(F).visitAll(S);
14596}
14597
14598void ScalarEvolution::getReachableBlocks(
14601 Worklist.push_back(&F.getEntryBlock());
14602 while (!Worklist.empty()) {
14603 BasicBlock *BB = Worklist.pop_back_val();
14604 if (!Reachable.insert(BB).second)
14605 continue;
14606
14607 Value *Cond;
14608 BasicBlock *TrueBB, *FalseBB;
14609 if (match(BB->getTerminator(), m_Br(m_Value(Cond), m_BasicBlock(TrueBB),
14610 m_BasicBlock(FalseBB)))) {
14611 if (auto *C = dyn_cast<ConstantInt>(Cond)) {
14612 Worklist.push_back(C->isOne() ? TrueBB : FalseBB);
14613 continue;
14614 }
14615
14616 if (auto *Cmp = dyn_cast<ICmpInst>(Cond)) {
14617 const SCEV *L = getSCEV(Cmp->getOperand(0));
14618 const SCEV *R = getSCEV(Cmp->getOperand(1));
14619 if (isKnownPredicateViaConstantRanges(Cmp->getCmpPredicate(), L, R)) {
14620 Worklist.push_back(TrueBB);
14621 continue;
14622 }
14623 if (isKnownPredicateViaConstantRanges(Cmp->getInverseCmpPredicate(), L,
14624 R)) {
14625 Worklist.push_back(FalseBB);
14626 continue;
14627 }
14628 }
14629 }
14630
14631 append_range(Worklist, successors(BB));
14632 }
14633}
14634
14636 ScalarEvolution &SE = *const_cast<ScalarEvolution *>(this);
14637 ScalarEvolution SE2(F, TLI, AC, DT, LI);
14638
14639 SmallVector<Loop *, 8> LoopStack(LI.begin(), LI.end());
14640
14641 // Map's SCEV expressions from one ScalarEvolution "universe" to another.
14642 struct SCEVMapper : public SCEVRewriteVisitor<SCEVMapper> {
14643 SCEVMapper(ScalarEvolution &SE) : SCEVRewriteVisitor<SCEVMapper>(SE) {}
14644
14645 const SCEV *visitConstant(const SCEVConstant *Constant) {
14646 return SE.getConstant(Constant->getAPInt());
14647 }
14648
14649 const SCEV *visitUnknown(const SCEVUnknown *Expr) {
14650 return SE.getUnknown(Expr->getValue());
14651 }
14652
14653 const SCEV *visitCouldNotCompute(const SCEVCouldNotCompute *Expr) {
14654 return SE.getCouldNotCompute();
14655 }
14656 };
14657
14658 SCEVMapper SCM(SE2);
14659 SmallPtrSet<BasicBlock *, 16> ReachableBlocks;
14660 SE2.getReachableBlocks(ReachableBlocks, F);
14661
14662 auto GetDelta = [&](const SCEV *Old, const SCEV *New) -> const SCEV * {
14663 if (containsUndefs(Old) || containsUndefs(New)) {
14664 // SCEV treats "undef" as an unknown but consistent value (i.e. it does
14665 // not propagate undef aggressively). This means we can (and do) fail
14666 // verification in cases where a transform makes a value go from "undef"
14667 // to "undef+1" (say). The transform is fine, since in both cases the
14668 // result is "undef", but SCEV thinks the value increased by 1.
14669 return nullptr;
14670 }
14671
14672 // Unless -verify-scev-strict is set, we only compare constant deltas.
14673 const SCEV *Delta = SE2.getMinusSCEV(Old, New);
14674 if (!Opts.verify_scev_strict && !isa<SCEVConstant>(Delta))
14675 return nullptr;
14676
14677 return Delta;
14678 };
14679
14680 while (!LoopStack.empty()) {
14681 auto *L = LoopStack.pop_back_val();
14682 llvm::append_range(LoopStack, *L);
14683
14684 // Only verify BECounts in reachable loops. For an unreachable loop,
14685 // any BECount is legal.
14686 if (!ReachableBlocks.contains(L->getHeader()))
14687 continue;
14688
14689 // Only verify cached BECounts. Computing new BECounts may change the
14690 // results of subsequent SCEV uses.
14691 auto It = BackedgeTakenCounts.find(L);
14692 if (It == BackedgeTakenCounts.end())
14693 continue;
14694
14695 auto *CurBECount =
14696 SCM.visit(It->second.getExact(L, const_cast<ScalarEvolution *>(this)));
14697 auto *NewBECount = SE2.getBackedgeTakenCount(L);
14698
14699 if (CurBECount == SE2.getCouldNotCompute() ||
14700 NewBECount == SE2.getCouldNotCompute()) {
14701 // NB! This situation is legal, but is very suspicious -- whatever pass
14702 // change the loop to make a trip count go from could not compute to
14703 // computable or vice-versa *should have* invalidated SCEV. However, we
14704 // choose not to assert here (for now) since we don't want false
14705 // positives.
14706 continue;
14707 }
14708
14709 if (SE.getTypeSizeInBits(CurBECount->getType()) >
14710 SE.getTypeSizeInBits(NewBECount->getType()))
14711 NewBECount = SE2.getZeroExtendExpr(NewBECount, CurBECount->getType());
14712 else if (SE.getTypeSizeInBits(CurBECount->getType()) <
14713 SE.getTypeSizeInBits(NewBECount->getType()))
14714 CurBECount = SE2.getZeroExtendExpr(CurBECount, NewBECount->getType());
14715
14716 const SCEV *Delta = GetDelta(CurBECount, NewBECount);
14717 if (Delta && !Delta->isZero()) {
14718 dbgs() << "Trip Count for " << *L << " Changed!\n";
14719 dbgs() << "Old: " << *CurBECount << "\n";
14720 dbgs() << "New: " << *NewBECount << "\n";
14721 dbgs() << "Delta: " << *Delta << "\n";
14722 std::abort();
14723 }
14724 }
14725
14726 // Collect all valid loops currently in LoopInfo.
14727 SmallPtrSet<Loop *, 32> ValidLoops;
14728 SmallVector<Loop *, 32> Worklist(LI.begin(), LI.end());
14729 while (!Worklist.empty()) {
14730 Loop *L = Worklist.pop_back_val();
14731 if (ValidLoops.insert(L).second)
14732 Worklist.append(L->begin(), L->end());
14733 }
14734 for (const auto &KV : ValueExprMap) {
14735#ifndef NDEBUG
14736 // Check for SCEV expressions referencing invalid/deleted loops.
14737 if (auto *AR = dyn_cast<SCEVAddRecExpr>(KV.second)) {
14738 assert(ValidLoops.contains(AR->getLoop()) &&
14739 "AddRec references invalid loop");
14740 }
14741#endif
14742
14743 // Check that the value is also part of the reverse map.
14744 auto It = ExprValueMap.find(KV.second);
14745 if (It == ExprValueMap.end() || !is_contained(It->second, KV.first)) {
14746 dbgs() << "Value " << *KV.first
14747 << " is in ValueExprMap but not in ExprValueMap\n";
14748 std::abort();
14749 }
14750
14751 if (auto *I = dyn_cast<Instruction>(&*KV.first)) {
14752 if (!ReachableBlocks.contains(I->getParent()))
14753 continue;
14754 const SCEV *OldSCEV = SCM.visit(KV.second);
14755 const SCEV *NewSCEV = SE2.getSCEV(I);
14756 const SCEV *Delta = GetDelta(OldSCEV, NewSCEV);
14757 if (Delta && !Delta->isZero()) {
14758 dbgs() << "SCEV for value " << *I << " changed!\n"
14759 << "Old: " << *OldSCEV << "\n"
14760 << "New: " << *NewSCEV << "\n"
14761 << "Delta: " << *Delta << "\n";
14762 std::abort();
14763 }
14764 }
14765 }
14766
14767 for (const auto &KV : ExprValueMap) {
14768 for (Value *V : KV.second) {
14769 const SCEV *S = ValueExprMap.lookup(V);
14770 if (!S) {
14771 dbgs() << "Value " << *V
14772 << " is in ExprValueMap but not in ValueExprMap\n";
14773 std::abort();
14774 }
14775 if (S != KV.first) {
14776 dbgs() << "Value " << *V << " mapped to " << *S << " rather than "
14777 << *KV.first << "\n";
14778 std::abort();
14779 }
14780 }
14781 }
14782
14783 // Verify integrity of SCEV users.
14784 for (const auto &S : UniqueSCEVs) {
14785 for (SCEVUse Op : S.operands()) {
14786 // We do not store dependencies of constants.
14787 if (isa<SCEVConstant>(Op))
14788 continue;
14789 auto It = SCEVUsers.find(Op);
14790 if (It != SCEVUsers.end() && It->second.count(&S))
14791 continue;
14792 dbgs() << "Use of operand " << *Op << " by user " << S
14793 << " is not being tracked!\n";
14794 std::abort();
14795 }
14796 }
14797
14798 // Verify integrity of ValuesAtScopes users.
14799 for (const auto &ValueAndVec : ValuesAtScopes) {
14800 const SCEV *Value = ValueAndVec.first;
14801 for (const auto &LoopAndValueAtScope : ValueAndVec.second) {
14802 const Loop *L = LoopAndValueAtScope.first;
14803 SCEVUse ValueAtScope = LoopAndValueAtScope.second;
14804 if (!isa<SCEVConstant>(ValueAtScope)) {
14805 auto It = ValuesAtScopesUsers.find(ValueAtScope.getPointer());
14806 if (It != ValuesAtScopesUsers.end() &&
14807 is_contained(It->second, std::make_pair(L, Value)))
14808 continue;
14809 dbgs() << "Value: " << *Value << ", Loop: " << *L << ", ValueAtScope: "
14810 << *ValueAtScope << " missing in ValuesAtScopesUsers\n";
14811 std::abort();
14812 }
14813 }
14814 }
14815
14816 for (const auto &ValueAtScopeAndVec : ValuesAtScopesUsers) {
14817 const SCEV *ValueAtScope = ValueAtScopeAndVec.first;
14818 for (const auto &LoopAndValue : ValueAtScopeAndVec.second) {
14819 const Loop *L = LoopAndValue.first;
14820 const SCEV *Value = LoopAndValue.second;
14822 auto It = ValuesAtScopes.find(Value);
14823 // The recorded value at scope may carry no-wrap flags that are not part
14824 // of the key it is recorded under.
14825 if (It != ValuesAtScopes.end() && any_of(It->second, [&](const auto &LS) {
14826 return LS.first == L && LS.second.getPointer() == ValueAtScope;
14827 }))
14828 continue;
14829 dbgs() << "Value: " << *Value << ", Loop: " << *L << ", ValueAtScope: "
14830 << *ValueAtScope << " missing in ValuesAtScopes\n";
14831 std::abort();
14832 }
14833 }
14834
14835 // Verify integrity of BECountUsers.
14836 auto VerifyBECountUsers = [&](bool Predicated) {
14837 auto &BECounts =
14838 Predicated ? PredicatedBackedgeTakenCounts : BackedgeTakenCounts;
14839 for (const auto &LoopAndBEInfo : BECounts) {
14840 for (const ExitNotTakenInfo &ENT : LoopAndBEInfo.second.ExitNotTaken) {
14841 for (const SCEV *S : {ENT.ExactNotTaken, ENT.SymbolicMaxNotTaken}) {
14842 if (!isa<SCEVConstant>(S)) {
14843 auto UserIt = BECountUsers.find(S);
14844 if (UserIt != BECountUsers.end() &&
14845 UserIt->second.contains({ LoopAndBEInfo.first, Predicated }))
14846 continue;
14847 dbgs() << "Value " << *S << " for loop " << *LoopAndBEInfo.first
14848 << " missing from BECountUsers\n";
14849 std::abort();
14850 }
14851 }
14852 }
14853 }
14854 };
14855 VerifyBECountUsers(/* Predicated */ false);
14856 VerifyBECountUsers(/* Predicated */ true);
14857
14858 // Verify intergity of loop disposition cache.
14859 for (auto &[S, Values] : LoopDispositions) {
14860 for (auto [Loop, CachedDisposition] : Values) {
14861 const auto RecomputedDisposition = SE2.getLoopDisposition(S, Loop);
14862 if (CachedDisposition != RecomputedDisposition) {
14863 dbgs() << "Cached disposition of " << *S << " for loop " << *Loop
14864 << " is incorrect: cached " << CachedDisposition << ", actual "
14865 << RecomputedDisposition << "\n";
14866 std::abort();
14867 }
14868 }
14869 }
14870
14871 // Verify integrity of the block disposition cache.
14872 for (auto &[S, Values] : BlockDispositions) {
14873 for (auto [BB, CachedDisposition] : Values) {
14874 const auto RecomputedDisposition = SE2.getBlockDisposition(S, BB);
14875 if (CachedDisposition != RecomputedDisposition) {
14876 dbgs() << "Cached disposition of " << *S << " for block %"
14877 << BB->getName() << " is incorrect: cached " << CachedDisposition
14878 << ", actual " << RecomputedDisposition << "\n";
14879 std::abort();
14880 }
14881 }
14882 }
14883
14884 // Verify FoldCache/FoldCacheUser caches.
14885 for (auto [FoldID, Expr] : FoldCache) {
14886 auto I = FoldCacheUser.find(Expr);
14887 if (I == FoldCacheUser.end()) {
14888 dbgs() << "Missing entry in FoldCacheUser for cached expression " << *Expr
14889 << "!\n";
14890 std::abort();
14891 }
14892 if (!is_contained(I->second, FoldID)) {
14893 dbgs() << "Missing FoldID in cached users of " << *Expr << "!\n";
14894 std::abort();
14895 }
14896 }
14897 for (auto [Expr, IDs] : FoldCacheUser) {
14898 for (auto &FoldID : IDs) {
14899 const SCEV *S = FoldCache.lookup(FoldID);
14900 if (!S) {
14901 dbgs() << "Missing entry in FoldCache for expression " << *Expr
14902 << "!\n";
14903 std::abort();
14904 }
14905 if (S != Expr) {
14906 dbgs() << "Entry in FoldCache doesn't match FoldCacheUser: " << *S
14907 << " != " << *Expr << "!\n";
14908 std::abort();
14909 }
14910 }
14911 }
14912
14913 // Verify that ConstantMultipleCache computations are correct. We check that
14914 // cached multiples and recomputed multiples are multiples of each other to
14915 // verify correctness. It is possible that a recomputed multiple is different
14916 // from the cached multiple due to strengthened no wrap flags or changes in
14917 // KnownBits computations.
14918 for (auto [S, Multiple] : ConstantMultipleCache) {
14919 APInt RecomputedMultiple = SE2.getConstantMultiple(S);
14920 if ((Multiple != 0 && RecomputedMultiple != 0 &&
14921 Multiple.urem(RecomputedMultiple) != 0 &&
14922 RecomputedMultiple.urem(Multiple) != 0)) {
14923 dbgs() << "Incorrect cached computation in ConstantMultipleCache for "
14924 << *S << " : Computed " << RecomputedMultiple
14925 << " but cache contains " << Multiple << "!\n";
14926 std::abort();
14927 }
14928 }
14929}
14930
14932 Function &F, const PreservedAnalyses &PA,
14933 FunctionAnalysisManager::Invalidator &Inv) {
14934 // Invalidate the ScalarEvolution object whenever it isn't preserved or one
14935 // of its dependencies is invalidated.
14936 auto PAC = PA.getChecker<ScalarEvolutionAnalysis>();
14937 return !(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>()) ||
14938 Inv.invalidate<AssumptionAnalysis>(F, PA) ||
14939 Inv.invalidate<DominatorTreeAnalysis>(F, PA) ||
14940 Inv.invalidate<LoopAnalysis>(F, PA);
14941}
14942
14943AnalysisKey ScalarEvolutionAnalysis::Key;
14944
14947 auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
14948 auto &AC = AM.getResult<AssumptionAnalysis>(F);
14949 auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
14950 auto &LI = AM.getResult<LoopAnalysis>(F);
14951 return ScalarEvolution(F, TLI, AC, DT, LI);
14952}
14953
14959
14962 // For compatibility with opt's -analyze feature under legacy pass manager
14963 // which was not ported to NPM. This keeps tests using
14964 // update_analyze_test_checks.py working.
14965 OS << "Printing analysis 'Scalar Evolution Analysis' for function '"
14966 << F.getName() << "':\n";
14968 return PreservedAnalyses::all();
14969}
14970
14972 "Scalar Evolution Analysis", false, true)
14978 "Scalar Evolution Analysis", false, true)
14979
14980char ScalarEvolutionWrapperPass::ID = 0;
14981
14983
14985 SE.reset(new ScalarEvolution(
14987 getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F),
14989 getAnalysis<LoopInfoWrapperPass>().getLoopInfo()));
14990 return false;
14991}
14992
14994
14996 SE->print(OS);
14997}
14998
15000 if (!VerifySCEV)
15001 return;
15002
15003 SE->verify();
15004}
15005
15013
15015 const SCEV *RHS) {
15016 return getComparePredicate(ICmpInst::ICMP_EQ, LHS, RHS);
15017}
15018
15019const SCEVPredicate *
15021 const SCEV *LHS, const SCEV *RHS) {
15023 assert(LHS->getType() == RHS->getType() &&
15024 "Type mismatch between LHS and RHS");
15025 // Unique this node based on the arguments
15026 ID.AddInteger(SCEVPredicate::P_Compare);
15027 ID.AddInteger(Pred);
15028 ID.AddPointer(LHS);
15029 ID.AddPointer(RHS);
15031 if (const auto *S = UniquePreds.lookup(ID, Token))
15032 return S;
15033 SCEVComparePredicate *Eq = new (SCEVAllocator)
15034 SCEVComparePredicate(ID.Intern(SCEVAllocator), Pred, LHS, RHS);
15035 UniquePreds.insert(Eq, Token);
15036 return Eq;
15037}
15038
15040 const SCEVAddRecExpr *AR,
15043 // Unique this node based on the arguments
15045 ID.AddPointer(AR);
15046 ID.AddInteger(AddedFlags);
15048 if (const auto *S = UniquePreds.lookup(ID, Token))
15049 return S;
15050 auto *OF = new (SCEVAllocator)
15051 SCEVWrapPredicate(ID.Intern(SCEVAllocator), AR, AddedFlags);
15052 UniquePreds.insert(OF, Token);
15053 return OF;
15054}
15055
15056namespace {
15057
15058class SCEVPredicateRewriter : public SCEVRewriteVisitor<SCEVPredicateRewriter> {
15059public:
15060
15061 /// Rewrites \p S in the context of a loop L and the SCEV predication
15062 /// infrastructure.
15063 ///
15064 /// If \p Pred is non-null, the SCEV expression is rewritten to respect the
15065 /// equivalences present in \p Pred.
15066 ///
15067 /// If \p NewPreds is non-null, rewrite is free to add further predicates to
15068 /// \p NewPreds such that the result will be an AddRecExpr.
15069 static const SCEV *rewrite(const SCEV *S, const Loop *L, ScalarEvolution &SE,
15071 const SCEVPredicate *Pred) {
15072 SCEVPredicateRewriter Rewriter(L, SE, NewPreds, Pred);
15073 return Rewriter.visit(S);
15074 }
15075
15076 const SCEV *visitUnknown(const SCEVUnknown *Expr) {
15077 if (Pred) {
15078 if (auto *U = dyn_cast<SCEVUnionPredicate>(Pred)) {
15079 for (const auto *Pred : U->getPredicates())
15080 if (const auto *IPred = dyn_cast<SCEVComparePredicate>(Pred))
15081 if (IPred->getLHS() == Expr &&
15082 IPred->getPredicate() == ICmpInst::ICMP_EQ)
15083 return IPred->getRHS();
15084 } else if (const auto *IPred = dyn_cast<SCEVComparePredicate>(Pred)) {
15085 if (IPred->getLHS() == Expr &&
15086 IPred->getPredicate() == ICmpInst::ICMP_EQ)
15087 return IPred->getRHS();
15088 }
15089 }
15090 return convertToAddRecWithPreds(Expr);
15091 }
15092
15093 const SCEV *visitZeroExtendExpr(const SCEVZeroExtendExpr *Expr) {
15094 const SCEV *Operand = visit(Expr->getOperand());
15095 const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(Operand);
15096 if (AR && AR->getLoop() == L && AR->isAffine()) {
15097 // This couldn't be folded because the operand didn't have the nuw
15098 // flag. Add the nusw flag as an assumption that we could make.
15099 const SCEV *Step = AR->getStepRecurrence(SE);
15100 Type *Ty = Expr->getType();
15101 if (addOverflowAssumption(AR, SCEVWrapPredicate::IncrementNUSW))
15102 return SE.getAddRecExpr(SE.getZeroExtendExpr(AR->getStart(), Ty),
15103 SE.getSignExtendExpr(Step, Ty), L,
15104 AR->getNoWrapFlags());
15105 }
15106 return SE.getZeroExtendExpr(Operand, Expr->getType());
15107 }
15108
15109 const SCEV *visitSignExtendExpr(const SCEVSignExtendExpr *Expr) {
15110 const SCEV *Operand = visit(Expr->getOperand());
15111 const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(Operand);
15112 if (AR && AR->getLoop() == L && AR->isAffine()) {
15113 // This couldn't be folded because the operand didn't have the nsw
15114 // flag. Add the nssw flag as an assumption that we could make.
15115 const SCEV *Step = AR->getStepRecurrence(SE);
15116 Type *Ty = Expr->getType();
15117 if (addOverflowAssumption(AR, SCEVWrapPredicate::IncrementNSSW))
15118 return SE.getAddRecExpr(SE.getSignExtendExpr(AR->getStart(), Ty),
15119 SE.getSignExtendExpr(Step, Ty), L,
15120 AR->getNoWrapFlags());
15121 }
15122 return SE.getSignExtendExpr(Operand, Expr->getType());
15123 }
15124
15125private:
15126 explicit SCEVPredicateRewriter(
15127 const Loop *L, ScalarEvolution &SE,
15128 SmallVectorImpl<const SCEVPredicate *> *NewPreds,
15129 const SCEVPredicate *Pred)
15130 : SCEVRewriteVisitor(SE), NewPreds(NewPreds), Pred(Pred), L(L) {}
15131
15132 bool addOverflowAssumption(const SCEVPredicate *P) {
15133 if (!NewPreds) {
15134 // Check if we've already made this assumption.
15135 return Pred && Pred->implies(P, SE);
15136 }
15137 NewPreds->push_back(P);
15138 return true;
15139 }
15140
15141 bool addOverflowAssumption(const SCEVAddRecExpr *AR,
15143 auto *A = SE.getWrapPredicate(AR, AddedFlags);
15144 return addOverflowAssumption(A);
15145 }
15146
15147 // If \p Expr represents a PHINode, we try to see if it can be represented
15148 // as an AddRec, possibly under a predicate (PHISCEVPred). If it is possible
15149 // to add this predicate as a runtime overflow check, we return the AddRec.
15150 // If \p Expr does not meet these conditions (is not a PHI node, or we
15151 // couldn't create an AddRec for it, or couldn't add the predicate), we just
15152 // return \p Expr.
15153 const SCEV *convertToAddRecWithPreds(const SCEVUnknown *Expr) {
15154 if (!isa<PHINode>(Expr->getValue()))
15155 return Expr;
15156 std::optional<
15157 std::pair<const SCEV *, SmallVector<const SCEVPredicate *, 3>>>
15158 PredicatedRewrite = SE.createAddRecFromPHIWithCasts(Expr);
15159 if (!PredicatedRewrite)
15160 return Expr;
15161 for (const auto *P : PredicatedRewrite->second){
15162 // Wrap predicates from outer loops are not supported.
15163 if (auto *WP = dyn_cast<const SCEVWrapPredicate>(P)) {
15164 if (L != WP->getExpr()->getLoop())
15165 return Expr;
15166 }
15167 if (!addOverflowAssumption(P))
15168 return Expr;
15169 }
15170 return PredicatedRewrite->first;
15171 }
15172
15173 SmallVectorImpl<const SCEVPredicate *> *NewPreds;
15174 const SCEVPredicate *Pred;
15175 const Loop *L;
15176};
15177
15178} // end anonymous namespace
15179
15180const SCEV *
15182 const SCEVPredicate &Preds) {
15183 return SCEVPredicateRewriter::rewrite(S, L, *this, nullptr, &Preds);
15184}
15185
15187 const SCEV *S, const Loop *L,
15190 S = SCEVPredicateRewriter::rewrite(S, L, *this, &TransformPreds, nullptr);
15191 auto *AddRec = dyn_cast<SCEVAddRecExpr>(S);
15192
15193 if (!AddRec)
15194 return nullptr;
15195
15196 // Check if any of the transformed predicates is known to be false. In that
15197 // case, it doesn't make sense to convert to a predicated AddRec, as the
15198 // versioned loop will never execute.
15199 for (const SCEVPredicate *Pred : TransformPreds) {
15200 auto *WrapPred = dyn_cast<SCEVWrapPredicate>(Pred);
15201 if (!WrapPred || WrapPred->getFlags() != SCEVWrapPredicate::IncrementNSSW)
15202 continue;
15203
15204 const SCEVAddRecExpr *AddRecToCheck = WrapPred->getExpr();
15205 const SCEV *ExitCount = getBackedgeTakenCount(AddRecToCheck->getLoop());
15206 if (isa<SCEVCouldNotCompute>(ExitCount))
15207 continue;
15208
15209 const SCEV *Step = AddRecToCheck->getStepRecurrence(*this);
15210 if (!Step->isOne())
15211 continue;
15212
15213 ExitCount = getTruncateOrSignExtend(ExitCount, Step->getType());
15214 const SCEV *Add = getAddExpr(AddRecToCheck->getStart(), ExitCount);
15215 if (isKnownPredicate(CmpInst::ICMP_SLT, Add, AddRecToCheck->getStart()))
15216 return nullptr;
15217 }
15218
15219 // Since the transformation was successful, we can now transfer the SCEV
15220 // predicates.
15221 Preds.append(TransformPreds.begin(), TransformPreds.end());
15222
15223 return AddRec;
15224}
15225
15226/// SCEV predicates
15230
15232 const ICmpInst::Predicate Pred,
15233 const SCEV *LHS, const SCEV *RHS)
15234 : SCEVPredicate(ID, P_Compare), Pred(Pred), LHS(LHS), RHS(RHS) {
15235 assert(LHS->getType() == RHS->getType() && "LHS and RHS types don't match");
15236 assert(LHS != RHS && "LHS and RHS are the same SCEV");
15237}
15238
15240 ScalarEvolution &SE) const {
15241 const auto *Op = dyn_cast<SCEVComparePredicate>(N);
15242
15243 if (!Op)
15244 return false;
15245
15246 if (Op->LHS != LHS || Op->RHS != RHS)
15247 return false;
15248
15249 return ICmpInst::isImpliedByMatchingCmp(Pred, Op->Pred) == true;
15250}
15251
15252bool SCEVComparePredicate::isAlwaysTrue() const { return false; }
15253
15255 if (Pred == ICmpInst::ICMP_EQ)
15256 OS.indent(Depth) << "Equal predicate: " << *LHS << " == " << *RHS << "\n";
15257 else
15258 OS.indent(Depth) << "Compare predicate: " << *LHS << " " << Pred << ") "
15259 << *RHS << "\n";
15260
15261}
15262
15264 const SCEVAddRecExpr *AR,
15265 IncrementWrapFlags Flags)
15266 : SCEVPredicate(ID, P_Wrap), AR(AR), Flags(Flags) {}
15267
15268const SCEVAddRecExpr *SCEVWrapPredicate::getExpr() const { return AR; }
15269
15271 ScalarEvolution &SE) const {
15272 const auto *Op = dyn_cast<SCEVWrapPredicate>(N);
15273 if (!Op || setFlags(Flags, Op->Flags) != Flags)
15274 return false;
15275
15276 if (Op->AR == AR)
15277 return true;
15278
15279 if (Flags != SCEVWrapPredicate::IncrementNSSW &&
15281 return false;
15282
15283 const SCEV *Start = AR->getStart();
15284 const SCEV *OpStart = Op->AR->getStart();
15285 if (Start->getType()->isPointerTy() != OpStart->getType()->isPointerTy())
15286 return false;
15287
15288 // Reject pointers to different address spaces.
15289 if (Start->getType()->isPointerTy() && Start->getType() != OpStart->getType())
15290 return false;
15291
15292 // NUSW/NSSW on a wider-type AddRec does not imply the same on a
15293 // narrower-type AddRec.
15294 if (SE.getTypeSizeInBits(AR->getType()) >
15295 SE.getTypeSizeInBits(Op->AR->getType()))
15296 return false;
15297
15298 const SCEV *Step = AR->getStepRecurrence(SE);
15299 const SCEV *OpStep = Op->AR->getStepRecurrence(SE);
15300 if (!SE.isKnownPositive(Step) || !SE.isKnownPositive(OpStep))
15301 return false;
15302
15303 // If both steps are positive, this implies N, if N's start and step are
15304 // ULE/SLE (for NSUW/NSSW) than this'.
15305 Type *WiderTy = SE.getWiderType(Step->getType(), OpStep->getType());
15306 Step = SE.getNoopOrZeroExtend(Step, WiderTy);
15307 OpStep = SE.getNoopOrZeroExtend(OpStep, WiderTy);
15308
15309 bool IsNUW = Flags == SCEVWrapPredicate::IncrementNUSW;
15310 OpStart = IsNUW ? SE.getNoopOrZeroExtend(OpStart, WiderTy)
15311 : SE.getNoopOrSignExtend(OpStart, WiderTy);
15312 Start = IsNUW ? SE.getNoopOrZeroExtend(Start, WiderTy)
15313 : SE.getNoopOrSignExtend(Start, WiderTy);
15315 return SE.isKnownPredicate(Pred, OpStep, Step) &&
15316 SE.isKnownPredicate(Pred, OpStart, Start);
15317}
15318
15320 SCEVFlags ScevFlags = AR->getNoWrapFlags();
15321 IncrementWrapFlags IFlags = Flags;
15322
15323 if (ScalarEvolution::setFlags(ScevFlags, SCEV::FlagNSW) == ScevFlags)
15324 IFlags = clearFlags(IFlags, IncrementNSSW);
15325
15326 return IFlags == IncrementAnyWrap;
15327}
15328
15329void SCEVWrapPredicate::print(raw_ostream &OS, unsigned Depth) const {
15330 OS.indent(Depth) << *getExpr() << " Added Flags: ";
15332 OS << "<nusw>";
15334 OS << "<nssw>";
15335 OS << "\n";
15336}
15337
15338/// Union predicates don't get cached so create a dummy set ID for it.
15340 ScalarEvolution &SE)
15342 for (const auto *P : Preds)
15343 add(P, SE);
15344}
15345
15347 return all_of(Preds,
15348 [](const SCEVPredicate *I) { return I->isAlwaysTrue(); });
15349}
15350
15352 ScalarEvolution &SE) const {
15353 if (const auto *Set = dyn_cast<SCEVUnionPredicate>(N))
15354 return all_of(Set->Preds, [this, &SE](const SCEVPredicate *I) {
15355 return this->implies(I, SE);
15356 });
15357
15358 if (any_of(Preds,
15359 [N, &SE](const SCEVPredicate *I) { return I->implies(N, SE); }))
15360 return true;
15361
15362 // A wrap predicate may be implied by a wrap predicate in Preds after applying
15363 // equal predicates.
15364 const auto *NWrap = dyn_cast<SCEVWrapPredicate>(N);
15365 if (!NWrap)
15366 return false;
15367 const Loop *L = NWrap->getExpr()->getLoop();
15368 return any_of(Preds, [&](const SCEVPredicate *I) {
15369 const auto *IWrap = dyn_cast<SCEVWrapPredicate>(I);
15370 if (!IWrap)
15371 return false;
15372 const auto *RewrittenAR = dyn_cast<SCEVAddRecExpr>(
15373 SE.rewriteUsingPredicate(IWrap->getExpr(), L, *this));
15374 return RewrittenAR &&
15375 SE.getWrapPredicate(RewrittenAR, IWrap->getFlags())->implies(N, SE);
15376 });
15377}
15378
15380 for (const auto *Pred : Preds)
15381 Pred->print(OS, Depth);
15382}
15383
15384void SCEVUnionPredicate::add(const SCEVPredicate *N, ScalarEvolution &SE) {
15385 if (const auto *Set = dyn_cast<SCEVUnionPredicate>(N)) {
15386 for (const auto *Pred : Set->Preds)
15387 add(Pred, SE);
15388 return;
15389 }
15390
15391 // Implication checks are quadratic in the number of predicates. Stop doing
15392 // them if there are many predicates, as they should be too expensive to use
15393 // anyway at that point.
15394 bool CheckImplies = Preds.size() < 16;
15395
15396 // Only add predicate if it is not already implied by this union predicate.
15397 if (CheckImplies && implies(N, SE))
15398 return;
15399
15400 // Build a new vector containing the current predicates, except the ones that
15401 // are implied by the new predicate N.
15403 for (auto *P : Preds) {
15404 if (CheckImplies && N->implies(P, SE))
15405 continue;
15406 PrunedPreds.push_back(P);
15407 }
15408 Preds = std::move(PrunedPreds);
15409 Preds.push_back(N);
15410}
15411
15413 Loop &L)
15414 : SE(SE), L(L) {
15416 Preds = std::make_unique<SCEVUnionPredicate>(Empty, SE);
15417}
15418
15420 for (const SCEV *Op : Ops)
15421 // We do not expect that forgetting cached data for SCEVConstants will ever
15422 // open any prospects for sharpening or introduce any correctness issues,
15423 // so we don't bother storing their dependencies.
15424 if (!isa<SCEVConstant>(Op))
15425 SCEVUsers[Op].insert(User);
15426}
15427
15429 const SCEV *Expr = SE.getSCEV(V);
15430 return getPredicatedSCEV(Expr);
15431}
15432
15434 RewriteEntry &Entry = RewriteMap[Expr];
15435
15436 // If we already have an entry and the version matches, return it.
15437 if (Entry.second && Generation == Entry.first)
15438 return Entry.second;
15439
15440 // We found an entry but it's stale. Rewrite the stale entry
15441 // according to the current predicate.
15442 if (Entry.second)
15443 Expr = Entry.second;
15444
15445 const SCEV *NewSCEV = SE.rewriteUsingPredicate(Expr, &L, *Preds);
15446 Entry = {Generation, NewSCEV};
15447
15448 return NewSCEV;
15449}
15450
15452 if (!BackedgeCount) {
15454 BackedgeCount = SE.getPredicatedBackedgeTakenCount(&L, Preds);
15455 for (const auto *P : Preds)
15456 addPredicate(*P);
15457 }
15458 return BackedgeCount;
15459}
15460
15462 if (!SymbolicMaxBackedgeCount) {
15464 SymbolicMaxBackedgeCount =
15465 SE.getPredicatedSymbolicMaxBackedgeTakenCount(&L, Preds);
15466 for (const auto *P : Preds)
15467 addPredicate(*P);
15468 }
15469 return SymbolicMaxBackedgeCount;
15470}
15471
15473 if (!SmallConstantMaxTripCount) {
15475 SmallConstantMaxTripCount = SE.getSmallConstantMaxTripCount(&L, &Preds);
15476 for (const auto *P : Preds)
15477 addPredicate(*P);
15478 }
15479 return *SmallConstantMaxTripCount;
15480}
15481
15483 if (Preds->implies(&Pred, SE))
15484 return;
15485
15486 Preds = std::make_unique<SCEVUnionPredicate>(Preds->getUnionWith(&Pred, SE));
15487 updateGeneration();
15488}
15489
15492 for (const SCEVPredicate *P : Preds)
15493 addPredicate(*P);
15494}
15495
15497 return *Preds;
15498}
15499
15500void PredicatedScalarEvolution::updateGeneration() {
15501 // If the generation number wrapped recompute everything.
15502 if (++Generation == 0) {
15503 for (auto &II : RewriteMap) {
15504 const SCEV *Rewritten = II.second.second;
15505 II.second = {Generation, SE.rewriteUsingPredicate(Rewritten, &L, *Preds)};
15506 }
15507 }
15508}
15509
15512 const SCEV *Expr = this->getSCEV(V);
15514 auto *New = SE.convertSCEVToAddRecWithPredicates(Expr, &L, NewPreds);
15515
15516 if (!New)
15517 return nullptr;
15518
15519 if (ExtraPreds) {
15520 ExtraPreds->append(NewPreds);
15521 return New;
15522 }
15523
15524 addPredicates(NewPreds);
15525
15526 RewriteMap[SE.getSCEV(V)] = {Generation, New};
15527 return New;
15528}
15529
15532 : RewriteMap(Init.RewriteMap), SE(Init.SE), L(Init.L),
15533 Preds(std::make_unique<SCEVUnionPredicate>(*Init.Preds)),
15534 Generation(Init.Generation), BackedgeCount(Init.BackedgeCount) {}
15535
15537 // For each block.
15538 for (auto *BB : L.getBlocks())
15539 for (auto &I : *BB) {
15540 if (!SE.isSCEVable(I.getType()))
15541 continue;
15542
15543 auto *Expr = SE.getSCEV(&I);
15544 auto II = RewriteMap.find(Expr);
15545
15546 if (II == RewriteMap.end())
15547 continue;
15548
15549 // Don't print things that are not interesting.
15550 if (II->second.second == Expr)
15551 continue;
15552
15553 OS.indent(Depth) << "[PSE]" << I << ":\n";
15554 OS.indent(Depth + 2) << *Expr << "\n";
15555 OS.indent(Depth + 2) << "--> " << *II->second.second << "\n";
15556 }
15557}
15558
15559void ScalarEvolution::LoopGuards::collectPending() {
15560 const Loop *L = PendingLoop;
15561 if (!L)
15562 return;
15563 PendingLoop = nullptr;
15564 BasicBlock *Pred = L->getLoopPredecessor();
15565 if (!Pred)
15566 return;
15568 collectFromBlock(SE, *this, L->getHeader(), Pred, VisitedBlocks);
15569}
15570
15571void ScalarEvolution::LoopGuards::collectFromPHI(
15575 unsigned Depth) {
15576 if (!SE.isSCEVable(Phi.getType()))
15577 return;
15578
15579 using MinMaxPattern = std::pair<const SCEVConstant *, SCEVTypes>;
15580 auto GetMinMaxConst = [&](unsigned IncomingIdx) -> MinMaxPattern {
15581 const BasicBlock *InBlock = Phi.getIncomingBlock(IncomingIdx);
15582 if (!VisitedBlocks.insert(InBlock).second)
15583 return {nullptr, scCouldNotCompute};
15584
15585 // Avoid analyzing unreachable blocks so that we don't get trapped
15586 // traversing cycles with ill-formed dominance or infinite cycles
15587 if (!SE.DT.isReachableFromEntry(InBlock))
15588 return {nullptr, scCouldNotCompute};
15589
15590 auto [G, Inserted] = IncomingGuards.try_emplace(InBlock, LoopGuards(SE));
15591 if (Inserted)
15592 collectFromBlock(SE, G->second, Phi.getParent(), InBlock, VisitedBlocks,
15593 Depth + 1);
15594 auto &RewriteMap = G->second.RewriteMap;
15595 if (RewriteMap.empty())
15596 return {nullptr, scCouldNotCompute};
15597 auto S = RewriteMap.find(SE.getSCEV(Phi.getIncomingValue(IncomingIdx)));
15598 if (S == RewriteMap.end())
15599 return {nullptr, scCouldNotCompute};
15600 auto *SM = dyn_cast_if_present<SCEVMinMaxExpr>(S->second);
15601 if (!SM)
15602 return {nullptr, scCouldNotCompute};
15603 if (const SCEVConstant *C0 = dyn_cast<SCEVConstant>(SM->getOperand(0)))
15604 return {C0, SM->getSCEVType()};
15605 return {nullptr, scCouldNotCompute};
15606 };
15607 auto MergeMinMaxConst = [](MinMaxPattern P1,
15608 MinMaxPattern P2) -> MinMaxPattern {
15609 auto [C1, T1] = P1;
15610 auto [C2, T2] = P2;
15611 if (!C1 || !C2 || T1 != T2)
15612 return {nullptr, scCouldNotCompute};
15613 switch (T1) {
15614 case scUMaxExpr:
15615 return {C1->getAPInt().ult(C2->getAPInt()) ? C1 : C2, T1};
15616 case scSMaxExpr:
15617 return {C1->getAPInt().slt(C2->getAPInt()) ? C1 : C2, T1};
15618 case scUMinExpr:
15619 return {C1->getAPInt().ugt(C2->getAPInt()) ? C1 : C2, T1};
15620 case scSMinExpr:
15621 return {C1->getAPInt().sgt(C2->getAPInt()) ? C1 : C2, T1};
15622 default:
15623 llvm_unreachable("Trying to merge non-MinMaxExpr SCEVs.");
15624 }
15625 };
15626 auto P = GetMinMaxConst(0);
15627 for (unsigned int In = 1; In < Phi.getNumIncomingValues(); In++) {
15628 if (!P.first)
15629 break;
15630 P = MergeMinMaxConst(P, GetMinMaxConst(In));
15631 }
15632 if (P.first) {
15633 const SCEV *LHS = SE.getSCEV(const_cast<PHINode *>(&Phi));
15634 SmallVector<SCEVUse, 2> Ops({P.first, LHS});
15635 const SCEV *RHS = SE.getMinMaxExpr(P.second, Ops);
15636 Guards.RewriteMap.insert({LHS, RHS});
15637 }
15638}
15639
15640// Return a new SCEV that modifies \p Expr to the closest number divides by
15641// \p Divisor and less or equal than Expr. For now, only handle constant
15642// Expr.
15644 const APInt &DivisorVal,
15645 ScalarEvolution &SE) {
15646 const APInt *ExprVal;
15647 if (!match(Expr, m_scev_APInt(ExprVal)) || ExprVal->isNegative() ||
15648 DivisorVal.isNonPositive())
15649 return Expr;
15650 APInt Rem = ExprVal->urem(DivisorVal);
15651 // return the SCEV: Expr - Expr % Divisor
15652 return SE.getConstant(*ExprVal - Rem);
15653}
15654
15655// Return a new SCEV that modifies \p Expr to the closest number divides by
15656// \p Divisor and greater or equal than Expr. For now, only handle constant
15657// Expr.
15658static const SCEV *getNextSCEVDivisibleByDivisor(const SCEV *Expr,
15659 const APInt &DivisorVal,
15660 ScalarEvolution &SE) {
15661 const APInt *ExprVal;
15662 if (!match(Expr, m_scev_APInt(ExprVal)) || ExprVal->isNegative() ||
15663 DivisorVal.isNonPositive())
15664 return Expr;
15665 APInt Rem = ExprVal->urem(DivisorVal);
15666 if (Rem.isZero())
15667 return Expr;
15668 // return the SCEV: Expr + Divisor - Expr % Divisor
15669 return SE.getConstant(*ExprVal + DivisorVal - Rem);
15670}
15671
15673 ICmpInst::Predicate Predicate, const SCEV *LHS, const SCEV *RHS,
15676 // If we have LHS == 0, check if LHS is computing a property of some unknown
15677 // SCEV %v which we can rewrite %v to express explicitly.
15679 return false;
15680 // If LHS is A % B, i.e. A % B == 0, rewrite A to (A /u B) * B to
15681 // explicitly express that.
15682 const SCEVUnknown *URemLHS = nullptr;
15683 const SCEV *URemRHS = nullptr;
15684 if (!match(LHS, m_scev_URem(m_SCEVUnknown(URemLHS), m_SCEV(URemRHS), SE)))
15685 return false;
15686
15687 const SCEV *Multiple =
15688 SE.getMulExpr(SE.getUDivExpr(URemLHS, URemRHS), URemRHS);
15689 DivInfo[URemLHS] = Multiple;
15690 if (auto *C = dyn_cast<SCEVConstant>(URemRHS))
15691 Multiples[URemLHS] = C->getAPInt();
15692 return true;
15693}
15694
15695// Check if the condition is a divisibility guard (A % B == 0).
15696static bool isDivisibilityGuard(const SCEV *LHS, const SCEV *RHS,
15697 ScalarEvolution &SE) {
15698 const SCEV *X, *Y;
15699 return match(LHS, m_scev_URem(m_SCEV(X), m_SCEV(Y), SE)) && RHS->isZero();
15700}
15701
15702// Apply divisibility by \p Divisor on MinMaxExpr with constant values,
15703// recursively. This is done by aligning up/down the constant value to the
15704// Divisor.
15705static const SCEV *applyDivisibilityOnMinMaxExpr(const SCEV *MinMaxExpr,
15706 APInt Divisor,
15707 ScalarEvolution &SE) {
15708 // Return true if \p Expr is a MinMax SCEV expression with a non-negative
15709 // constant operand. If so, return in \p SCTy the SCEV type and in \p RHS
15710 // the non-constant operand and in \p LHS the constant operand.
15711 auto IsMinMaxSCEVWithNonNegativeConstant =
15712 [&](const SCEV *Expr, SCEVTypes &SCTy, const SCEV *&LHS,
15713 const SCEV *&RHS) {
15714 if (auto *MinMax = dyn_cast<SCEVMinMaxExpr>(Expr)) {
15715 if (MinMax->getNumOperands() != 2)
15716 return false;
15717 if (auto *C = dyn_cast<SCEVConstant>(MinMax->getOperand(0))) {
15718 if (C->getAPInt().isNegative())
15719 return false;
15720 SCTy = MinMax->getSCEVType();
15721 LHS = MinMax->getOperand(0);
15722 RHS = MinMax->getOperand(1);
15723 return true;
15724 }
15725 }
15726 return false;
15727 };
15728
15729 const SCEV *MinMaxLHS = nullptr, *MinMaxRHS = nullptr;
15730 SCEVTypes SCTy;
15731 if (!IsMinMaxSCEVWithNonNegativeConstant(MinMaxExpr, SCTy, MinMaxLHS,
15732 MinMaxRHS))
15733 return MinMaxExpr;
15734 auto IsMin = isa<SCEVSMinExpr>(MinMaxExpr) || isa<SCEVUMinExpr>(MinMaxExpr);
15735 assert(SE.isKnownNonNegative(MinMaxLHS) && "Expected non-negative operand!");
15736 auto *DivisibleExpr =
15737 IsMin ? getPreviousSCEVDivisibleByDivisor(MinMaxLHS, Divisor, SE)
15738 : getNextSCEVDivisibleByDivisor(MinMaxLHS, Divisor, SE);
15740 applyDivisibilityOnMinMaxExpr(MinMaxRHS, Divisor, SE), DivisibleExpr};
15741 return SE.getMinMaxExpr(SCTy, Ops);
15742}
15743
15744void ScalarEvolution::LoopGuards::collectFromBlock(
15745 ScalarEvolution &SE, ScalarEvolution::LoopGuards &Guards,
15746 const BasicBlock *Block, const BasicBlock *Pred,
15747 SmallPtrSetImpl<const BasicBlock *> &VisitedBlocks, unsigned Depth) {
15748
15750
15751 SmallVector<SCEVUse> ExprsToRewrite;
15752 auto CollectCondition = [&](ICmpInst::Predicate Predicate, const SCEV *LHS,
15753 const SCEV *RHS,
15754 DenseMap<const SCEV *, const SCEV *> &RewriteMap,
15755 const LoopGuards &DivGuards) {
15756 // WARNING: It is generally unsound to apply any wrap flags to the proposed
15757 // replacement SCEV which isn't directly implied by the structure of that
15758 // SCEV. In particular, using contextual facts to imply flags is *NOT*
15759 // legal. See the scoping rules for flags in the header to understand why.
15760
15761 // Puts rewrite rule \p From -> \p To into the rewrite map. Also if \p From
15762 // and \p FromRewritten are the same (i.e. there has been no rewrite
15763 // registered for \p From), then puts this value in the list of rewritten
15764 // expressions.
15765 auto AddRewrite = [&](const SCEV *From, const SCEV *FromRewritten,
15766 const SCEV *To) {
15767 if (From == FromRewritten)
15768 ExprsToRewrite.push_back(From);
15769 RewriteMap[From] = To;
15770 };
15771
15772 // Checks whether \p S has already been rewritten. In that case returns the
15773 // existing rewrite because we want to chain further rewrites onto the
15774 // already rewritten value. Otherwise returns \p S.
15775 auto GetMaybeRewritten = [&](const SCEV *S) {
15776 return RewriteMap.lookup_or(S, S);
15777 };
15778
15779 // Check for a condition of the form (-C1 + X < C2). InstCombine will
15780 // create this form when combining two checks of the form (X u< C2 + C1) and
15781 // (X >=u C1).
15782 auto MatchRangeCheckIdiom = [&](ICmpInst::Predicate Pred,
15783 const SCEV *MatchLHS,
15784 const SCEV *MatchRHS) {
15785 const SCEVConstant *C1;
15786 const SCEVUnknown *LHSUnknown;
15787 auto *C2 = dyn_cast<SCEVConstant>(MatchRHS);
15788 if (!match(MatchLHS,
15789 m_scev_Add(m_SCEVConstant(C1), m_SCEVUnknown(LHSUnknown))) ||
15790 !C2)
15791 return false;
15792
15793 auto ExactRegion =
15795 .sub(C1->getAPInt());
15796
15797 // Tighten the raw range with what we already know about LHSUnknown
15798 // from prior guards recorded in RewriteMap, or from SCEV's own range
15799 // analysis.
15800 const SCEV *RewrittenLHS = GetMaybeRewritten(LHSUnknown);
15801 ExactRegion = ExactRegion.intersectWith(SE.getUnsignedRange(RewrittenLHS),
15803
15804 // Bail if the guard is inconsistent with prior facts, or if the range
15805 // is still not a monotonic non-wrapping interval after tightening.
15806 if (ExactRegion.isEmptySet() || ExactRegion.isWrappedSet() ||
15807 ExactRegion.isFullSet())
15808 return false;
15809
15810 const SCEV *RegionMin = SE.getConstant(ExactRegion.getUnsignedMin());
15811 const SCEV *RegionMax = SE.getConstant(ExactRegion.getUnsignedMax());
15812 const SCEV *ClampedLHS =
15813 SE.getUMaxExpr(RegionMin, SE.getUMinExpr(RewrittenLHS, RegionMax));
15814 AddRewrite(LHSUnknown, RewrittenLHS, ClampedLHS);
15815 return true;
15816 };
15817 if (MatchRangeCheckIdiom(Predicate, LHS, RHS))
15818 return;
15819
15820 // Do not apply information for constants or if RHS contains an AddRec.
15822 return;
15823
15824 // If RHS is SCEVUnknown, make sure the information is applied to it.
15826 std::swap(LHS, RHS);
15828 }
15829
15830 const SCEV *RewrittenLHS = GetMaybeRewritten(LHS);
15831 // Apply divisibility information when computing the constant multiple.
15832 const APInt &DividesBy =
15833 SE.getConstantMultiple(DivGuards.rewrite(RewrittenLHS));
15834
15835 // Collect rewrites for LHS and its transitive operands based on the
15836 // condition.
15837 // For min/max expressions, also apply the guard to its operands:
15838 // 'min(a, b) >= c' -> '(a >= c) and (b >= c)',
15839 // 'min(a, b) > c' -> '(a > c) and (b > c)',
15840 // 'max(a, b) <= c' -> '(a <= c) and (b <= c)',
15841 // 'max(a, b) < c' -> '(a < c) and (b < c)'.
15842
15843 // We cannot express strict predicates in SCEV, so instead we replace them
15844 // with non-strict ones against plus or minus one of RHS depending on the
15845 // predicate.
15846 const SCEV *One = SE.getOne(RHS->getType());
15847 switch (Predicate) {
15848 case CmpInst::ICMP_ULT:
15849 if (RHS->getType()->isPointerTy())
15850 return;
15851 RHS = SE.getUMaxExpr(RHS, One);
15852 [[fallthrough]];
15853 case CmpInst::ICMP_SLT: {
15854 RHS = SE.getMinusSCEV(RHS, One);
15855 RHS = getPreviousSCEVDivisibleByDivisor(RHS, DividesBy, SE);
15856 break;
15857 }
15858 case CmpInst::ICMP_UGT:
15859 case CmpInst::ICMP_SGT:
15860 RHS = SE.getAddExpr(RHS, One);
15861 RHS = getNextSCEVDivisibleByDivisor(RHS, DividesBy, SE);
15862 break;
15863 case CmpInst::ICMP_ULE:
15864 case CmpInst::ICMP_SLE:
15865 RHS = getPreviousSCEVDivisibleByDivisor(RHS, DividesBy, SE);
15866 break;
15867 case CmpInst::ICMP_UGE:
15868 case CmpInst::ICMP_SGE:
15869 RHS = getNextSCEVDivisibleByDivisor(RHS, DividesBy, SE);
15870 break;
15871 default:
15872 break;
15873 }
15874
15875 SmallVector<SCEVUse, 16> Worklist(1, LHS);
15876 SmallPtrSet<const SCEV *, 16> Visited;
15877
15878 auto EnqueueOperands = [&Worklist](const SCEVNAryExpr *S) {
15879 append_range(Worklist, S->operands());
15880 };
15881
15882 while (!Worklist.empty()) {
15883 const SCEV *From = Worklist.pop_back_val();
15884 if (isa<SCEVConstant>(From))
15885 continue;
15886 if (!Visited.insert(From).second)
15887 continue;
15888 const SCEV *FromRewritten = GetMaybeRewritten(From);
15889 const SCEV *To = nullptr;
15890
15891 switch (Predicate) {
15892 case CmpInst::ICMP_ULT:
15893 case CmpInst::ICMP_ULE:
15894 To = SE.getUMinExpr(FromRewritten, RHS);
15895 if (auto *UMax = dyn_cast<SCEVUMaxExpr>(FromRewritten))
15896 EnqueueOperands(UMax);
15897 break;
15898 case CmpInst::ICMP_SLT:
15899 case CmpInst::ICMP_SLE:
15900 To = SE.getSMinExpr(FromRewritten, RHS);
15901 if (auto *SMax = dyn_cast<SCEVSMaxExpr>(FromRewritten))
15902 EnqueueOperands(SMax);
15903 break;
15904 case CmpInst::ICMP_UGT:
15905 case CmpInst::ICMP_UGE:
15906 To = SE.getUMaxExpr(FromRewritten, RHS);
15907 if (auto *UMin = dyn_cast<SCEVUMinExpr>(FromRewritten))
15908 EnqueueOperands(UMin);
15909 break;
15910 case CmpInst::ICMP_SGT:
15911 case CmpInst::ICMP_SGE: {
15912 // From s>= RHS s>= 0 implies From u>= RHS, so an earlier
15913 // umax(C, From) with C u<= RHS is redundant. Drop it, as the range of
15914 // the umax may be much less precise than the one of From.
15915 const APInt *C, *RHSC;
15916 if (match(RHS, m_scev_APInt(RHSC)) && RHSC->isNonNegative() &&
15917 match(FromRewritten,
15919 C->ule(*RHSC))
15920 FromRewritten = From;
15921 To = SE.getSMaxExpr(FromRewritten, RHS);
15922 if (auto *SMin = dyn_cast<SCEVSMinExpr>(FromRewritten))
15923 EnqueueOperands(SMin);
15924 break;
15925 }
15926 case CmpInst::ICMP_EQ:
15928 To = RHS;
15929 break;
15930 case CmpInst::ICMP_NE:
15931 if (match(RHS, m_scev_Zero())) {
15932 const SCEV *OneAlignedUp =
15933 getNextSCEVDivisibleByDivisor(One, DividesBy, SE);
15934 To = SE.getUMaxExpr(FromRewritten, OneAlignedUp);
15935 } else {
15936 // LHS != RHS can be rewritten as (LHS - RHS) = UMax(1, LHS - RHS),
15937 // but creating the subtraction eagerly is expensive. Track the
15938 // inequalities in a separate map, and materialize the rewrite lazily
15939 // when encountering a suitable subtraction while re-writing.
15940 if (LHS->getType()->isPointerTy()) {
15941 LHS = SE.getPtrToAddrExpr(LHS);
15942 RHS = SE.getPtrToAddrExpr(RHS);
15944 break;
15945 }
15946 const SCEVConstant *C;
15947 const SCEV *A, *B;
15950 RHS = A;
15951 LHS = B;
15952 }
15953 if (LHS > RHS)
15954 std::swap(LHS, RHS);
15955 Guards.NotEqual.insert({LHS, RHS});
15956 continue;
15957 }
15958 break;
15959 default:
15960 break;
15961 }
15962
15963 if (To)
15964 AddRewrite(From, FromRewritten, To);
15965 }
15966 };
15967
15969 // First, collect information from assumptions dominating the loop.
15970 for (auto &AssumeVH : SE.AC.assumptions()) {
15971 if (!AssumeVH)
15972 continue;
15973 auto *AssumeI = cast<CallInst>(AssumeVH);
15974 if (!SE.DT.dominates(AssumeI, Block))
15975 continue;
15976 Terms.emplace_back(AssumeI->getOperand(0), true);
15977 }
15978
15979 // Second, collect information from llvm.experimental.guards dominating the loop.
15980 auto *GuardDecl = Intrinsic::getDeclarationIfExists(
15981 SE.F.getParent(), Intrinsic::experimental_guard);
15982 if (GuardDecl)
15983 for (const auto *GU : GuardDecl->users())
15984 if (const auto *Guard = dyn_cast<IntrinsicInst>(GU))
15985 if (Guard->getFunction() == Block->getParent() &&
15986 SE.DT.dominates(Guard, Block))
15987 Terms.emplace_back(Guard->getArgOperand(0), true);
15988
15989 // Third, collect conditions from dominating branches. Starting at the loop
15990 // predecessor, climb up the predecessor chain, as long as there are
15991 // predecessors that can be found that have unique successors leading to the
15992 // original header. If there is no such predecessor, continue at the
15993 // immediate dominator.
15994 // TODO: share this logic with isLoopEntryGuardedByCond.
15995 unsigned NumCollectedConditions = 0;
15996 unsigned NumDomTreeSteps = 0;
15998 std::pair<const BasicBlock *, const BasicBlock *> Pair(Pred, Block);
15999 for (;; Pair = SE.getPredecessorWithUniqueSuccessorForBB(Pair.first)) {
16000 if (!Pair.first) {
16001 // At the first block without a unique predecessor, try to build
16002 // conditions for its phis by merging those of their incoming blocks.
16003 if (!NumDomTreeSteps &&
16004 Depth < SE.Opts.scalar_evolution_max_loop_guard_collection_depth) {
16005 SmallDenseMap<const BasicBlock *, LoopGuards> IncomingGuards;
16006 for (auto &Phi : Pair.second->phis())
16007 collectFromPHI(SE, Guards, Phi, VisitedBlocks, IncomingGuards, Depth);
16008 }
16009 const DomTreeNode *IDom = SE.DT.getNode(Pair.second)->getIDom();
16010 if (!IDom ||
16011 ++NumDomTreeSteps > SE.Opts.scalar_evolution_max_guard_dom_tree_steps)
16012 break;
16013 Pair.first = IDom->getBlock();
16014 continue;
16015 }
16016 VisitedBlocks.insert(Pair.second);
16017 const CondBrInst *LoopEntryPredicate =
16018 dyn_cast<CondBrInst>(Pair.first->getTerminator());
16019 if (!LoopEntryPredicate)
16020 continue;
16021
16022 Terms.emplace_back(LoopEntryPredicate->getCondition(),
16023 LoopEntryPredicate->getSuccessor(0) == Pair.second);
16024 NumCollectedConditions++;
16025
16026 // If we are recursively collecting guards stop after 2
16027 // conditions to limit compile-time impact for now.
16028 if (Depth > 0 && NumCollectedConditions == 2)
16029 break;
16030 }
16031
16032 // Now apply the information from the collected conditions to
16033 // Guards.RewriteMap. Conditions are processed in reverse order, so the
16034 // earliest conditions is processed first, except guards with divisibility
16035 // information, which are moved to the back. This ensures the SCEVs with the
16036 // shortest dependency chains are constructed first.
16038 GuardsToProcess;
16039 for (auto [Term, EnterIfTrue] : reverse(Terms)) {
16040 SmallVector<Value *, 8> Worklist;
16041 SmallPtrSet<Value *, 8> Visited;
16042 Worklist.push_back(Term);
16043 while (!Worklist.empty()) {
16044 Value *Cond = Worklist.pop_back_val();
16045 if (!Visited.insert(Cond).second)
16046 continue;
16047
16048 if (auto *Cmp = dyn_cast<ICmpInst>(Cond)) {
16049 auto Predicate =
16050 EnterIfTrue ? Cmp->getPredicate() : Cmp->getInversePredicate();
16051 const auto *LHS = SE.getSCEV(Cmp->getOperand(0));
16052 const auto *RHS = SE.getSCEV(Cmp->getOperand(1));
16053 // If LHS is a constant, apply information to the other expression.
16054 // TODO: If LHS is not a constant, check if using compareSCEVComplexity
16055 // can improve results.
16056 if (isa<SCEVConstant>(LHS)) {
16057 std::swap(LHS, RHS);
16059 }
16060 GuardsToProcess.emplace_back(Predicate, LHS, RHS);
16061 continue;
16062 }
16063
16064 Value *L, *R;
16065 if (EnterIfTrue ? match(Cond, m_LogicalAnd(m_Value(L), m_Value(R)))
16066 : match(Cond, m_LogicalOr(m_Value(L), m_Value(R)))) {
16067 Worklist.push_back(L);
16068 Worklist.push_back(R);
16069 }
16070 }
16071 }
16072
16073 // Process divisibility guards in reverse order to populate DivGuards early.
16074 DenseMap<const SCEV *, APInt> Multiples;
16075 LoopGuards DivGuards(SE);
16076 for (const auto &[Predicate, LHS, RHS] : GuardsToProcess) {
16077 if (!isDivisibilityGuard(LHS, RHS, SE))
16078 continue;
16079 collectDivisibilityInformation(Predicate, LHS, RHS, DivGuards.RewriteMap,
16080 Multiples, SE);
16081 }
16082
16083 for (const auto &[Predicate, LHS, RHS] : GuardsToProcess)
16084 CollectCondition(Predicate, LHS, RHS, Guards.RewriteMap, DivGuards);
16085
16086 // Apply divisibility information last. This ensures it is applied to the
16087 // outermost expression after other rewrites for the given value.
16088 for (const auto &[K, Divisor] : Multiples) {
16089 const SCEV *DivisorSCEV = SE.getConstant(Divisor);
16090 Guards.RewriteMap[K] =
16092 Guards.rewrite(K), Divisor, SE),
16093 DivisorSCEV),
16094 DivisorSCEV);
16095 ExprsToRewrite.push_back(K);
16096 }
16097
16098 // Let the rewriter preserve NUW/NSW flags if the unsigned/signed ranges of
16099 // the replacement expressions are contained in the ranges of the replaced
16100 // expressions.
16101 Guards.PreserveNUW = true;
16102 Guards.PreserveNSW = true;
16103 for (const SCEV *Expr : ExprsToRewrite) {
16104 const SCEV *RewriteTo = Guards.RewriteMap[Expr];
16105 Guards.PreserveNUW &=
16106 SE.getUnsignedRange(Expr).contains(SE.getUnsignedRange(RewriteTo));
16107 Guards.PreserveNSW &=
16108 SE.getSignedRange(Expr).contains(SE.getSignedRange(RewriteTo));
16109 }
16110
16111 // Now that all rewrite information is collect, rewrite the collected
16112 // expressions with the information in the map. This applies information to
16113 // sub-expressions. A collected expression is rewritten when it is first
16114 // looked up, so the rewrites of the expressions it contains are used once
16115 // they are final.
16116 if (ExprsToRewrite.size() > 1) {
16117 constexpr unsigned MaxDepth = 16;
16118 unsigned Depth = 0;
16119 SmallPtrSet<const SCEV *, 16> ToRewrite(llvm::from_range, ExprsToRewrite);
16120 std::function<const SCEV *(const SCEV *)> Lookup = [&](const SCEV *Expr) {
16121 if (Depth < MaxDepth && ToRewrite.erase(Expr)) {
16122 const SCEV *RewriteTo = Guards.RewriteMap[Expr];
16123 Guards.RewriteMap.erase(Expr);
16124 SaveAndRestore Nest(Depth, Depth + 1);
16125 Guards.RewriteMap[Expr] = Guards.rewrite(RewriteTo, Lookup);
16126 }
16127 return Guards.RewriteMap.lookup(Expr);
16128 };
16129 for (const SCEV *Expr : ExprsToRewrite)
16130 Lookup(Expr);
16131 }
16132}
16133
16134const SCEV *ScalarEvolution::LoopGuards::rewrite(const SCEV *Expr) const {
16135 return rewrite(Expr, nullptr);
16136}
16137
16138const SCEV *ScalarEvolution::LoopGuards::rewrite(
16139 const SCEV *Expr, function_ref<const SCEV *(const SCEV *)> Lookup) const {
16140 /// A rewriter to replace SCEV expressions in Map with the corresponding entry
16141 /// in the map. It skips AddRecExpr because we cannot guarantee that the
16142 /// replacement is loop invariant in the loop of the AddRec.
16143 class SCEVLoopGuardRewriter
16144 : public SCEVRewriteVisitor<SCEVLoopGuardRewriter> {
16147 function_ref<const SCEV *(const SCEV *)> Lookup;
16148
16149 SCEVFlags FlagMask = SCEV::FlagNone;
16150
16151 const SCEV *lookup(const SCEV *Key) {
16152 return Lookup ? Lookup(Key) : Map.lookup(Key);
16153 }
16154
16155 public:
16156 SCEVLoopGuardRewriter(ScalarEvolution &SE,
16157 const ScalarEvolution::LoopGuards &Guards,
16158 function_ref<const SCEV *(const SCEV *)> Lookup)
16159 : SCEVRewriteVisitor(SE), Map(Guards.RewriteMap),
16160 NotEqual(Guards.NotEqual), Lookup(Lookup) {
16161 if (Guards.PreserveNUW)
16162 FlagMask = ScalarEvolution::setFlags(FlagMask, SCEV::FlagNUW);
16163 if (Guards.PreserveNSW)
16164 FlagMask = ScalarEvolution::setFlags(FlagMask, SCEV::FlagNSW);
16165 }
16166
16167 const SCEV *visitAddRecExpr(const SCEVAddRecExpr *Expr) { return Expr; }
16168
16169 const SCEV *visitUnknown(const SCEVUnknown *Expr) {
16170 if (const SCEV *S = lookup(Expr))
16171 return S;
16172 return Expr;
16173 }
16174
16175 const SCEV *visitPtrToAddrExpr(const SCEVPtrToAddrExpr *Expr) {
16176 if (const SCEV *S = lookup(Expr))
16177 return S;
16179 Expr);
16180 }
16181
16182 const SCEV *visitZeroExtendExpr(const SCEVZeroExtendExpr *Expr) {
16183 if (const SCEV *S = lookup(Expr))
16184 return S;
16185
16186 // If we didn't find the extact ZExt expr in the map, check if there's
16187 // an entry for a smaller ZExt we can use instead.
16188 Type *Ty = Expr->getType();
16189 const SCEV *Op = Expr->getOperand(0);
16190 unsigned Bitwidth = Ty->getScalarSizeInBits() / 2;
16191 while (Bitwidth % 8 == 0 && Bitwidth >= 8 &&
16192 Bitwidth > Op->getType()->getScalarSizeInBits()) {
16193 Type *NarrowTy = IntegerType::get(SE.getContext(), Bitwidth);
16194 auto *NarrowExt = SE.getZeroExtendExpr(Op, NarrowTy);
16195 if (const SCEV *S = lookup(NarrowExt))
16196 return SE.getZeroExtendExpr(S, Ty);
16197 Bitwidth = Bitwidth / 2;
16198 }
16199
16201 Expr);
16202 }
16203
16204 const SCEV *visitSignExtendExpr(const SCEVSignExtendExpr *Expr) {
16205 if (const SCEV *S = lookup(Expr))
16206 return S;
16208 Expr);
16209 }
16210
16211 const SCEV *visitUMinExpr(const SCEVUMinExpr *Expr) {
16212 if (const SCEV *S = lookup(Expr))
16213 return S;
16215 }
16216
16217 const SCEV *visitSMinExpr(const SCEVSMinExpr *Expr) {
16218 if (const SCEV *S = lookup(Expr))
16219 return S;
16221 }
16222
16223 const SCEV *visitAddExpr(const SCEVAddExpr *Expr) {
16224 if (const SCEV *S = lookup(Expr))
16225 return S;
16226
16227 // Helper to check if S is a subtraction (A - B) where A != B, and if so,
16228 // return UMax(S, 1).
16229 auto RewriteSubtraction = [&](const SCEV *S) -> const SCEV * {
16230 SCEVUse LHS, RHS;
16231 if (MatchBinarySub(S, LHS, RHS)) {
16232 if (LHS > RHS)
16233 std::swap(LHS, RHS);
16234 if (NotEqual.contains({LHS, RHS})) {
16235 const SCEV *OneAlignedUp = getNextSCEVDivisibleByDivisor(
16236 SE.getOne(S->getType()), SE.getConstantMultiple(S), SE);
16237 return SE.getUMaxExpr(OneAlignedUp, S);
16238 }
16239 }
16240 return nullptr;
16241 };
16242
16243 // Check if Expr itself is a subtraction pattern with guard info.
16244 if (const SCEV *Rewritten = RewriteSubtraction(Expr))
16245 return Rewritten;
16246
16247 // Trip count expressions sometimes consist of adding 3 operands, i.e.
16248 // (Const + A + B). There may be guard info for A + B, and if so, apply
16249 // it.
16250 // TODO: Could more generally apply guards to Add sub-expressions.
16251 if (isa<SCEVConstant>(Expr->getOperand(0))) {
16252 if (Expr->getNumOperands() == 3) {
16253 const SCEV *Add =
16254 SE.getAddExpr(Expr->getOperand(1), Expr->getOperand(2));
16255 if (const SCEV *Rewritten = RewriteSubtraction(Add))
16256 return SE.getAddExpr(
16257 Expr->getOperand(0), Rewritten,
16258 ScalarEvolution::maskFlags(Expr->getNoWrapFlags(), FlagMask));
16259 if (const SCEV *S = lookup(Add))
16260 return SE.getAddExpr(Expr->getOperand(0), S);
16261 }
16262
16263 // For expressions of the form (Const + A), check if we have guard info
16264 // for (Const + 1 + A), and rewrite to ((Const + 1 + A) - 1). This makes
16265 // sure we don't lose information when rewriting expressions based on
16266 // back-edge taken counts in some cases.
16267 if (Expr->getNumOperands() == 2) {
16268 const SCEV *S = nullptr;
16269 // Handle (-1 + 1 + A) without constructing SCEVs.
16270 if (match(Expr->getOperand(0), m_scev_AllOnes())) {
16271 S = lookup(Expr->getOperand(1));
16272 } else {
16273 const SCEV *NewC =
16274 SE.getAddExpr(Expr->getOperand(0), SE.getOne(Expr->getType()));
16275 S = lookup(SE.getAddExpr(NewC, Expr->getOperand(1)));
16276 }
16277 if (S)
16278 return SE.getAddExpr(S, SE.getMinusOne(Expr->getType()));
16279 }
16280 }
16282 bool Changed = false;
16283 for (SCEVUse Op : Expr->operands()) {
16284 Operands.push_back(
16286 Changed |= Op != Operands.back();
16287 }
16288 // We are only replacing operands with equivalent values, so transfer the
16289 // flags from the original expression.
16290 return !Changed ? Expr
16291 : SE.getAddExpr(Operands,
16293 Expr->getNoWrapFlags(), FlagMask));
16294 }
16295
16296 const SCEV *visitMulExpr(const SCEVMulExpr *Expr) {
16298 bool Changed = false;
16299 for (SCEVUse Op : Expr->operands()) {
16300 Operands.push_back(
16302 Changed |= Op != Operands.back();
16303 }
16304 // We are only replacing operands with equivalent values, so transfer the
16305 // flags from the original expression.
16306 return !Changed ? Expr
16307 : SE.getMulExpr(Operands,
16309 Expr->getNoWrapFlags(), FlagMask));
16310 }
16311 };
16312
16313 if (RewriteMap.empty() && NotEqual.empty())
16314 return Expr;
16315
16316 SCEVLoopGuardRewriter Rewriter(SE, *this, Lookup);
16317 return Rewriter.visit(Expr);
16318}
16319
16320const SCEV *ScalarEvolution::applyLoopGuards(const SCEV *Expr, const Loop *L) {
16321 LoopGuards Guards = LoopGuards::collectOnDemand(L, *this);
16322 return applyLoopGuards(Expr, Guards);
16323}
16324
16326 LoopGuards &Guards) {
16327 // Loop guards never rewrite constants and AddRecs, so there is no need to
16328 // collect pending guards for them.
16330 return Expr;
16331 if (Guards.PendingLoop)
16332 Guards.collectPending();
16333 return Guards.rewrite(Expr);
16334}
const TargetLowering & TLI
SDValue Pred
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t uint64_t
constexpr LLT S1
Rewrite undef for PHI
This file implements a class to represent arbitrary precision integral constant values and operations...
@ PostInc
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
bpf unwind BPF Unwind Lower
#define X(NUM, ENUM, NAME)
Definition ELF.h:665
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_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition Compiler.h:690
This file contains the declarations for the subclasses of Constant, which represent the different fla...
SmallPtrSet< const BasicBlock *, 8 > VisitedBlocks
This file defines the DenseMap class.
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
static bool isSigned(unsigned Opcode)
This file defines a hash set that can be used to remove duplication of nodes in a graph.
#define op(i)
Hexagon Common GEP
Value * getPointer(Value *Ptr)
IRTranslator LLVM IR MI
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This defines the Use class.
iv Induction Variable Users
Definition IVUsers.cpp:48
static bool lookup(const GsymReader &GR, GsymDataExtractor &Data, uint64_t &Offset, uint64_t BaseAddr, uint64_t Addr, SourceLocations &SrcLocs, llvm::Error &Err)
A Lookup helper functions.
static bool hasNoUnsignedWrap(BinaryOperator &I)
static constexpr Value * getValue(Ty &ValueOrUse)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:550
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
#define T
#define T1
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
#define P(N)
ppc ctr loops verify
PowerPC Reduce CR logical Operation
if(PassOpts->AAPipeline)
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
R600 Clause Merge
MachineBasicBlock * Folded
SmallVector< MachineOperand, 4 > Cond
int64_t C1
int64_t C0
unsigned ExpectedFlags
static DominatorTree getDomTree(Function &F)
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
SI Fold Operands
SI optimize exec mask operations pre RA
static void visit(BasicBlock &Start, std::function< bool(BasicBlock *)> op)
This file contains some templates that are useful if you are working with the STL at all.
This file provides utility classes that use RAII to save and restore values.
bool SCEVMinMaxExprContains(const SCEV *Root, const SCEV *OperandToFind, SCEVTypes RootKind)
static const Loop * isIntegerLoopHeaderPHI(const PHINode *PN, LoopInfo &LI)
static unsigned getConstantTripCount(const SCEVConstant *ExitCount)
static const SCEV * getNextSCEVDivisibleByDivisor(const SCEV *Expr, const APInt &DivisorVal, ScalarEvolution &SE)
static PHINode * getConstantEvolvingPHIOperands(const AnalysisOptions &Opts, Instruction *UseInst, const Loop *L, DenseMap< Instruction *, PHINode * > &PHIMap, const TargetLibraryInfo *TLI, unsigned Depth)
getConstantEvolvingPHIOperands - Implement getConstantEvolvingPHI by recursing through each instructi...
static void PushLoopPHIs(const Loop *L, SmallVectorImpl< Instruction * > &Worklist, SmallPtrSetImpl< Instruction * > &Visited)
Push PHI nodes in the header of the given loop onto the given Worklist.
static void insertFoldCacheEntry(const ScalarEvolution::FoldID &ID, const SCEV *S, DenseMap< ScalarEvolution::FoldID, const SCEV * > &FoldCache, DenseMap< const SCEV *, SmallVector< ScalarEvolution::FoldID, 2 > > &FoldCacheUser)
static bool hasHugeExpression(const AnalysisOptions &Opts, ArrayRef< SCEVUse > Ops)
Returns true if Ops contains a huge SCEV (the subtree of S contains at least -scalar-evolution-huge-e...
static bool RangeRefPHIAllowedOperands(DominatorTree &DT, PHINode *PHI)
static bool IsKnownPredicateViaAddRecMonotonicity(ScalarEvolution &SE, CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Is LHS Pred RHS true because one of them is an AddRec that is known not to go below its own start val...
static std::optional< APInt > MinOptional(std::optional< APInt > X, std::optional< APInt > Y)
Helper function to compare optional APInts: (a) if X and Y both exist, return min(X,...
static std::optional< BinaryOp > MatchBinaryOp(Value *V, const DominatorTree &DT)
Try to map V into a BinaryOp, and return std::nullopt on failure.
static bool canConstantFold(const Instruction *I, const TargetLibraryInfo *TLI)
Return true if we can constant fold an instruction of the specified type, assuming that all operands ...
static BinaryOperator * getCommonInstForPHI(PHINode *PN)
static PHINode * getConstantEvolvingPHI(const AnalysisOptions &Opts, Value *V, const Loop *L, const TargetLibraryInfo *TLI)
getConstantEvolvingPHI - Given an LLVM value and a loop, return a PHI node in the loop that V is deri...
static bool isDivisibilityGuard(const SCEV *LHS, const SCEV *RHS, ScalarEvolution &SE)
static std::optional< const SCEV * > createNodeForSelectViaUMinSeq(ScalarEvolution *SE, const SCEV *CondExpr, const SCEV *TrueExpr, const SCEV *FalseExpr)
static Constant * BuildConstantFromSCEV(const SCEV *V)
This builds up a Constant using the ConstantExpr interface.
static ConstantInt * EvaluateConstantChrecAtConstant(const SCEVAddRecExpr *AddRec, ConstantInt *C, ScalarEvolution &SE)
static const SCEV * BinomialCoefficient(const SCEV *It, unsigned K, ScalarEvolution &SE, Type *ResultTy)
Compute BC(It, K). The result has width W. Assume, K > 0.
static bool IsMinMaxConsistingOf(const SCEV *MaybeMinMaxExpr, const SCEV *Candidate)
Is MaybeMinMaxExpr an (U|S)(Min|Max) of Candidate and some other values?
static SCEVFlags getNoWrapFlagsForGEP(GEPOperator *GEP, const SCEV *Accum, ScalarEvolution &SE)
static const SCEV * SolveLinEquationWithOverflow(const APInt &A, const SCEV *B, SmallVectorImpl< const SCEVPredicate * > *Predicates, ScalarEvolution &SE, const Loop *L)
Finds the minimum unsigned root of the following equation:
static uint64_t umul_ov(uint64_t i, uint64_t j, bool &Overflow)
static void PrintSCEVWithTypeHint(raw_ostream &OS, const SCEV *S)
When printing a top-level SCEV for trip counts, it's helpful to include a type for constants which ar...
static void PrintLoopInfo(raw_ostream &OS, ScalarEvolution *SE, const Loop *L)
static bool containsConstantInAddMulChain(const SCEV *StartExpr)
Determine if any of the operands in this SCEV are a constant or if any of the add or multiply express...
static const SCEV * getExtendAddRecStart(const SCEVAddRecExpr *AR, Type *Ty, ScalarEvolution *SE, unsigned Depth)
static const SCEV * constantFoldAndGroupOps(const AnalysisOptions &Opts, ScalarEvolution &SE, LoopInfo &LI, DominatorTree &DT, SmallVectorImpl< SCEVUse > &Ops, FoldT Fold, IsIdentityT IsIdentity, IsAbsorberT IsAbsorber)
Performs a number of common optimizations on the passed Ops.
static int compareValueComplexity(const AnalysisOptions &Opts, const LoopInfo *const LI, Value *LV, Value *RV, unsigned Depth)
Compare the two values LV and RV in terms of their "complexity" where "complexity" is a partial (and ...
static bool IsKnownPredicateViaAddRecStart(ScalarEvolution &SE, CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
static const SCEV * getPreStartForExtend(const SCEVAddRecExpr *AR, ScalarEvolution *SE, unsigned Depth)
static bool collectDivisibilityInformation(ICmpInst::Predicate Predicate, const SCEV *LHS, const SCEV *RHS, DenseMap< const SCEV *, const SCEV * > &DivInfo, DenseMap< const SCEV *, APInt > &Multiples, ScalarEvolution &SE)
static void PushDefUseChildren(Instruction *I, SmallVectorImpl< Instruction * > &Worklist, SmallPtrSetImpl< Instruction * > &Visited)
Push users of the given Instruction onto the given Worklist.
static std::optional< APInt > SolveQuadraticAddRecRange(const SCEVAddRecExpr *AddRec, const ConstantRange &Range, ScalarEvolution &SE)
Let c(n) be the value of the quadratic chrec {0,+,M,+,N} after n iterations.
static int compareSCEVComplexity(const AnalysisOptions &Opts, const LoopInfo *const LI, SCEVUse LHS, SCEVUse RHS, DominatorTree &DT)
static bool getOperandsForSelectLikePHI(DominatorTree &DT, PHINode *PN, Value *&Cond, Value *&LHS, Value *&RHS)
static std::optional< std::tuple< APInt, APInt, APInt, APInt, unsigned > > GetQuadraticEquation(const SCEVAddRecExpr *AddRec)
For a given quadratic addrec, generate coefficients of the corresponding quadratic equation,...
static bool CollectAddOperandsWithScales(SmallDenseMap< const SCEV *, APInt, 16 > &M, SmallVectorImpl< SCEVUse > &NewOps, APInt &AccumulatedConstant, ArrayRef< SCEVUse > Ops, const APInt &Scale, ScalarEvolution &SE)
Process the given Ops list, which is a list of operands to be added under the given scale,...
static bool isKnownPredicateExtendIdiom(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
static std::optional< APInt > SolveQuadraticAddRecExact(const SCEVAddRecExpr *AddRec, ScalarEvolution &SE)
Let c(n) be the value of the quadratic chrec {L,+,M,+,N} after n iterations.
static std::optional< APInt > TruncIfPossible(std::optional< APInt > X, unsigned BitWidth)
Helper function to truncate an optional APInt to a given BitWidth.
static SCEVFlags StrengthenNoWrapFlags(ScalarEvolution *SE, SCEVTypes Type, ArrayRef< SCEVUse > Ops, SCEVFlags Flags)
static void groupByComplexity(const AnalysisOptions &Opts, SmallVectorImpl< SCEVUse > &Ops, LoopInfo *LI, DominatorTree &DT)
Given a list of SCEV objects, order them by their complexity, and group objects of the same complexit...
static APInt extractConstantWithoutWrapping(ScalarEvolution &SE, const SCEVConstant *ConstantTerm, const SCEVAddExpr *WholeAddExpr)
static bool canConstantEvolve(Instruction *I, const Loop *L, const TargetLibraryInfo *TLI)
Determine whether this instruction can constant evolve within this loop assuming its operands can all...
static bool MatchBinarySub(const SCEV *S, SCEVUse &LHS, SCEVUse &RHS)
static std::optional< ConstantRange > GetRangeFromMetadata(Value *V)
Helper method to assign a range to V from metadata present in the IR.
static Type * isSimpleCastedPHI(const SCEV *Op, const SCEVUnknown *SymbolicPHI, bool &Signed, ScalarEvolution &SE)
Helper function to createAddRecFromPHIWithCasts.
static Constant * EvaluateExpression(Value *V, const Loop *L, DenseMap< Instruction *, Constant * > &Vals, const DataLayout &DL, const TargetLibraryInfo *TLI)
EvaluateExpression - Given an expression that passes the getConstantEvolvingPHI predicate,...
static const SCEV * getPreviousSCEVDivisibleByDivisor(const SCEV *Expr, const APInt &DivisorVal, ScalarEvolution &SE)
static const SCEV * MatchNotExpr(const SCEV *Expr)
If Expr computes ~A, return A else return nullptr.
static std::pair< ConstantRange, bool > getRangeForAffineARHelper(APInt Step, const ConstantRange &StartRange, const APInt &MaxBECount, bool Signed)
static const SCEV * applyDivisibilityOnMinMaxExpr(const SCEV *MinMaxExpr, APInt Divisor, ScalarEvolution &SE)
static cl::opt< bool, true > VerifySCEVOpt("verify-scev", cl::Hidden, cl::location(VerifySCEV), cl::desc("Verify ScalarEvolution's backedge taken counts (slow)"))
static const SCEV * getSignedOverflowLimitForStep(const SCEV *Step, ICmpInst::Predicate *Pred, ScalarEvolution *SE)
static bool HasSameValue(const SCEV *A, const SCEV *B)
SCEV structural equivalence is usually sufficient for testing whether two expressions are equal,...
static uint64_t Choose(uint64_t n, uint64_t k, bool &Overflow)
Compute the result of "n choose k", the binomial coefficient.
static bool scevUnconditionallyPropagatesPoisonFromOperands(SCEVTypes Kind)
static Constant * getOtherIncomingValue(PHINode *PN, BasicBlock *BB)
static const SCEV * getUnsignedOverflowLimitForStep(const SCEV *Step, ICmpInst::Predicate *Pred, ScalarEvolution *SE)
static bool IsKnownPredicateViaMinOrMax(ScalarEvolution &SE, CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Is LHS Pred RHS true on the virtue of LHS or RHS being a Min or Max expression?
static bool BrPHIToSelect(DominatorTree &DT, CondBrInst *BI, PHINode *Merge, Value *&C, Value *&LHS, Value *&RHS)
This file defines the scope_exit class, which executes user-defined cleanup logic at scope exit.
static bool InBlock(const Value *V, const BasicBlock *BB)
Provides some synthesis utilities to produce sequences of values.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
LocallyHashedType DenseMapInfo< LocallyHashedType >::Empty
static std::optional< bool > isImpliedCondOperands(CmpInst::Predicate Pred, const Value *ALHS, const Value *ARHS, const Value *BLHS, const Value *BRHS)
Return true if "icmp Pred BLHS BRHS" is true whenever "icmp PredALHS ARHS" is true.
virt reg Virtual Register Rewriter
static int Lookup(ArrayRef< TableEntry > Table, unsigned Opcode)
Value * RHS
Value * LHS
BinaryOperator * Mul
static const uint32_t IV[8]
Definition blake3_impl.h:83
SCEVCastSinkingRewriter(ScalarEvolution &SE, Type *TargetTy, ConversionFn CreatePtrCast)
static const SCEV * rewrite(const SCEV *Scev, ScalarEvolution &SE, Type *TargetTy, ConversionFn CreatePtrCast)
const SCEV * visitUnknown(const SCEVUnknown *Expr)
const SCEV * visitAddExpr(const SCEVAddExpr *Expr)
const SCEV * visit(const SCEV *S)
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:2009
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1057
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:419
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1560
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1532
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:970
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:202
APInt abs() const
Get the absolute value.
Definition APInt.h:1815
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition APInt.h:1205
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:367
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1186
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:376
bool isSignMask() const
Check if the APInt's value is returned by getSignMask.
Definition APInt.h:462
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1695
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1508
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1115
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:205
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition APInt.h:212
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:325
LLVM_ABI APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1973
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:215
bool isNonPositive() const
Determine if this APInt Value is non-positive (<= 0).
Definition APInt.h:357
unsigned countTrailingZeros() const
Definition APInt.h:1667
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
Definition APInt.h:352
unsigned logBase2() const
Definition APInt.h:1781
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition APInt.h:471
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:829
LLVM_ABI APInt multiplicativeInverse() const
Definition APInt.cpp:1303
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:330
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1154
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:1030
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:875
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:436
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:302
bool isSignBitSet() const
Determine if sign bit of this APInt is set.
Definition APInt.h:337
bool slt(const APInt &RHS) const
Signed less than comparison.
Definition APInt.h:1134
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:196
bool isIntN(unsigned N) const
Check if this APInt has an N-bits unsigned integer value.
Definition APInt.h:428
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1241
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:235
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1225
This templated class represents "all analyses that operate over <aparticular IR unit>" (e....
Definition Analysis.h:50
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
void setPreservesAll()
Set by analyses that do not transform their input at all.
AnalysisUsage & addRequiredTransitive()
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:130
size_t size() const
Get the array size.
Definition ArrayRef.h:141
iterator begin() const
Definition ArrayRef.h:129
A function analysis which provides an AssumptionCache.
An immutable pass that tracks lazily created AssumptionCache objects.
A cache of @llvm.assume calls within a function.
MutableArrayRef< WeakVH > assumptions()
Access the list of assumption handles currently tracked for this function.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:440
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
const Instruction & front() const
Definition BasicBlock.h:463
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
LLVM_ABI unsigned getNoWrapKind() const
Returns one of OBO::NoSignedWrap or OBO::NoUnsignedWrap.
LLVM_ABI Instruction::BinaryOps getBinaryOp() const
Returns the binary operation underlying the intrinsic.
BinaryOps getOpcode() const
Definition InstrTypes.h:409
This class represents a function call, abstracting a target machine's calling convention.
virtual void deleted()
Callback for Value destruction.
void setValPtr(Value *P)
This is the base class for all instructions that perform data casts.
Definition InstrTypes.h:512
This class is the base class for the comparison instructions.
Definition InstrTypes.h:728
bool isFalseWhenEqual() const
This is just a convenience.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ ICMP_SLT
signed less than
Definition InstrTypes.h:769
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:770
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:764
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:767
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:768
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
bool isSigned() const
Definition InstrTypes.h:993
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:890
bool isTrueWhenEqual() const
This is just a convenience.
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
Definition InstrTypes.h:934
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:852
bool isUnsigned() const
Definition InstrTypes.h:999
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
Definition InstrTypes.h:989
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI std::optional< CmpPredicate > getMatching(CmpPredicate A, CmpPredicate B)
Compares two CmpPredicates taking samesign into account and returns the canonicalized CmpPredicate if...
CmpInst::Predicate dropSameSign() const
Drops samesign information.
Conditional Branch instruction.
Value * getCondition() const
BasicBlock * getSuccessor(unsigned i) const
static LLVM_ABI Constant * getNot(Constant *C)
static Constant * getPtrAdd(Constant *Ptr, Constant *Offset, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReduced=nullptr)
Create a getelementptr i8, ptr, offset constant expression.
Definition Constants.h:1518
static LLVM_ABI Constant * getPtrToAddr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getNeg(Constant *C, bool HasNSW=false)
static LLVM_ABI Constant * getTrunc(Constant *C, Type *Ty, bool OnlyIfReduced=false)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:219
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
static LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
This class represents a range of values.
LLVM_ABI ConstantRange add(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an addition of a value in this ran...
LLVM_ABI ConstantRange zextOrTrunc(uint32_t BitWidth) const
Make this range have the bit width given by BitWidth.
PreferredRangeType
If represented precisely, the result of some range operations may consist of multiple disjoint ranges...
LLVM_ABI bool getEquivalentICmp(CmpInst::Predicate &Pred, APInt &RHS) const
Set up Pred and RHS such that ConstantRange::makeExactICmpRegion(Pred, RHS) == *this.
const APInt & getLower() const
Return the lower value for this range.
LLVM_ABI ConstantRange urem(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an unsigned remainder operation of...
LLVM_ABI bool isFullSet() const
Return true if this set contains all of the elements possible for this data-type.
LLVM_ABI bool icmp(CmpInst::Predicate Pred, const ConstantRange &Other) const
Does the predicate Pred hold between ranges this and Other?
LLVM_ABI bool isEmptySet() const
Return true if this set contains no members.
LLVM_ABI ConstantRange zeroExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI bool isSignWrappedSet() const
Return true if this set wraps around the signed domain.
LLVM_ABI APInt getSignedMin() const
Return the smallest signed value contained in the ConstantRange.
LLVM_ABI bool isWrappedSet() const
Return true if this set wraps around the unsigned domain.
LLVM_ABI void print(raw_ostream &OS) const
Print out the bounds to a stream.
bool isSingleElement() const
Return true if this set contains exactly one member.
LLVM_ABI ConstantRange truncate(uint32_t BitWidth, unsigned NoWrapKind=0) const
Return a new range in the specified integer type, which must be strictly smaller than the current typ...
LLVM_ABI ConstantRange signExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
const APInt & getUpper() const
Return the upper value for this range.
LLVM_ABI ConstantRange unionWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the union of this range with another range.
static LLVM_ABI ConstantRange makeExactICmpRegion(CmpInst::Predicate Pred, const APInt &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
LLVM_ABI APInt getSignedMax() const
Return the largest signed value contained in the ConstantRange.
static ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
static LLVM_ABI ConstantRange makeGuaranteedNoWrapRegion(Instruction::BinaryOps BinOp, const ConstantRange &Other, unsigned NoWrapKind)
Produce the largest range containing all X such that "X BinOp Y" is guaranteed not to wrap (overflow)...
LLVM_ABI unsigned getMinSignedBits() const
Compute the maximal number of bits needed to represent every value in this signed range.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
LLVM_ABI ConstantRange sub(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a subtraction of a value in this r...
LLVM_ABI ConstantRange sextOrTrunc(uint32_t BitWidth) const
Make this range have the bit width given by BitWidth.
static LLVM_ABI ConstantRange makeExactNoWrapRegion(Instruction::BinaryOps BinOp, const APInt &Other, unsigned NoWrapKind)
Produce the range that contains X if and only if "X BinOp Other" does not wrap.
This is an important base class in LLVM.
Definition Constant.h:44
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
LLVM_ABI const StructLayout * getStructLayout(StructType *Ty) const
Returns a StructLayout object, indicating the alignment of the struct, its size, and the offsets of i...
LLVM_ABI unsigned getIndexTypeSizeInBits(Type *Ty) const
The size in bits of the index used in GEP calculation for this type.
LLVM_ABI IntegerType * getIndexType(LLVMContext &C, unsigned AddressSpace) const
Returns the type of a GEP index in AddressSpace.
TypeSize getTypeSizeInBits(Type *Ty) const
Size examples:
Definition DataLayout.h:791
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition DenseMap.h:757
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
Definition DenseMap.h:762
bool empty() const
Definition DenseMap.h:716
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:766
iterator end()
Definition DenseMap.h:686
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
Definition DenseMap.h:678
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
Definition DenseMap.h:793
iterator find_as(const LookupKeyT &Val)
Alternate version of find() which allows a different, and possibly less expensive,...
Definition DenseMap.h:779
void swap(DenseMapBase &RHS)
Definition DenseMap.h:975
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:827
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:856
DomTreeNodeBase * getIDom() const
NodeT * getBlock() const
Analysis pass which computes a DominatorTree.
Definition Dominators.h:241
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
Legacy analysis pass which computes a DominatorTree.
Definition Dominators.h:277
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
LLVM_ABI bool isReachableFromEntry(const Use &U) const
Provide an overload for a Use.
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
This instruction extracts a single (scalar) element from a VectorType value.
This instruction extracts a struct member or array element value from an aggregate value.
Insertion token: a failed lookup fills it in, the matching insert consumes it.
Definition FoldingSet.h:284
This class describes a reference to an interned FoldingSetNodeID, which can be a useful to store node...
Definition FoldingSet.h:123
This class is used to gather all the unique data bits of a node.
Definition FoldingSet.h:162
void AddInteger(signed I)
Definition FoldingSet.h:190
This class represents a freeze function that returns random concrete value if an operand is either a ...
FunctionPass(char &pid)
Definition Pass.h:314
Represents flags for the getelementptr instruction/expression.
bool hasNoUnsignedSignedWrap() const
bool hasNoUnsignedWrap() const
static GEPNoWrapFlags none()
static LLVM_ABI Type * getTypeAtIndex(Type *Ty, Value *Idx)
Return the type of the element at the given index of an indexable type.
Module * getParent()
Get the module that this global value is contained inside of...
static bool isPrivateLinkage(LinkageTypes Linkage)
static bool isInternalLinkage(LinkageTypes Linkage)
This instruction compares its operands according to the predicate given to the constructor.
CmpPredicate getCmpPredicate() const
static bool isGE(Predicate P)
Return true if the predicate is SGE or UGE.
CmpPredicate getSwappedCmpPredicate() const
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
static bool isLT(Predicate P)
Return true if the predicate is SLT or ULT.
CmpPredicate getInverseCmpPredicate() const
Predicate getNonStrictCmpPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
static bool isGT(Predicate P)
Return true if the predicate is SGT or UGT.
Predicate getFlippedSignednessPredicate() const
For example, SLT->ULT, ULT->SLT, SLE->ULE, ULE->SLE, EQ->EQ.
static CmpPredicate getInverseCmpPredicate(CmpPredicate Pred)
bool isEquality() const
Return true if this predicate is either EQ or NE.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
static LLVM_ABI std::optional< bool > isImpliedByMatchingCmp(CmpPredicate Pred1, CmpPredicate Pred2)
Determine if Pred1 implies Pred2 is true, false, or if nothing can be inferred about the implication,...
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
static bool isLE(Predicate P)
Return true if the predicate is SLE or ULE.
This instruction inserts a single (scalar) element into a VectorType value.
This instruction inserts a struct field of array element value into an aggregate value.
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
LLVM_ABI bool isIdenticalToWhenDefined(const Instruction *I, bool IntersectAttrs=false) const LLVM_READONLY
This is like isIdenticalTo, except that it ignores the SubclassOptionalData flags,...
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:338
A helper class to return the specified delimiter string after the first invocation of operator String...
An instruction for reading from memory.
Analysis pass that exposes the LoopInfo for a function.
Definition LoopInfo.h:598
bool contains(const LoopT *L) const
Return true if the specified loop is contained within this loop.
BlockT * getHeader() const
BlockT * getLoopPredecessor() const
If the given loop's header has exactly one unique predecessor outside the loop, return it.
LoopT * getParentLoop() const
Return the parent loop if it exists or nullptr for top level loops.
unsigned getLoopDepth(const BlockT *BB) const
Return the loop nesting level of the specified block.
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
The legacy pass manager's analysis pass to compute loop information.
Definition LoopInfo.h:623
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
LLVM_ABI bool isLoopInvariant(const Value *V) const
Return true if the specified value is loop invariant.
Definition LoopInfo.cpp:68
Metadata node.
Definition Metadata.h:1081
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
unsigned getOpcode() const
Return the opcode for this Instruction or ConstantExpr.
Definition Operator.h:43
Utility class for integer operators which may exhibit overflow - Add, Sub, Mul, and Shl.
Definition Operator.h:78
bool hasNoSignedWrap() const
Test whether this operation is known to never undergo signed overflow, aka the nsw property.
Definition Operator.h:113
bool hasNoUnsignedWrap() const
Test whether this operation is known to never undergo unsigned overflow, aka the nuw property.
Definition Operator.h:107
iterator_range< const_block_iterator > blocks() const
op_range incoming_values()
Value * getIncomingValueForBlock(const BasicBlock *BB) const
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
PointerIntPair - This class implements a pair of a pointer and small integer.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
LLVM_ABI void addPredicate(const SCEVPredicate &Pred)
Adds a new predicate.
LLVM_ABI const SCEVPredicate & getPredicate() const
LLVM_ABI const SCEV * getPredicatedSCEV(const SCEV *Expr)
Returns the rewritten SCEV for Expr in the context of the current SCEV predicate.
LLVM_ABI bool areAddRecsEqualWithPreds(const SCEVAddRecExpr *AR1, const SCEVAddRecExpr *AR2, ArrayRef< const SCEVPredicate * > ExtraPreds={}) const
Check if AR1 and AR2 are equal, while taking into account Equal predicates in Preds and ExtraPreds.
LLVM_ABI const SCEVAddRecExpr * getAsAddRec(Value *V, SmallVectorImpl< const SCEVPredicate * > *WrapPredsAdded=nullptr)
Attempts to produce an AddRecExpr for V by adding additional SCEV predicates.
LLVM_ABI void print(raw_ostream &OS, unsigned Depth) const
Print the SCEV mappings done by the Predicated Scalar Evolution.
LLVM_ABI PredicatedScalarEvolution(ScalarEvolution &SE, Loop &L)
LLVM_ABI unsigned getSmallConstantMaxTripCount()
Returns the upper bound of the loop trip count as a normal unsigned value, or 0 if the trip count is ...
LLVM_ABI void addPredicates(ArrayRef< const SCEVPredicate * > Preds)
Adds all predicates in Preds.
LLVM_ABI const SCEV * getBackedgeTakenCount()
Get the (predicated) backedge count for the analyzed loop.
LLVM_ABI const SCEV * getSymbolicMaxBackedgeTakenCount()
Get the (predicated) symbolic max backedge count for the analyzed loop.
LLVM_ABI const SCEV * getSCEV(Value *V)
Returns the SCEV expression of V, in the context of the current SCEV predicate.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalysisChecker getChecker() const
Build a checker for this PreservedAnalyses and the specified analysis type.
Definition Analysis.h:275
constexpr bool isValid() const
Definition Register.h:112
This node represents an addition of some number of SCEVs.
This node represents a polynomial recurrence on the trip count of the specified loop.
LLVM_ABI SCEVUse getExitValue(ScalarEvolution &SE) const
Return the value of this recurrences when its loop exits, i.e.
LLVM_ABI const SCEV * evaluateAtIteration(const SCEV *It, ScalarEvolution &SE) const
Return the value of this chain of recurrences at the specified iteration number.
void setNoWrapFlags(SCEVFlags Flags)
Set flags for a recurrence without clearing any previously set flags.
bool isAffine() const
Return true if this represents an expression A + B*x where A and B are loop invariant values.
bool isQuadratic() const
Return true if this represents an expression A + B*x + C*x^2 where A, B and C are loop invariant valu...
LLVM_ABI const SCEV * getNumIterationsInRange(const ConstantRange &Range, ScalarEvolution &SE) const
Return the number of iterations of this loop that produce values in the specified constant range.
LLVM_ABI const SCEVAddRecExpr * getPostIncExpr(ScalarEvolution &SE) const
Return an expression representing the value of this expression one iteration of the loop ahead.
SCEVUse getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
This is the base class for unary cast operator classes.
LLVM_ABI SCEVCastExpr(const FoldingSetNodeIDRef ID, SCEVTypes SCEVTy, SCEVUse op, Type *ty)
This class represents an assumption that the expression LHS Pred RHS evaluates to true,...
SCEVComparePredicate(const FoldingSetNodeIDRef ID, const ICmpInst::Predicate Pred, const SCEV *LHS, const SCEV *RHS)
bool isAlwaysTrue() const override
Returns true if the predicate is always true.
void print(raw_ostream &OS, unsigned Depth=0) const override
Prints a textual representation of this predicate with an indentation of Depth.
bool implies(const SCEVPredicate *N, ScalarEvolution &SE) const override
Implementation of the SCEVPredicate interface.
This class represents a constant integer value.
ConstantInt * getValue() const
const APInt & getAPInt() const
This is the base class for unary integral cast operator classes.
LLVM_ABI SCEVIntegralCastExpr(const FoldingSetNodeIDRef ID, SCEVTypes SCEVTy, SCEVUse op, Type *ty)
This node is the base class min/max selections.
static enum SCEVTypes negate(enum SCEVTypes T)
This node represents multiplication of some number of SCEVs.
This node is a base class providing common functionality for n'ary operators.
ArrayRef< SCEVUse > operands() const
SCEVFlags getNoWrapFlags(SCEVFlags Mask=FlagsNoWrapMask) const
SCEVUse getOperand(unsigned i) const
This class represents an assumption made using SCEV expressions which can be checked at run-time.
SCEVPredicate(const SCEVPredicate &)=default
virtual bool implies(const SCEVPredicate *N, ScalarEvolution &SE) const =0
Returns true if this predicate implies N.
SCEVPredicateKind Kind
This class represents a cast from a pointer to a pointer-sized integer value, without capturing the p...
This visitor recursively visits a SCEV expression and re-writes it.
const SCEV * visitPtrToAddrExpr(const SCEVPtrToAddrExpr *Expr)
const SCEV * visitSignExtendExpr(const SCEVSignExtendExpr *Expr)
const SCEV * visitZeroExtendExpr(const SCEVZeroExtendExpr *Expr)
const SCEV * visitSMinExpr(const SCEVSMinExpr *Expr)
const SCEV * visitUMinExpr(const SCEVUMinExpr *Expr)
This node is the base class for sequential/in-order min/max selections.
static SCEVTypes getEquivalentNonSequentialSCEVType(SCEVTypes Ty)
This class represents a sign extension of a small integer value to a larger integer value.
Visit all nodes in the expression tree using worklist traversal.
This class represents a truncation of an integer value to a smaller integer value.
This class represents a binary unsigned division operation.
This class represents a composition of other SCEV predicates, and is the class that most clients will...
void print(raw_ostream &OS, unsigned Depth) const override
Prints a textual representation of this predicate with an indentation of Depth.
bool implies(const SCEVPredicate *N, ScalarEvolution &SE) const override
Returns true if this predicate implies N.
SCEVUnionPredicate(ArrayRef< const SCEVPredicate * > Preds, ScalarEvolution &SE)
Union predicates don't get cached so create a dummy set ID for it.
bool isAlwaysTrue() const override
Implementation of the SCEVPredicate interface.
SCEVUnionPredicate getUnionWith(const SCEVPredicate *N, ScalarEvolution &SE) const
Returns a new SCEVUnionPredicate that is the union of this predicate and the given predicate N.
This means that we are dealing with an entirely unknown SCEV value, and only represent it as its LLVM...
This class represents the value of vscale, as used when defining the length of a scalable vector or r...
This class represents an assumption made on an AddRec expression.
IncrementWrapFlags
Similar to SCEVFlags, but with slightly different semantics for FlagNUSW.
SCEVWrapPredicate(const FoldingSetNodeIDRef ID, const SCEVAddRecExpr *AR, IncrementWrapFlags Flags)
bool implies(const SCEVPredicate *N, ScalarEvolution &SE) const override
Returns true if this predicate implies N.
static SCEVWrapPredicate::IncrementWrapFlags setFlags(SCEVWrapPredicate::IncrementWrapFlags Flags, SCEVWrapPredicate::IncrementWrapFlags OnFlags)
void print(raw_ostream &OS, unsigned Depth=0) const override
Prints a textual representation of this predicate with an indentation of Depth.
bool isAlwaysTrue() const override
Returns true if the predicate is always true.
const SCEVAddRecExpr * getExpr() const
Implementation of the SCEVPredicate interface.
static SCEVWrapPredicate::IncrementWrapFlags clearFlags(SCEVWrapPredicate::IncrementWrapFlags Flags, SCEVWrapPredicate::IncrementWrapFlags OffFlags)
Convenient IncrementWrapFlags manipulation methods.
IncrementWrapFlags getFlags() const
Returns the set assumed no overflow flags.
This class represents a zero extension of a small integer value to a larger integer value.
This class represents an analyzed expression in the program.
unsigned short getExpressionSize() const
static constexpr auto FlagsNoWrapMask
LLVM_ABI bool isOne() const
Return true if the expression is a constant one.
SCEV(const FoldingSetNodeIDRef ID, SCEVTypes SCEVTy, unsigned short ExpressionSize, Type *Ty)
static constexpr auto FlagNUW
LLVM_ABI void computeAndSetCanonical(ScalarEvolution &SE)
Compute and set the canonical SCEV, by constructing a SCEV with the same operands,...
LLVM_ABI bool isZero() const
Return true if the expression is a constant zero.
const SCEV * getCanonical() const
Return the canonical SCEV.
const SCEV * CanonicalSCEV
Pointer to the canonical version of the SCEV, i.e.
LLVM_ABI void dump() const
This method is used for debugging.
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.
Type * getType() const
Return the LLVM type of this SCEV expression.
static constexpr auto FlagNone
LLVM_ABI void print(raw_ostream &OS) const
Print out the internal representation of this scalar to the specified stream.
SCEVTypes getSCEVType() const
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)
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
void print(raw_ostream &OS, const Module *=nullptr) const override
print - Print out the internal state of the pass.
bool runOnFunction(Function &F) override
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
void releaseMemory() override
releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memo...
void verifyAnalysis() const override
verifyAnalysis() - This member can be implemented by a analysis pass to check state of analysis infor...
static LoopGuards collectOnDemand(const Loop *L, ScalarEvolution &SE)
Return loop guards for loop L, which are collected on first use.
The main scalar evolution driver.
LLVM_ABI const SCEV * getUDivExpr(SCEVUse LHS, SCEVUse RHS)
Get a canonical unsigned division expression, or something simpler if possible.
const SCEV * getConstantMaxBackedgeTakenCount(const Loop *L)
When successful, this returns a SCEVConstant that is greater than or equal to (i.e.
const DataLayout & getDataLayout() const
Return the DataLayout associated with the module this SCEV instance is operating on.
LLVM_ABI bool isKnownNonNegative(const SCEV *S)
Test if the given expression is known to be non-negative.
LLVM_ABI bool isKnownOnEveryIteration(CmpPredicate Pred, const SCEVAddRecExpr *LHS, const SCEV *RHS)
Test if the condition described by Pred, LHS, RHS is known to be true on every iteration of the loop ...
static bool hasFlags(SCEVFlags Flags, SCEVFlags TestFlags)
LLVM_ABI std::optional< LoopInvariantPredicate > getLoopInvariantExitCondDuringFirstIterationsImpl(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const Loop *L, const Instruction *CtxI, const SCEV *MaxIter)
LLVM_ABI const SCEV * getZeroExtendExpr(SCEVUse Op, Type *Ty, unsigned Depth=0)
LLVM_ABI const SCEV * getUDivCeilSCEV(const SCEV *N, const SCEV *D)
Compute ceil(N / D).
LLVM_ABI std::optional< LoopInvariantPredicate > getLoopInvariantExitCondDuringFirstIterations(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const Loop *L, const Instruction *CtxI, const SCEV *MaxIter)
If the result of the predicate LHS Pred RHS is loop invariant with respect to L at given Context duri...
LLVM_ABI Type * getWiderType(Type *Ty1, Type *Ty2) const
LLVM_ABI const SCEV * getAbsExpr(const SCEV *Op, bool IsNSW)
LLVM_ABI bool isKnownNonPositive(const SCEV *S)
Test if the given expression is known to be non-positive.
LLVM_ABI const SCEV * getElementCount(Type *Ty, ElementCount EC, SCEVFlags Flags=SCEV::FlagNone)
LLVM_ABI bool isKnownNegative(const SCEV *S)
Test if the given expression is known to be negative.
LLVM_ABI const SCEV * getPredicatedConstantMaxBackedgeTakenCount(const Loop *L, SmallVectorImpl< const SCEVPredicate * > &Predicates)
Similar to getConstantMaxBackedgeTakenCount, except it will add a set of SCEV predicates to Predicate...
LLVM_ABI const SCEV * removePointerBase(const SCEV *S)
Compute an expression equivalent to S - getPointerBase(S).
LLVM_ABI bool isLoopEntryGuardedByCond(const Loop *L, CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Test whether entry to the loop is protected by a conditional between LHS and RHS.
LLVM_ABI bool isKnownNonZero(const SCEV *S)
Test if the given expression is known to be non-zero.
LLVM_ABI const SCEV * getURemExpr(SCEVUse LHS, SCEVUse RHS)
Represents an unsigned remainder expression based on unsigned division.
LLVM_ABI const SCEV * getBackedgeTakenCount(const Loop *L, ExitCountKind Kind=Exact)
If the specified loop has a predictable backedge-taken count, return it, otherwise return a SCEVCould...
LLVM_ABI const SCEV * getSMinExpr(SCEVUse LHS, SCEVUse RHS)
LLVM_ABI const SCEV * getUMaxFromMismatchedTypes(const SCEV *LHS, const SCEV *RHS)
Promote the operands to the wider of the types using zero-extension, and then perform a umax operatio...
const SCEV * getZero(Type *Ty)
Return a SCEV for the constant 0 of a specific type.
LLVM_ABI bool willNotOverflow(Instruction::BinaryOps BinOp, bool Signed, const SCEV *LHS, const SCEV *RHS, const Instruction *CtxI=nullptr)
Is operation BinOp between LHS and RHS provably does not have a signed/unsigned overflow (Signed)?
LLVM_ABI const SCEV * getMinusSCEV(SCEVUse LHS, SCEVUse RHS, SCEVFlags Flags=SCEV::FlagNone, unsigned Depth=0)
Return LHS-RHS.
LLVM_ABI ExitLimit computeExitLimitFromCond(const Loop *L, Value *ExitCond, bool ExitIfTrue, bool ControlsOnlyExit, bool AllowPredicates=false)
Compute the number of times the backedge of the specified loop will execute if its exit condition wer...
LLVM_ABI const SCEV * getMinMaxExpr(SCEVTypes Kind, SmallVectorImpl< SCEVUse > &Operands)
LLVM_ABI const SCEVPredicate * getEqualPredicate(const SCEV *LHS, const SCEV *RHS)
LLVM_ABI unsigned getSmallConstantTripMultiple(const Loop *L, const SCEV *ExitCount)
Returns the largest constant divisor of the trip count as a normal unsigned value,...
LLVM_ABI SCEVUse getSCEVAtScope(const SCEV *S, const Loop *L)
Return a SCEV expression for the specified value at the specified scope in the program.
LLVM_ABI uint64_t getTypeSizeInBits(Type *Ty) const
Return the size in bits of the specified type, for which isSCEVable must return true.
LLVM_ABI void registerUser(const SCEV *User, ArrayRef< SCEVUse > Ops)
Notify this ScalarEvolution that User directly uses SCEVs in Ops.
LLVM_ABI const SCEV * getConstant(ConstantInt *V)
LLVM_ABI const SCEV * getPredicatedBackedgeTakenCount(const Loop *L, SmallVectorImpl< const SCEVPredicate * > &Predicates)
Similar to getBackedgeTakenCount, except it will add a set of SCEV predicates to Predicates that are ...
LLVM_ABI const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
ConstantRange getSignedRange(const SCEV *S)
Determine the signed range for a particular SCEV.
LLVM_ABI const SCEV * getNoopOrSignExtend(const SCEV *V, Type *Ty)
Return a SCEV corresponding to a conversion of the input value to the specified type.
static SCEVFlags setFlags(SCEVFlags Flags, SCEVFlags OnFlags)
static LLVM_ABI bool isGuaranteedNotToBePoison(const SCEV *Op)
Returns true if Op is guaranteed to not be poison.
bool loopHasNoAbnormalExits(const Loop *L)
Return true if the loop has no abnormal exits.
LLVM_ABI const SCEV * getTripCountFromExitCount(const SCEV *ExitCount)
A version of getTripCountFromExitCount below which always picks an evaluation type which can not resu...
LLVM_ABI ScalarEvolution(Function &F, TargetLibraryInfo &TLI, AssumptionCache &AC, DominatorTree &DT, LoopInfo &LI)
const SCEV * getOne(Type *Ty)
Return a SCEV for the constant 1 of a specific type.
LLVM_ABI const SCEV * getTruncateOrNoop(const SCEV *V, Type *Ty)
Return a SCEV corresponding to a conversion of the input value to the specified type.
LLVM_ABI void forgetValues(ArrayRef< Value * > Values)
Batched forgetValue: invalidates all Values in one shared def-use walk, avoiding the redundant re-tra...
LLVM_ABI const SCEV * getSequentialMinMaxExpr(SCEVTypes Kind, SmallVectorImpl< SCEVUse > &Operands)
LLVM_ABI const SCEV * getCastExpr(SCEVTypes Kind, SCEVUse Op, Type *Ty)
LLVM_ABI std::optional< bool > evaluatePredicateAt(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const Instruction *CtxI)
Check whether the condition described by Pred, LHS, and RHS is true or false in the given Context.
LLVM_ABI SCEVUse getAddRecExpr(SCEVUse Start, SCEVUse Step, const Loop *L, SCEVFlagsPair Flags)
Get an add recurrence expression for the specified loop.
LLVM_ABI unsigned getSmallConstantMaxTripCount(const Loop *L, SmallVectorImpl< const SCEVPredicate * > *Predicates=nullptr)
Returns the upper bound of the loop trip count as a normal unsigned value.
LLVM_ABI bool isKnownMultipleOf(const SCEV *S, uint64_t M, SmallVectorImpl< const SCEVPredicate * > *Predicates=nullptr)
Check that S is a multiple of M.
LLVM_ABI bool isBackedgeTakenCountMaxOrZero(const Loop *L)
Return true if the backedge taken count is either the value returned by getConstantMaxBackedgeTakenCo...
LLVM_ABI void forgetLoop(const Loop *L)
This method should be called by the client when it has changed a loop in a way that may effect Scalar...
LLVM_ABI bool isLoopInvariant(const SCEV *S, const Loop *L)
Return true if the value of the given SCEV is unchanging in the specified loop.
LLVM_ABI bool isKnownPositive(const SCEV *S)
Test if the given expression is known to be positive.
LLVM_ABI bool SimplifyICmpOperands(CmpPredicate &Pred, SCEVUse &LHS, SCEVUse &RHS, unsigned Depth=0)
Simplify LHS and RHS in a comparison with predicate Pred.
APInt getUnsignedRangeMin(const SCEV *S)
Determine the min of the unsigned range for a particular SCEV.
static SCEVFlags clearFlags(SCEVFlags Flags, SCEVFlags OffFlags)
LLVM_ABI const SCEV * getOffsetOfExpr(Type *IntTy, StructType *STy, unsigned FieldNo)
Return an expression for offsetof on the given field with type IntTy.
LLVM_ABI LoopDisposition getLoopDisposition(const SCEV *S, const Loop *L)
Return the "disposition" of the given SCEV with respect to the given loop.
static SCEVFlags maskFlags(SCEVFlags Flags, SCEVFlags Mask)
Convenient SCEVFlags manipulation.
LLVM_ABI bool containsAddRecurrence(const SCEV *S)
Return true if the SCEV is a scAddRecExpr or it contains scAddRecExpr.
LLVM_ABI const SCEV * getTruncateExpr(SCEVUse Op, Type *Ty, unsigned Depth=0)
LLVM_ABI SCEVUse getAddExpr(SmallVectorImpl< SCEVUse > &Ops, SCEVFlagsPair Flags={}, unsigned Depth=0)
Get a canonical add expression, or something simpler if possible.
LLVM_ABI const SCEV * getZeroExtendExprImpl(SCEVUse Op, Type *Ty, unsigned Depth=0)
LLVM_ABI bool isSCEVable(Type *Ty) const
Test if values of the given type are analyzable within the SCEV framework.
LLVM_ABI Type * getEffectiveSCEVType(Type *Ty) const
Return a type with the same bitwidth as the given type and which represents how SCEV will treat the g...
LLVM_ABI const SCEVPredicate * getComparePredicate(ICmpInst::Predicate Pred, const SCEV *LHS, const SCEV *RHS)
LLVM_ABI bool haveSameSign(const SCEV *S1, const SCEV *S2)
Return true if we know that S1 and S2 must have the same sign.
LLVM_ABI const SCEV * getNotSCEV(const SCEV *V)
Return the SCEV object corresponding to ~V.
LLVM_ABI bool instructionCouldExistWithOperands(const SCEV *A, const SCEV *B)
Return true if there exists a point in the program at which both A and B could be operands to the sam...
LLVM_ABI std::optional< SCEVFlags > getStrengthenedNoWrapFlagsFromBinOp(const OverflowingBinaryOperator *OBO)
Parse NSW/NUW flags from add/sub/mul IR binary operation Op into SCEV no-wrap flags,...
ConstantRange getUnsignedRange(const SCEV *S)
Determine the unsigned range for a particular SCEV.
LLVM_ABI void print(raw_ostream &OS) const
LLVM_ABI const SCEV * getAnyExtendExpr(SCEVUse Op, Type *Ty)
getAnyExtendExpr - Return a SCEV for the given operand extended with unspecified bits out to the give...
LLVM_ABI const SCEV * getPredicatedExitCount(const Loop *L, const BasicBlock *ExitingBlock, SmallVectorImpl< const SCEVPredicate * > *Predicates, ExitCountKind Kind=Exact)
Same as above except this uses the predicated backedge taken info and may require predicates.
LLVM_ABI void forgetTopmostLoop(const Loop *L)
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)
LLVM_ABI std::optional< LoopInvariantPredicate > getLoopInvariantPredicate(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const Loop *L, const Instruction *CtxI=nullptr)
If the result of the predicate LHS Pred RHS is loop invariant with respect to L, return a LoopInvaria...
LLVM_ABI const SCEV * getStoreSizeOfExpr(Type *IntTy, Type *StoreTy)
Return an expression for the store size of StoreTy that is type IntTy.
LLVM_ABI const SCEVPredicate * getWrapPredicate(const SCEVAddRecExpr *AR, SCEVWrapPredicate::IncrementWrapFlags AddedFlags)
LLVM_ABI bool isLoopBackedgeGuardedByCond(const Loop *L, CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Test whether the backedge of the loop is protected by a conditional between LHS and RHS.
LLVM_ABI APInt getNonZeroConstantMultiple(const SCEV *S)
const SCEV * getMinusOne(Type *Ty)
Return a SCEV for the constant -1 of a specific type.
LLVM_ABI bool hasLoopInvariantBackedgeTakenCount(const Loop *L)
Return true if the specified loop has an analyzable loop-invariant backedge-taken count.
LLVM_ABI BlockDisposition getBlockDisposition(const SCEV *S, const BasicBlock *BB)
Return the "disposition" of the given SCEV with respect to the given block.
LLVM_ABI const SCEV * getNoopOrZeroExtend(const SCEV *V, Type *Ty)
Return a SCEV corresponding to a conversion of the input value to the specified type.
LLVM_ABI bool invalidate(Function &F, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &Inv)
LLVM_ABI const SCEV * getUMinFromMismatchedTypes(const SCEV *LHS, const SCEV *RHS, bool Sequential=false)
Promote the operands to the wider of the types using zero-extension, and then perform a umin operatio...
LLVM_ABI bool loopIsFiniteByAssumption(const Loop *L)
Return true if this loop is finite by assumption.
LLVM_ABI SCEVUse getSCEVAtExit(const SCEV *S, const Loop *L, const BasicBlock *ExitingBlock)
Return the SCEV expression at the specified loop exit.
LLVM_ABI const SCEV * getExistingSCEV(Value *V)
Return an existing SCEV for V if there is one, otherwise return nullptr.
LLVM_ABI APInt getConstantMultiple(const SCEV *S, const Instruction *CtxI=nullptr)
Returns the max constant multiple of S.
LoopDisposition
An enum describing the relationship between a SCEV and a loop.
@ LoopComputable
The SCEV varies predictably with the loop.
@ LoopVariant
The SCEV is loop-variant (unknown).
@ LoopInvariant
The SCEV is loop-invariant.
@ LoopUniform
The SCEV is loop-uniform.
LLVM_ABI bool isKnownToBeAPowerOfTwo(const SCEV *S, bool OrZero=false, bool OrNegative=false)
Test if the given expression is known to be a power of 2.
LLVM_ABI void forgetLcssaPhiWithNewPredecessor(Loop *L, PHINode *V)
Forget LCSSA phi node V of loop L to which a new predecessor was added, such that it may no longer be...
LLVM_ABI bool containsUndefs(const SCEV *S) const
Return true if the SCEV expression contains an undef value.
LLVM_ABI std::optional< MonotonicPredicateType > getMonotonicPredicateType(const SCEVAddRecExpr *LHS, ICmpInst::Predicate Pred)
If, for all loop invariant X, the predicate "LHS `Pred` X" is monotonically increasing or decreasing,...
LLVM_ABI const SCEV * getCouldNotCompute()
LLVM_ABI bool isAvailableAtLoopEntry(const SCEV *S, const Loop *L)
Determine if the SCEV can be evaluated at loop's entry.
LLVM_ABI uint32_t getMinTrailingZeros(const SCEV *S, const Instruction *CtxI=nullptr)
Determine the minimum number of zero bits that S is guaranteed to end in (at every loop iteration).
BlockDisposition
An enum describing the relationship between a SCEV and a basic block.
@ DominatesBlock
The SCEV dominates the block.
@ ProperlyDominatesBlock
The SCEV properly dominates the block.
@ DoesNotDominateBlock
The SCEV does not dominate the block.
LLVM_ABI const SCEV * getExitCount(const Loop *L, const BasicBlock *ExitingBlock, ExitCountKind Kind=Exact)
Return the number of times the backedge executes before the given exit would be taken; if not exactly...
LLVM_ABI void getPoisonGeneratingValues(SmallPtrSetImpl< const Value * > &Result, const SCEV *S)
Return the set of Values that, if poison, will definitively result in S being poison as well.
LLVM_ABI void setNoWrapFlags(SCEVAddRecExpr *AddRec, SCEVFlags Flags)
Update no-wrap flags of an AddRec.
LLVM_ABI void forgetLoopDispositions()
Called when the client has changed the disposition of values in this loop.
LLVM_ABI const SCEV * getVScale(Type *Ty)
LLVM_ABI SCEVUse getMulExpr(SmallVectorImpl< SCEVUse > &Ops, SCEVFlagsPair Flags={}, unsigned Depth=0)
Get a canonical multiply expression, or something simpler if possible.
LLVM_ABI unsigned getSmallConstantTripCount(const Loop *L)
Returns the exact trip count of the loop if we can compute it, and the result is a small constant.
LLVM_ABI bool hasComputableLoopEvolution(const SCEV *S, const Loop *L)
Return true if the given SCEV changes value in a known way in the specified loop.
LLVM_ABI const SCEV * getPointerBase(const SCEV *V)
Transitively follow the chain of pointer-type operands until reaching a SCEV that does not have a sin...
LLVM_ABI void forgetAllLoops()
LLVM_ABI const SCEV * getSignExtendExprImpl(SCEVUse Op, Type *Ty, unsigned Depth=0)
LLVM_ABI bool dominates(const SCEV *S, const BasicBlock *BB)
Return true if elements that makes up the given SCEV dominate the specified basic block.
APInt getUnsignedRangeMax(const SCEV *S)
Determine the max of the unsigned range for a particular SCEV.
ExitCountKind
The terms "backedge taken count" and "exit count" are used interchangeably to refer to the number of ...
@ SymbolicMaximum
An expression which provides an upper bound on the exact trip count.
@ ConstantMaximum
A constant which provides an upper bound on the exact trip count.
@ Exact
An expression exactly describing the number of times the backedge has executed when a loop is exited.
LLVM_ABI bool isKnownPredicate(CmpPredicate Pred, SCEVUse LHS, SCEVUse RHS)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
LLVM_ABI const SCEV * applyLoopGuards(const SCEV *Expr, const Loop *L)
Try to apply information from loop guards for L to Expr.
LLVM_ABI const SCEV * getPtrToAddrExpr(const SCEV *Op)
LLVM_ABI const SCEVAddRecExpr * convertSCEVToAddRecWithPredicates(const SCEV *S, const Loop *L, SmallVectorImpl< const SCEVPredicate * > &Preds)
Tries to convert the S expression to an AddRec expression, adding additional predicates to Preds as r...
LLVM_ABI const SCEV * getSMaxExpr(SCEVUse LHS, SCEVUse RHS)
LLVM_ABI const SCEV * getElementSize(Instruction *Inst)
Return the size of an element read or written by Inst.
LLVM_ABI bool isGuaranteedNotToCauseUB(const SCEV *Op)
Returns true if Op is guaranteed not to cause immediate UB.
LLVM_ABI const SCEV * getSizeOfExpr(Type *IntTy, TypeSize Size)
Return an expression for a TypeSize.
LLVM_ABI std::optional< bool > evaluatePredicate(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Check whether the condition described by Pred, LHS, and RHS is true or false.
LLVM_ABI const SCEV * getUnknown(Value *V)
LLVM_ABI std::optional< std::pair< const SCEV *, SmallVector< const SCEVPredicate *, 3 > > > createAddRecFromPHIWithCasts(const SCEVUnknown *SymbolicPHI)
Checks if SymbolicPHI can be rewritten as an AddRecExpr under some Predicates.
LLVM_ABI const SCEV * getTruncateOrZeroExtend(const SCEV *V, Type *Ty, unsigned Depth=0)
Return a SCEV corresponding to a conversion of the input value to the specified type.
LLVM_ABI bool isKnownViaInduction(CmpPredicate Pred, SCEVUse LHS, SCEVUse RHS)
We'd like to check the predicate on every iteration of the most dominated loop between loops used in ...
LLVM_ABI std::optional< APInt > computeConstantDifference(const SCEV *LHS, const SCEV *RHS)
Compute LHS - RHS and returns the result as an APInt if it is a constant, and std::nullopt if it isn'...
LLVM_ABI bool properlyDominates(const SCEV *S, const BasicBlock *BB)
Return true if elements that makes up the given SCEV properly dominate the specified basic block.
LLVM_ABI const SCEV * getNegativeSCEV(const SCEV *V, SCEVFlags Flags=SCEV::FlagNone)
Return the SCEV object corresponding to -V.
LLVM_ABI const SCEV * getUDivExactExpr(SCEVUse LHS, SCEVUse RHS)
Get a canonical unsigned division expression, or something simpler if possible.
LLVM_ABI const SCEV * rewriteUsingPredicate(const SCEV *S, const Loop *L, const SCEVPredicate &A)
Re-writes the SCEV according to the Predicates in A.
LLVM_ABI std::pair< const SCEV *, const SCEV * > SplitIntoInitAndPostInc(const Loop *L, const SCEV *S)
Splits SCEV expression S into two SCEVs.
LLVM_ABI bool canReuseInstruction(const SCEV *S, Instruction *I, SmallVectorImpl< Instruction * > &DropPoisonGeneratingInsts)
Check whether it is poison-safe to represent the expression S using the instruction I.
LLVM_ABI bool isKnownPredicateAt(CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS, const Instruction *CtxI)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
LLVM_ABI const SCEV * getPredicatedSymbolicMaxBackedgeTakenCount(const Loop *L, SmallVectorImpl< const SCEVPredicate * > &Predicates)
Similar to getSymbolicMaxBackedgeTakenCount, except it will add a set of SCEV predicates to Predicate...
LLVM_ABI const SCEV * getGEPExpr(GEPOperator *GEP, ArrayRef< SCEVUse > IndexExprs)
Returns an expression for a GEP.
LLVM_ABI const SCEV * getUMinExpr(SCEVUse LHS, SCEVUse RHS, bool Sequential=false)
LLVM_ABI bool isBasicBlockEntryGuardedByCond(const BasicBlock *BB, CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Test whether entry to the basic block is protected by a conditional between LHS and RHS.
LLVM_ABI const SCEV * getTruncateOrSignExtend(const SCEV *V, Type *Ty, unsigned Depth=0)
Return a SCEV corresponding to a conversion of the input value to the specified type.
LLVM_ABI bool containsErasedValue(const SCEV *S) const
Return true if the SCEV expression contains a Value that has been optimised out and is now a nullptr.
const SCEV * getSymbolicMaxBackedgeTakenCount(const Loop *L)
When successful, this returns a SCEV that is greater than or equal to (i.e.
APInt getSignedRangeMax(const SCEV *S)
Determine the max of the signed range for a particular SCEV.
LLVM_ABI void verify() const
LLVMContext & getContext() const
This class represents the LLVM 'select' instruction.
Implements a dense probed hash-table based set with some number of buckets stored inline.
Definition DenseSet.h:295
size_type size() const
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Used to lazily calculate structure layout information for a target machine, based on the DataLayout s...
Definition DataLayout.h:743
TypeSize getElementOffset(unsigned Idx) const
Definition DataLayout.h:774
TypeSize getSizeInBits() const
Definition DataLayout.h:754
Class to represent struct types.
Analysis pass providing the TargetLibraryInfo.
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
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:299
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:277
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:187
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:222
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:296
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:252
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:303
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
op_range operands()
Definition User.h:267
Use & Op()
Definition User.h:171
Value * getOperand(unsigned i) const
Definition User.h:207
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
iterator_range< user_iterator > users()
Definition Value.h:428
unsigned getValueID() const
Return an ID for the concrete type of this object.
Definition Value.h:545
LLVM_ABI void printAsOperand(raw_ostream &O, bool PrintType=true, const Module *M=nullptr) const
Print the name of this Value out to the specified raw_ostream.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:314
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:183
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:169
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
Definition ilist_node.h:34
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
const APInt & smin(const APInt &A, const APInt &B)
Determine the smaller of two APInts considered to be signed.
Definition APInt.h:2274
const APInt & smax(const APInt &A, const APInt &B)
Determine the larger of two APInts considered to be signed.
Definition APInt.h:2279
const APInt & umin(const APInt &A, const APInt &B)
Determine the smaller of two APInts considered to be unsigned.
Definition APInt.h:2284
LLVM_ABI std::optional< APInt > SolveQuadraticEquationWrap(APInt A, APInt B, APInt C, unsigned RangeWidth)
Let q(n) = An^2 + Bn + C, and BW = bit width of the value range (e.g.
Definition APInt.cpp:2850
LLVM_ABI APInt GreatestCommonDivisor(APInt A, APInt B, bool IsSigned=false)
Compute GCD of two APInt values.
Definition APInt.cpp:826
const APInt & umax(const APInt &A, const APInt &B)
Determine the larger of two APInts considered to be unsigned.
Definition APInt.h:2289
constexpr bool any(E Val)
@ Entry
Definition COFF.h:862
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:83
LLVM_ABI Function * getDeclarationIfExists(const Module *M, ID id)
Look up the Function declaration of the intrinsic id in the Module M and return it if it exists.
Predicate
Predicate - These are "(BI << 5) | BO" for various predicates.
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
bool match(Val *V, const Pattern &P)
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
auto m_BasicBlock()
Match an arbitrary basic block value and ignore it.
ExtractValue_match< Ind, Val_t > m_ExtractValue(const Val_t &V)
Match a single index ExtractValue instruction.
auto m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
match_bind< WithOverflowInst > m_WithOverflowInst(WithOverflowInst *&I)
Match a with overflow intrinsic, capturing it if we match.
auto m_Intrinsic(const Ts &...Ops)
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
BinaryOp_match< LHS, RHS, Instruction::SDiv > m_SDiv(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
brc_match< Cond_t, match_bind< BasicBlock >, match_bind< BasicBlock > > m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F)
CastOperator_match< OpTy, Instruction::PtrToInt > m_PtrToInt(const OpTy &Op)
Matches PtrToInt.
auto m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
bind_cst_ty m_scev_APInt(const APInt *&C)
Match an SCEV constant and bind it to an APInt.
cst_pred_ty< is_all_ones > m_scev_AllOnes()
Match an integer with all bits set.
SCEVUnaryExpr_match< SCEVZeroExtendExpr, Op0_t > m_scev_ZExt(const Op0_t &Op0)
is_undef_or_poison m_scev_UndefOrPoison()
Match an SCEVUnknown wrapping undef or poison.
cst_pred_ty< is_one > m_scev_One()
Match an integer 1.
specificloop_ty m_SpecificLoop(const Loop *L)
SCEVUnaryExpr_match< SCEVSignExtendExpr, Op0_t > m_scev_SExt(const Op0_t &Op0)
match_bind< const SCEVMulExpr > m_scev_Mul(const SCEVMulExpr *&V)
cst_pred_ty< is_zero > m_scev_Zero()
Match an integer 0.
SCEVUnaryExpr_match< SCEVTruncateExpr, Op0_t > m_scev_Trunc(const Op0_t &Op0)
bool match(const SCEV *S, const Pattern &P)
SCEVBinaryExpr_match< SCEVUDivExpr, Op0_t, Op1_t > m_scev_UDiv(const Op0_t &Op0, const Op1_t &Op1)
SCEVBinaryExpr_match< SCEVAddExpr, Op0_t, Op1_t, SCEV::FlagNSW > m_scev_NSWAdd(const Op0_t &Op0, const Op1_t &Op1)
specificscev_ty m_scev_Specific(const SCEV *S)
Match if we have a specific specified SCEV.
SCEVAffineAddRec_match< Op0_t, Op1_t, match_isa< const Loop > > m_scev_AffineAddRec(const Op0_t &Op0, const Op1_t &Op1)
match_bind< const SCEVUnknown > m_SCEVUnknown(const SCEVUnknown *&V)
SCEVBinaryExpr_match< SCEVMulExpr, Op0_t, Op1_t, SCEV::FlagNUW, true > m_scev_c_NUWMul(const Op0_t &Op0, const Op1_t &Op1)
SCEVBinaryExpr_match< SCEVUMaxExpr, Op0_t, Op1_t, SCEV::FlagNone, true > m_scev_UMax(const Op0_t &Op0, const Op1_t &Op1)
SCEVBinaryExpr_match< SCEVSMaxExpr, Op0_t, Op1_t, SCEV::FlagNone, true > m_scev_SMax(const Op0_t &Op0, const Op1_t &Op1)
SCEVBinaryExpr_match< SCEVMulExpr, Op0_t, Op1_t, SCEV::FlagNone, true > m_scev_c_Mul(const Op0_t &Op0, const Op1_t &Op1)
match_bind< const SCEVAddExpr > m_scev_Add(const SCEVAddExpr *&V)
SCEVURem_match< Op0_t, Op1_t > m_scev_URem(Op0_t LHS, Op1_t RHS, ScalarEvolution &SE)
Match the mathematical pattern A - (A / B) * B, where A and B can be arbitrary expressions.
@ Valid
The data is already valid.
LocationClass< Ty > location(Ty &L)
@ Switch
The "resume-switch" lowering, where there are separate resume and destroy functions that are shared b...
Definition CoroShape.h:32
constexpr double e
NodeAddr< PhiNode * > Phi
Definition RDFGraph.h:390
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
unsigned getOpcode(const VPValue *V)
Return the instruction opcode for the recipe defining V or 0 for unsupported recipes and VPValues not...
This is an optimization pass for GlobalISel generic memory operations.
void visitAll(const SCEV *Root, SV &Visitor)
Use SCEVTraversal to visit all nodes in the given expression tree.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:316
@ Offset
Definition DWP.cpp:577
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1755
SaveAndRestore(T &) -> SaveAndRestore< T >
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
LLVM_ABI bool canCreatePoison(const Operator *Op, bool ConsiderFlagsAndMetadata=true)
LLVM_ABI bool mustTriggerUB(const Instruction *I, const SmallPtrSetImpl< const Value * > &KnownPoison)
Return true if the given instruction must trigger undefined behavior when I is executed with any oper...
RelativeUniformCounterPtr Values
Definition InstrProf.h:91
@ Known
Known to have no common set bits.
@ Dead
Unused definition.
InterleavedRange< Range > interleaved(const Range &R, StringRef Separator=", ", StringRef Prefix="", StringRef Suffix="")
Output range R as a sequence of interleaved elements.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI bool verifyFunction(const Function &F, raw_ostream *OS=nullptr)
Check a function for errors, useful for use when debugging a pass.
auto successors(const MachineBasicBlock *BB)
scope_exit(Callable) -> scope_exit< Callable >
const Value * getLoadStorePointerOperand(const Value *V)
A helper function that returns the pointer operand of a load or store instruction.
@ BinaryOp
One of the operands is a binary op.
constexpr from_range_t from_range
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
bool set_is_subset(const S1Ty &S1, const S2Ty &S2)
set_is_subset(A, B) - Return true iff A in B
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2224
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:244
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
void * PointerTy
LLVM_ABI bool VerifySCEV
auto uninitialized_copy(R &&Src, IterTy Dst)
Definition STLExtras.h:2127
bool isa_and_nonnull(const Y &Val)
Definition Casting.h:676
LLVM_ABI unsigned ComputeNumSignBits(const Value *Op, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Return the number of times the sign bit of the register is replicated into the other bits.
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
auto map_range(ContainerTy &&C, FuncTy F)
Return a range that applies F to the elements of C.
Definition STLExtras.h:366
LLVM_ABI bool canConstantFoldCallTo(const CallBase *Call, const Function *F, const TargetLibraryInfo *TLI=nullptr)
canConstantFoldCallTo - Return true if its even possible to fold a call to the specified function.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:204
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
LLVM_ABI bool isOverflowIntrinsicNoWrap(const WithOverflowInst *WO, const DominatorTree &DT)
Returns true if the arithmetic part of the WO 's result is used only along the paths control dependen...
DomTreeNodeBase< BasicBlock > DomTreeNode
Definition Dominators.h:65
LLVM_ABI bool matchSimpleRecurrence(const PHINode *P, BinaryOperator *&BO, Value *&Start, Value *&Step)
Attempt to match a simple first order recurrence cycle of the form: iv = phi Ty [Start,...
LLVM_ABI Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Function *CtxF=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
const AnalysisOptions & getAnalysisOptions(const LLVMContext &C)
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
Definition STLExtras.h:2216
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1762
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
LLVM_ABI bool isMustProgress(const Loop *L)
Return true if this loop can be assumed to make progress.
LLVM_ABI bool impliesPoison(const Value *ValAssumedPoison, const Value *V)
Return true if V is poison given that ValAssumedPoison is already poison.
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1652
LLVM_ABI bool isFinite(const Loop *L)
Return true if this loop can be assumed to run for a finite number of iterations.
unsigned short computeExpressionSize(ArrayRef< SCEVUse > Args)
LLVM_ABI bool programUndefinedIfPoison(const Instruction *Inst)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
bool isPointerTy(const Type *T)
Definition SPIRVUtils.h:373
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
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
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
Definition MathExtras.h:389
LLVM_ABI bool propagatesPoison(const Use &PoisonOp)
Return true if PoisonOp's user yields poison or raises UB if its operand PoisonOp is poison.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ Mul
Product of integers.
@ SMax
Signed integer max implemented in terms of select(cmp()).
@ SMin
Signed integer min implemented in terms of select(cmp()).
@ Add
Sum of integers.
@ UMax
Unsigned integer max implemented in terms of select(cmp()).
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
Definition STLExtras.h:2028
DWARFExpression::Operation Op
auto max_element(R &&Range)
Provide wrappers to std::max_element which take ranges instead of having to pass begin/end explicitly...
Definition STLExtras.h:2104
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
SCEVFlags
SCEVFlags are bitfield indices into SCEV's SubclassData.
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1933
LLVM_ABI bool isGuaranteedToTransferExecutionToSuccessor(const Instruction *I)
Return true if this function can prove that the instruction I will always transfer execution to one o...
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
Definition STLExtras.h:2035
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
Definition Sequence.h:341
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
Definition STLExtras.h:2208
constexpr bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
Definition MathExtras.h:249
auto predecessors(const MachineBasicBlock *BB)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1963
Type * getLoadStoreType(const Value *I)
A helper function that returns the type of a load or store instruction.
iterator_range< df_iterator< T > > depth_first(const T &G)
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
bool equal(L &&LRange, R &&RRange)
Wrapper function around std::equal to detect if pair-wise elements between two ranges are the same.
Definition STLExtras.h:2162
LLVM_ABI bool isGuaranteedNotToBePoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be poison, but may be undef.
LLVM_ABI Constant * ConstantFoldInstOperands(const Instruction *I, ArrayRef< Constant * > Ops, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, bool AllowNonDeterministic=true)
ConstantFoldInstOperands - Attempt to constant fold an instruction with the specified operands.
@ End
Run the machine verifier once, at the end of the pipeline.
Definition CodeGen.h:320
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.
Definition Casting.h:866
SCEVUseT< const SCEV * > SCEVUse
bool SCEVExprContains(const SCEV *Root, PredTy Pred)
Return true if any node in Root satisfies the predicate Pred.
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:879
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:881
#define N
#define NC
Definition regutils.h:42
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:315
static LLVM_ABI KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
static LLVM_ABI KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
static LLVM_ABI KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
An object of this class is returned by queries that could not be answered.
static LLVM_ABI bool classof(const SCEV *S)
Methods for support type inquiry through isa, cast, and dyn_cast:
The no-wrap flags to apply when creating a SCEV expression, to the expression and use respectively.
SCEVFlags ExprFlags
Flags applied directly to a SCEV expression, must be valid wherever the expression is valid.
SCEVFlags UseFlags
Flags only applied to a SCEVUse.
static SCEVUseT getCommon(SCEVUseT A, SCEVUseT B)
SCEVPtrT getPointer() const
This class defines a simple visitor class that may be used for various SCEV analysis purposes.
A utility class that uses RAII to save and restore the value of a variable.
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.
SmallVector< const SCEVPredicate *, 4 > Predicates
A vector of predicate guards for this ExitLimit.