LLVM 24.0.0git
InductiveRangeCheckElimination.cpp
Go to the documentation of this file.
1//===- InductiveRangeCheckElimination.cpp - -------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// The InductiveRangeCheckElimination pass splits a loop's iteration space into
10// three disjoint ranges. It does that in a way such that the loop running in
11// the middle loop provably does not need range checks. As an example, it will
12// convert
13//
14// len = < known positive >
15// for (i = 0; i < n; i++) {
16// if (0 <= i && i < len) {
17// do_something();
18// } else {
19// throw_out_of_bounds();
20// }
21// }
22//
23// to
24//
25// len = < known positive >
26// limit = smin(n, len)
27// // no first segment
28// for (i = 0; i < limit; i++) {
29// if (0 <= i && i < len) { // this check is fully redundant
30// do_something();
31// } else {
32// throw_out_of_bounds();
33// }
34// }
35// for (i = limit; i < n; i++) {
36// if (0 <= i && i < len) {
37// do_something();
38// } else {
39// throw_out_of_bounds();
40// }
41// }
42//
43//===----------------------------------------------------------------------===//
44
46#include "llvm/ADT/APInt.h"
47#include "llvm/ADT/ArrayRef.h"
51#include "llvm/ADT/StringRef.h"
52#include "llvm/ADT/Twine.h"
59#include "llvm/IR/BasicBlock.h"
60#include "llvm/IR/CFG.h"
61#include "llvm/IR/Constants.h"
63#include "llvm/IR/Dominators.h"
64#include "llvm/IR/Function.h"
65#include "llvm/IR/IRBuilder.h"
66#include "llvm/IR/InstrTypes.h"
68#include "llvm/IR/Metadata.h"
69#include "llvm/IR/Module.h"
71#include "llvm/IR/Type.h"
72#include "llvm/IR/Use.h"
73#include "llvm/IR/User.h"
74#include "llvm/IR/Value.h"
79#include "llvm/Support/Debug.h"
89#include <algorithm>
90#include <cassert>
91#include <optional>
92#include <utility>
93
94using namespace llvm;
95using namespace llvm::PatternMatch;
96
97static cl::opt<unsigned> LoopSizeCutoff("irce-loop-size-cutoff", cl::Hidden,
98 cl::init(64));
99
100static cl::opt<bool> PrintChangedLoops("irce-print-changed-loops", cl::Hidden,
101 cl::init(false));
102
103static cl::opt<bool> PrintRangeChecks("irce-print-range-checks", cl::Hidden,
104 cl::init(false));
105
106static cl::opt<bool> SkipProfitabilityChecks("irce-skip-profitability-checks",
107 cl::Hidden, cl::init(false));
108
109static cl::opt<unsigned> MinEliminatedChecks("irce-min-eliminated-checks",
110 cl::Hidden, cl::init(10));
111
112static cl::opt<bool> AllowUnsignedLatchCondition("irce-allow-unsigned-latch",
113 cl::Hidden, cl::init(true));
114
116 "irce-allow-narrow-latch", cl::Hidden, cl::init(true),
117 cl::desc("If set to true, IRCE may eliminate wide range checks in loops "
118 "with narrow latch condition."));
119
121 "irce-max-type-size-for-overflow-check", cl::Hidden, cl::init(32),
122 cl::desc(
123 "Maximum size of range check type for which can be produced runtime "
124 "overflow check of its limit's computation"));
125
126static cl::opt<bool>
127 PrintScaledBoundaryRangeChecks("irce-print-scaled-boundary-range-checks",
128 cl::Hidden, cl::init(false));
129
130#define DEBUG_TYPE "irce"
131
132namespace {
133
134/// An inductive range check is conditional branch in a loop with a condition
135/// that is provably true for some contiguous range of values taken by the
136/// containing loop's induction variable.
137///
138class InductiveRangeCheck {
139
140 const SCEV *Begin = nullptr;
141 const SCEV *Step = nullptr;
142 const SCEV *End = nullptr;
143 Use *CheckUse = nullptr;
144
145 static bool parseRangeCheckICmp(Loop *L, ICmpInst *ICI, ScalarEvolution &SE,
146 const SCEVAddRecExpr *&Index,
147 const SCEV *&End);
148
149 static void
150 extractRangeChecksFromCond(Loop *L, ScalarEvolution &SE, Use &ConditionUse,
152 SmallPtrSetImpl<Value *> &Visited);
153
154 static bool parseIvAgaisntLimit(Loop *L, Value *LHS, Value *RHS,
156 const SCEVAddRecExpr *&Index,
157 const SCEV *&End);
158
159 static bool reassociateSubLHS(Loop *L, Value *VariantLHS, Value *InvariantRHS,
161 const SCEVAddRecExpr *&Index, const SCEV *&End);
162
163public:
164 const SCEV *getBegin() const { return Begin; }
165 const SCEV *getStep() const { return Step; }
166 const SCEV *getEnd() const { return End; }
167
168 void print(raw_ostream &OS) const {
169 OS << "InductiveRangeCheck:\n";
170 OS << " Begin: ";
171 Begin->print(OS);
172 OS << " Step: ";
173 Step->print(OS);
174 OS << " End: ";
175 End->print(OS);
176 OS << "\n CheckUse: ";
177 getCheckUse()->getUser()->print(OS);
178 OS << " Operand: " << getCheckUse()->getOperandNo() << "\n";
179 }
180
182 void dump() {
183 print(dbgs());
184 }
185
186 Use *getCheckUse() const { return CheckUse; }
187
188 /// Represents an signed integer range [Range.getBegin(), Range.getEnd()). If
189 /// R.getEnd() le R.getBegin(), then R denotes the empty range.
190
191 class Range {
192 const SCEV *Begin;
193 const SCEV *End;
194
195 public:
196 Range(const SCEV *Begin, const SCEV *End) : Begin(Begin), End(End) {
197 assert(Begin->getType() == End->getType() && "ill-typed range!");
198 }
199
200 Type *getType() const { return Begin->getType(); }
201 const SCEV *getBegin() const { return Begin; }
202 const SCEV *getEnd() const { return End; }
203 bool isEmpty(ScalarEvolution &SE, bool IsSigned) const {
204 if (Begin == End)
205 return true;
206 if (IsSigned)
207 return SE.isKnownPredicate(ICmpInst::ICMP_SGE, Begin, End);
208 else
209 return SE.isKnownPredicate(ICmpInst::ICMP_UGE, Begin, End);
210 }
211 };
212
213 /// This is the value the condition of the branch needs to evaluate to for the
214 /// branch to take the hot successor (see (1) above).
215 bool getPassingDirection() { return true; }
216
217 /// Computes a range for the induction variable (IndVar) in which the range
218 /// check is redundant and can be constant-folded away. The induction
219 /// variable is not required to be the canonical {0,+,1} induction variable.
220 std::optional<Range> computeSafeIterationSpace(ScalarEvolution &SE,
221 const SCEVAddRecExpr *IndVar,
222 bool IsLatchSigned) const;
223
224 /// Parse out a set of inductive range checks from \p BI and append them to \p
225 /// Checks.
226 ///
227 /// NB! There may be conditions feeding into \p BI that aren't inductive range
228 /// checks, and hence don't end up in \p Checks.
229 static void extractRangeChecksFromBranch(
231 std::optional<uint64_t> EstimatedTripCount,
233};
234
235class InductiveRangeCheckElimination {
236 ScalarEvolution &SE;
238 DominatorTree &DT;
239 LoopInfo &LI;
240
241 using GetBFIFunc = llvm::function_ref<llvm::BlockFrequencyInfo &()>;
242 GetBFIFunc GetBFI;
243
244 // Returns the estimated number of iterations based on block frequency info if
245 // available, or on branch probability info. Nullopt is returned if the number
246 // of iterations cannot be estimated.
247 std::optional<uint64_t> estimatedTripCount(const Loop &L);
248
249public:
250 InductiveRangeCheckElimination(ScalarEvolution &SE,
252 LoopInfo &LI, GetBFIFunc GetBFI = nullptr)
253 : SE(SE), BPI(BPI), DT(DT), LI(LI), GetBFI(GetBFI) {}
254
255 bool run(Loop *L, function_ref<void(Loop *, bool)> LPMAddNewLoop);
256};
257
258} // end anonymous namespace
259
260/// Parse a single ICmp instruction, `ICI`, into a range check. If `ICI` cannot
261/// be interpreted as a range check, return false. Otherwise set `Index` to the
262/// SCEV being range checked, and set `End` to the upper or lower limit `Index`
263/// is being range checked.
264bool InductiveRangeCheck::parseRangeCheckICmp(Loop *L, ICmpInst *ICI,
265 ScalarEvolution &SE,
266 const SCEVAddRecExpr *&Index,
267 const SCEV *&End) {
268 auto IsLoopInvariant = [&SE, L](Value *V) {
269 return SE.isLoopInvariant(SE.getSCEV(V), L);
270 };
271
272 ICmpInst::Predicate Pred = ICI->getPredicate();
273 Value *LHS = ICI->getOperand(0);
274 Value *RHS = ICI->getOperand(1);
275
276 if (!LHS->getType()->isIntegerTy())
277 return false;
278
279 // Canonicalize to the `Index Pred Invariant` comparison
280 if (IsLoopInvariant(LHS)) {
281 std::swap(LHS, RHS);
282 Pred = CmpInst::getSwappedPredicate(Pred);
283 } else if (!IsLoopInvariant(RHS))
284 // Both LHS and RHS are loop variant
285 return false;
286
287 if (parseIvAgaisntLimit(L, LHS, RHS, Pred, SE, Index, End))
288 return true;
289
290 if (reassociateSubLHS(L, LHS, RHS, Pred, SE, Index, End))
291 return true;
292
293 // TODO: support ReassociateAddLHS
294 return false;
295}
296
297// Try to parse range check in the form of "IV vs Limit"
298bool InductiveRangeCheck::parseIvAgaisntLimit(Loop *L, Value *LHS, Value *RHS,
299 ICmpInst::Predicate Pred,
300 ScalarEvolution &SE,
301 const SCEVAddRecExpr *&Index,
302 const SCEV *&End) {
303
304 auto SIntMaxSCEV = [&](Type *T) {
305 unsigned BitWidth = cast<IntegerType>(T)->getBitWidth();
307 };
308
309 const auto *AddRec = dyn_cast<SCEVAddRecExpr>(SE.getSCEV(LHS));
310 if (!AddRec)
311 return false;
312
313 // We strengthen "0 <= I" to "0 <= I < INT_SMAX" and "I < L" to "0 <= I < L".
314 // We can potentially do much better here.
315 // If we want to adjust upper bound for the unsigned range check as we do it
316 // for signed one, we will need to pick Unsigned max
317 switch (Pred) {
318 default:
319 return false;
320
321 case ICmpInst::ICMP_SGE:
322 if (match(RHS, m_ConstantInt<0>())) {
323 Index = AddRec;
324 End = SIntMaxSCEV(Index->getType());
325 return true;
326 }
327 return false;
328
329 case ICmpInst::ICMP_SGT:
330 if (match(RHS, m_ConstantInt<-1>())) {
331 Index = AddRec;
332 End = SIntMaxSCEV(Index->getType());
333 return true;
334 }
335 return false;
336
337 case ICmpInst::ICMP_SLT:
338 case ICmpInst::ICMP_ULT:
339 Index = AddRec;
340 End = SE.getSCEV(RHS);
341 return true;
342
343 case ICmpInst::ICMP_SLE:
344 case ICmpInst::ICMP_ULE:
345 const SCEV *One = SE.getOne(RHS->getType());
346 const SCEV *RHSS = SE.getSCEV(RHS);
347 bool Signed = Pred == ICmpInst::ICMP_SLE;
348 if (SE.willNotOverflow(Instruction::BinaryOps::Add, Signed, RHSS, One)) {
349 Index = AddRec;
350 End = SE.getAddExpr(RHSS, One);
351 return true;
352 }
353 return false;
354 }
355
356 llvm_unreachable("default clause returns!");
357}
358
359// Try to parse range check in the form of "IV - Offset vs Limit" or "Offset -
360// IV vs Limit"
361bool InductiveRangeCheck::reassociateSubLHS(
362 Loop *L, Value *VariantLHS, Value *InvariantRHS, ICmpInst::Predicate Pred,
363 ScalarEvolution &SE, const SCEVAddRecExpr *&Index, const SCEV *&End) {
364 Value *LHS, *RHS;
365 if (!match(VariantLHS, m_Sub(m_Value(LHS), m_Value(RHS))))
366 return false;
367
368 const SCEV *IV = SE.getSCEV(LHS);
369 const SCEV *Offset = SE.getSCEV(RHS);
370 const SCEV *Limit = SE.getSCEV(InvariantRHS);
371
372 bool OffsetSubtracted = false;
373 if (SE.isLoopInvariant(IV, L))
374 // "Offset - IV vs Limit"
376 else if (SE.isLoopInvariant(Offset, L))
377 // "IV - Offset vs Limit"
378 OffsetSubtracted = true;
379 else
380 return false;
381
382 const auto *AddRec = dyn_cast<SCEVAddRecExpr>(IV);
383 if (!AddRec)
384 return false;
385
386 // In order to turn "IV - Offset < Limit" into "IV < Limit + Offset", we need
387 // to be able to freely move values from left side of inequality to right side
388 // (just as in normal linear arithmetics). Overflows make things much more
389 // complicated, so we want to avoid this.
390 //
391 // Let's prove that the initial subtraction doesn't overflow with all IV's
392 // values from the safe range constructed for that check.
393 //
394 // [Case 1] IV - Offset < Limit
395 // It doesn't overflow if:
396 // SINT_MIN <= IV - Offset <= SINT_MAX
397 // In terms of scaled SINT we need to prove:
398 // SINT_MIN + Offset <= IV <= SINT_MAX + Offset
399 // Safe range will be constructed:
400 // 0 <= IV < Limit + Offset
401 // It means that 'IV - Offset' doesn't underflow, because:
402 // SINT_MIN + Offset < 0 <= IV
403 // and doesn't overflow:
404 // IV < Limit + Offset <= SINT_MAX + Offset
405 //
406 // [Case 2] Offset - IV > Limit
407 // It doesn't overflow if:
408 // SINT_MIN <= Offset - IV <= SINT_MAX
409 // In terms of scaled SINT we need to prove:
410 // -SINT_MIN >= IV - Offset >= -SINT_MAX
411 // Offset - SINT_MIN >= IV >= Offset - SINT_MAX
412 // Safe range will be constructed:
413 // 0 <= IV < Offset - Limit
414 // It means that 'Offset - IV' doesn't underflow, because
415 // Offset - SINT_MAX < 0 <= IV
416 // and doesn't overflow:
417 // IV < Offset - Limit <= Offset - SINT_MIN
418 //
419 // For the computed upper boundary of the IV's range (Offset +/- Limit) we
420 // don't know exactly whether it overflows or not. So if we can't prove this
421 // fact at compile time, we scale boundary computations to a wider type with
422 // the intention to add runtime overflow check.
423
424 auto getExprScaledIfOverflow = [&](Instruction::BinaryOps BinOp,
425 const SCEV *LHS,
426 const SCEV *RHS) -> const SCEV * {
427 const SCEV *(ScalarEvolution::*Operation)(SCEVUse, SCEVUse,
428 SCEV::NoWrapFlags, unsigned);
429 switch (BinOp) {
430 default:
431 llvm_unreachable("Unsupported binary op");
432 case Instruction::Add:
434 break;
435 case Instruction::Sub:
437 break;
438 }
439
440 if (SE.willNotOverflow(BinOp, ICmpInst::isSigned(Pred), LHS, RHS,
441 cast<Instruction>(VariantLHS)))
442 return (SE.*Operation)(LHS, RHS, SCEV::FlagAnyWrap, 0);
443
444 // We couldn't prove that the expression does not overflow.
445 // Than scale it to a wider type to check overflow at runtime.
446 auto *Ty = cast<IntegerType>(LHS->getType());
447 if (Ty->getBitWidth() > MaxTypeSizeForOverflowCheck)
448 return nullptr;
449
450 auto WideTy = IntegerType::get(Ty->getContext(), Ty->getBitWidth() * 2);
451 return (SE.*Operation)(SE.getSignExtendExpr(LHS, WideTy),
453 0);
454 };
455
456 if (OffsetSubtracted)
457 // "IV - Offset < Limit" -> "IV" < Offset + Limit
458 Limit = getExprScaledIfOverflow(Instruction::BinaryOps::Add, Offset, Limit);
459 else {
460 // "Offset - IV > Limit" -> "IV" < Offset - Limit
461 Limit = getExprScaledIfOverflow(Instruction::BinaryOps::Sub, Offset, Limit);
462 Pred = ICmpInst::getSwappedPredicate(Pred);
463 }
464
465 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE) {
466 // "Expr <= Limit" -> "Expr < Limit + 1"
467 if (Pred == ICmpInst::ICMP_SLE && Limit)
468 Limit = getExprScaledIfOverflow(Instruction::BinaryOps::Add, Limit,
469 SE.getOne(Limit->getType()));
470 if (Limit) {
471 Index = AddRec;
472 End = Limit;
473 return true;
474 }
475 }
476 return false;
477}
478
479void InductiveRangeCheck::extractRangeChecksFromCond(
480 Loop *L, ScalarEvolution &SE, Use &ConditionUse,
481 SmallVectorImpl<InductiveRangeCheck> &Checks,
482 SmallPtrSetImpl<Value *> &Visited) {
483 Value *Condition = ConditionUse.get();
484 if (!Visited.insert(Condition).second)
485 return;
486
487 // TODO: Do the same for OR, XOR, NOT etc?
488 if (match(Condition, m_LogicalAnd(m_Value(), m_Value()))) {
489 extractRangeChecksFromCond(L, SE, cast<User>(Condition)->getOperandUse(0),
490 Checks, Visited);
491 extractRangeChecksFromCond(L, SE, cast<User>(Condition)->getOperandUse(1),
492 Checks, Visited);
493 return;
494 }
495
496 ICmpInst *ICI = dyn_cast<ICmpInst>(Condition);
497 if (!ICI)
498 return;
499
500 const SCEV *End = nullptr;
501 const SCEVAddRecExpr *IndexAddRec = nullptr;
502 if (!parseRangeCheckICmp(L, ICI, SE, IndexAddRec, End))
503 return;
504
505 assert(IndexAddRec && "IndexAddRec was not computed");
506 assert(End && "End was not computed");
507
508 if ((IndexAddRec->getLoop() != L) || !IndexAddRec->isAffine())
509 return;
510
511 InductiveRangeCheck IRC;
512 IRC.End = End;
513 IRC.Begin = IndexAddRec->getStart();
514 IRC.Step = IndexAddRec->getStepRecurrence(SE);
515 IRC.CheckUse = &ConditionUse;
516 Checks.push_back(IRC);
517}
518
519void InductiveRangeCheck::extractRangeChecksFromBranch(
520 CondBrInst *BI, Loop *L, ScalarEvolution &SE, BranchProbabilityInfo *BPI,
521 std::optional<uint64_t> EstimatedTripCount,
522 SmallVectorImpl<InductiveRangeCheck> &Checks, bool &Changed) {
523 if (BI->getParent() == L->getLoopLatch())
524 return;
525
526 unsigned IndexLoopSucc = L->contains(BI->getSuccessor(0)) ? 0 : 1;
527 assert(L->contains(BI->getSuccessor(IndexLoopSucc)) &&
528 "No edges coming to loop?");
529
530 if (!SkipProfitabilityChecks && BPI) {
531 auto SuccessProbability =
532 BPI->getEdgeProbability(BI->getParent(), IndexLoopSucc);
533 if (EstimatedTripCount) {
534 auto EstimatedEliminatedChecks =
535 SuccessProbability.scale(*EstimatedTripCount);
536 if (EstimatedEliminatedChecks < MinEliminatedChecks) {
537 LLVM_DEBUG(dbgs() << "irce: could not prove profitability for branch "
538 << *BI << ": "
539 << "estimated eliminated checks too low "
540 << EstimatedEliminatedChecks << "\n";);
541 return;
542 }
543 } else {
544 BranchProbability LikelyTaken(15, 16);
545 if (SuccessProbability < LikelyTaken) {
546 LLVM_DEBUG(dbgs() << "irce: could not prove profitability for branch "
547 << *BI << ": "
548 << "could not estimate trip count "
549 << "and branch success probability too low "
550 << SuccessProbability << "\n";);
551 return;
552 }
553 }
554 }
555
556 // IRCE expects branch's true edge comes to loop. Invert branch for opposite
557 // case.
558 if (IndexLoopSucc != 0) {
559 IRBuilder<> Builder(BI);
560 InvertBranch(BI, Builder);
561 if (BPI)
563 Changed = true;
564 }
565
566 SmallPtrSet<Value *, 8> Visited;
567 InductiveRangeCheck::extractRangeChecksFromCond(L, SE, BI->getOperandUse(0),
568 Checks, Visited);
569}
570
571/// If the type of \p S matches with \p Ty, return \p S. Otherwise, return
572/// signed or unsigned extension of \p S to type \p Ty.
573static const SCEV *NoopOrExtend(const SCEV *S, Type *Ty, ScalarEvolution &SE,
574 bool Signed) {
575 return Signed ? SE.getNoopOrSignExtend(S, Ty) : SE.getNoopOrZeroExtend(S, Ty);
576}
577
578// Compute a safe set of limits for the main loop to run in -- effectively the
579// intersection of `Range' and the iteration space of the original loop.
580// Return std::nullopt if unable to compute the set of subranges.
581static std::optional<LoopConstrainer::SubRanges>
583 InductiveRangeCheck::Range &Range,
584 const LoopStructure &MainLoopStructure) {
585 auto *RTy = cast<IntegerType>(Range.getType());
586 // We only support wide range checks and narrow latches.
587 if (!AllowNarrowLatchCondition && RTy != MainLoopStructure.ExitCountTy)
588 return std::nullopt;
589 if (RTy->getBitWidth() < MainLoopStructure.ExitCountTy->getBitWidth())
590 return std::nullopt;
591
593
594 bool IsSignedPredicate = MainLoopStructure.IsSignedPredicate;
595 // I think we can be more aggressive here and make this nuw / nsw if the
596 // addition that feeds into the icmp for the latch's terminating branch is nuw
597 // / nsw. In any case, a wrapping 2's complement addition is safe.
598 const SCEV *Start = NoopOrExtend(SE.getSCEV(MainLoopStructure.IndVarStart),
599 RTy, SE, IsSignedPredicate);
600 const SCEV *End = NoopOrExtend(SE.getSCEV(MainLoopStructure.LoopExitAt), RTy,
601 SE, IsSignedPredicate);
602
603 bool Increasing = MainLoopStructure.IndVarIncreasing;
604
605 // We compute `Smallest` and `Greatest` such that [Smallest, Greatest), or
606 // [Smallest, GreatestSeen] is the range of values the induction variable
607 // takes.
608
609 const SCEV *Smallest = nullptr, *Greatest = nullptr, *GreatestSeen = nullptr;
610
611 const SCEV *One = SE.getOne(RTy);
612 if (Increasing) {
613 Smallest = Start;
614 Greatest = End;
615 // No overflow, because the range [Smallest, GreatestSeen] is not empty.
616 GreatestSeen = SE.getMinusSCEV(End, One);
617 } else {
618 // These two computations may sign-overflow. Here is why that is okay:
619 //
620 // We know that the induction variable does not sign-overflow on any
621 // iteration except the last one, and it starts at `Start` and ends at
622 // `End`, decrementing by one every time.
623 //
624 // * if `Smallest` sign-overflows we know `End` is `INT_SMAX`. Since the
625 // induction variable is decreasing we know that the smallest value
626 // the loop body is actually executed with is `INT_SMIN` == `Smallest`.
627 //
628 // * if `Greatest` sign-overflows, we know it can only be `INT_SMIN`. In
629 // that case, `Clamp` will always return `Smallest` and
630 // [`Result.LowLimit`, `Result.HighLimit`) = [`Smallest`, `Smallest`)
631 // will be an empty range. Returning an empty range is always safe.
632
633 Smallest = SE.getAddExpr(End, One);
634 Greatest = SE.getAddExpr(Start, One);
635 GreatestSeen = Start;
636 }
637
638 auto Clamp = [&SE, Smallest, Greatest, IsSignedPredicate](const SCEV *S) {
639 return IsSignedPredicate
640 ? SE.getSMaxExpr(Smallest, SE.getSMinExpr(Greatest, S))
641 : SE.getUMaxExpr(Smallest, SE.getUMinExpr(Greatest, S));
642 };
643
644 // In some cases we can prove that we don't need a pre or post loop.
645 ICmpInst::Predicate PredLE =
646 IsSignedPredicate ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE;
647 ICmpInst::Predicate PredLT =
648 IsSignedPredicate ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
649
650 bool ProvablyNoPreloop =
651 SE.isKnownPredicate(PredLE, Range.getBegin(), Smallest);
652 if (!ProvablyNoPreloop)
653 Result.LowLimit = Clamp(Range.getBegin());
654
655 bool ProvablyNoPostLoop =
656 SE.isKnownPredicate(PredLT, GreatestSeen, Range.getEnd());
657 if (!ProvablyNoPostLoop)
658 Result.HighLimit = Clamp(Range.getEnd());
659
660 return Result;
661}
662
663/// Computes and returns a range of values for the induction variable (IndVar)
664/// in which the range check can be safely elided. If it cannot compute such a
665/// range, returns std::nullopt.
666std::optional<InductiveRangeCheck::Range>
667InductiveRangeCheck::computeSafeIterationSpace(ScalarEvolution &SE,
668 const SCEVAddRecExpr *IndVar,
669 bool IsLatchSigned) const {
670 // We can deal when types of latch check and range checks don't match in case
671 // if latch check is more narrow.
672 auto *IVType = dyn_cast<IntegerType>(IndVar->getType());
673 auto *RCType = dyn_cast<IntegerType>(getBegin()->getType());
674 auto *EndType = dyn_cast<IntegerType>(getEnd()->getType());
675 // Do not work with pointer types.
676 if (!IVType || !RCType)
677 return std::nullopt;
678 if (IVType->getBitWidth() > RCType->getBitWidth())
679 return std::nullopt;
680
681 // IndVar is of the form "A + B * I" (where "I" is the canonical induction
682 // variable, that may or may not exist as a real llvm::Value in the loop) and
683 // this inductive range check is a range check on the "C + D * I" ("C" is
684 // getBegin() and "D" is getStep()). We rewrite the value being range
685 // checked to "M + N * IndVar" where "N" = "D * B^(-1)" and "M" = "C - NA".
686 //
687 // The actual inequalities we solve are of the form
688 //
689 // 0 <= M + 1 * IndVar < L given L >= 0 (i.e. N == 1)
690 //
691 // Here L stands for upper limit of the safe iteration space.
692 // The inequality is satisfied by (0 - M) <= IndVar < (L - M). To avoid
693 // overflows when calculating (0 - M) and (L - M) we, depending on type of
694 // IV's iteration space, limit the calculations by borders of the iteration
695 // space. For example, if IndVar is unsigned, (0 - M) overflows for any M > 0.
696 // If we figured out that "anything greater than (-M) is safe", we strengthen
697 // this to "everything greater than 0 is safe", assuming that values between
698 // -M and 0 just do not exist in unsigned iteration space, and we don't want
699 // to deal with overflown values.
700
701 if (!IndVar->isAffine())
702 return std::nullopt;
703
704 const SCEV *A = NoopOrExtend(IndVar->getStart(), RCType, SE, IsLatchSigned);
705 const SCEVConstant *B = dyn_cast<SCEVConstant>(
706 NoopOrExtend(IndVar->getStepRecurrence(SE), RCType, SE, IsLatchSigned));
707 if (!B)
708 return std::nullopt;
709 assert(!B->isZero() && "Recurrence with zero step?");
710
711 const SCEV *C = getBegin();
712 const SCEVConstant *D = dyn_cast<SCEVConstant>(getStep());
713 if (D != B)
714 return std::nullopt;
715
716 assert(!D->getValue()->isZero() && "Recurrence with zero step?");
717 unsigned BitWidth = RCType->getBitWidth();
718 const SCEV *SIntMax = SE.getConstant(APInt::getSignedMaxValue(BitWidth));
719 const SCEV *SIntMin = SE.getConstant(APInt::getSignedMinValue(BitWidth));
720
721 // Subtract Y from X so that it does not go through border of the IV
722 // iteration space. Mathematically, it is equivalent to:
723 //
724 // ClampedSubtract(X, Y) = min(max(X - Y, INT_MIN), INT_MAX). [1]
725 //
726 // In [1], 'X - Y' is a mathematical subtraction (result is not bounded to
727 // any width of bit grid). But after we take min/max, the result is
728 // guaranteed to be within [INT_MIN, INT_MAX].
729 //
730 // In [1], INT_MAX and INT_MIN are respectively signed and unsigned max/min
731 // values, depending on type of latch condition that defines IV iteration
732 // space.
733 auto ClampedSubtract = [&](const SCEV *X, const SCEV *Y) {
734 // FIXME: The current implementation assumes that X is in [0, SINT_MAX].
735 // This is required to ensure that SINT_MAX - X does not overflow signed and
736 // that X - Y does not overflow unsigned if Y is negative. Can we lift this
737 // restriction and make it work for negative X either?
738 if (IsLatchSigned) {
739 // X is a number from signed range, Y is interpreted as signed.
740 // Even if Y is SINT_MAX, (X - Y) does not reach SINT_MIN. So the only
741 // thing we should care about is that we didn't cross SINT_MAX.
742 // So, if Y is positive, we subtract Y safely.
743 // Rule 1: Y > 0 ---> Y.
744 // If 0 <= -Y <= (SINT_MAX - X), we subtract Y safely.
745 // Rule 2: Y >=s (X - SINT_MAX) ---> Y.
746 // If 0 <= (SINT_MAX - X) < -Y, we can only subtract (X - SINT_MAX).
747 // Rule 3: Y <s (X - SINT_MAX) ---> (X - SINT_MAX).
748 // It gives us smax(Y, X - SINT_MAX) to subtract in all cases.
749 const SCEV *XMinusSIntMax = SE.getMinusSCEV(X, SIntMax);
750 return SE.getMinusSCEV(X, SE.getSMaxExpr(Y, XMinusSIntMax),
752 } else
753 // X is a number from unsigned range, Y is interpreted as signed.
754 // Even if Y is SINT_MIN, (X - Y) does not reach UINT_MAX. So the only
755 // thing we should care about is that we didn't cross zero.
756 // So, if Y is negative, we subtract Y safely.
757 // Rule 1: Y <s 0 ---> Y.
758 // If 0 <= Y <= X, we subtract Y safely.
759 // Rule 2: Y <=s X ---> Y.
760 // If 0 <= X < Y, we should stop at 0 and can only subtract X.
761 // Rule 3: Y >s X ---> X.
762 // It gives us smin(X, Y) to subtract in all cases.
763 return SE.getMinusSCEV(X, SE.getSMinExpr(X, Y), SCEV::FlagNUW);
764 };
765 const SCEV *M = SE.getMinusSCEV(C, A);
766 const SCEV *Zero = SE.getZero(M->getType());
767
768 // This function returns SCEV equal to 1 if X is non-negative 0 otherwise.
769 auto SCEVCheckNonNegative = [&](const SCEV *X) {
770 const Loop *L = IndVar->getLoop();
771 const SCEV *Zero = SE.getZero(X->getType());
772 const SCEV *One = SE.getOne(X->getType());
773 // Can we trivially prove that X is a non-negative or negative value?
774 if (isKnownNonNegativeInLoop(X, L, SE))
775 return One;
776 else if (isKnownNegativeInLoop(X, L, SE))
777 return Zero;
778 // If not, we will have to figure it out during the execution.
779 // Function smax(smin(X, 0), -1) + 1 equals to 1 if X >= 0 and 0 if X < 0.
780 const SCEV *NegOne = SE.getNegativeSCEV(One);
781 return SE.getAddExpr(SE.getSMaxExpr(SE.getSMinExpr(X, Zero), NegOne), One);
782 };
783
784 // This function returns SCEV equal to 1 if X will not overflow in terms of
785 // range check type, 0 otherwise.
786 auto SCEVCheckWillNotOverflow = [&](const SCEV *X) {
787 // X doesn't overflow if SINT_MAX >= X.
788 // Then if (SINT_MAX - X) >= 0, X doesn't overflow
789 const SCEV *SIntMaxExt = SE.getSignExtendExpr(SIntMax, X->getType());
790 const SCEV *OverflowCheck =
791 SCEVCheckNonNegative(SE.getMinusSCEV(SIntMaxExt, X));
792
793 // X doesn't underflow if X >= SINT_MIN.
794 // Then if (X - SINT_MIN) >= 0, X doesn't underflow
795 const SCEV *SIntMinExt = SE.getSignExtendExpr(SIntMin, X->getType());
796 const SCEV *UnderflowCheck =
797 SCEVCheckNonNegative(SE.getMinusSCEV(X, SIntMinExt));
798
799 return SE.getMulExpr(OverflowCheck, UnderflowCheck);
800 };
801
802 // FIXME: Current implementation of ClampedSubtract implicitly assumes that
803 // X is non-negative (in sense of a signed value). We need to re-implement
804 // this function in a way that it will correctly handle negative X as well.
805 // We use it twice: for X = 0 everything is fine, but for X = getEnd() we can
806 // end up with a negative X and produce wrong results. So currently we ensure
807 // that if getEnd() is negative then both ends of the safe range are zero.
808 // Note that this may pessimize elimination of unsigned range checks against
809 // negative values.
810 const SCEV *REnd = getEnd();
811 const SCEV *EndWillNotOverflow = SE.getOne(RCType);
812
813 auto PrintRangeCheck = [&](raw_ostream &OS) {
814 auto L = IndVar->getLoop();
815 OS << "irce: in function ";
816 OS << L->getHeader()->getParent()->getName();
817 OS << ", in ";
818 L->print(OS);
819 OS << "there is range check with scaled boundary:\n";
820 print(OS);
821 };
822
823 if (EndType->getBitWidth() > RCType->getBitWidth()) {
824 assert(EndType->getBitWidth() == RCType->getBitWidth() * 2);
826 PrintRangeCheck(errs());
827 // End is computed with extended type but will be truncated to a narrow one
828 // type of range check. Therefore we need a check that the result will not
829 // overflow in terms of narrow type.
830 EndWillNotOverflow =
831 SE.getTruncateExpr(SCEVCheckWillNotOverflow(REnd), RCType);
832 REnd = SE.getTruncateExpr(REnd, RCType);
833 }
834
835 const SCEV *RuntimeChecks =
836 SE.getMulExpr(SCEVCheckNonNegative(REnd), EndWillNotOverflow);
837 const SCEV *Begin = SE.getMulExpr(ClampedSubtract(Zero, M), RuntimeChecks);
838 const SCEV *End = SE.getMulExpr(ClampedSubtract(REnd, M), RuntimeChecks);
839
840 return InductiveRangeCheck::Range(Begin, End);
841}
842
843static std::optional<InductiveRangeCheck::Range>
845 const std::optional<InductiveRangeCheck::Range> &R1,
846 const InductiveRangeCheck::Range &R2) {
847 if (R2.isEmpty(SE, /* IsSigned */ true))
848 return std::nullopt;
849 if (!R1)
850 return R2;
851 auto &R1Value = *R1;
852 // We never return empty ranges from this function, and R1 is supposed to be
853 // a result of intersection. Thus, R1 is never empty.
854 assert(!R1Value.isEmpty(SE, /* IsSigned */ true) &&
855 "We should never have empty R1!");
856
857 // TODO: we could widen the smaller range and have this work; but for now we
858 // bail out to keep things simple.
859 if (R1Value.getType() != R2.getType())
860 return std::nullopt;
861
862 const SCEV *NewBegin = SE.getSMaxExpr(R1Value.getBegin(), R2.getBegin());
863 const SCEV *NewEnd = SE.getSMinExpr(R1Value.getEnd(), R2.getEnd());
864
865 // If the resulting range is empty, just return std::nullopt.
866 auto Ret = InductiveRangeCheck::Range(NewBegin, NewEnd);
867 if (Ret.isEmpty(SE, /* IsSigned */ true))
868 return std::nullopt;
869 return Ret;
870}
871
872static std::optional<InductiveRangeCheck::Range>
874 const std::optional<InductiveRangeCheck::Range> &R1,
875 const InductiveRangeCheck::Range &R2) {
876 if (R2.isEmpty(SE, /* IsSigned */ false))
877 return std::nullopt;
878 if (!R1)
879 return R2;
880 auto &R1Value = *R1;
881 // We never return empty ranges from this function, and R1 is supposed to be
882 // a result of intersection. Thus, R1 is never empty.
883 assert(!R1Value.isEmpty(SE, /* IsSigned */ false) &&
884 "We should never have empty R1!");
885
886 // TODO: we could widen the smaller range and have this work; but for now we
887 // bail out to keep things simple.
888 if (R1Value.getType() != R2.getType())
889 return std::nullopt;
890
891 const SCEV *NewBegin = SE.getUMaxExpr(R1Value.getBegin(), R2.getBegin());
892 const SCEV *NewEnd = SE.getUMinExpr(R1Value.getEnd(), R2.getEnd());
893
894 // If the resulting range is empty, just return std::nullopt.
895 auto Ret = InductiveRangeCheck::Range(NewBegin, NewEnd);
896 if (Ret.isEmpty(SE, /* IsSigned */ false))
897 return std::nullopt;
898 return Ret;
899}
900
902 auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
903 LoopInfo &LI = AM.getResult<LoopAnalysis>(F);
904 // There are no loops in the function. Return before computing other expensive
905 // analyses.
906 if (LI.empty())
907 return PreservedAnalyses::all();
908 auto &SE = AM.getResult<ScalarEvolutionAnalysis>(F);
909 auto &BPI = AM.getResult<BranchProbabilityAnalysis>(F);
910
911 // Get BFI analysis result on demand. Please note that modification of
912 // CFG invalidates this analysis and we should handle it.
913 auto getBFI = [&F, &AM ]()->BlockFrequencyInfo & {
915 };
916 InductiveRangeCheckElimination IRCE(SE, &BPI, DT, LI, { getBFI });
917
918 bool Changed = false;
919 {
920 bool CFGChanged = false;
921 for (const auto &L : LI) {
922 CFGChanged |= simplifyLoop(L, &DT, &LI, &SE, nullptr, nullptr,
923 /*PreserveLCSSA=*/false);
924 Changed |= formLCSSARecursively(*L, DT, &LI, &SE);
925 }
926 Changed |= CFGChanged;
927
928 if (CFGChanged && !SkipProfitabilityChecks) {
931 AM.invalidate(F, PA);
932 }
933 }
934
936 appendLoopsToWorklist(LI, Worklist);
937 auto LPMAddNewLoop = [&Worklist](Loop *NL, bool IsSubloop) {
938 if (!IsSubloop)
939 appendLoopsToWorklist(*NL, Worklist);
940 };
941
942 while (!Worklist.empty()) {
943 Loop *L = Worklist.pop_back_val();
944 if (IRCE.run(L, LPMAddNewLoop)) {
945 Changed = true;
949 AM.invalidate(F, PA);
950 }
951 }
952 }
953
954 if (!Changed)
955 return PreservedAnalyses::all();
957}
958
959std::optional<uint64_t>
960InductiveRangeCheckElimination::estimatedTripCount(const Loop &L) {
961 if (GetBFI) {
962 BlockFrequencyInfo &BFI = GetBFI();
963 uint64_t hFreq = BFI.getBlockFreq(L.getHeader()).getFrequency();
964 uint64_t phFreq = BFI.getBlockFreq(L.getLoopPreheader()).getFrequency();
965 if (phFreq == 0 || hFreq == 0)
966 return std::nullopt;
967 return {hFreq / phFreq};
968 }
969
970 if (!BPI)
971 return std::nullopt;
972
973 auto *Latch = L.getLoopLatch();
974 if (!Latch)
975 return std::nullopt;
976 auto *LatchBr = dyn_cast<CondBrInst>(Latch->getTerminator());
977 if (!LatchBr)
978 return std::nullopt;
979
980 auto LatchBrExitIdx = LatchBr->getSuccessor(0) == L.getHeader() ? 1 : 0;
981 BranchProbability ExitProbability =
982 BPI->getEdgeProbability(Latch, LatchBrExitIdx);
983 if (ExitProbability.isUnknown() || ExitProbability.isZero())
984 return std::nullopt;
985
986 return {ExitProbability.scaleByInverse(1)};
987}
988
989bool InductiveRangeCheckElimination::run(
990 Loop *L, function_ref<void(Loop *, bool)> LPMAddNewLoop) {
991 if (L->getBlocks().size() >= LoopSizeCutoff) {
992 LLVM_DEBUG(dbgs() << "irce: giving up constraining loop, too large\n");
993 return false;
994 }
995
996 BasicBlock *Preheader = L->getLoopPreheader();
997 if (!Preheader) {
998 LLVM_DEBUG(dbgs() << "irce: loop has no preheader, leaving\n");
999 return false;
1000 }
1001
1002 auto EstimatedTripCount = estimatedTripCount(*L);
1003 if (!SkipProfitabilityChecks && EstimatedTripCount &&
1004 *EstimatedTripCount < MinEliminatedChecks) {
1005 LLVM_DEBUG(dbgs() << "irce: could not prove profitability: "
1006 << "the estimated number of iterations is "
1007 << *EstimatedTripCount << "\n");
1008 return false;
1009 }
1010
1011 LLVMContext &Context = Preheader->getContext();
1013 bool Changed = false;
1014
1015 for (auto *BBI : L->getBlocks())
1016 if (CondBrInst *TBI = dyn_cast<CondBrInst>(BBI->getTerminator()))
1017 InductiveRangeCheck::extractRangeChecksFromBranch(
1018 TBI, L, SE, BPI, EstimatedTripCount, RangeChecks, Changed);
1019
1020 if (RangeChecks.empty())
1021 return Changed;
1022
1023 auto PrintRecognizedRangeChecks = [&](raw_ostream &OS) {
1024 OS << "irce: looking at loop "; L->print(OS);
1025 OS << "irce: loop has " << RangeChecks.size()
1026 << " inductive range checks: \n";
1027 for (InductiveRangeCheck &IRC : RangeChecks)
1028 IRC.print(OS);
1029 };
1030
1031 LLVM_DEBUG(PrintRecognizedRangeChecks(dbgs()));
1032
1033 if (PrintRangeChecks)
1034 PrintRecognizedRangeChecks(errs());
1035
1036 const char *FailureReason = nullptr;
1037 SCEVExpander LoopStructureExpander(SE, "loop-constrainer");
1038 SCEVExpanderCleaner LoopStructureExpanderCleaner(LoopStructureExpander);
1039 std::optional<LoopStructure> MaybeLoopStructure =
1040 LoopStructure::parseLoopStructure(LoopStructureExpander, *L,
1042 FailureReason);
1043 if (!MaybeLoopStructure) {
1044 LLVM_DEBUG(dbgs() << "irce: could not parse loop structure: "
1045 << FailureReason << "\n";);
1046 return Changed;
1047 }
1048 LoopStructure LS = *MaybeLoopStructure;
1049 const SCEVAddRecExpr *IndVar =
1050 cast<SCEVAddRecExpr>(SE.getMinusSCEV(SE.getSCEV(LS.IndVarBase), SE.getSCEV(LS.IndVarStep)));
1051
1052 std::optional<InductiveRangeCheck::Range> SafeIterRange;
1053
1054 SmallVector<InductiveRangeCheck, 4> RangeChecksToEliminate;
1055 // Basing on the type of latch predicate, we interpret the IV iteration range
1056 // as signed or unsigned range. We use different min/max functions (signed or
1057 // unsigned) when intersecting this range with safe iteration ranges implied
1058 // by range checks.
1059 auto IntersectRange =
1060 LS.IsSignedPredicate ? IntersectSignedRange : IntersectUnsignedRange;
1061
1062 for (InductiveRangeCheck &IRC : RangeChecks) {
1063 auto Result = IRC.computeSafeIterationSpace(SE, IndVar,
1064 LS.IsSignedPredicate);
1065 if (Result) {
1066 auto MaybeSafeIterRange = IntersectRange(SE, SafeIterRange, *Result);
1067 if (MaybeSafeIterRange) {
1068 assert(!MaybeSafeIterRange->isEmpty(SE, LS.IsSignedPredicate) &&
1069 "We should never return empty ranges!");
1070 RangeChecksToEliminate.push_back(IRC);
1071 SafeIterRange = *MaybeSafeIterRange;
1072 }
1073 }
1074 }
1075
1076 if (!SafeIterRange)
1077 return Changed;
1078
1079 std::optional<LoopConstrainer::SubRanges> MaybeSR =
1080 calculateSubRanges(SE, *L, *SafeIterRange, LS);
1081 if (!MaybeSR) {
1082 LLVM_DEBUG(dbgs() << "irce: could not compute subranges\n");
1083 return Changed;
1084 }
1085
1086 LoopConstrainer LC(*L, LI, LPMAddNewLoop, LS, SE, DT,
1087 SafeIterRange->getBegin()->getType(), *MaybeSR);
1088
1089 if (LC.run()) {
1090 LoopStructureExpanderCleaner.markResultUsed();
1091 LS.IndVarStart->setName("indvar.start");
1092 Changed = true;
1093
1094 auto PrintConstrainedLoopInfo = [L]() {
1095 dbgs() << "irce: in function ";
1096 dbgs() << L->getHeader()->getParent()->getName() << ": ";
1097 dbgs() << "constrained ";
1098 L->print(dbgs());
1099 };
1100
1101 LLVM_DEBUG(PrintConstrainedLoopInfo());
1102
1104 PrintConstrainedLoopInfo();
1105
1106 // Optimize away the now-redundant range checks.
1107
1108 for (InductiveRangeCheck &IRC : RangeChecksToEliminate) {
1109 ConstantInt *FoldedRangeCheck = IRC.getPassingDirection()
1111 : ConstantInt::getFalse(Context);
1112 IRC.getCheckUse()->set(FoldedRangeCheck);
1113 }
1114 }
1115
1116 return Changed;
1117}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements a class to represent arbitrary precision integral constant values and operations...
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
#define X(NUM, ENUM, NAME)
Definition ELF.h:856
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< 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:678
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
This defines the Use class.
static const SCEV * NoopOrExtend(const SCEV *S, Type *Ty, ScalarEvolution &SE, bool Signed)
If the type of S matches with Ty, return S.
static cl::opt< bool > PrintRangeChecks("irce-print-range-checks", cl::Hidden, cl::init(false))
static cl::opt< bool > AllowUnsignedLatchCondition("irce-allow-unsigned-latch", cl::Hidden, cl::init(true))
static cl::opt< unsigned > LoopSizeCutoff("irce-loop-size-cutoff", cl::Hidden, cl::init(64))
static std::optional< InductiveRangeCheck::Range > IntersectSignedRange(ScalarEvolution &SE, const std::optional< InductiveRangeCheck::Range > &R1, const InductiveRangeCheck::Range &R2)
static cl::opt< bool > AllowNarrowLatchCondition("irce-allow-narrow-latch", cl::Hidden, cl::init(true), cl::desc("If set to true, IRCE may eliminate wide range checks in loops " "with narrow latch condition."))
static cl::opt< unsigned > MaxTypeSizeForOverflowCheck("irce-max-type-size-for-overflow-check", cl::Hidden, cl::init(32), cl::desc("Maximum size of range check type for which can be produced runtime " "overflow check of its limit's computation"))
static cl::opt< unsigned > MinEliminatedChecks("irce-min-eliminated-checks", cl::Hidden, cl::init(10))
static cl::opt< bool > PrintChangedLoops("irce-print-changed-loops", cl::Hidden, cl::init(false))
static std::optional< InductiveRangeCheck::Range > IntersectUnsignedRange(ScalarEvolution &SE, const std::optional< InductiveRangeCheck::Range > &R1, const InductiveRangeCheck::Range &R2)
static cl::opt< bool > SkipProfitabilityChecks("irce-skip-profitability-checks", cl::Hidden, cl::init(false))
static std::optional< LoopConstrainer::SubRanges > calculateSubRanges(ScalarEvolution &SE, const Loop &L, InductiveRangeCheck::Range &Range, const LoopStructure &MainLoopStructure)
static cl::opt< bool > PrintScaledBoundaryRangeChecks("irce-print-scaled-boundary-range-checks", cl::Hidden, cl::init(false))
static Constant * getFalse(Type *Ty)
For a boolean type or a vector of boolean type, return false or a vector with every element false.
This header provides classes for managing per-loop analyses.
#define F(x, y, z)
Definition MD5.cpp:54
#define R2(n)
This file contains the declarations for metadata subclasses.
#define T
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
PowerPC Reduce CR logical Operation
This file provides a priority worklist.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
#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
Value * RHS
Value * LHS
static const uint32_t IV[8]
Definition blake3_impl.h:83
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
void invalidate(IRUnitT &IR, const PreservedAnalyses &PA)
Invalidate cached analyses for an IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block lives.
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
LLVM_ABI BlockFrequency getBlockFreq(const BasicBlock *BB) const
getblockFreq - Return block frequency.
uint64_t getFrequency() const
Returns the frequency as a fixpoint number scaled by the entry frequency.
Analysis pass which computes BranchProbabilityInfo.
Analysis providing branch probability information.
LLVM_ABI BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get an edge's probability, relative to other out-edges of the Src.
LLVM_ABI void swapSuccEdgesProbabilities(const BasicBlock *Src)
Swap outgoing edges probabilities for Src with branch terminator.
LLVM_ABI uint64_t scaleByInverse(uint64_t Num) const
Scale a large integer by the inverse.
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_ULT
unsigned less than
Definition InstrTypes.h:765
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:768
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:890
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:828
Conditional Branch instruction.
BasicBlock * getSuccessor(unsigned i) const
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
Analysis pass which computes a DominatorTree.
Definition Dominators.h:241
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
This instruction compares its operands according to the predicate given to the constructor.
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:348
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
Analysis pass that exposes the LoopInfo for a function.
Definition LoopInfo.h:587
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
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
PreservedAnalyses & abandon()
Mark an analysis as abandoned.
Definition Analysis.h:171
bool empty() const
Determine if the PriorityWorklist is empty or not.
This node represents a polynomial recurrence on the trip count of the specified loop.
bool isAffine() const
Return true if this represents an expression A + B*x where A and B are loop invariant values.
SCEVUse getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
This class represents an analyzed expression in the program.
SCEVNoWrapFlags NoWrapFlags
static constexpr auto FlagNUW
static constexpr auto FlagAnyWrap
static constexpr auto FlagNSW
Type * getType() const
Return the LLVM type of this SCEV expression.
LLVM_ABI void print(raw_ostream &OS) const
Print out the internal representation of this scalar to the specified stream.
Analysis pass that exposes the ScalarEvolution for a function.
The main scalar evolution driver.
LLVM_ABI const SCEV * getNegativeSCEV(const SCEV *V, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap)
Return the SCEV object corresponding to -V.
LLVM_ABI const SCEV * getSMinExpr(SCEVUse LHS, SCEVUse RHS)
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 * getConstant(ConstantInt *V)
LLVM_ABI const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
LLVM_ABI const SCEV * getMinusSCEV(SCEVUse LHS, SCEVUse RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Return LHS-RHS.
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.
const SCEV * getOne(Type *Ty)
Return a SCEV for the constant 1 of a specific type.
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 const SCEV * getTruncateExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
LLVM_ABI const SCEV * getUMaxExpr(SCEVUse LHS, SCEVUse RHS)
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 const SCEV * getMulExpr(SmallVectorImpl< SCEVUse > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Get a canonical multiply expression, or something simpler if possible.
LLVM_ABI const SCEV * getSignExtendExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
LLVM_ABI const SCEV * getAddExpr(SmallVectorImpl< SCEVUse > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Get a canonical add expression, or something simpler if possible.
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 * getSMaxExpr(SCEVUse LHS, SCEVUse RHS)
LLVM_ABI const SCEV * getUMinExpr(SCEVUse LHS, SCEVUse RHS, bool Sequential=false)
A version of PriorityWorklist that selects small size optimized data structures for the vector and ma...
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.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:257
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
Value * get() const
Definition Use.h:55
const Use & getOperandUse(unsigned i) const
Definition User.h:220
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:255
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
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
bool match(Val *V, const Pattern &P)
auto m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
auto m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool simplifyLoop(Loop *L, DominatorTree *DT, LoopInfo *LI, ScalarEvolution *SE, AssumptionCache *AC, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)
Simplify each loop in a loop nest recursively.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
@ Offset
Definition DWP.cpp:578
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
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 formLCSSARecursively(Loop &L, const DominatorTree &DT, const LoopInfo *LI, ScalarEvolution *SE)
Put a loop nest into LCSSA form.
Definition LCSSA.cpp:469
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
LLVM_ABI void InvertBranch(CondBrInst *PBI, IRBuilderBase &Builder)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_TEMPLATE_ABI void appendLoopsToWorklist(RangeT &&, SmallPriorityWorklist< Loop *, 4 > &)
Utility that implements appending of loops onto a worklist given a range.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
LLVM_ABI bool isKnownNegativeInLoop(const SCEV *S, const Loop *L, ScalarEvolution &SE)
Returns true if we can prove that S is defined and always negative in loop L.
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI PreservedAnalyses getLoopPassPreservedAnalyses()
Returns the minimum set of Analyses that all loop passes must preserve.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI bool isKnownNonNegativeInLoop(const SCEV *S, const Loop *L, ScalarEvolution &SE)
Returns true if we can prove that S is defined and always non-negative in loop L.
SCEVUseT< const SCEV * > SCEVUse
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
static LLVM_ABI std::optional< LoopStructure > parseLoopStructure(SCEVExpander &Expander, Loop &L, bool AllowUnsignedLatchCond, const char *&FailureReason)
Parse L and use Expander to materialize values needed by the parsed structure.
IntegerType * ExitCountTy