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