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 "ScalarOptions.h"
47#include "llvm/ADT/APInt.h"
48#include "llvm/ADT/ArrayRef.h"
52#include "llvm/ADT/StringRef.h"
53#include "llvm/ADT/Twine.h"
61#include "llvm/IR/BasicBlock.h"
62#include "llvm/IR/CFG.h"
63#include "llvm/IR/Constants.h"
65#include "llvm/IR/Dominators.h"
66#include "llvm/IR/Function.h"
67#include "llvm/IR/IRBuilder.h"
68#include "llvm/IR/InstrTypes.h"
70#include "llvm/IR/Metadata.h"
71#include "llvm/IR/Module.h"
73#include "llvm/IR/Type.h"
74#include "llvm/IR/Use.h"
75#include "llvm/IR/User.h"
76#include "llvm/IR/Value.h"
80#include "llvm/Support/Debug.h"
90#include <algorithm>
91#include <cassert>
92#include <optional>
93#include <utility>
94
95using namespace llvm;
96using namespace llvm::PatternMatch;
97
98#define DEBUG_TYPE "irce"
99
100namespace {
101
102/// An inductive range check is conditional branch in a loop with a condition
103/// that is provably true for some contiguous range of values taken by the
104/// containing loop's induction variable.
105///
106class InductiveRangeCheck {
107
108 const SCEV *Begin = nullptr;
109 const SCEV *Step = nullptr;
110 const SCEV *End = nullptr;
111 Use *CheckUse = nullptr;
112
113 friend class InductiveRangeCheckElimination;
114
115 static bool parseIvAgaisntLimit(Loop *L, Value *LHS, Value *RHS,
117 const SCEVAddRecExpr *&Index,
118 const SCEV *&End);
119
120public:
121 const SCEV *getBegin() const { return Begin; }
122 const SCEV *getStep() const { return Step; }
123 const SCEV *getEnd() const { return End; }
124
125 void print(raw_ostream &OS) const {
126 OS << "InductiveRangeCheck:\n";
127 OS << " Begin: ";
128 Begin->print(OS);
129 OS << " Step: ";
130 Step->print(OS);
131 OS << " End: ";
132 End->print(OS);
133 OS << "\n CheckUse: ";
134 getCheckUse()->getUser()->print(OS);
135 OS << " Operand: " << getCheckUse()->getOperandNo() << "\n";
136 }
137
139 void dump() {
140 print(dbgs());
141 }
142
143 Use *getCheckUse() const { return CheckUse; }
144
145 /// Represents an signed integer range [Range.getBegin(), Range.getEnd()). If
146 /// R.getEnd() le R.getBegin(), then R denotes the empty range.
147
148 class Range {
149 const SCEV *Begin;
150 const SCEV *End;
151
152 public:
153 Range(const SCEV *Begin, const SCEV *End) : Begin(Begin), End(End) {
154 assert(Begin->getType() == End->getType() && "ill-typed range!");
155 }
156
157 Type *getType() const { return Begin->getType(); }
158 const SCEV *getBegin() const { return Begin; }
159 const SCEV *getEnd() const { return End; }
160 bool isEmpty(ScalarEvolution &SE, bool IsSigned) const {
161 if (Begin == End)
162 return true;
163 if (IsSigned)
164 return SE.isKnownPredicate(ICmpInst::ICMP_SGE, Begin, End);
165 else
166 return SE.isKnownPredicate(ICmpInst::ICMP_UGE, Begin, End);
167 }
168 };
169
170 /// This is the value the condition of the branch needs to evaluate to for the
171 /// branch to take the hot successor (see (1) above).
172 bool getPassingDirection() { return true; }
173
174 /// Computes a range for the induction variable (IndVar) in which the range
175 /// check is redundant and can be constant-folded away. The induction
176 /// variable is not required to be the canonical {0,+,1} induction variable.
177 std::optional<Range>
178 computeSafeIterationSpace(ScalarEvolution &SE, const SCEVAddRecExpr *IndVar,
179 bool IsLatchSigned,
180 const ScalarOptions &Opts) const;
181};
182
183class InductiveRangeCheckElimination {
184 const ScalarOptions &Opts;
185 ScalarEvolution &SE;
187 DominatorTree &DT;
188 LoopInfo &LI;
189
190 using GetBFIFunc = llvm::function_ref<llvm::BlockFrequencyInfo &()>;
191 GetBFIFunc GetBFI;
192
193 // Returns the estimated number of iterations based on block frequency info if
194 // available, or on branch probability info. Nullopt is returned if the number
195 // of iterations cannot be estimated.
196 std::optional<uint64_t> estimatedTripCount(const Loop &L);
197
198 bool parseRangeCheckICmp(Loop *L, ICmpInst *ICI, const SCEVAddRecExpr *&Index,
199 const SCEV *&End);
200
201 void extractRangeChecksFromCond(Loop *L, Use &ConditionUse,
203 SmallPtrSetImpl<Value *> &Visited);
204
205 bool reassociateSubLHS(Loop *L, Value *VariantLHS, Value *InvariantRHS,
206 ICmpInst::Predicate Pred, const SCEVAddRecExpr *&Index,
207 const SCEV *&End);
208
209 /// Parse out a set of inductive range checks from \p BI and append them to \p
210 /// Checks.
211 ///
212 /// NB! There may be conditions feeding into \p BI that aren't inductive range
213 /// checks, and hence don't end up in \p Checks.
214 void extractRangeChecksFromBranch(
215 CondBrInst *BI, Loop *L, std::optional<uint64_t> EstimatedTripCount,
217
218public:
219 InductiveRangeCheckElimination(const ScalarOptions &Opts, ScalarEvolution &SE,
221 LoopInfo &LI, GetBFIFunc GetBFI = nullptr)
222 : Opts(Opts), SE(SE), BPI(BPI), DT(DT), LI(LI), GetBFI(GetBFI) {}
223
224 bool run(Loop *L, function_ref<void(Loop *, bool)> LPMAddNewLoop);
225};
226
227} // end anonymous namespace
228
229/// Parse a single ICmp instruction, `ICI`, into a range check. If `ICI` cannot
230/// be interpreted as a range check, return false. Otherwise set `Index` to the
231/// SCEV being range checked, and set `End` to the upper or lower limit `Index`
232/// is being range checked.
233bool InductiveRangeCheckElimination::parseRangeCheckICmp(
234 Loop *L, ICmpInst *ICI, const SCEVAddRecExpr *&Index, const SCEV *&End) {
235 auto IsLoopInvariant = [this, L](Value *V) {
236 return SE.isLoopInvariant(SE.getSCEV(V), L);
237 };
238
239 ICmpInst::Predicate Pred = ICI->getPredicate();
240 Value *LHS = ICI->getOperand(0);
241 Value *RHS = ICI->getOperand(1);
242
243 if (!LHS->getType()->isIntegerTy())
244 return false;
245
246 // Canonicalize to the `Index Pred Invariant` comparison
247 if (IsLoopInvariant(LHS)) {
248 std::swap(LHS, RHS);
249 Pred = CmpInst::getSwappedPredicate(Pred);
250 } else if (!IsLoopInvariant(RHS))
251 // Both LHS and RHS are loop variant
252 return false;
253
254 if (InductiveRangeCheck::parseIvAgaisntLimit(L, LHS, RHS, Pred, SE, Index,
255 End))
256 return true;
257
258 if (reassociateSubLHS(L, LHS, RHS, Pred, Index, End))
259 return true;
260
261 // TODO: support ReassociateAddLHS
262 return false;
263}
264
265// Try to parse range check in the form of "IV vs Limit"
266bool InductiveRangeCheck::parseIvAgaisntLimit(Loop *L, Value *LHS, Value *RHS,
267 ICmpInst::Predicate Pred,
268 ScalarEvolution &SE,
269 const SCEVAddRecExpr *&Index,
270 const SCEV *&End) {
271
272 auto SIntMaxSCEV = [&](Type *T) {
273 unsigned BitWidth = cast<IntegerType>(T)->getBitWidth();
275 };
276
277 const auto *AddRec = dyn_cast<SCEVAddRecExpr>(SE.getSCEV(LHS));
278 if (!AddRec)
279 return false;
280
281 // We strengthen "0 <= I" to "0 <= I < INT_SMAX" and "I < L" to "0 <= I < L".
282 // We can potentially do much better here.
283 // If we want to adjust upper bound for the unsigned range check as we do it
284 // for signed one, we will need to pick Unsigned max
285 switch (Pred) {
286 default:
287 return false;
288
289 case ICmpInst::ICMP_SGE:
290 if (match(RHS, m_ConstantInt<0>())) {
291 Index = AddRec;
292 End = SIntMaxSCEV(Index->getType());
293 return true;
294 }
295 return false;
296
297 case ICmpInst::ICMP_SGT:
298 if (match(RHS, m_ConstantInt<-1>())) {
299 Index = AddRec;
300 End = SIntMaxSCEV(Index->getType());
301 return true;
302 }
303 return false;
304
305 case ICmpInst::ICMP_SLT:
306 case ICmpInst::ICMP_ULT:
307 Index = AddRec;
308 End = SE.getSCEV(RHS);
309 return true;
310
311 case ICmpInst::ICMP_SLE:
312 case ICmpInst::ICMP_ULE:
313 const SCEV *One = SE.getOne(RHS->getType());
314 const SCEV *RHSS = SE.getSCEV(RHS);
315 bool Signed = Pred == ICmpInst::ICMP_SLE;
316 if (SE.willNotOverflow(Instruction::BinaryOps::Add, Signed, RHSS, One)) {
317 Index = AddRec;
318 End = SE.getAddExpr(RHSS, One);
319 return true;
320 }
321 return false;
322 }
323
324 llvm_unreachable("default clause returns!");
325}
326
327// Try to parse range check in the form of "IV - Offset vs Limit" or "Offset -
328// IV vs Limit"
329bool InductiveRangeCheckElimination::reassociateSubLHS(
330 Loop *L, Value *VariantLHS, Value *InvariantRHS, ICmpInst::Predicate Pred,
331 const SCEVAddRecExpr *&Index, const SCEV *&End) {
332 Value *LHS, *RHS;
333 if (!match(VariantLHS, m_Sub(m_Value(LHS), m_Value(RHS))))
334 return false;
335
336 const SCEV *IV = SE.getSCEV(LHS);
337 const SCEV *Offset = SE.getSCEV(RHS);
338 const SCEV *Limit = SE.getSCEV(InvariantRHS);
339
340 bool OffsetSubtracted = false;
341 if (SE.isLoopInvariant(IV, L))
342 // "Offset - IV vs Limit"
344 else if (SE.isLoopInvariant(Offset, L))
345 // "IV - Offset vs Limit"
346 OffsetSubtracted = true;
347 else
348 return false;
349
350 const auto *AddRec = dyn_cast<SCEVAddRecExpr>(IV);
351 if (!AddRec)
352 return false;
353
354 // In order to turn "IV - Offset < Limit" into "IV < Limit + Offset", we need
355 // to be able to freely move values from left side of inequality to right side
356 // (just as in normal linear arithmetics). Overflows make things much more
357 // complicated, so we want to avoid this.
358 //
359 // Let's prove that the initial subtraction doesn't overflow with all IV's
360 // values from the safe range constructed for that check.
361 //
362 // [Case 1] IV - Offset < Limit
363 // It doesn't overflow if:
364 // SINT_MIN <= IV - Offset <= SINT_MAX
365 // In terms of scaled SINT we need to prove:
366 // SINT_MIN + Offset <= IV <= SINT_MAX + Offset
367 // Safe range will be constructed:
368 // 0 <= IV < Limit + Offset
369 // It means that 'IV - Offset' doesn't underflow, because:
370 // SINT_MIN + Offset < 0 <= IV
371 // and doesn't overflow:
372 // IV < Limit + Offset <= SINT_MAX + Offset
373 //
374 // [Case 2] Offset - IV > Limit
375 // It doesn't overflow if:
376 // SINT_MIN <= Offset - IV <= SINT_MAX
377 // In terms of scaled SINT we need to prove:
378 // -SINT_MIN >= IV - Offset >= -SINT_MAX
379 // Offset - SINT_MIN >= IV >= Offset - SINT_MAX
380 // Safe range will be constructed:
381 // 0 <= IV < Offset - Limit
382 // It means that 'Offset - IV' doesn't underflow, because
383 // Offset - SINT_MAX < 0 <= IV
384 // and doesn't overflow:
385 // IV < Offset - Limit <= Offset - SINT_MIN
386 //
387 // For the computed upper boundary of the IV's range (Offset +/- Limit) we
388 // don't know exactly whether it overflows or not. So if we can't prove this
389 // fact at compile time, we scale boundary computations to a wider type with
390 // the intention to add runtime overflow check.
391
392 auto getExprScaledIfOverflow = [&](Instruction::BinaryOps BinOp,
393 const SCEV *LHS,
394 const SCEV *RHS) -> const SCEV * {
395 auto Operation = [this, BinOp](SCEVUse L, SCEVUse R) -> const SCEV * {
396 switch (BinOp) {
397 default:
398 llvm_unreachable("Unsupported binary op");
399 case Instruction::Add:
400 return SE.getAddExpr(L, R);
401 case Instruction::Sub:
402 return SE.getMinusSCEV(L, R);
403 }
404 };
405
406 if (SE.willNotOverflow(BinOp, ICmpInst::isSigned(Pred), LHS, RHS,
407 cast<Instruction>(VariantLHS)))
408 return Operation(LHS, RHS);
409
410 // We couldn't prove that the expression does not overflow.
411 // Than scale it to a wider type to check overflow at runtime.
412 auto *Ty = cast<IntegerType>(LHS->getType());
413 if (Ty->getBitWidth() > Opts.irce_max_type_size_for_overflow_check)
414 return nullptr;
415
416 auto WideTy = IntegerType::get(Ty->getContext(), Ty->getBitWidth() * 2);
417 return Operation(SE.getSignExtendExpr(LHS, WideTy),
418 SE.getSignExtendExpr(RHS, WideTy));
419 };
420
421 if (OffsetSubtracted)
422 // "IV - Offset < Limit" -> "IV" < Offset + Limit
423 Limit = getExprScaledIfOverflow(Instruction::BinaryOps::Add, Offset, Limit);
424 else {
425 // "Offset - IV > Limit" -> "IV" < Offset - Limit
426 Limit = getExprScaledIfOverflow(Instruction::BinaryOps::Sub, Offset, Limit);
427 Pred = ICmpInst::getSwappedPredicate(Pred);
428 }
429
430 if (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SLE) {
431 // "Expr <= Limit" -> "Expr < Limit + 1"
432 if (Pred == ICmpInst::ICMP_SLE && Limit)
433 Limit = getExprScaledIfOverflow(Instruction::BinaryOps::Add, Limit,
434 SE.getOne(Limit->getType()));
435 if (Limit) {
436 Index = AddRec;
437 End = Limit;
438 return true;
439 }
440 }
441 return false;
442}
443
444void InductiveRangeCheckElimination::extractRangeChecksFromCond(
445 Loop *L, Use &ConditionUse, SmallVectorImpl<InductiveRangeCheck> &Checks,
446 SmallPtrSetImpl<Value *> &Visited) {
447 Value *Condition = ConditionUse.get();
448 if (!Visited.insert(Condition).second)
449 return;
450
451 // TODO: Do the same for OR, XOR, NOT etc?
452 if (match(Condition, m_LogicalAnd(m_Value(), m_Value()))) {
453 extractRangeChecksFromCond(L, cast<User>(Condition)->getOperandUse(0),
454 Checks, Visited);
455 extractRangeChecksFromCond(L, cast<User>(Condition)->getOperandUse(1),
456 Checks, Visited);
457 return;
458 }
459
460 ICmpInst *ICI = dyn_cast<ICmpInst>(Condition);
461 if (!ICI)
462 return;
463
464 const SCEV *End = nullptr;
465 const SCEVAddRecExpr *IndexAddRec = nullptr;
466 if (!parseRangeCheckICmp(L, ICI, IndexAddRec, End))
467 return;
468
469 assert(IndexAddRec && "IndexAddRec was not computed");
470 assert(End && "End was not computed");
471
472 if ((IndexAddRec->getLoop() != L) || !IndexAddRec->isAffine())
473 return;
474
475 InductiveRangeCheck IRC;
476 IRC.End = End;
477 IRC.Begin = IndexAddRec->getStart();
478 IRC.Step = IndexAddRec->getStepRecurrence(SE);
479 IRC.CheckUse = &ConditionUse;
480 Checks.push_back(IRC);
481}
482
483void InductiveRangeCheckElimination::extractRangeChecksFromBranch(
484 CondBrInst *BI, Loop *L, std::optional<uint64_t> EstimatedTripCount,
485 SmallVectorImpl<InductiveRangeCheck> &Checks, bool &Changed) {
486 if (BI->getParent() == L->getLoopLatch())
487 return;
488
489 unsigned IndexLoopSucc = L->contains(BI->getSuccessor(0)) ? 0 : 1;
490 assert(L->contains(BI->getSuccessor(IndexLoopSucc)) &&
491 "No edges coming to loop?");
492
493 if (!Opts.irce_skip_profitability_checks && BPI) {
494 auto SuccessProbability =
495 BPI->getEdgeProbability(BI->getParent(), IndexLoopSucc);
496 if (EstimatedTripCount) {
497 auto EstimatedEliminatedChecks =
498 SuccessProbability.scale(*EstimatedTripCount);
499 if (EstimatedEliminatedChecks < Opts.irce_min_eliminated_checks) {
500 LLVM_DEBUG(dbgs() << "irce: could not prove profitability for branch "
501 << *BI << ": "
502 << "estimated eliminated checks too low "
503 << EstimatedEliminatedChecks << "\n";);
504 return;
505 }
506 } else {
507 BranchProbability LikelyTaken(15, 16);
508 if (SuccessProbability < LikelyTaken) {
509 LLVM_DEBUG(dbgs() << "irce: could not prove profitability for branch "
510 << *BI << ": "
511 << "could not estimate trip count "
512 << "and branch success probability too low "
513 << SuccessProbability << "\n";);
514 return;
515 }
516 }
517 }
518
519 // IRCE expects branch's true edge comes to loop. Invert branch for opposite
520 // case.
521 if (IndexLoopSucc != 0) {
522 IRBuilder<> Builder(BI);
523 InvertBranch(BI, Builder);
524 if (BPI)
526 Changed = true;
527 }
528
529 SmallPtrSet<Value *, 8> Visited;
530 extractRangeChecksFromCond(L, BI->getOperandUse(0), Checks, Visited);
531}
532
533/// If the type of \p S matches with \p Ty, return \p S. Otherwise, return
534/// signed or unsigned extension of \p S to type \p Ty.
535static const SCEV *NoopOrExtend(const SCEV *S, Type *Ty, ScalarEvolution &SE,
536 bool Signed) {
537 return Signed ? SE.getNoopOrSignExtend(S, Ty) : SE.getNoopOrZeroExtend(S, Ty);
538}
539
540// Compute a safe set of limits for the main loop to run in -- effectively the
541// intersection of `Range' and the iteration space of the original loop.
542// Return std::nullopt if unable to compute the set of subranges.
543static std::optional<LoopConstrainer::SubRanges>
544calculateSubRanges(const ScalarOptions &Opts, ScalarEvolution &SE,
545 const Loop &L, InductiveRangeCheck::Range &Range,
546 const LoopStructure &MainLoopStructure) {
547 auto *RTy = cast<IntegerType>(Range.getType());
548 // We only support wide range checks and narrow latches.
549 if (!Opts.irce_allow_narrow_latch && RTy != MainLoopStructure.ExitCountTy)
550 return std::nullopt;
551 if (RTy->getBitWidth() < MainLoopStructure.ExitCountTy->getBitWidth())
552 return std::nullopt;
553
555
556 bool IsSignedPredicate = MainLoopStructure.IsSignedPredicate;
557 // I think we can be more aggressive here and make this nuw / nsw if the
558 // addition that feeds into the icmp for the latch's terminating branch is nuw
559 // / nsw. In any case, a wrapping 2's complement addition is safe.
560 const SCEV *Start = NoopOrExtend(SE.getSCEV(MainLoopStructure.IndVarStart),
561 RTy, SE, IsSignedPredicate);
562 const SCEV *End = NoopOrExtend(SE.getSCEV(MainLoopStructure.LoopExitAt), RTy,
563 SE, IsSignedPredicate);
564
565 bool Increasing = MainLoopStructure.IndVarIncreasing;
566
567 // We compute `Smallest` and `Greatest` such that [Smallest, Greatest), or
568 // [Smallest, GreatestSeen] is the range of values the induction variable
569 // takes.
570
571 const SCEV *Smallest = nullptr, *Greatest = nullptr, *GreatestSeen = nullptr;
572
573 const SCEV *One = SE.getOne(RTy);
574 if (Increasing) {
575 Smallest = Start;
576 Greatest = End;
577 // No overflow, because the range [Smallest, GreatestSeen] is not empty.
578 GreatestSeen = SE.getMinusSCEV(End, One);
579 } else {
580 // These two computations may sign-overflow. Here is why that is okay:
581 //
582 // We know that the induction variable does not sign-overflow on any
583 // iteration except the last one, and it starts at `Start` and ends at
584 // `End`, decrementing by one every time.
585 //
586 // * if `Smallest` sign-overflows we know `End` is `INT_SMAX`. Since the
587 // induction variable is decreasing we know that the smallest value
588 // the loop body is actually executed with is `INT_SMIN` == `Smallest`.
589 //
590 // * if `Greatest` sign-overflows, we know it can only be `INT_SMIN`. In
591 // that case, `Clamp` will always return `Smallest` and
592 // [`Result.LowLimit`, `Result.HighLimit`) = [`Smallest`, `Smallest`)
593 // will be an empty range. Returning an empty range is always safe.
594
595 Smallest = SE.getAddExpr(End, One);
596 Greatest = SE.getAddExpr(Start, One);
597 GreatestSeen = Start;
598 }
599
600 auto Clamp = [&SE, Smallest, Greatest, IsSignedPredicate](const SCEV *S) {
601 return IsSignedPredicate
602 ? SE.getSMaxExpr(Smallest, SE.getSMinExpr(Greatest, S))
603 : SE.getUMaxExpr(Smallest, SE.getUMinExpr(Greatest, S));
604 };
605
606 // In some cases we can prove that we don't need a pre or post loop.
607 ICmpInst::Predicate PredLE =
608 IsSignedPredicate ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE;
609 ICmpInst::Predicate PredLT =
610 IsSignedPredicate ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
611
612 bool ProvablyNoPreloop =
613 SE.isKnownPredicate(PredLE, Range.getBegin(), Smallest);
614 if (!ProvablyNoPreloop)
615 Result.LowLimit = Clamp(Range.getBegin());
616
617 bool ProvablyNoPostLoop =
618 SE.isKnownPredicate(PredLT, GreatestSeen, Range.getEnd());
619 if (!ProvablyNoPostLoop)
620 Result.HighLimit = Clamp(Range.getEnd());
621
622 return Result;
623}
624
625/// Computes and returns a range of values for the induction variable (IndVar)
626/// in which the range check can be safely elided. If it cannot compute such a
627/// range, returns std::nullopt.
628std::optional<InductiveRangeCheck::Range>
629InductiveRangeCheck::computeSafeIterationSpace(
630 ScalarEvolution &SE, const SCEVAddRecExpr *IndVar, bool IsLatchSigned,
631 const ScalarOptions &Opts) const {
632 // We can deal when types of latch check and range checks don't match in case
633 // if latch check is more narrow.
634 auto *IVType = dyn_cast<IntegerType>(IndVar->getType());
635 auto *RCType = dyn_cast<IntegerType>(getBegin()->getType());
636 auto *EndType = dyn_cast<IntegerType>(getEnd()->getType());
637 // Do not work with pointer types.
638 if (!IVType || !RCType)
639 return std::nullopt;
640 if (IVType->getBitWidth() > RCType->getBitWidth())
641 return std::nullopt;
642
643 // IndVar is of the form "A + B * I" (where "I" is the canonical induction
644 // variable, that may or may not exist as a real llvm::Value in the loop) and
645 // this inductive range check is a range check on the "C + D * I" ("C" is
646 // getBegin() and "D" is getStep()). We rewrite the value being range
647 // checked to "M + N * IndVar" where "N" = "D * B^(-1)" and "M" = "C - NA".
648 //
649 // The actual inequalities we solve are of the form
650 //
651 // 0 <= M + 1 * IndVar < L given L >= 0 (i.e. N == 1)
652 //
653 // Here L stands for upper limit of the safe iteration space.
654 // The inequality is satisfied by (0 - M) <= IndVar < (L - M). To avoid
655 // overflows when calculating (0 - M) and (L - M) we, depending on type of
656 // IV's iteration space, limit the calculations by borders of the iteration
657 // space. For example, if IndVar is unsigned, (0 - M) overflows for any M > 0.
658 // If we figured out that "anything greater than (-M) is safe", we strengthen
659 // this to "everything greater than 0 is safe", assuming that values between
660 // -M and 0 just do not exist in unsigned iteration space, and we don't want
661 // to deal with overflown values.
662
663 if (!IndVar->isAffine())
664 return std::nullopt;
665
666 const SCEV *A = NoopOrExtend(IndVar->getStart(), RCType, SE, IsLatchSigned);
667 const SCEVConstant *B = dyn_cast<SCEVConstant>(
668 NoopOrExtend(IndVar->getStepRecurrence(SE), RCType, SE, IsLatchSigned));
669 if (!B)
670 return std::nullopt;
671 assert(!B->isZero() && "Recurrence with zero step?");
672
673 const SCEV *C = getBegin();
674 const SCEVConstant *D = dyn_cast<SCEVConstant>(getStep());
675 if (D != B)
676 return std::nullopt;
677
678 assert(!D->getValue()->isZero() && "Recurrence with zero step?");
679 unsigned BitWidth = RCType->getBitWidth();
680 const SCEV *SIntMax = SE.getConstant(APInt::getSignedMaxValue(BitWidth));
681 const SCEV *SIntMin = SE.getConstant(APInt::getSignedMinValue(BitWidth));
682
683 // Subtract Y from X so that it does not go through border of the IV
684 // iteration space. Mathematically, it is equivalent to:
685 //
686 // ClampedSubtract(X, Y) = min(max(X - Y, INT_MIN), INT_MAX). [1]
687 //
688 // In [1], 'X - Y' is a mathematical subtraction (result is not bounded to
689 // any width of bit grid). But after we take min/max, the result is
690 // guaranteed to be within [INT_MIN, INT_MAX].
691 //
692 // In [1], INT_MAX and INT_MIN are respectively signed and unsigned max/min
693 // values, depending on type of latch condition that defines IV iteration
694 // space.
695 auto ClampedSubtract = [&](const SCEV *X, const SCEV *Y) {
696 // FIXME: The current implementation assumes that X is in [0, SINT_MAX].
697 // This is required to ensure that SINT_MAX - X does not overflow signed and
698 // that X - Y does not overflow unsigned if Y is negative. Can we lift this
699 // restriction and make it work for negative X either?
700 if (IsLatchSigned) {
701 // X is a number from signed range, Y is interpreted as signed.
702 // Even if Y is SINT_MAX, (X - Y) does not reach SINT_MIN. So the only
703 // thing we should care about is that we didn't cross SINT_MAX.
704 // So, if Y is positive, we subtract Y safely.
705 // Rule 1: Y > 0 ---> Y.
706 // If 0 <= -Y <= (SINT_MAX - X), we subtract Y safely.
707 // Rule 2: Y >=s (X - SINT_MAX) ---> Y.
708 // If 0 <= (SINT_MAX - X) < -Y, we can only subtract (X - SINT_MAX).
709 // Rule 3: Y <s (X - SINT_MAX) ---> (X - SINT_MAX).
710 // It gives us smax(Y, X - SINT_MAX) to subtract in all cases.
711 const SCEV *XMinusSIntMax = SE.getMinusSCEV(X, SIntMax);
712 return SE.getMinusSCEV(X, SE.getSMaxExpr(Y, XMinusSIntMax),
714 } else
715 // X is a number from unsigned range, Y is interpreted as signed.
716 // Even if Y is SINT_MIN, (X - Y) does not reach UINT_MAX. So the only
717 // thing we should care about is that we didn't cross zero.
718 // So, if Y is negative, we subtract Y safely.
719 // Rule 1: Y <s 0 ---> Y.
720 // If 0 <= Y <= X, we subtract Y safely.
721 // Rule 2: Y <=s X ---> Y.
722 // If 0 <= X < Y, we should stop at 0 and can only subtract X.
723 // Rule 3: Y >s X ---> X.
724 // It gives us smin(X, Y) to subtract in all cases.
725 return SE.getMinusSCEV(X, SE.getSMinExpr(X, Y), SCEV::FlagNUW);
726 };
727 const SCEV *M = SE.getMinusSCEV(C, A);
728 const SCEV *Zero = SE.getZero(M->getType());
729
730 // This function returns SCEV equal to 1 if X is non-negative 0 otherwise.
731 auto SCEVCheckNonNegative = [&](const SCEV *X) -> const SCEV * {
732 const Loop *L = IndVar->getLoop();
733 const SCEV *Zero = SE.getZero(X->getType());
734 const SCEV *One = SE.getOne(X->getType());
735 // Can we trivially prove that X is a non-negative or negative value?
736 if (isKnownNonNegativeInLoop(X, L, SE))
737 return One;
738 else if (isKnownNegativeInLoop(X, L, SE))
739 return Zero;
740 // If not, we will have to figure it out during the execution.
741 // Function smax(smin(X, 0), -1) + 1 equals to 1 if X >= 0 and 0 if X < 0.
742 const SCEV *NegOne = SE.getNegativeSCEV(One);
743 return SE.getAddExpr(SE.getSMaxExpr(SE.getSMinExpr(X, Zero), NegOne), One);
744 };
745
746 // This function returns SCEV equal to 1 if X will not overflow in terms of
747 // range check type, 0 otherwise.
748 auto SCEVCheckWillNotOverflow = [&](const SCEV *X) {
749 // X doesn't overflow if SINT_MAX >= X.
750 // Then if (SINT_MAX - X) >= 0, X doesn't overflow
751 const SCEV *SIntMaxExt = SE.getSignExtendExpr(SIntMax, X->getType());
752 const SCEV *OverflowCheck =
753 SCEVCheckNonNegative(SE.getMinusSCEV(SIntMaxExt, X));
754
755 // X doesn't underflow if X >= SINT_MIN.
756 // Then if (X - SINT_MIN) >= 0, X doesn't underflow
757 const SCEV *SIntMinExt = SE.getSignExtendExpr(SIntMin, X->getType());
758 const SCEV *UnderflowCheck =
759 SCEVCheckNonNegative(SE.getMinusSCEV(X, SIntMinExt));
760
761 return SE.getMulExpr(OverflowCheck, UnderflowCheck);
762 };
763
764 // FIXME: Current implementation of ClampedSubtract implicitly assumes that
765 // X is non-negative (in sense of a signed value). We need to re-implement
766 // this function in a way that it will correctly handle negative X as well.
767 // We use it twice: for X = 0 everything is fine, but for X = getEnd() we can
768 // end up with a negative X and produce wrong results. So currently we ensure
769 // that if getEnd() is negative then both ends of the safe range are zero.
770 // Note that this may pessimize elimination of unsigned range checks against
771 // negative values.
772 const SCEV *REnd = getEnd();
773 const SCEV *EndWillNotOverflow = SE.getOne(RCType);
774
775 auto PrintRangeCheck = [&](raw_ostream &OS) {
776 auto L = IndVar->getLoop();
777 OS << "irce: in function ";
778 OS << L->getHeader()->getParent()->getName();
779 OS << ", in ";
780 L->print(OS);
781 OS << "there is range check with scaled boundary:\n";
782 print(OS);
783 };
784
785 if (EndType->getBitWidth() > RCType->getBitWidth()) {
786 assert(EndType->getBitWidth() == RCType->getBitWidth() * 2);
787 if (Opts.irce_print_scaled_boundary_range_checks)
788 PrintRangeCheck(errs());
789 // End is computed with extended type but will be truncated to a narrow one
790 // type of range check. Therefore we need a check that the result will not
791 // overflow in terms of narrow type.
792 EndWillNotOverflow =
793 SE.getTruncateExpr(SCEVCheckWillNotOverflow(REnd), RCType);
794 REnd = SE.getTruncateExpr(REnd, RCType);
795 }
796
797 const SCEV *RuntimeChecks =
798 SE.getMulExpr(SCEVCheckNonNegative(REnd), EndWillNotOverflow);
799 const SCEV *Begin = SE.getMulExpr(ClampedSubtract(Zero, M), RuntimeChecks);
800 const SCEV *End = SE.getMulExpr(ClampedSubtract(REnd, M), RuntimeChecks);
801
802 return InductiveRangeCheck::Range(Begin, End);
803}
804
805static std::optional<InductiveRangeCheck::Range>
807 const std::optional<InductiveRangeCheck::Range> &R1,
808 const InductiveRangeCheck::Range &R2) {
809 if (R2.isEmpty(SE, /* IsSigned */ true))
810 return std::nullopt;
811 if (!R1)
812 return R2;
813 auto &R1Value = *R1;
814 // We never return empty ranges from this function, and R1 is supposed to be
815 // a result of intersection. Thus, R1 is never empty.
816 assert(!R1Value.isEmpty(SE, /* IsSigned */ true) &&
817 "We should never have empty R1!");
818
819 // TODO: we could widen the smaller range and have this work; but for now we
820 // bail out to keep things simple.
821 if (R1Value.getType() != R2.getType())
822 return std::nullopt;
823
824 const SCEV *NewBegin = SE.getSMaxExpr(R1Value.getBegin(), R2.getBegin());
825 const SCEV *NewEnd = SE.getSMinExpr(R1Value.getEnd(), R2.getEnd());
826
827 // If the resulting range is empty, just return std::nullopt.
828 auto Ret = InductiveRangeCheck::Range(NewBegin, NewEnd);
829 if (Ret.isEmpty(SE, /* IsSigned */ true))
830 return std::nullopt;
831 return Ret;
832}
833
834static std::optional<InductiveRangeCheck::Range>
836 const std::optional<InductiveRangeCheck::Range> &R1,
837 const InductiveRangeCheck::Range &R2) {
838 if (R2.isEmpty(SE, /* IsSigned */ false))
839 return std::nullopt;
840 if (!R1)
841 return R2;
842 auto &R1Value = *R1;
843 // We never return empty ranges from this function, and R1 is supposed to be
844 // a result of intersection. Thus, R1 is never empty.
845 assert(!R1Value.isEmpty(SE, /* IsSigned */ false) &&
846 "We should never have empty R1!");
847
848 // TODO: we could widen the smaller range and have this work; but for now we
849 // bail out to keep things simple.
850 if (R1Value.getType() != R2.getType())
851 return std::nullopt;
852
853 const SCEV *NewBegin = SE.getUMaxExpr(R1Value.getBegin(), R2.getBegin());
854 const SCEV *NewEnd = SE.getUMinExpr(R1Value.getEnd(), R2.getEnd());
855
856 // If the resulting range is empty, just return std::nullopt.
857 auto Ret = InductiveRangeCheck::Range(NewBegin, NewEnd);
858 if (Ret.isEmpty(SE, /* IsSigned */ false))
859 return std::nullopt;
860 return Ret;
861}
862
864 const ScalarOptions &Opts =
865 F.getContext().getLibraryOptions().get<ScalarOptions>();
866 auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
867 LoopInfo &LI = AM.getResult<LoopAnalysis>(F);
868 // There are no loops in the function. Return before computing other expensive
869 // analyses.
870 if (LI.empty())
871 return PreservedAnalyses::all();
872 auto &SE = AM.getResult<ScalarEvolutionAnalysis>(F);
873 auto &BPI = AM.getResult<BranchProbabilityAnalysis>(F);
874
875 // Get BFI analysis result on demand. Please note that modification of
876 // CFG invalidates this analysis and we should handle it.
877 auto getBFI = [&F, &AM ]()->BlockFrequencyInfo & {
879 };
880 InductiveRangeCheckElimination IRCE(Opts, SE, &BPI, DT, LI, {getBFI});
881
882 bool Changed = false;
883 {
884 bool CFGChanged = false;
885 for (const auto &L : LI) {
886 CFGChanged |= simplifyLoop(L, &DT, &LI, &SE, nullptr, nullptr,
887 /*PreserveLCSSA=*/false);
888 Changed |= formLCSSARecursively(*L, DT, &LI, &SE);
889 }
890 Changed |= CFGChanged;
891
892 if (CFGChanged && !Opts.irce_skip_profitability_checks) {
896 AM.invalidate(F, PA);
897 }
898 }
899
901 appendLoopsToWorklist(LI, Worklist);
902 auto LPMAddNewLoop = [&Worklist](Loop *NL, bool IsSubloop) {
903 if (!IsSubloop)
904 appendLoopsToWorklist(*NL, Worklist);
905 };
906
907 while (!Worklist.empty()) {
908 Loop *L = Worklist.pop_back_val();
909 if (IRCE.run(L, LPMAddNewLoop)) {
910 Changed = true;
911 if (!Opts.irce_skip_profitability_checks) {
915 AM.invalidate(F, PA);
916 }
917 }
918 }
919
920 if (!Changed)
921 return PreservedAnalyses::all();
923}
924
925std::optional<uint64_t>
926InductiveRangeCheckElimination::estimatedTripCount(const Loop &L) {
927 if (GetBFI) {
928 BlockFrequencyInfo &BFI = GetBFI();
929 uint64_t hFreq = BFI.getBlockFreq(L.getHeader()).getFrequency();
930 uint64_t phFreq = BFI.getBlockFreq(L.getLoopPreheader()).getFrequency();
931 if (phFreq == 0 || hFreq == 0)
932 return std::nullopt;
933 return {hFreq / phFreq};
934 }
935
936 if (!BPI)
937 return std::nullopt;
938
939 auto *Latch = L.getLoopLatch();
940 if (!Latch)
941 return std::nullopt;
942 auto *LatchBr = dyn_cast<CondBrInst>(Latch->getTerminator());
943 if (!LatchBr)
944 return std::nullopt;
945
946 auto LatchBrExitIdx = LatchBr->getSuccessor(0) == L.getHeader() ? 1 : 0;
947 BranchProbability ExitProbability =
948 BPI->getEdgeProbability(Latch, LatchBrExitIdx);
949 if (ExitProbability.isUnknown() || ExitProbability.isZero())
950 return std::nullopt;
951
952 return {ExitProbability.scaleByInverse(1)};
953}
954
955bool InductiveRangeCheckElimination::run(
956 Loop *L, function_ref<void(Loop *, bool)> LPMAddNewLoop) {
957 if (L->getBlocks().size() >= Opts.irce_loop_size_cutoff) {
958 LLVM_DEBUG(dbgs() << "irce: giving up constraining loop, too large\n");
959 return false;
960 }
961
962 BasicBlock *Preheader = L->getLoopPreheader();
963 if (!Preheader) {
964 LLVM_DEBUG(dbgs() << "irce: loop has no preheader, leaving\n");
965 return false;
966 }
967
968 auto EstimatedTripCount = estimatedTripCount(*L);
969 if (!Opts.irce_skip_profitability_checks && EstimatedTripCount &&
970 *EstimatedTripCount < Opts.irce_min_eliminated_checks) {
971 LLVM_DEBUG(dbgs() << "irce: could not prove profitability: "
972 << "the estimated number of iterations is "
973 << *EstimatedTripCount << "\n");
974 return false;
975 }
976
977 LLVMContext &Context = Preheader->getContext();
979 bool Changed = false;
980
981 for (auto *BBI : L->getBlocks())
982 if (CondBrInst *TBI = dyn_cast<CondBrInst>(BBI->getTerminator()))
983 extractRangeChecksFromBranch(TBI, L, EstimatedTripCount, RangeChecks,
984 Changed);
985
986 if (RangeChecks.empty())
987 return Changed;
988
989 auto PrintRecognizedRangeChecks = [&](raw_ostream &OS) {
990 OS << "irce: looking at loop "; L->print(OS);
991 OS << "irce: loop has " << RangeChecks.size()
992 << " inductive range checks: \n";
993 for (InductiveRangeCheck &IRC : RangeChecks)
994 IRC.print(OS);
995 };
996
997 LLVM_DEBUG(PrintRecognizedRangeChecks(dbgs()));
998
999 if (Opts.irce_print_range_checks)
1000 PrintRecognizedRangeChecks(errs());
1001
1002 const char *FailureReason = nullptr;
1003 SCEVExpander LoopStructureExpander(SE, "loop-constrainer");
1004 SCEVExpanderCleaner LoopStructureExpanderCleaner(LoopStructureExpander);
1005 std::optional<LoopStructure> MaybeLoopStructure =
1006 LoopStructure::parseLoopStructure(LoopStructureExpander, *L,
1007 Opts.irce_allow_unsigned_latch,
1008 FailureReason);
1009 if (!MaybeLoopStructure) {
1010 LLVM_DEBUG(dbgs() << "irce: could not parse loop structure: "
1011 << FailureReason << "\n";);
1012 return Changed;
1013 }
1014 LoopStructure LS = *MaybeLoopStructure;
1015 const SCEVAddRecExpr *IndVar =
1016 cast<SCEVAddRecExpr>(SE.getMinusSCEV(SE.getSCEV(LS.IndVarBase), SE.getSCEV(LS.IndVarStep)));
1017
1018 std::optional<InductiveRangeCheck::Range> SafeIterRange;
1019
1020 SmallVector<InductiveRangeCheck, 4> RangeChecksToEliminate;
1021 // Basing on the type of latch predicate, we interpret the IV iteration range
1022 // as signed or unsigned range. We use different min/max functions (signed or
1023 // unsigned) when intersecting this range with safe iteration ranges implied
1024 // by range checks.
1025 auto IntersectRange =
1026 LS.IsSignedPredicate ? IntersectSignedRange : IntersectUnsignedRange;
1027
1028 for (InductiveRangeCheck &IRC : RangeChecks) {
1029 auto Result =
1030 IRC.computeSafeIterationSpace(SE, IndVar, LS.IsSignedPredicate, Opts);
1031 if (Result) {
1032 auto MaybeSafeIterRange = IntersectRange(SE, SafeIterRange, *Result);
1033 if (MaybeSafeIterRange) {
1034 assert(!MaybeSafeIterRange->isEmpty(SE, LS.IsSignedPredicate) &&
1035 "We should never return empty ranges!");
1036 RangeChecksToEliminate.push_back(IRC);
1037 SafeIterRange = *MaybeSafeIterRange;
1038 }
1039 }
1040 }
1041
1042 if (!SafeIterRange)
1043 return Changed;
1044
1045 std::optional<LoopConstrainer::SubRanges> MaybeSR =
1046 calculateSubRanges(Opts, SE, *L, *SafeIterRange, LS);
1047 if (!MaybeSR) {
1048 LLVM_DEBUG(dbgs() << "irce: could not compute subranges\n");
1049 return Changed;
1050 }
1051
1052 LoopConstrainer LC(*L, LI, LPMAddNewLoop, LS, SE, DT,
1053 SafeIterRange->getBegin()->getType(), *MaybeSR);
1054
1055 if (LC.run()) {
1056 LoopStructureExpanderCleaner.markResultUsed();
1057 LS.IndVarStart->setName("indvar.start");
1058 Changed = true;
1059
1060 auto PrintConstrainedLoopInfo = [L]() {
1061 dbgs() << "irce: in function ";
1062 dbgs() << L->getHeader()->getParent()->getName() << ": ";
1063 dbgs() << "constrained ";
1064 L->print(dbgs());
1065 };
1066
1067 LLVM_DEBUG(PrintConstrainedLoopInfo());
1068
1069 if (Opts.irce_print_changed_loops)
1070 PrintConstrainedLoopInfo();
1071
1072 // Optimize away the now-redundant range checks.
1073
1074 for (InductiveRangeCheck &IRC : RangeChecksToEliminate) {
1075 ConstantInt *FoldedRangeCheck = IRC.getPassingDirection()
1077 : ConstantInt::getFalse(Context);
1078 IRC.getCheckUse()->set(FoldedRangeCheck);
1079 }
1080 }
1081
1082 return Changed;
1083}
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:857
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< 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:682
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file declares an analysis pass that computes CycleInfo for LLVM IR, specialized from GenericCycl...
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 std::optional< LoopConstrainer::SubRanges > calculateSubRanges(const ScalarOptions &Opts, ScalarEvolution &SE, const Loop &L, InductiveRangeCheck::Range &Range, const LoopStructure &MainLoopStructure)
static std::optional< InductiveRangeCheck::Range > IntersectSignedRange(ScalarEvolution &SE, const std::optional< InductiveRangeCheck::Range > &R1, const InductiveRangeCheck::Range &R2)
static std::optional< InductiveRangeCheck::Range > IntersectUnsignedRange(ScalarEvolution &SE, const std::optional< InductiveRangeCheck::Range > &R1, const InductiveRangeCheck::Range &R2)
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:205
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:215
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 CycleInfo.
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:338
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
Analysis pass that exposes the LoopInfo for a function.
Definition LoopInfo.h:594
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.
static constexpr auto FlagNUW
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 * 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 * getMinusSCEV(SCEVUse LHS, SCEVUse RHS, SCEVFlags Flags=SCEV::FlagNone, unsigned Depth=0)
Return LHS-RHS.
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 * 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(SCEVUse Op, Type *Ty, unsigned Depth=0)
LLVM_ABI SCEVUse getAddExpr(SmallVectorImpl< SCEVUse > &Ops, SCEVFlagsPair Flags={}, unsigned Depth=0)
Get a canonical add expression, or something simpler if possible.
LLVM_ABI const SCEV * getSignExtendExpr(SCEVUse 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 SCEVUse getMulExpr(SmallVectorImpl< SCEVUse > &Ops, SCEVFlagsPair Flags={}, unsigned Depth=0)
Get a canonical multiply 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 * getNegativeSCEV(const SCEV *V, SCEVFlags Flags=SCEV::FlagNone)
Return the SCEV object corresponding to -V.
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:252
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:257
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:83
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.
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:577
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
IRBuilder(LLVMContext &, FolderTy, InserterTy) -> IRBuilder< FolderTy, InserterTy >
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.
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.
@ End
Run the machine verifier once, at the end of the pipeline.
Definition CodeGen.h:267
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