LLVM 24.0.0git
LoopConstrainer.cpp
Go to the documentation of this file.
10
11using namespace llvm;
12
13static const char *ClonedLoopTag = "loop_constrainer.loop.clone";
14
15#define DEBUG_TYPE "loop-constrainer"
16
19 const SCEV *Start, const SCEV *Bound) {
20 // First, try to prove the predicate without applying loop guards.
21 if (SE.isLoopEntryGuardedByCond(L, Pred, Start, Bound))
22 return true;
23 // Otherwise, try again with loop guards applied to the SCEVs.
24 auto StartLG = SE.applyLoopGuards(Start, L);
25 auto BoundLG = SE.applyLoopGuards(Bound, L);
26 return SE.isLoopEntryGuardedByCond(L, Pred, StartLG, BoundLG);
27}
28
29/// Given a loop with an deccreasing induction variable, is it possible to
30/// safely calculate the bounds of a new loop using the given Predicate.
31static bool isSafeDecreasingBound(const SCEV *Start, const SCEV *BoundSCEV,
32 const SCEV *Step, ICmpInst::Predicate Pred,
33 unsigned LatchBrExitIdx, Loop *L,
34 ScalarEvolution &SE) {
35 if (Pred != ICmpInst::ICMP_SLT && Pred != ICmpInst::ICMP_SGT &&
36 Pred != ICmpInst::ICMP_ULT && Pred != ICmpInst::ICMP_UGT)
37 return false;
38
39 if (!SE.isAvailableAtLoopEntry(BoundSCEV, L))
40 return false;
41
42 assert(SE.isKnownNegative(Step) && "expecting negative step");
43
44 LLVM_DEBUG(dbgs() << "isSafeDecreasingBound with:\n");
45 LLVM_DEBUG(dbgs() << "Start: " << *Start << "\n");
46 LLVM_DEBUG(dbgs() << "Step: " << *Step << "\n");
47 LLVM_DEBUG(dbgs() << "BoundSCEV: " << *BoundSCEV << "\n");
48 LLVM_DEBUG(dbgs() << "Pred: " << Pred << "\n");
49 LLVM_DEBUG(dbgs() << "LatchExitBrIdx: " << LatchBrExitIdx << "\n");
50
51 bool IsSigned = ICmpInst::isSigned(Pred);
52 // The predicate that we need to check that the induction variable lies
53 // within bounds.
54 ICmpInst::Predicate BoundPred =
56
57 if (LatchBrExitIdx == 1)
58 return isLoopEntryGuardedByCond(SE, L, BoundPred, Start, BoundSCEV);
59
60 assert(LatchBrExitIdx == 0 && "LatchBrExitIdx should be either 0 or 1");
61
62 const SCEV *StepPlusOne = SE.getAddExpr(Step, SE.getOne(Step->getType()));
63 unsigned BitWidth = cast<IntegerType>(BoundSCEV->getType())->getBitWidth();
66 const SCEV *Limit = SE.getMinusSCEV(SE.getConstant(Min), StepPlusOne);
67
68 const SCEV *MinusOne =
69 SE.getMinusSCEV(BoundSCEV, SE.getOne(BoundSCEV->getType()));
70
71 return isLoopEntryGuardedByCond(SE, L, BoundPred, Start, MinusOne) &&
72 isLoopEntryGuardedByCond(SE, L, BoundPred, BoundSCEV, Limit);
73}
74
75/// Given a loop with an increasing induction variable, is it possible to
76/// safely calculate the bounds of a new loop using the given Predicate.
77static bool isSafeIncreasingBound(const SCEV *Start, const SCEV *BoundSCEV,
78 const SCEV *Step, ICmpInst::Predicate Pred,
79 unsigned LatchBrExitIdx, Loop *L,
80 ScalarEvolution &SE) {
81 if (Pred != ICmpInst::ICMP_SLT && Pred != ICmpInst::ICMP_SGT &&
82 Pred != ICmpInst::ICMP_ULT && Pred != ICmpInst::ICMP_UGT)
83 return false;
84
85 if (!SE.isAvailableAtLoopEntry(BoundSCEV, L))
86 return false;
87
88 LLVM_DEBUG(dbgs() << "isSafeIncreasingBound with:\n");
89 LLVM_DEBUG(dbgs() << "Start: " << *Start << "\n");
90 LLVM_DEBUG(dbgs() << "Step: " << *Step << "\n");
91 LLVM_DEBUG(dbgs() << "BoundSCEV: " << *BoundSCEV << "\n");
92 LLVM_DEBUG(dbgs() << "Pred: " << Pred << "\n");
93 LLVM_DEBUG(dbgs() << "LatchExitBrIdx: " << LatchBrExitIdx << "\n");
94
95 bool IsSigned = ICmpInst::isSigned(Pred);
96 // The predicate that we need to check that the induction variable lies
97 // within bounds.
98 ICmpInst::Predicate BoundPred =
100
101 if (LatchBrExitIdx == 1)
102 return isLoopEntryGuardedByCond(SE, L, BoundPred, Start, BoundSCEV);
103
104 assert(LatchBrExitIdx == 0 && "LatchBrExitIdx should be 0 or 1");
105
106 const SCEV *StepMinusOne = SE.getMinusSCEV(Step, SE.getOne(Step->getType()));
107 unsigned BitWidth = cast<IntegerType>(BoundSCEV->getType())->getBitWidth();
108 APInt Max = IsSigned ? APInt::getSignedMaxValue(BitWidth)
110 const SCEV *Limit = SE.getMinusSCEV(SE.getConstant(Max), StepMinusOne);
111
112 return (isLoopEntryGuardedByCond(SE, L, BoundPred, Start,
113 SE.getAddExpr(BoundSCEV, Step)) &&
114 isLoopEntryGuardedByCond(SE, L, BoundPred, BoundSCEV, Limit));
115}
116
117/// Returns estimate for max latch taken count of the loop of the narrowest
118/// available type. If the latch block has such estimate, it is returned.
119/// Otherwise, we use max exit count of whole loop (that is potentially of wider
120/// type than latch check itself), which is still better than no estimate.
122 const Loop &L) {
123 const SCEV *FromBlock =
124 SE.getExitCount(&L, L.getLoopLatch(), ScalarEvolution::SymbolicMaximum);
125 if (isa<SCEVCouldNotCompute>(FromBlock))
127 return FromBlock;
128}
129
130std::optional<LoopStructure>
132 bool AllowUnsignedLatchCond,
133 const char *&FailureReason) {
134 ScalarEvolution &SE = *Expander.getSE();
135 if (!L.isLoopSimplifyForm()) {
136 FailureReason = "loop not in LoopSimplify form";
137 return std::nullopt;
138 }
139
140 BasicBlock *Latch = L.getLoopLatch();
141 assert(Latch && "Simplified loops only have one latch!");
142
143 if (Latch->getTerminator()->getMetadata(ClonedLoopTag)) {
144 FailureReason = "loop has already been cloned";
145 return std::nullopt;
146 }
147
148 if (!L.isLoopExiting(Latch)) {
149 FailureReason = "no loop latch";
150 return std::nullopt;
151 }
152
153 BasicBlock *Header = L.getHeader();
154 BasicBlock *Preheader = L.getLoopPreheader();
155 if (!Preheader) {
156 FailureReason = "no preheader";
157 return std::nullopt;
158 }
159
160 CondBrInst *LatchBr = dyn_cast<CondBrInst>(Latch->getTerminator());
161 if (!LatchBr) {
162 FailureReason = "latch terminator not conditional branch";
163 return std::nullopt;
164 }
165
166 unsigned LatchBrExitIdx = LatchBr->getSuccessor(0) == Header ? 1 : 0;
167
168 ICmpInst *ICI = dyn_cast<ICmpInst>(LatchBr->getCondition());
169 if (!ICI || !isa<IntegerType>(ICI->getOperand(0)->getType())) {
170 FailureReason = "latch terminator branch not conditional on integral icmp";
171 return std::nullopt;
172 }
173
174 const SCEV *MaxBETakenCount = getNarrowestLatchMaxTakenCountEstimate(SE, L);
175 if (isa<SCEVCouldNotCompute>(MaxBETakenCount)) {
176 FailureReason = "could not compute latch count";
177 return std::nullopt;
178 }
179 assert(SE.getLoopDisposition(MaxBETakenCount, &L) ==
181 "loop variant exit count doesn't make sense!");
182
183 ICmpInst::Predicate Pred = ICI->getPredicate();
184 Value *LeftValue = ICI->getOperand(0);
185 const SCEV *LeftSCEV = SE.getSCEV(LeftValue);
186 IntegerType *IndVarTy = cast<IntegerType>(LeftValue->getType());
187
188 Value *RightValue = ICI->getOperand(1);
189 const SCEV *RightSCEV = SE.getSCEV(RightValue);
190
191 // We canonicalize `ICI` such that `LeftSCEV` is an add recurrence.
192 if (!isa<SCEVAddRecExpr>(LeftSCEV)) {
193 if (isa<SCEVAddRecExpr>(RightSCEV)) {
194 std::swap(LeftSCEV, RightSCEV);
195 std::swap(LeftValue, RightValue);
197 } else {
198 FailureReason = "no add recurrences in the icmp";
199 return std::nullopt;
200 }
201 }
202
203 auto HasNoSignedWrap = [&](const SCEVAddRecExpr *AR) {
204 if (AR->hasNoSignedWrap())
205 return true;
206
207 IntegerType *Ty = cast<IntegerType>(AR->getType());
208 IntegerType *WideTy =
209 IntegerType::get(Ty->getContext(), Ty->getBitWidth() * 2);
210
211 const SCEVAddRecExpr *ExtendAfterOp =
213 if (ExtendAfterOp) {
214 const SCEV *ExtendedStart = SE.getSignExtendExpr(AR->getStart(), WideTy);
215 const SCEV *ExtendedStep =
216 SE.getSignExtendExpr(AR->getStepRecurrence(SE), WideTy);
217
218 bool NoSignedWrap = ExtendAfterOp->getStart() == ExtendedStart &&
219 ExtendAfterOp->getStepRecurrence(SE) == ExtendedStep;
220
221 if (NoSignedWrap)
222 return true;
223 }
224
225 // We may have proved this when computing the sign extension above.
226 return AR->hasNoSignedWrap();
227 };
228
229 // `ICI` is interpreted as taking the backedge if the *next* value of the
230 // induction variable satisfies some constraint.
231
233 if (IndVarBase->getLoop() != &L) {
234 FailureReason = "LHS in cmp is not an AddRec for this loop";
235 return std::nullopt;
236 }
237 if (!IndVarBase->isAffine()) {
238 FailureReason = "LHS in icmp not induction variable";
239 return std::nullopt;
240 }
241 const SCEV *StepRec = IndVarBase->getStepRecurrence(SE);
242 if (!isa<SCEVConstant>(StepRec)) {
243 FailureReason = "LHS in icmp not induction variable";
244 return std::nullopt;
245 }
246 ConstantInt *StepCI = cast<SCEVConstant>(StepRec)->getValue();
247
248 if (ICI->isEquality() && !HasNoSignedWrap(IndVarBase)) {
249 FailureReason = "LHS in icmp needs nsw for equality predicates";
250 return std::nullopt;
251 }
252
253 assert(!StepCI->isZero() && "Zero step?");
254 bool IsIncreasing = !StepCI->isNegative();
256 const SCEV *StartNext = IndVarBase->getStart();
257 const SCEV *Addend = SE.getNegativeSCEV(IndVarBase->getStepRecurrence(SE));
258 const SCEV *IndVarStart = SE.getAddExpr(StartNext, Addend);
259 const SCEV *Step = SE.getSCEV(StepCI);
260
261 const SCEV *FixedRightSCEV = nullptr;
262
263 // If RightValue resides within loop (but still being loop invariant),
264 // regenerate it as preheader.
265 if (auto *I = dyn_cast<Instruction>(RightValue))
266 if (L.contains(I->getParent()))
267 FixedRightSCEV = RightSCEV;
268
269 if (IsIncreasing) {
270 bool DecreasedRightValueByOne = false;
271 if (StepCI->isOne()) {
272 // Try to turn eq/ne predicates to those we can work with.
273 if (Pred == ICmpInst::ICMP_NE && LatchBrExitIdx == 1)
274 // while (++i != len) { while (++i < len) {
275 // ... ---> ...
276 // } }
277 // If both parts are known non-negative, it is profitable to use
278 // unsigned comparison in increasing loop. This allows us to make the
279 // comparison check against "RightSCEV + 1" more optimistic.
281 isKnownNonNegativeInLoop(RightSCEV, &L, SE))
282 Pred = ICmpInst::ICMP_ULT;
283 else
284 Pred = ICmpInst::ICMP_SLT;
285 else if (Pred == ICmpInst::ICMP_EQ && LatchBrExitIdx == 0) {
286 // while (true) { while (true) {
287 // if (++i == len) ---> if (++i > len - 1)
288 // break; break;
289 // ... ...
290 // } }
291 if (IndVarBase->hasNoUnsignedWrap() &&
292 cannotBeMinInLoop(RightSCEV, &L, SE, /*Signed*/ false)) {
293 Pred = ICmpInst::ICMP_UGT;
294 RightSCEV =
295 SE.getMinusSCEV(RightSCEV, SE.getOne(RightSCEV->getType()));
296 DecreasedRightValueByOne = true;
297 } else if (cannotBeMinInLoop(RightSCEV, &L, SE, /*Signed*/ true)) {
298 Pred = ICmpInst::ICMP_SGT;
299 RightSCEV =
300 SE.getMinusSCEV(RightSCEV, SE.getOne(RightSCEV->getType()));
301 DecreasedRightValueByOne = true;
302 }
303 }
304 }
305
306 bool LTPred = (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_ULT);
307 bool GTPred = (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_UGT);
308 bool FoundExpectedPred =
309 (LTPred && LatchBrExitIdx == 1) || (GTPred && LatchBrExitIdx == 0);
310
311 if (!FoundExpectedPred) {
312 FailureReason = "expected icmp slt semantically, found something else";
313 return std::nullopt;
314 }
315
317 if (!IsSignedPredicate && !AllowUnsignedLatchCond) {
318 FailureReason = "unsigned latch conditions are explicitly prohibited";
319 return std::nullopt;
320 }
321
322 if (!isSafeIncreasingBound(IndVarStart, RightSCEV, Step, Pred,
323 LatchBrExitIdx, &L, SE)) {
324 FailureReason = "Unsafe loop bounds";
325 return std::nullopt;
326 }
327 if (LatchBrExitIdx == 0) {
328 // We need to increase the right value unless we have already decreased
329 // it virtually when we replaced EQ with SGT.
330 if (!DecreasedRightValueByOne)
331 FixedRightSCEV =
332 SE.getAddExpr(RightSCEV, SE.getOne(RightSCEV->getType()));
333 } else {
334 assert(!DecreasedRightValueByOne &&
335 "Right value can be decreased only for LatchBrExitIdx == 0!");
336 }
337 } else {
338 bool IncreasedRightValueByOne = false;
339 if (StepCI->isMinusOne()) {
340 // Try to turn eq/ne predicates to those we can work with.
341 if (Pred == ICmpInst::ICMP_NE && LatchBrExitIdx == 1)
342 // while (--i != len) { while (--i > len) {
343 // ... ---> ...
344 // } }
345 // We intentionally don't turn the predicate into UGT even if we know
346 // that both operands are non-negative, because it will only pessimize
347 // our check against "RightSCEV - 1".
348 Pred = ICmpInst::ICMP_SGT;
349 else if (Pred == ICmpInst::ICMP_EQ && LatchBrExitIdx == 0) {
350 // while (true) { while (true) {
351 // if (--i == len) ---> if (--i < len + 1)
352 // break; break;
353 // ... ...
354 // } }
355 if (IndVarBase->hasNoUnsignedWrap() &&
356 cannotBeMaxInLoop(RightSCEV, &L, SE, /* Signed */ false)) {
357 Pred = ICmpInst::ICMP_ULT;
358 RightSCEV = SE.getAddExpr(RightSCEV, SE.getOne(RightSCEV->getType()));
359 IncreasedRightValueByOne = true;
360 } else if (cannotBeMaxInLoop(RightSCEV, &L, SE, /* Signed */ true)) {
361 Pred = ICmpInst::ICMP_SLT;
362 RightSCEV = SE.getAddExpr(RightSCEV, SE.getOne(RightSCEV->getType()));
363 IncreasedRightValueByOne = true;
364 }
365 }
366 }
367
368 bool LTPred = (Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_ULT);
369 bool GTPred = (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_UGT);
370
371 bool FoundExpectedPred =
372 (GTPred && LatchBrExitIdx == 1) || (LTPred && LatchBrExitIdx == 0);
373
374 if (!FoundExpectedPred) {
375 FailureReason = "expected icmp sgt semantically, found something else";
376 return std::nullopt;
377 }
378
380 Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGT;
381
382 if (!IsSignedPredicate && !AllowUnsignedLatchCond) {
383 FailureReason = "unsigned latch conditions are explicitly prohibited";
384 return std::nullopt;
385 }
386
387 if (!isSafeDecreasingBound(IndVarStart, RightSCEV, Step, Pred,
388 LatchBrExitIdx, &L, SE)) {
389 FailureReason = "Unsafe bounds";
390 return std::nullopt;
391 }
392
393 if (LatchBrExitIdx == 0) {
394 // We need to decrease the right value unless we have already increased
395 // it virtually when we replaced EQ with SLT.
396 if (!IncreasedRightValueByOne)
397 FixedRightSCEV =
398 SE.getMinusSCEV(RightSCEV, SE.getOne(RightSCEV->getType()));
399 } else {
400 assert(!IncreasedRightValueByOne &&
401 "Right value can be increased only for LatchBrExitIdx == 0!");
402 }
403 }
404 BasicBlock *LatchExit = LatchBr->getSuccessor(LatchBrExitIdx);
405
406 assert(!L.contains(LatchExit) && "expected an exit block!");
407 Instruction *Ins = Preheader->getTerminator();
408
409 if (FixedRightSCEV)
410 RightValue =
411 Expander.expandCodeFor(FixedRightSCEV, FixedRightSCEV->getType(), Ins);
412
413 Value *IndVarStartV = Expander.expandCodeFor(IndVarStart, IndVarTy, Ins);
414
415 LoopStructure Result;
416
417 Result.Tag = "main";
418 Result.Header = Header;
419 Result.Latch = Latch;
420 Result.LatchBr = LatchBr;
421 Result.LatchExit = LatchExit;
422 Result.LatchBrExitIdx = LatchBrExitIdx;
423 Result.IndVarStart = IndVarStartV;
424 Result.IndVarStep = StepCI;
425 Result.IndVarBase = LeftValue;
426 Result.IndVarIncreasing = IsIncreasing;
427 Result.LoopExitAt = RightValue;
428 Result.IsSignedPredicate = IsSignedPredicate;
429 Result.ExitCountTy = cast<IntegerType>(MaxBETakenCount->getType());
430
431 FailureReason = nullptr;
432
433 return Result;
434}
435
436// Add metadata to the loop L to disable loop optimizations. Callers need to
437// confirm that optimizing loop L is not beneficial.
439 // We do not care about any existing loopID related metadata for L, since we
440 // are setting all loop metadata to false.
441 LLVMContext &Context = L.getHeader()->getContext();
442 // Reserve first location for self reference to the LoopID metadata node.
443 MDNode *Dummy = MDNode::get(Context, {});
444 MDNode *DisableUnroll = MDNode::get(
445 Context, {MDString::get(Context, "llvm.loop.unroll.disable")});
446 MDNode *DisableVectorize = MDNode::get(
447 Context, {MDString::get(Context, "llvm.loop.vectorize.disable")});
448 MDNode *DisableLICMVersioning = MDNode::get(
449 Context, {MDString::get(Context, "llvm.loop.licm_versioning.disable")});
450 MDNode *DisableDistribution = MDNode::get(
451 Context, {MDString::get(Context, "llvm.loop.distribute.disable")});
452 MDNode *NewLoopID =
453 MDNode::get(Context, {Dummy, DisableUnroll, DisableVectorize,
454 DisableLICMVersioning, DisableDistribution});
455 // Set operand 0 to refer to the loop id itself.
456 NewLoopID->replaceOperandWith(0, NewLoopID);
457 L.setLoopID(NewLoopID);
458}
459
461 function_ref<void(Loop *, bool)> LPMAddNewLoop,
462 const LoopStructure &LS, ScalarEvolution &SE,
463 DominatorTree &DT, Type *T, SubRanges SR)
464 : F(*L.getHeader()->getParent()), Ctx(L.getHeader()->getContext()), SE(SE),
465 DT(DT), LI(LI), LPMAddNewLoop(LPMAddNewLoop), OriginalLoop(L), RangeTy(T),
466 MainLoopStructure(LS), SR(SR) {}
467
468void LoopConstrainer::cloneLoop(LoopConstrainer::ClonedLoop &Result,
469 const char *Tag) const {
470 for (BasicBlock *BB : OriginalLoop.getBlocks()) {
471 BasicBlock *Clone = CloneBasicBlock(BB, Result.Map, Twine(".") + Tag, &F);
472 Result.Blocks.push_back(Clone);
473 Result.Map[BB] = Clone;
474 }
475
476 auto GetClonedValue = [&Result](Value *V) {
477 assert(V && "null values not in domain!");
478 auto It = Result.Map.find(V);
479 if (It == Result.Map.end())
480 return V;
481 return static_cast<Value *>(It->second);
482 };
483
484 auto *ClonedLatch =
485 cast<BasicBlock>(GetClonedValue(OriginalLoop.getLoopLatch()));
486 ClonedLatch->getTerminator()->setMetadata(ClonedLoopTag,
487 MDNode::get(Ctx, {}));
488
489 Result.Structure = MainLoopStructure.map(GetClonedValue);
490 Result.Structure.Tag = Tag;
491
492 for (unsigned i = 0, e = Result.Blocks.size(); i != e; ++i) {
493 BasicBlock *ClonedBB = Result.Blocks[i];
494 BasicBlock *OriginalBB = OriginalLoop.getBlocks()[i];
495
496 assert(Result.Map[OriginalBB] == ClonedBB && "invariant!");
497
498 for (Instruction &I : *ClonedBB)
501
502 // Exit blocks will now have one more predecessor and their PHI nodes need
503 // to be edited to reflect that. No phi nodes need to be introduced because
504 // the loop is in LCSSA.
505
506 for (auto *SBB : successors(OriginalBB)) {
507 if (OriginalLoop.contains(SBB))
508 continue; // not an exit block
509
510 for (PHINode &PN : SBB->phis()) {
511 Value *OldIncoming = PN.getIncomingValueForBlock(OriginalBB);
512 PN.addIncoming(GetClonedValue(OldIncoming), ClonedBB);
513 SE.forgetLcssaPhiWithNewPredecessor(&OriginalLoop, &PN);
514 }
515 }
516 }
517}
518
519LoopConstrainer::RewrittenRangeInfo LoopConstrainer::changeIterationSpaceEnd(
520 const LoopStructure &LS, BasicBlock *Preheader, Value *ExitSubloopAt,
521 BasicBlock *ContinuationBlock) const {
522 // We start with a loop with a single latch:
523 //
524 // +--------------------+
525 // | |
526 // | preheader |
527 // | |
528 // +--------+-----------+
529 // | ----------------\
530 // | / |
531 // +--------v----v------+ |
532 // | | |
533 // | header | |
534 // | | |
535 // +--------------------+ |
536 // |
537 // ..... |
538 // |
539 // +--------------------+ |
540 // | | |
541 // | latch >----------/
542 // | |
543 // +-------v------------+
544 // |
545 // |
546 // | +--------------------+
547 // | | |
548 // +---> original exit |
549 // | |
550 // +--------------------+
551 //
552 // We change the control flow to look like
553 //
554 //
555 // +--------------------+
556 // | |
557 // | preheader >-------------------------+
558 // | | |
559 // +--------v-----------+ |
560 // | /-------------+ |
561 // | / | |
562 // +--------v--v--------+ | |
563 // | | | |
564 // | header | | +--------+ |
565 // | | | | | |
566 // +--------------------+ | | +-----v-----v-----------+
567 // | | | |
568 // | | | .pseudo.exit |
569 // | | | |
570 // | | +-----------v-----------+
571 // | | |
572 // ..... | | |
573 // | | +--------v-------------+
574 // +--------------------+ | | | |
575 // | | | | | ContinuationBlock |
576 // | latch >------+ | | |
577 // | | | +----------------------+
578 // +---------v----------+ |
579 // | |
580 // | |
581 // | +---------------^-----+
582 // | | |
583 // +-----> .exit.selector |
584 // | |
585 // +----------v----------+
586 // |
587 // +--------------------+ |
588 // | | |
589 // | original exit <----+
590 // | |
591 // +--------------------+
592
593 RewrittenRangeInfo RRI;
594
595 BasicBlock *BBInsertLocation = LS.Latch->getNextNode();
596 RRI.ExitSelector = BasicBlock::Create(Ctx, Twine(LS.Tag) + ".exit.selector",
597 &F, BBInsertLocation);
598 RRI.PseudoExit = BasicBlock::Create(Ctx, Twine(LS.Tag) + ".pseudo.exit", &F,
599 BBInsertLocation);
600
601 Instruction *PreheaderJump = Preheader->getTerminator();
602 bool Increasing = LS.IndVarIncreasing;
603 bool IsSignedPredicate = LS.IsSignedPredicate;
604
605 IRBuilder<> B(PreheaderJump);
606 auto NoopOrExt = [&](Value *V) {
607 if (V->getType() == RangeTy)
608 return V;
609 return IsSignedPredicate ? B.CreateSExt(V, RangeTy, "wide." + V->getName())
610 : B.CreateZExt(V, RangeTy, "wide." + V->getName());
611 };
612
613 // EnterLoopCond - is it okay to start executing this `LS'?
614 Value *EnterLoopCond = nullptr;
615 auto Pred =
616 Increasing
617 ? (IsSignedPredicate ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT)
618 : (IsSignedPredicate ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT);
619 Value *IndVarStart = NoopOrExt(LS.IndVarStart);
620 EnterLoopCond = B.CreateICmp(Pred, IndVarStart, ExitSubloopAt);
621
622 B.CreateCondBr(EnterLoopCond, LS.Header, RRI.PseudoExit);
623 PreheaderJump->eraseFromParent();
624
625 LS.LatchBr->setSuccessor(LS.LatchBrExitIdx, RRI.ExitSelector);
626 B.SetInsertPoint(LS.LatchBr);
627 Value *IndVarBase = NoopOrExt(LS.IndVarBase);
628 Value *TakeBackedgeLoopCond = B.CreateICmp(Pred, IndVarBase, ExitSubloopAt);
629
630 Value *CondForBranch = LS.LatchBrExitIdx == 1
631 ? TakeBackedgeLoopCond
632 : B.CreateNot(TakeBackedgeLoopCond);
633
634 LS.LatchBr->setCondition(CondForBranch);
635
636 B.SetInsertPoint(RRI.ExitSelector);
637
638 // IterationsLeft - are there any more iterations left, given the original
639 // upper bound on the induction variable? If not, we branch to the "real"
640 // exit.
641 Value *LoopExitAt = NoopOrExt(LS.LoopExitAt);
642 Value *IterationsLeft = B.CreateICmp(Pred, IndVarBase, LoopExitAt);
643 B.CreateCondBr(IterationsLeft, RRI.PseudoExit, LS.LatchExit);
644
645 UncondBrInst *BranchToContinuation =
646 UncondBrInst::Create(ContinuationBlock, RRI.PseudoExit);
647
648 // We emit PHI nodes into `RRI.PseudoExit' that compute the "latest" value of
649 // each of the PHI nodes in the loop header. This feeds into the initial
650 // value of the same PHI nodes if/when we continue execution.
651 for (PHINode &PN : LS.Header->phis()) {
652 PHINode *NewPHI = PHINode::Create(PN.getType(), 2, PN.getName() + ".copy",
653 BranchToContinuation->getIterator());
654
655 NewPHI->addIncoming(PN.getIncomingValueForBlock(Preheader), Preheader);
656 NewPHI->addIncoming(PN.getIncomingValueForBlock(LS.Latch),
657 RRI.ExitSelector);
658 RRI.PHIValuesAtPseudoExit.push_back(NewPHI);
659 }
660
661 RRI.IndVarEnd = PHINode::Create(IndVarBase->getType(), 2, "indvar.end",
662 BranchToContinuation->getIterator());
663 RRI.IndVarEnd->addIncoming(IndVarStart, Preheader);
664 RRI.IndVarEnd->addIncoming(IndVarBase, RRI.ExitSelector);
665
666 // The latch exit now has a branch from `RRI.ExitSelector' instead of
667 // `LS.Latch'. The PHI nodes need to be updated to reflect that.
668 LS.LatchExit->replacePhiUsesWith(LS.Latch, RRI.ExitSelector);
669
670 return RRI;
671}
672
673void LoopConstrainer::rewriteIncomingValuesForPHIs(
674 LoopStructure &LS, BasicBlock *ContinuationBlock,
675 const LoopConstrainer::RewrittenRangeInfo &RRI) const {
676 unsigned PHIIndex = 0;
677 for (PHINode &PN : LS.Header->phis())
678 PN.setIncomingValueForBlock(ContinuationBlock,
679 RRI.PHIValuesAtPseudoExit[PHIIndex++]);
680
681 LS.IndVarStart = RRI.IndVarEnd;
682}
683
684BasicBlock *LoopConstrainer::createPreheader(const LoopStructure &LS,
685 BasicBlock *OldPreheader,
686 const char *Tag) const {
687 BasicBlock *Preheader = BasicBlock::Create(Ctx, Tag, &F, LS.Header);
688 UncondBrInst::Create(LS.Header, Preheader);
689
690 LS.Header->replacePhiUsesWith(OldPreheader, Preheader);
691
692 return Preheader;
693}
694
695void LoopConstrainer::addToParentLoopIfNeeded(ArrayRef<BasicBlock *> BBs) {
696 Loop *ParentLoop = OriginalLoop.getParentLoop();
697 if (!ParentLoop)
698 return;
699
700 for (BasicBlock *BB : BBs)
701 ParentLoop->addBasicBlockToLoop(BB, LI);
702}
703
704Loop *LoopConstrainer::createClonedLoopStructure(Loop *Original, Loop *Parent,
706 bool IsSubloop) {
707 Loop &New = *LI.AllocateLoop();
708 if (Parent)
709 Parent->addChildLoop(&New);
710 else
711 LI.addTopLevelLoop(&New);
712 LPMAddNewLoop(&New, IsSubloop);
713
714 // Add all of the blocks in Original to the new loop.
715 for (auto *BB : Original->blocks())
716 if (LI.getLoopFor(BB) == Original)
717 New.addBasicBlockToLoop(cast<BasicBlock>(VM[BB]), LI);
718
719 // Add all of the subloops to the new loop.
720 for (Loop *SubLoop : *Original)
721 createClonedLoopStructure(SubLoop, &New, VM, /* IsSubloop */ true);
722
723 return &New;
724}
725
727 BasicBlock *Preheader = OriginalLoop.getLoopPreheader();
728 assert(Preheader != nullptr && "precondition!");
729
730 OriginalPreheader = Preheader;
731 MainLoopPreheader = Preheader;
732 bool IsSignedPredicate = MainLoopStructure.IsSignedPredicate;
733 bool Increasing = MainLoopStructure.IndVarIncreasing;
734 IntegerType *IVTy = cast<IntegerType>(RangeTy);
735
736 SCEVExpander Expander(SE, "loop-constrainer");
737 SCEVExpanderCleaner ExpanderCleaner(Expander);
738 Instruction *InsertPt = OriginalPreheader->getTerminator();
739
740 // It would have been better to make `PreLoop' and `PostLoop'
741 // `std::optional<ClonedLoop>'s, but `ValueToValueMapTy' does not have a copy
742 // constructor.
743 ClonedLoop PreLoop, PostLoop;
744 bool NeedsPreLoop =
745 Increasing ? SR.LowLimit.has_value() : SR.HighLimit.has_value();
746 bool NeedsPostLoop =
747 Increasing ? SR.HighLimit.has_value() : SR.LowLimit.has_value();
748
749 Value *ExitPreLoopAt = nullptr;
750 Value *ExitMainLoopAt = nullptr;
751 const SCEVConstant *MinusOneS =
752 cast<SCEVConstant>(SE.getConstant(IVTy, -1, true /* isSigned */));
753
754 if (NeedsPreLoop) {
755 const SCEV *ExitPreLoopAtSCEV = nullptr;
756
757 if (Increasing)
758 ExitPreLoopAtSCEV = *SR.LowLimit;
759 else if (cannotBeMinInLoop(*SR.HighLimit, &OriginalLoop, SE,
760 IsSignedPredicate))
761 ExitPreLoopAtSCEV = SE.getAddExpr(*SR.HighLimit, MinusOneS);
762 else {
763 LLVM_DEBUG(dbgs() << "could not prove no-overflow when computing "
764 << "preloop exit limit. HighLimit = "
765 << *(*SR.HighLimit) << "\n");
766 return false;
767 }
768
769 if (!Expander.isSafeToExpandAt(ExitPreLoopAtSCEV, InsertPt)) {
770 LLVM_DEBUG(dbgs() << "could not prove that it is safe to expand the"
771 << " preloop exit limit " << *ExitPreLoopAtSCEV
772 << " at block " << InsertPt->getParent()->getName()
773 << "\n");
774 return false;
775 }
776
777 ExitPreLoopAt = Expander.expandCodeFor(ExitPreLoopAtSCEV, IVTy, InsertPt);
778 }
779
780 if (NeedsPostLoop) {
781 const SCEV *ExitMainLoopAtSCEV = nullptr;
782
783 if (Increasing)
784 ExitMainLoopAtSCEV = *SR.HighLimit;
785 else if (cannotBeMinInLoop(*SR.LowLimit, &OriginalLoop, SE,
786 IsSignedPredicate))
787 ExitMainLoopAtSCEV = SE.getAddExpr(*SR.LowLimit, MinusOneS);
788 else {
789 LLVM_DEBUG(dbgs() << "could not prove no-overflow when computing "
790 << "mainloop exit limit. LowLimit = "
791 << *(*SR.LowLimit) << "\n");
792 return false;
793 }
794
795 if (!Expander.isSafeToExpandAt(ExitMainLoopAtSCEV, InsertPt)) {
796 LLVM_DEBUG(dbgs() << "could not prove that it is safe to expand the"
797 << " main loop exit limit " << *ExitMainLoopAtSCEV
798 << " at block " << InsertPt->getParent()->getName()
799 << "\n");
800 return false;
801 }
802
803 ExitMainLoopAt = Expander.expandCodeFor(ExitMainLoopAtSCEV, IVTy, InsertPt);
804 ExitMainLoopAt->setName("exit.mainloop.at");
805 }
806
807 // All checks which can fail after expanding SCEVs are complete. Keep the
808 // expansions now that the loop transformation is guaranteed to proceed.
809 ExpanderCleaner.markResultUsed();
810 if (ExitPreLoopAt)
811 ExitPreLoopAt->setName("exit.preloop.at");
812
813 // We clone these ahead of time so that we don't have to deal with changing
814 // and temporarily invalid IR as we transform the loops.
815 if (NeedsPreLoop)
816 cloneLoop(PreLoop, "preloop");
817 if (NeedsPostLoop)
818 cloneLoop(PostLoop, "postloop");
819
820 RewrittenRangeInfo PreLoopRRI;
821
822 if (NeedsPreLoop) {
823 Preheader->getTerminator()->replaceUsesOfWith(MainLoopStructure.Header,
824 PreLoop.Structure.Header);
825
826 MainLoopPreheader =
827 createPreheader(MainLoopStructure, Preheader, "mainloop");
828 PreLoopRRI = changeIterationSpaceEnd(PreLoop.Structure, Preheader,
829 ExitPreLoopAt, MainLoopPreheader);
830 rewriteIncomingValuesForPHIs(MainLoopStructure, MainLoopPreheader,
831 PreLoopRRI);
832 }
833
834 BasicBlock *PostLoopPreheader = nullptr;
835 RewrittenRangeInfo PostLoopRRI;
836
837 if (NeedsPostLoop) {
838 PostLoopPreheader =
839 createPreheader(PostLoop.Structure, Preheader, "postloop");
840 PostLoopRRI = changeIterationSpaceEnd(MainLoopStructure, MainLoopPreheader,
841 ExitMainLoopAt, PostLoopPreheader);
842 rewriteIncomingValuesForPHIs(PostLoop.Structure, PostLoopPreheader,
843 PostLoopRRI);
844 }
845
846 BasicBlock *NewMainLoopPreheader =
847 MainLoopPreheader != Preheader ? MainLoopPreheader : nullptr;
848 BasicBlock *NewBlocks[] = {PostLoopPreheader, PreLoopRRI.PseudoExit,
849 PreLoopRRI.ExitSelector, PostLoopRRI.PseudoExit,
850 PostLoopRRI.ExitSelector, NewMainLoopPreheader};
851
852 // Some of the above may be nullptr, filter them out before passing to
853 // addToParentLoopIfNeeded.
854 auto NewBlocksEnd =
855 std::remove(std::begin(NewBlocks), std::end(NewBlocks), nullptr);
856
857 addToParentLoopIfNeeded(ArrayRef(std::begin(NewBlocks), NewBlocksEnd));
858
859 DT.recalculate(F);
860
861 // We need to first add all the pre and post loop blocks into the loop
862 // structures (as part of createClonedLoopStructure), and then update the
863 // LCSSA form and LoopSimplifyForm. This is necessary for correctly updating
864 // LI when LoopSimplifyForm is generated.
865 Loop *PreL = nullptr, *PostL = nullptr;
866 if (!PreLoop.Blocks.empty()) {
867 PreL = createClonedLoopStructure(&OriginalLoop,
868 OriginalLoop.getParentLoop(), PreLoop.Map,
869 /* IsSubLoop */ false);
870 }
871
872 if (!PostLoop.Blocks.empty()) {
873 PostL =
874 createClonedLoopStructure(&OriginalLoop, OriginalLoop.getParentLoop(),
875 PostLoop.Map, /* IsSubLoop */ false);
876 }
877
878 // This function canonicalizes the loop into Loop-Simplify and LCSSA forms.
879 auto CanonicalizeLoop = [&](Loop *L, bool IsOriginalLoop) {
880 formLCSSARecursively(*L, DT, &LI, &SE);
881 simplifyLoop(L, &DT, &LI, &SE, nullptr, nullptr, true);
882 // Pre/post loops are slow paths, we do not need to perform any loop
883 // optimizations on them.
884 if (!IsOriginalLoop)
886 };
887 if (PreL)
888 CanonicalizeLoop(PreL, false);
889 if (PostL)
890 CanonicalizeLoop(PostL, false);
891 CanonicalizeLoop(&OriginalLoop, true);
892
893 /// At this point:
894 /// - We've broken a "main loop" out of the loop in a way that the "main loop"
895 /// runs with the induction variable in a subset of [Begin, End).
896 /// - There is no overflow when computing "main loop" exit limit.
897 /// - Max latch taken count of the loop is limited.
898 /// It guarantees that induction variable will not overflow iterating in the
899 /// "main loop".
900 if (isa<OverflowingBinaryOperator>(MainLoopStructure.IndVarBase))
901 if (IsSignedPredicate)
902 cast<BinaryOperator>(MainLoopStructure.IndVarBase)
903 ->setHasNoSignedWrap(true);
904 /// TODO: support unsigned predicate.
905 /// To add NUW flag we need to prove that both operands of BO are
906 /// non-negative. E.g:
907 /// ...
908 /// %iv.next = add nsw i32 %iv, -1
909 /// %cmp = icmp ult i32 %iv.next, %n
910 /// br i1 %cmp, label %loopexit, label %loop
911 ///
912 /// -1 is MAX_UINT in terms of unsigned int. Adding anything but zero will
913 /// overflow, therefore NUW flag is not legal here.
914
915 return true;
916}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static const Function * getParent(const Value *V)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static const char * ClonedLoopTag
static bool isLoopEntryGuardedByCond(ScalarEvolution &SE, Loop *L, ICmpInst::Predicate Pred, const SCEV *Start, const SCEV *Bound)
static const SCEV * getNarrowestLatchMaxTakenCountEstimate(ScalarEvolution &SE, const Loop &L)
Returns estimate for max latch taken count of the loop of the narrowest available type.
static bool isSafeDecreasingBound(const SCEV *Start, const SCEV *BoundSCEV, const SCEV *Step, ICmpInst::Predicate Pred, unsigned LatchBrExitIdx, Loop *L, ScalarEvolution &SE)
Given a loop with an deccreasing induction variable, is it possible to safely calculate the bounds of...
static void DisableAllLoopOptsOnLoop(Loop &L)
static bool isSafeIncreasingBound(const SCEV *Start, const SCEV *BoundSCEV, const SCEV *Step, ICmpInst::Predicate Pred, unsigned LatchBrExitIdx, Loop *L, ScalarEvolution &SE)
Given a loop with an increasing induction variable, is it possible to safely calculate the bounds of ...
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define T
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
#define LLVM_DEBUG(...)
Definition Debug.h:119
Class for arbitrary precision integers.
Definition APInt.h:78
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:207
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition APInt.h:217
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
LLVM Basic Block Representation.
Definition BasicBlock.h:62
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
Definition BasicBlock.h:206
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ ICMP_SLT
signed less than
Definition InstrTypes.h:769
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:767
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ ICMP_NE
not equal
Definition InstrTypes.h:762
bool isSigned() const
Definition InstrTypes.h:993
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:890
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:828
Conditional Branch instruction.
This is the shared class of boolean and integer constants.
Definition Constants.h:87
bool isMinusOne() const
This function will return true iff every bit in this constant is set to true.
Definition Constants.h:231
bool isOne() const
This is just a convenience method to make client code smaller for a common case.
Definition Constants.h:225
bool isNegative() const
Definition Constants.h:214
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:219
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
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.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:348
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
void addBasicBlockToLoop(BlockT *NewBB, LoopInfoBase< BlockT, LoopT > &LI)
This method is used by other analyses to update loop information.
iterator_range< block_iterator > blocks() const
void addChildLoop(LoopT *NewChild)
Add the specified loop to be a child of this loop.
ArrayRef< BlockT * > getBlocks() const
Get a list of the basic blocks which make up this loop.
LLVM_ABI LoopConstrainer(Loop &L, LoopInfo &LI, function_ref< void(Loop *, bool)> LPMAddNewLoop, const LoopStructure &LS, ScalarEvolution &SE, DominatorTree &DT, Type *T, SubRanges SR)
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
Metadata node.
Definition Metadata.h:1069
LLVM_ABI void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1567
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:615
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
This node represents a polynomial recurrence on the trip count of the specified loop.
SCEVUse getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
This class represents a constant integer value.
Helper to remove instructions inserted during SCEV expansion, unless they are marked as used.
void markResultUsed()
Indicate that the result of the expansion is used.
This class uses information about analyze scalars to rewrite expressions in canonical form.
LLVM_ABI bool isSafeToExpandAt(const SCEV *S, const Instruction *InsertionPoint) const
Return true if the given expression is safe to expand in the sense that all materialized values are d...
ScalarEvolution * getSE()
LLVM_ABI Value * expandCodeFor(SCEVUse SH, Type *Ty, BasicBlock::iterator I)
Insert code to directly compute the specified SCEV expression into the program.
This class represents an analyzed expression in the program.
Type * getType() const
Return the LLVM type of this SCEV expression.
The main scalar evolution driver.
LLVM_ABI const SCEV * getNegativeSCEV(const SCEV *V, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap)
Return the SCEV object corresponding to -V.
LLVM_ABI bool isKnownNegative(const SCEV *S)
Test if the given expression is known to be negative.
LLVM_ABI bool isLoopEntryGuardedByCond(const Loop *L, CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)
Test whether entry to the loop is protected by a conditional between LHS and RHS.
LLVM_ABI const SCEV * getConstant(ConstantInt *V)
LLVM_ABI const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
LLVM_ABI const SCEV * getMinusSCEV(SCEVUse LHS, SCEVUse RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Return LHS-RHS.
const SCEV * getOne(Type *Ty)
Return a SCEV for the constant 1 of a specific type.
LLVM_ABI LoopDisposition getLoopDisposition(const SCEV *S, const Loop *L)
Return the "disposition" of the given SCEV with respect to the given loop.
@ LoopInvariant
The SCEV is loop-invariant.
LLVM_ABI bool isAvailableAtLoopEntry(const SCEV *S, const Loop *L)
Determine if the SCEV can be evaluated at loop's entry.
LLVM_ABI const SCEV * getExitCount(const Loop *L, const BasicBlock *ExitingBlock, ExitCountKind Kind=Exact)
Return the number of times the backedge executes before the given exit would be taken; if not exactly...
LLVM_ABI const SCEV * getSignExtendExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)
LLVM_ABI const SCEV * getAddExpr(SmallVectorImpl< SCEVUse > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Get a canonical add expression, or something simpler if possible.
@ SymbolicMaximum
An expression which provides an upper bound on the exact trip count.
LLVM_ABI const SCEV * applyLoopGuards(const SCEV *Expr, const Loop *L)
Try to apply information from loop guards for L to Expr.
const SCEV * getSymbolicMaxBackedgeTakenCount(const Loop *L)
When successful, this returns a SCEV that is greater than or equal to (i.e.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
LLVM_ABI bool replaceUsesOfWith(Value *From, Value *To)
Replace uses of one Value with another.
Definition User.cpp:25
Value * getOperand(unsigned i) const
Definition User.h:207
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
Definition Value.cpp:394
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
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.
LLVM_ABI BasicBlock * CloneBasicBlock(const BasicBlock *BB, ValueToValueMapTy &VMap, const Twine &NameSuffix="", Function *F=nullptr, ClonedCodeInfo *CodeInfo=nullptr, bool MapAtoms=true)
Return a copy of the specified basic block, but without embedding the block into a particular functio...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
auto successors(const MachineBasicBlock *BB)
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 bool cannotBeMaxInLoop(const SCEV *S, const Loop *L, ScalarEvolution &SE, bool Signed)
Returns true if S is defined and never is equal to signed/unsigned max.
@ RF_IgnoreMissingLocals
If this flag is set, the remapper ignores missing function-local entries (Argument,...
Definition ValueMapper.h:98
@ RF_NoModuleLevelChanges
If this flag is set, the remapper knows that only local values within a function (such as an instruct...
Definition ValueMapper.h:80
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
void RemapInstruction(Instruction *I, ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
Convert the instruction operands from referencing the current values into those specified by VM.
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool cannotBeMinInLoop(const SCEV *S, const Loop *L, ScalarEvolution &SE, bool Signed)
Returns true if S is defined and never is equal to signed/unsigned min.
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.
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.
LoopStructure()=default