LLVM 20.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"
88#include <algorithm>
89#include <cassert>
90#include <optional>
91#include <utility>
92
93using namespace llvm;
94using namespace llvm::PatternMatch;
95
96static cl::opt<unsigned> LoopSizeCutoff("irce-loop-size-cutoff", cl::Hidden,
97 cl::init(64));
98
99static cl::opt<bool> PrintChangedLoops("irce-print-changed-loops", cl::Hidden,
100 cl::init(false));
101
102static cl::opt<bool> PrintRangeChecks("irce-print-range-checks", cl::Hidden,
103 cl::init(false));
104
105static cl::opt<bool> SkipProfitabilityChecks("irce-skip-profitability-checks",
106 cl::Hidden, cl::init(false));
107
108static cl::opt<unsigned> MinEliminatedChecks("irce-min-eliminated-checks",
109 cl::Hidden, cl::init(10));
110
111static cl::opt<bool> AllowUnsignedLatchCondition("irce-allow-unsigned-latch",
112 cl::Hidden, cl::init(true));
113
115 "irce-allow-narrow-latch", cl::Hidden, cl::init(true),
116 cl::desc("If set to true, IRCE may eliminate wide range checks in loops "
117 "with narrow latch condition."));
118
120 "irce-max-type-size-for-overflow-check", cl::Hidden, cl::init(32),
121 cl::desc(
122 "Maximum size of range check type for which can be produced runtime "
123 "overflow check of its limit's computation"));
124
125static cl::opt<bool>
126 PrintScaledBoundaryRangeChecks("irce-print-scaled-boundary-range-checks",
127 cl::Hidden, cl::init(false));
128
129#define DEBUG_TYPE "irce"
130
131namespace {
132
133/// An inductive range check is conditional branch in a loop with a condition
134/// that is provably true for some contiguous range of values taken by the
135/// containing loop's induction variable.
136///
137class InductiveRangeCheck {
138
139 const SCEV *Begin = nullptr;
140 const SCEV *Step = nullptr;
141 const SCEV *End = nullptr;
142 Use *CheckUse = nullptr;
143
144 static bool parseRangeCheckICmp(Loop *L, ICmpInst *ICI, ScalarEvolution &SE,
145 const SCEVAddRecExpr *&Index,
146 const SCEV *&End);
147
148 static void
149 extractRangeChecksFromCond(Loop *L, ScalarEvolution &SE, Use &ConditionUse,
151 SmallPtrSetImpl<Value *> &Visited);
152
153 static bool parseIvAgaisntLimit(Loop *L, Value *LHS, Value *RHS,
155 const SCEVAddRecExpr *&Index,
156 const SCEV *&End);
157
158 static bool reassociateSubLHS(Loop *L, Value *VariantLHS, Value *InvariantRHS,
160 const SCEVAddRecExpr *&Index, const SCEV *&End);
161
162public:
163 const SCEV *getBegin() const { return Begin; }
164 const SCEV *getStep() const { return Step; }
165 const SCEV *getEnd() const { return End; }
166
167 void print(raw_ostream &OS) const {
168 OS << "InductiveRangeCheck:\n";
169 OS << " Begin: ";
170 Begin->print(OS);
171 OS << " Step: ";
172 Step->print(OS);
173 OS << " End: ";
174 End->print(OS);
175 OS << "\n CheckUse: ";
176 getCheckUse()->getUser()->print(OS);
177 OS << " Operand: " << getCheckUse()->getOperandNo() << "\n";
178 }
179
181 void dump() {
182 print(dbgs());
183 }
184
185 Use *getCheckUse() const { return CheckUse; }
186
187 /// Represents an signed integer range [Range.getBegin(), Range.getEnd()). If
188 /// R.getEnd() le R.getBegin(), then R denotes the empty range.
189
190 class Range {
191 const SCEV *Begin;
192 const SCEV *End;
193
194 public:
195 Range(const SCEV *Begin, const SCEV *End) : Begin(Begin), End(End) {
196 assert(Begin->getType() == End->getType() && "ill-typed range!");
197 }
198
199 Type *getType() const { return Begin->getType(); }
200 const SCEV *getBegin() const { return Begin; }
201 const SCEV *getEnd() const { return End; }
202 bool isEmpty(ScalarEvolution &SE, bool IsSigned) const {
203 if (Begin == End)
204 return true;
205 if (IsSigned)
206 return SE.isKnownPredicate(ICmpInst::ICMP_SGE, Begin, End);
207 else
208 return SE.isKnownPredicate(ICmpInst::ICMP_UGE, Begin, End);
209 }
210 };
211
212 /// This is the value the condition of the branch needs to evaluate to for the
213 /// branch to take the hot successor (see (1) above).
214 bool getPassingDirection() { return true; }
215
216 /// Computes a range for the induction variable (IndVar) in which the range
217 /// check is redundant and can be constant-folded away. The induction
218 /// variable is not required to be the canonical {0,+,1} induction variable.
219 std::optional<Range> computeSafeIterationSpace(ScalarEvolution &SE,
220 const SCEVAddRecExpr *IndVar,
221 bool IsLatchSigned) const;
222
223 /// Parse out a set of inductive range checks from \p BI and append them to \p
224 /// Checks.
225 ///
226 /// NB! There may be conditions feeding into \p BI that aren't inductive range
227 /// checks, and hence don't end up in \p Checks.
228 static void extractRangeChecksFromBranch(
230 std::optional<uint64_t> EstimatedTripCount,
231 SmallVectorImpl<InductiveRangeCheck> &Checks, bool &Changed);
232};
233
234class InductiveRangeCheckElimination {
235 ScalarEvolution &SE;
237 DominatorTree &DT;
238 LoopInfo &LI;
239
240 using GetBFIFunc =
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 = std::nullopt)
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,
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)(const SCEV *, const SCEV *,
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),
452 SE.getSignExtendExpr(RHS, WideTy), SCEV::FlagAnyWrap,
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,
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(
521 std::optional<uint64_t> EstimatedTripCount,
522 SmallVectorImpl<InductiveRangeCheck> &Checks, bool &Changed) {
523 if (BI->isUnconditional() || 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
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();
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<BranchInst>(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 (BranchInst *TBI = dyn_cast<BranchInst>(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 std::optional<LoopStructure> MaybeLoopStructure =
1039 FailureReason);
1040 if (!MaybeLoopStructure) {
1041 LLVM_DEBUG(dbgs() << "irce: could not parse loop structure: "
1042 << FailureReason << "\n";);
1043 return Changed;
1044 }
1045 LoopStructure LS = *MaybeLoopStructure;
1046 const SCEVAddRecExpr *IndVar =
1047 cast<SCEVAddRecExpr>(SE.getMinusSCEV(SE.getSCEV(LS.IndVarBase), SE.getSCEV(LS.IndVarStep)));
1048
1049 std::optional<InductiveRangeCheck::Range> SafeIterRange;
1050
1051 SmallVector<InductiveRangeCheck, 4> RangeChecksToEliminate;
1052 // Basing on the type of latch predicate, we interpret the IV iteration range
1053 // as signed or unsigned range. We use different min/max functions (signed or
1054 // unsigned) when intersecting this range with safe iteration ranges implied
1055 // by range checks.
1056 auto IntersectRange =
1057 LS.IsSignedPredicate ? IntersectSignedRange : IntersectUnsignedRange;
1058
1059 for (InductiveRangeCheck &IRC : RangeChecks) {
1060 auto Result = IRC.computeSafeIterationSpace(SE, IndVar,
1061 LS.IsSignedPredicate);
1062 if (Result) {
1063 auto MaybeSafeIterRange = IntersectRange(SE, SafeIterRange, *Result);
1064 if (MaybeSafeIterRange) {
1065 assert(!MaybeSafeIterRange->isEmpty(SE, LS.IsSignedPredicate) &&
1066 "We should never return empty ranges!");
1067 RangeChecksToEliminate.push_back(IRC);
1068 SafeIterRange = *MaybeSafeIterRange;
1069 }
1070 }
1071 }
1072
1073 if (!SafeIterRange)
1074 return Changed;
1075
1076 std::optional<LoopConstrainer::SubRanges> MaybeSR =
1077 calculateSubRanges(SE, *L, *SafeIterRange, LS);
1078 if (!MaybeSR) {
1079 LLVM_DEBUG(dbgs() << "irce: could not compute subranges\n");
1080 return false;
1081 }
1082
1083 LoopConstrainer LC(*L, LI, LPMAddNewLoop, LS, SE, DT,
1084 SafeIterRange->getBegin()->getType(), *MaybeSR);
1085
1086 if (LC.run()) {
1087 Changed = true;
1088
1089 auto PrintConstrainedLoopInfo = [L]() {
1090 dbgs() << "irce: in function ";
1091 dbgs() << L->getHeader()->getParent()->getName() << ": ";
1092 dbgs() << "constrained ";
1093 L->print(dbgs());
1094 };
1095
1096 LLVM_DEBUG(PrintConstrainedLoopInfo());
1097
1099 PrintConstrainedLoopInfo();
1100
1101 // Optimize away the now-redundant range checks.
1102
1103 for (InductiveRangeCheck &IRC : RangeChecksToEliminate) {
1104 ConstantInt *FoldedRangeCheck = IRC.getPassingDirection()
1105 ? ConstantInt::getTrue(Context)
1106 : ConstantInt::getFalse(Context);
1107 IRC.getCheckUse()->set(FoldedRangeCheck);
1108 }
1109 }
1110
1111 return Changed;
1112}
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)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition: Compiler.h:622
This file contains the declarations for the subclasses of Constant, which represent the different fla...
#define LLVM_DEBUG(...)
Definition: Debug.h:106
bool End
Definition: ELF_riscv.cpp:480
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
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:55
#define R2(n)
This file contains the declarations for metadata subclasses.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
PowerPC Reduce CR logical Operation
This file provides a priority worklist.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
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:78
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition: APInt.h:209
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition: APInt.h:219
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:253
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.
Definition: PassManager.h:410
LLVM Basic Block Representation.
Definition: BasicBlock.h:61
LLVMContext & getContext() const
Get the context in which this basic block lives.
Definition: BasicBlock.cpp:168
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Conditional or Unconditional Branch instruction.
BasicBlock * getSuccessor(unsigned i) const
bool isUnconditional() const
Analysis pass which computes BranchProbabilityInfo.
Analysis providing branch probability information.
BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get an edge's probability, relative to other out-edges of the Src.
void swapSuccEdgesProbabilities(const BasicBlock *Src)
Swap outgoing edges probabilities for Src with branch terminator.
uint64_t scaleByInverse(uint64_t Num) const
Scale a large integer by the inverse.
uint64_t scale(uint64_t Num) const
Scale a large integer.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition: InstrTypes.h:673
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition: InstrTypes.h:825
Predicate getPredicate() const
Return the predicate for this instruction.
Definition: InstrTypes.h:763
This is the shared class of boolean and integer constants.
Definition: Constants.h:83
static ConstantInt * getTrue(LLVMContext &Context)
Definition: Constants.cpp:866
Analysis pass which computes a DominatorTree.
Definition: Dominators.h:279
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition: Dominators.h:162
This instruction compares its operands according to the predicate given to the constructor.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition: IRBuilder.h:2697
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition: Type.cpp:311
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
Definition: DerivedTypes.h:74
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:67
Analysis pass that exposes the LoopInfo for a function.
Definition: LoopInfo.h:566
This class is used to constrain loops to run within a given iteration space.
Represents a single loop in the control flow graph.
Definition: LoopInfo.h:39
A set of analyses that are preserved following a run of a transformation pass.
Definition: Analysis.h:111
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition: Analysis.h:117
void abandon()
Mark an analysis as abandoned.
Definition: Analysis.h:164
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.
const SCEV * getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
bool isAffine() const
Return true if this represents an expression A + B*x where A and B are loop invariant values.
This class represents a constant integer value.
This class represents an analyzed expression in the program.
void print(raw_ostream &OS) const
Print out the internal representation of this scalar to the specified stream.
Type * getType() const
Return the LLVM type of this SCEV expression.
NoWrapFlags
NoWrapFlags are bitfield indices into SubclassData.
Analysis pass that exposes the ScalarEvolution for a function.
The main scalar evolution driver.
const SCEV * getNegativeSCEV(const SCEV *V, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap)
Return the SCEV object corresponding to -V.
const SCEV * getSMaxExpr(const SCEV *LHS, const SCEV *RHS)
const SCEV * getSMinExpr(const SCEV *LHS, const SCEV *RHS)
const SCEV * getUMaxExpr(const SCEV *LHS, const SCEV *RHS)
const SCEV * getZero(Type *Ty)
Return a SCEV for the constant 0 of a specific type.
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)?...
const SCEV * getConstant(ConstantInt *V)
const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
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.
bool isLoopInvariant(const SCEV *S, const Loop *L)
Return true if the value of the given SCEV is unchanging in the specified loop.
bool isKnownPredicate(ICmpInst::Predicate Pred, const SCEV *LHS, const SCEV *RHS)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
const SCEV * getUMinExpr(const SCEV *LHS, const SCEV *RHS, bool Sequential=false)
const SCEV * getTruncateExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
const SCEV * getMinusSCEV(const SCEV *LHS, const SCEV *RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Return LHS-RHS.
const SCEV * getNoopOrZeroExtend(const SCEV *V, Type *Ty)
Return a SCEV corresponding to a conversion of the input value to the specified type.
const SCEV * getSignExtendExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
const SCEV * getMulExpr(SmallVectorImpl< const SCEV * > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Get a canonical multiply expression, or something simpler if possible.
const SCEV * getAddExpr(SmallVectorImpl< const SCEV * > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Get a canonical add expression, or something simpler if possible.
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...
Definition: SmallPtrSet.h:363
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:384
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:519
bool empty() const
Definition: SmallVector.h:81
size_t size() const
Definition: SmallVector.h:78
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:573
void push_back(const T &Elt)
Definition: SmallVector.h:413
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition: Type.h:237
A Use represents the edge between a Value definition and its users.
Definition: Use.h:43
Value * get() const
Definition: Use.h:66
const Use & getOperandUse(unsigned i) const
Definition: User.h:241
Value * getOperand(unsigned i) const
Definition: User.h:228
LLVM Value Representation.
Definition: Value.h:74
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:32
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
bool match(Val *V, const Pattern &P)
Definition: PatternMatch.h:49
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
Definition: PatternMatch.h:92
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)
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:443
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
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:480
bool formLCSSARecursively(Loop &L, const DominatorTree &DT, const LoopInfo *LI, ScalarEvolution *SE)
Put a loop nest into LCSSA form.
Definition: LCSSA.cpp:465
void InvertBranch(BranchInst *PBI, IRBuilderBase &Builder)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
void appendLoopsToWorklist(RangeT &&, SmallPriorityWorklist< Loop *, 4 > &)
Utility that implements appending of loops onto a worklist given a range.
Definition: LoopUtils.cpp:1814
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.
Definition: LoopUtils.cpp:1388
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:217
PreservedAnalyses getLoopPassPreservedAnalyses()
Returns the minimum set of Analyses that all loop passes must preserve.
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.
Definition: LoopUtils.cpp:1395
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:860
IntegerType * ExitCountTy
static std::optional< LoopStructure > parseLoopStructure(ScalarEvolution &, Loop &, bool, const char *&)