LLVM 24.0.0git
LoopUnrollPass.cpp
Go to the documentation of this file.
1//===- LoopUnroll.cpp - Loop unroller pass --------------------------------===//
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// This pass implements a simple loop unroller. It works best when loops have
10// been canonicalized by the -indvars pass, allowing it to determine the trip
11// counts of loops easily.
12//===----------------------------------------------------------------------===//
13
15#include "ScalarOptions.h"
16#include "llvm/ADT/DenseMap.h"
18#include "llvm/ADT/DenseSet.h"
19#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/SetVector.h"
23#include "llvm/ADT/StringRef.h"
37#include "llvm/IR/BasicBlock.h"
38#include "llvm/IR/CFG.h"
39#include "llvm/IR/Constant.h"
40#include "llvm/IR/Constants.h"
42#include "llvm/IR/Dominators.h"
43#include "llvm/IR/Function.h"
44#include "llvm/IR/Instruction.h"
46#include "llvm/IR/Metadata.h"
47#include "llvm/IR/PassManager.h"
49#include "llvm/Pass.h"
52#include "llvm/Support/Debug.h"
64#include <algorithm>
65#include <cassert>
66#include <cstdint>
67#include <limits>
68#include <optional>
69#include <string>
70#include <tuple>
71#include <utility>
72
73using namespace llvm;
74
75#define DEBUG_TYPE "loop-unroll"
76
78 const cl::LibraryOptionsContext &LibraryOptions) {
79 return LibraryOptions.get<ScalarOptions>().forget_scev_loop_unroll;
80}
81
82/// A magic value for use with the Threshold parameter to indicate
83/// that the loop unroll should be performed regardless of how much
84/// code expansion would result.
85static const unsigned NoThreshold = std::numeric_limits<unsigned>::max();
86
87/// Gather the various unrolling parameters based on the defaults, compiler
88/// flags, TTI overrides and user specified parameters.
92 OptimizationRemarkEmitter &ORE, int OptLevel,
93 std::optional<unsigned> UserThreshold, std::optional<bool> UserAllowPartial,
94 std::optional<bool> UserRuntime, std::optional<bool> UserUpperBound,
95 std::optional<unsigned> UserFullUnrollMaxCount) {
96 const ScalarOptions &Opts = getScalarOptions(*L);
98
99 // Set up the defaults
100 UP.Threshold = OptLevel > 2 ? Opts.unroll_threshold_aggressive
101 : Opts.unroll_threshold_default;
103 UP.OptSizeThreshold = Opts.unroll_optsize_threshold;
104 UP.PartialThreshold = 150;
105 UP.PartialOptSizeThreshold = Opts.unroll_optsize_threshold;
107 UP.MaxCount = std::numeric_limits<unsigned>::max();
108 UP.MaxUpperBound = 8;
109 UP.FullUnrollMaxCount = std::numeric_limits<unsigned>::max();
110 UP.BEInsns = 2;
111 UP.Partial = false;
112 UP.Runtime = false;
113 UP.AllowRemainder = true;
114 UP.UnrollRemainder = false;
115 UP.AllowExpensiveTripCount = false;
116 UP.Force = false;
117 UP.UpperBound = false;
118 UP.UnrollAndJam = false;
122 UP.RuntimeUnrollMultiExit = false;
123 UP.AddAdditionalAccumulators = false;
124
125 // Override with any target specific settings
126 TTI.getUnrollingPreferences(L, SE, UP, &ORE);
127
128 // Apply size attributes
129 bool OptForSize = L->getHeader()->getParent()->hasOptSize() ||
130 // Let unroll hints / pragmas take precedence over PGSO.
132 llvm::shouldOptimizeForSize(L->getHeader(), PSI, BFI,
134 if (OptForSize) {
138 }
139
140 // Apply any user values specified by cl::opt
141 if (Opts.unroll_threshold)
142 UP.Threshold = *Opts.unroll_threshold;
143 if (Opts.unroll_partial_threshold)
144 UP.PartialThreshold = *Opts.unroll_partial_threshold;
145 if (Opts.unroll_max_percent_threshold_boost)
146 UP.MaxPercentThresholdBoost = *Opts.unroll_max_percent_threshold_boost;
147 if (Opts.unroll_max_count)
148 UP.MaxCount = *Opts.unroll_max_count;
149 if (Opts.unroll_max_upperbound)
150 UP.MaxUpperBound = *Opts.unroll_max_upperbound;
151 if (Opts.unroll_full_max_count)
152 UP.FullUnrollMaxCount = *Opts.unroll_full_max_count;
153 UP.Partial = valueOr(Opts.unroll_allow_partial, UP.Partial);
154 UP.AllowRemainder = valueOr(Opts.unroll_allow_remainder, UP.AllowRemainder);
155 UP.Runtime = valueOr(Opts.unroll_runtime, UP.Runtime);
156 if (Opts.unroll_max_upperbound == 0)
157 UP.UpperBound = false;
158 UP.UnrollRemainder = valueOr(Opts.unroll_remainder, UP.UnrollRemainder);
159 if (Opts.unroll_max_iteration_count_to_analyze)
161 *Opts.unroll_max_iteration_count_to_analyze;
162
163 // Apply user values provided by argument
164 if (UserThreshold) {
165 UP.Threshold = *UserThreshold;
166 UP.PartialThreshold = *UserThreshold;
167 }
168 if (UserAllowPartial)
169 UP.Partial = *UserAllowPartial;
170 if (UserRuntime)
171 UP.Runtime = *UserRuntime;
172 if (UserUpperBound)
173 UP.UpperBound = *UserUpperBound;
174 if (UserFullUnrollMaxCount)
175 UP.FullUnrollMaxCount = *UserFullUnrollMaxCount;
176
177 return UP;
178}
179
180namespace {
181
182/// A struct to densely store the state of an instruction after unrolling at
183/// each iteration.
184///
185/// This is designed to work like a tuple of <Instruction *, int> for the
186/// purposes of hashing and lookup, but to be able to associate two boolean
187/// states with each key.
188struct UnrolledInstState {
189 Instruction *I;
190 int Iteration : 30;
191 unsigned IsFree : 1;
192 unsigned IsCounted : 1;
193};
194
195/// Hashing and equality testing for a set of the instruction states.
196struct UnrolledInstStateKeyInfo {
197 using PairInfo = DenseMapInfo<std::pair<Instruction *, int>>;
198
199 static inline unsigned getHashValue(const UnrolledInstState &S) {
200 return PairInfo::getHashValue({S.I, S.Iteration});
201 }
202
203 static inline bool isEqual(const UnrolledInstState &LHS,
204 const UnrolledInstState &RHS) {
205 return PairInfo::isEqual({LHS.I, LHS.Iteration}, {RHS.I, RHS.Iteration});
206 }
207};
208
209struct EstimatedUnrollCost {
210 /// The estimated cost after unrolling.
211 unsigned UnrolledCost;
212
213 /// The estimated dynamic cost of executing the instructions in the
214 /// rolled form.
215 unsigned RolledDynamicCost;
216};
217
218} // end anonymous namespace
219
220/// Figure out if the loop is worth full unrolling.
221///
222/// Complete loop unrolling can make some loads constant, and we need to know
223/// if that would expose any further optimization opportunities. This routine
224/// estimates this optimization. It computes cost of unrolled loop
225/// (UnrolledCost) and dynamic cost of the original loop (RolledDynamicCost). By
226/// dynamic cost we mean that we won't count costs of blocks that are known not
227/// to be executed (i.e. if we have a branch in the loop and we know that at the
228/// given iteration its condition would be resolved to true, we won't add up the
229/// cost of the 'false'-block).
230/// \returns Optional value, holding the RolledDynamicCost and UnrolledCost. If
231/// the analysis failed (no benefits expected from the unrolling, or the loop is
232/// too big to analyze), the returned value is std::nullopt.
233static std::optional<EstimatedUnrollCost> analyzeLoopUnrollCost(
234 const Loop *L, unsigned TripCount, DominatorTree &DT, ScalarEvolution &SE,
235 const SmallPtrSetImpl<const Value *> &EphValues,
236 const TargetTransformInfo &TTI, unsigned MaxUnrolledLoopSize,
237 unsigned MaxIterationsCountToAnalyze) {
238 // We want to be able to scale offsets by the trip count and add more offsets
239 // to them without checking for overflows, and we already don't want to
240 // analyze *massive* trip counts, so we force the max to be reasonably small.
241 assert(MaxIterationsCountToAnalyze <
242 (unsigned)(std::numeric_limits<int>::max() / 2) &&
243 "The unroll iterations max is too large!");
244
245 // Only analyze inner loops. We can't properly estimate cost of nested loops
246 // and we won't visit inner loops again anyway.
247 if (!L->isInnermost()) {
249 << "Not analyzing loop cost: not an innermost loop.\n");
250 return std::nullopt;
251 }
252
253 // Don't simulate loops with a big or unknown tripcount
254 if (!TripCount || TripCount > MaxIterationsCountToAnalyze) {
256 << "Not analyzing loop cost: trip count "
257 << (TripCount ? "too large" : "unknown") << ".\n");
258 return std::nullopt;
259 }
260
263 DenseMap<Value *, Value *> SimplifiedValues;
264 SmallVector<std::pair<Value *, Value *>, 4> SimplifiedInputValues;
265
266 // The estimated cost of the unrolled form of the loop. We try to estimate
267 // this by simplifying as much as we can while computing the estimate.
268 InstructionCost UnrolledCost = 0;
269
270 // We also track the estimated dynamic (that is, actually executed) cost in
271 // the rolled form. This helps identify cases when the savings from unrolling
272 // aren't just exposing dead control flows, but actual reduced dynamic
273 // instructions due to the simplifications which we expect to occur after
274 // unrolling.
275 InstructionCost RolledDynamicCost = 0;
276
277 // We track the simplification of each instruction in each iteration. We use
278 // this to recursively merge costs into the unrolled cost on-demand so that
279 // we don't count the cost of any dead code. This is essentially a map from
280 // <instruction, int> to <bool, bool>, but stored as a densely packed struct.
282
283 // A small worklist used to accumulate cost of instructions from each
284 // observable and reached root in the loop.
286
287 // PHI-used worklist used between iterations while accumulating cost.
289
290 // Helper function to accumulate cost for instructions in the loop.
291 auto AddCostRecursively = [&](Instruction &RootI, int Iteration) {
292 assert(Iteration >= 0 && "Cannot have a negative iteration!");
293 assert(CostWorklist.empty() && "Must start with an empty cost list");
294 assert(PHIUsedList.empty() && "Must start with an empty phi used list");
295 CostWorklist.push_back(&RootI);
297 RootI.getFunction()->hasMinSize() ?
300 for (;; --Iteration) {
301 do {
302 Instruction *I = CostWorklist.pop_back_val();
303
304 // InstCostMap only uses I and Iteration as a key, the other two values
305 // don't matter here.
306 auto CostIter = InstCostMap.find({I, Iteration, 0, 0});
307 if (CostIter == InstCostMap.end())
308 // If an input to a PHI node comes from a dead path through the loop
309 // we may have no cost data for it here. What that actually means is
310 // that it is free.
311 continue;
312 auto &Cost = *CostIter;
313 if (Cost.IsCounted)
314 // Already counted this instruction.
315 continue;
316
317 // Mark that we are counting the cost of this instruction now.
318 Cost.IsCounted = true;
319
320 // If this is a PHI node in the loop header, just add it to the PHI set.
321 if (auto *PhiI = dyn_cast<PHINode>(I))
322 if (PhiI->getParent() == L->getHeader()) {
323 assert(Cost.IsFree && "Loop PHIs shouldn't be evaluated as they "
324 "inherently simplify during unrolling.");
325 if (Iteration == 0)
326 continue;
327
328 // Push the incoming value from the backedge into the PHI used list
329 // if it is an in-loop instruction. We'll use this to populate the
330 // cost worklist for the next iteration (as we count backwards).
331 if (auto *OpI = dyn_cast<Instruction>(
332 PhiI->getIncomingValueForBlock(L->getLoopLatch())))
333 if (L->contains(OpI))
334 PHIUsedList.push_back(OpI);
335 continue;
336 }
337
338 // First accumulate the cost of this instruction.
339 if (!Cost.IsFree) {
340 // Consider simplified operands in instruction cost.
342 transform(I->operands(), std::back_inserter(Operands),
343 [&](Value *Op) {
344 if (auto Res = SimplifiedValues.lookup(Op))
345 return Res;
346 return Op;
347 });
348 UnrolledCost += TTI.getInstructionCost(I, Operands, CostKind);
350 << "Adding cost of instruction (iteration " << Iteration
351 << "): ");
352 LLVM_DEBUG(I->dump());
353 }
354
355 // We must count the cost of every operand which is not free,
356 // recursively. If we reach a loop PHI node, simply add it to the set
357 // to be considered on the next iteration (backwards!).
358 for (Value *Op : I->operands()) {
359 // Check whether this operand is free due to being a constant or
360 // outside the loop.
361 auto *OpI = dyn_cast<Instruction>(Op);
362 if (!OpI || !L->contains(OpI))
363 continue;
364
365 // Otherwise accumulate its cost.
366 CostWorklist.push_back(OpI);
367 }
368 } while (!CostWorklist.empty());
369
370 if (PHIUsedList.empty())
371 // We've exhausted the search.
372 break;
373
374 assert(Iteration > 0 &&
375 "Cannot track PHI-used values past the first iteration!");
376 CostWorklist.append(PHIUsedList.begin(), PHIUsedList.end());
377 PHIUsedList.clear();
378 }
379 };
380
381 // Ensure that we don't violate the loop structure invariants relied on by
382 // this analysis.
383 assert(L->isLoopSimplifyForm() && "Must put loop into normal form first.");
384 assert(L->isLCSSAForm(DT) &&
385 "Must have loops in LCSSA form to track live-out values.");
386
388 << "Starting LoopUnroll profitability analysis...\n");
389
391 L->getHeader()->getParent()->hasMinSize() ?
393 // Simulate execution of each iteration of the loop counting instructions,
394 // which would be simplified.
395 // Since the same load will take different values on different iterations,
396 // we literally have to go through all loop's iterations.
397 for (unsigned Iteration = 0; Iteration < TripCount; ++Iteration) {
398 LLVM_DEBUG(dbgs().indent(3) << "Analyzing iteration " << Iteration << "\n");
399
400 // Prepare for the iteration by collecting any simplified entry or backedge
401 // inputs.
402 for (Instruction &I : *L->getHeader()) {
403 auto *PHI = dyn_cast<PHINode>(&I);
404 if (!PHI)
405 break;
406
407 // The loop header PHI nodes must have exactly two input: one from the
408 // loop preheader and one from the loop latch.
409 assert(
410 PHI->getNumIncomingValues() == 2 &&
411 "Must have an incoming value only for the preheader and the latch.");
412
413 Value *V = PHI->getIncomingValueForBlock(
414 Iteration == 0 ? L->getLoopPreheader() : L->getLoopLatch());
415 if (Iteration != 0 && SimplifiedValues.contains(V))
416 V = SimplifiedValues.lookup(V);
417 SimplifiedInputValues.push_back({PHI, V});
418 }
419
420 // Now clear and re-populate the map for the next iteration.
421 SimplifiedValues.clear();
422 while (!SimplifiedInputValues.empty())
423 SimplifiedValues.insert(SimplifiedInputValues.pop_back_val());
424
425 UnrolledInstAnalyzer Analyzer(Iteration, SimplifiedValues, SE, L);
426
427 BBWorklist.clear();
428 BBWorklist.insert(L->getHeader());
429 // Note that we *must not* cache the size, this loop grows the worklist.
430 for (unsigned Idx = 0; Idx != BBWorklist.size(); ++Idx) {
431 BasicBlock *BB = BBWorklist[Idx];
432
433 // Visit all instructions in the given basic block and try to simplify
434 // it. We don't change the actual IR, just count optimization
435 // opportunities.
436 for (Instruction &I : *BB) {
437 // These won't get into the final code - don't even try calculating the
438 // cost for them.
439 if (EphValues.contains(&I))
440 continue;
441
442 // Track this instruction's expected baseline cost when executing the
443 // rolled loop form.
444 RolledDynamicCost += TTI.getInstructionCost(&I, CostKind);
445
446 // Visit the instruction to analyze its loop cost after unrolling,
447 // and if the visitor returns true, mark the instruction as free after
448 // unrolling and continue.
449 bool IsFree = Analyzer.visit(I);
450 bool Inserted = InstCostMap.insert({&I, (int)Iteration,
451 (unsigned)IsFree,
452 /*IsCounted*/ false}).second;
453 (void)Inserted;
454 assert(Inserted && "Cannot have a state for an unvisited instruction!");
455
456 if (IsFree)
457 continue;
458
459 // Can't properly model a cost of a call.
460 // FIXME: With a proper cost model we should be able to do it.
461 if (auto *CI = dyn_cast<CallInst>(&I)) {
462 const Function *Callee = CI->getCalledFunction();
463 if (!Callee || TTI.isLoweredToCall(Callee)) {
465 << "Can't analyze cost of loop with call\n");
466 return std::nullopt;
467 }
468 }
469
470 // If the instruction might have a side-effect recursively account for
471 // the cost of it and all the instructions leading up to it.
472 if (I.mayHaveSideEffects())
473 AddCostRecursively(I, Iteration);
474
475 // If unrolled body turns out to be too big, bail out.
476 if (UnrolledCost > MaxUnrolledLoopSize) {
477 LLVM_DEBUG({
478 dbgs().indent(3) << "Exceeded threshold.. exiting.\n";
479 dbgs().indent(3)
480 << "UnrolledCost: " << UnrolledCost
481 << ", MaxUnrolledLoopSize: " << MaxUnrolledLoopSize << "\n";
482 });
483 return std::nullopt;
484 }
485 }
486
487 Instruction *TI = BB->getTerminator();
488
489 auto getSimplifiedConstant = [&](Value *V) -> Constant * {
490 if (SimplifiedValues.contains(V))
491 V = SimplifiedValues.lookup(V);
492 return dyn_cast<Constant>(V);
493 };
494
495 // Add in the live successors by first checking whether we have terminator
496 // that may be simplified based on the values simplified by this call.
497 BasicBlock *KnownSucc = nullptr;
498 if (CondBrInst *BI = dyn_cast<CondBrInst>(TI)) {
499 if (auto *SimpleCond = getSimplifiedConstant(BI->getCondition())) {
500 // Just take the first successor if condition is undef
501 if (isa<UndefValue>(SimpleCond))
502 KnownSucc = BI->getSuccessor(0);
503 else if (ConstantInt *SimpleCondVal =
504 dyn_cast<ConstantInt>(SimpleCond))
505 KnownSucc = BI->getSuccessor(SimpleCondVal->isZero() ? 1 : 0);
506 }
507 } else if (SwitchInst *SI = dyn_cast<SwitchInst>(TI)) {
508 if (auto *SimpleCond = getSimplifiedConstant(SI->getCondition())) {
509 // Just take the first successor if condition is undef
510 if (isa<UndefValue>(SimpleCond))
511 KnownSucc = SI->getSuccessor(0);
512 else if (ConstantInt *SimpleCondVal =
513 dyn_cast<ConstantInt>(SimpleCond))
514 KnownSucc = SI->findCaseValue(SimpleCondVal)->getCaseSuccessor();
515 }
516 }
517 if (KnownSucc) {
518 if (L->contains(KnownSucc))
519 BBWorklist.insert(KnownSucc);
520 else
521 ExitWorklist.insert({BB, KnownSucc});
522 continue;
523 }
524
525 // Add BB's successors to the worklist.
526 for (BasicBlock *Succ : successors(BB))
527 if (L->contains(Succ))
528 BBWorklist.insert(Succ);
529 else
530 ExitWorklist.insert({BB, Succ});
531 AddCostRecursively(*TI, Iteration);
532 }
533
534 // If we found no optimization opportunities on the first iteration, we
535 // won't find them on later ones too.
536 if (UnrolledCost == RolledDynamicCost) {
537 LLVM_DEBUG({
538 dbgs().indent(3) << "No opportunities found.. exiting.\n";
539 dbgs().indent(3) << "UnrolledCost: " << UnrolledCost << "\n";
540 });
541 return std::nullopt;
542 }
543 }
544
545 while (!ExitWorklist.empty()) {
546 BasicBlock *ExitingBB, *ExitBB;
547 std::tie(ExitingBB, ExitBB) = ExitWorklist.pop_back_val();
548
549 for (Instruction &I : *ExitBB) {
550 auto *PN = dyn_cast<PHINode>(&I);
551 if (!PN)
552 break;
553
554 Value *Op = PN->getIncomingValueForBlock(ExitingBB);
555 if (auto *OpI = dyn_cast<Instruction>(Op))
556 if (L->contains(OpI))
557 AddCostRecursively(*OpI, TripCount - 1);
558 }
559 }
560
561 assert(UnrolledCost.isValid() && RolledDynamicCost.isValid() &&
562 "All instructions must have a valid cost, whether the "
563 "loop is rolled or unrolled.");
564
565 LLVM_DEBUG({
566 dbgs().indent(3) << "Analysis finished:\n";
567 dbgs().indent(3) << "UnrolledCost: " << UnrolledCost
568 << ", RolledDynamicCost: " << RolledDynamicCost << "\n";
569 });
570 return {{unsigned(UnrolledCost.getValue()),
571 unsigned(RolledDynamicCost.getValue())}};
572}
573
575 const Loop *L, const TargetTransformInfo &TTI,
576 const SmallPtrSetImpl<const Value *> &EphValues, unsigned BEInsns,
577 bool PrepareForLTO, bool TripCountIsUniform) {
579 for (BasicBlock *BB : L->blocks())
580 Metrics.analyzeBasicBlock(BB, TTI, EphValues, PrepareForLTO, L);
581 NumInlineCandidates = Metrics.NumInlineCandidates;
582 NotDuplicatable = Metrics.notDuplicatable;
583 Convergence = Metrics.Convergence;
584 LoopSize = Metrics.NumInsts;
585 // Convergent operations make the remainder prelude unsafe by adding a
586 // control-flow dependency, unless the trip count is uniform per
587 // UniformityInfo, in which case all paths agree and the remainder is safe.
589 (Metrics.Convergence != ConvergenceKind::Uncontrolled &&
591 TripCountIsUniform;
592
593 // Don't allow an estimate of size zero. This would allows unrolling of loops
594 // with huge iteration counts, which is a compile time problem even if it's
595 // not a problem for code quality. Also, the code using this size may assume
596 // that each loop has at least three instructions (likely a conditional
597 // branch, a comparison feeding that branch, and some kind of loop increment
598 // feeding that comparison instruction).
599 if (LoopSize.isValid() && LoopSize < BEInsns + 1)
600 // This is an open coded max() on InstructionCost
601 LoopSize = BEInsns + 1;
602}
603
605 const Loop *L) const {
606 auto ReportCannotUnroll = [&](StringRef Reason) {
607 LLVM_DEBUG(dbgs().indent(1) << "Not unrolling: " << Reason << ".\n");
608 if (ORE && L)
609 ORE->emit([&]() {
610 return OptimizationRemarkMissed(DEBUG_TYPE, "CannotUnrollLoop",
611 L->getStartLoc(), L->getHeader())
612 << "unable to unroll loop: " << Reason;
613 });
614 };
615
617 ReportCannotUnroll("contains convergent operations");
618 return false;
619 }
620 if (!LoopSize.isValid()) {
621 ReportCannotUnroll("loop size could not be computed");
622 return false;
623 }
624 if (NotDuplicatable) {
625 ReportCannotUnroll("contains non-duplicatable instructions");
626 return false;
627 }
628 return true;
629}
630
632 const TargetTransformInfo::UnrollingPreferences &UP, unsigned Count) const {
633 unsigned LS = LoopSize.getValue();
634 assert(LS >= UP.BEInsns && "LoopSize should not be less than BEInsns!");
635 return static_cast<uint64_t>(LS - UP.BEInsns) * Count + UP.BEInsns;
636}
637
638// Returns true if the loop has an unroll(full) pragma.
639static bool hasUnrollFullPragma(const Loop *L) {
640 return getUnrollMetadataForLoop(L, "llvm.loop.unroll.full");
641}
642
643// Returns true if the loop has an unroll(enable) pragma. This metadata is used
644// for both "#pragma unroll" and "#pragma clang loop unroll(enable)" directives.
645static bool hasUnrollEnablePragma(const Loop *L) {
646 return getUnrollMetadataForLoop(L, "llvm.loop.unroll.enable");
647}
648
649// Returns true if the loop has a runtime unroll(disable) pragma.
650static bool hasRuntimeUnrollDisablePragma(const Loop *L) {
651 return getUnrollMetadataForLoop(L, "llvm.loop.unroll.runtime.disable");
652}
653
654/// Returns true if the SCEV expression is uniform, i.e., all threads in a
655/// convergent execution agree on its value. Recursively checks operands.
656/// Returns false if the SCEV could not be computed.
657static bool isSCEVUniform(const SCEV *S, UniformityInfo &UI) {
659 return false;
660 if (isa<SCEVConstant>(S))
661 return true;
662 if (auto *U = dyn_cast<SCEVUnknown>(S))
663 return UI.isUniformAtDef(U->getValue());
664 for (const SCEV *Op : S->operands()) {
665 if (!isSCEVUniform(Op, UI))
666 return false;
667 }
668 return true;
669}
670
671// If loop has an unroll_count pragma return the (necessarily
672// positive) value from the pragma. Otherwise return 0.
673static unsigned unrollCountPragmaValue(const Loop *L) {
674 MDNode *MD = getUnrollMetadataForLoop(L, "llvm.loop.unroll.count");
675 if (MD) {
676 assert(MD->getNumOperands() == 2 &&
677 "Unroll count hint metadata should have two operands.");
678 unsigned Count =
679 mdconst::extract<ConstantInt>(MD->getOperand(1))->getZExtValue();
680 assert(Count >= 1 && "Unroll count must be positive.");
681 return Count;
682 }
683 return 0;
684}
685
694
695// Computes the boosting factor for complete unrolling.
696// If fully unrolling the loop would save a lot of RolledDynamicCost, it would
697// be beneficial to fully unroll the loop even if unrolledcost is large. We
698// use (RolledDynamicCost / UnrolledCost) to model the unroll benefits to adjust
699// the unroll threshold.
700static unsigned getFullUnrollBoostingFactor(const EstimatedUnrollCost &Cost,
701 unsigned MaxPercentThresholdBoost) {
702 if (Cost.RolledDynamicCost >= std::numeric_limits<unsigned>::max() / 100)
703 return 100;
704 else if (Cost.UnrolledCost != 0)
705 // The boosting factor is RolledDynamicCost / UnrolledCost
706 return std::min(100 * Cost.RolledDynamicCost / Cost.UnrolledCost,
707 MaxPercentThresholdBoost);
708 else
709 return MaxPercentThresholdBoost;
710}
711
712static std::optional<unsigned>
713shouldPragmaUnroll(const ScalarOptions &Opts, Loop *L,
714 const UnrollPragmaInfo &PInfo, const unsigned TripMultiple,
715 const unsigned TripCount, unsigned MaxTripCount,
716 const UnrollCostEstimator UCE,
719
720 // Using unroll pragma
721 // 1st priority is unroll count set by "unroll-count" option.
722
723 if (PInfo.UserUnrollCount) {
724 if (UP.AllowRemainder &&
725 UCE.getUnrolledLoopSize(UP, *Opts.unroll_count) < UP.Threshold) {
726 LLVM_DEBUG(dbgs().indent(2) << "Unrolling with user-specified count: "
727 << *Opts.unroll_count << ".\n");
728 return *Opts.unroll_count;
729 }
731 << "Not unrolling with user count " << *Opts.unroll_count << ": "
732 << (UP.AllowRemainder ? "exceeds threshold"
733 : "remainder not allowed")
734 << ".\n");
735 }
736
737 // 2nd priority is unroll count set by pragma.
738 if (PInfo.PragmaCount > 0) {
739 if ((UP.AllowRemainder || (TripMultiple % PInfo.PragmaCount == 0))) {
740 LLVM_DEBUG(dbgs().indent(2) << "Unrolling with pragma count: "
741 << PInfo.PragmaCount << ".\n");
742 return PInfo.PragmaCount;
743 }
745 << "Not unrolling with pragma count " << PInfo.PragmaCount
746 << ": remainder not allowed, count does not divide trip "
747 << "multiple " << TripMultiple << ".\n");
748 ORE->emit([&]() {
749 return OptimizationRemarkAnalysis(DEBUG_TYPE, "PragmaUnrollCountRejected",
750 L->getStartLoc(), L->getHeader())
751 << "may be unable to unroll loop with count "
752 << ore::NV("PragmaCount", PInfo.PragmaCount)
753 << ": remainder loop is not allowed and count does not divide "
754 "trip multiple "
755 << ore::NV("TripMultiple", TripMultiple);
756 });
757 }
758
759 if (PInfo.PragmaFullUnroll) {
760 if (TripCount != 0) {
761 // Certain cases with UBSAN can cause trip count to be calculated as
762 // INT_MAX, Block full unrolling at a reasonable limit so that the
763 // compiler doesn't hang trying to unroll the loop. See PR77842
764 if (TripCount > Opts.pragma_unroll_full_max_iterations) {
766 << "Won't unroll; trip count is too large.\n");
767 ORE->emit([&]() {
769 "PragmaFullUnrollTripCountTooLarge",
770 L->getStartLoc(), L->getHeader())
771 << "may be unable to fully unroll loop: trip count "
772 << ore::NV("TripCount", TripCount) << " exceeds limit "
773 << ore::NV("Limit", Opts.pragma_unroll_full_max_iterations);
774 });
775 return std::nullopt;
776 }
777
779 << "Fully unrolling with trip count: " << TripCount << ".\n");
780 return TripCount;
781 }
783 << "Not fully unrolling: unknown trip count.\n");
784 ORE->emit([&]() {
786 "PragmaFullUnrollUnknownTripCount",
787 L->getStartLoc(), L->getHeader())
788 << "may be unable to fully unroll loop: trip count is unknown";
789 });
790 }
791
792 if (PInfo.PragmaEnableUnroll && !TripCount && MaxTripCount &&
793 MaxTripCount <= UP.MaxUpperBound) {
795 << "Unrolling with max trip count: " << MaxTripCount << ".\n");
796 return MaxTripCount;
797 }
798
799 return std::nullopt;
800}
801
802static std::optional<unsigned> shouldFullUnroll(
805 const unsigned FullUnrollTripCount, const UnrollCostEstimator UCE,
807 assert(FullUnrollTripCount && "should be non-zero!");
808
809 if (FullUnrollTripCount > UP.FullUnrollMaxCount) {
811 << "Not unrolling: trip count " << FullUnrollTripCount
812 << " exceeds max count " << UP.FullUnrollMaxCount << ".\n");
813 return std::nullopt;
814 }
815
816 // When computing the unrolled size, note that BEInsns are not replicated
817 // like the rest of the loop body.
818 uint64_t UnrolledSize = UCE.getUnrolledLoopSize(UP, FullUnrollTripCount);
819 if (UnrolledSize < UP.Threshold) {
820 LLVM_DEBUG(dbgs().indent(2) << "Unrolling: size " << UnrolledSize
821 << " < threshold " << UP.Threshold << ".\n");
822 return FullUnrollTripCount;
823 }
824
826 << "Unrolled size " << UnrolledSize << " exceeds threshold "
827 << UP.Threshold << "; checking for cost benefit.\n");
828
829 // The loop isn't that small, but we still can fully unroll it if that
830 // helps to remove a significant number of instructions.
831 // To check that, run additional analysis on the loop.
832 if (std::optional<EstimatedUnrollCost> Cost = analyzeLoopUnrollCost(
833 L, FullUnrollTripCount, DT, SE, EphValues, TTI,
836 unsigned Boost =
838 unsigned BoostedThreshold = UP.Threshold * Boost / 100;
839 if (Cost->UnrolledCost < BoostedThreshold) {
840 LLVM_DEBUG(dbgs().indent(2) << "Profitable after cost analysis.\n");
841 return FullUnrollTripCount;
842 }
844 << "Not unrolling: cost " << Cost->UnrolledCost
845 << " >= boosted threshold " << BoostedThreshold << ".\n");
846 }
847
848 return std::nullopt;
849}
850
851static std::optional<unsigned>
852shouldPartialUnroll(const unsigned LoopSize, const unsigned TripCount,
853 const UnrollCostEstimator UCE,
855
856 if (!TripCount)
857 return std::nullopt;
858
859 if (!UP.Partial) {
860 LLVM_DEBUG(dbgs().indent(2) << "Will not try to unroll partially because "
861 << "-unroll-allow-partial not given\n");
862 return 0;
863 }
864 unsigned Count = TripCount;
865 if (UP.PartialThreshold != NoThreshold) {
866 // Reduce unroll count to be modulo of TripCount for partial unrolling.
867 if (UCE.getUnrolledLoopSize(UP, Count) > UP.PartialThreshold) {
868 unsigned NewCount =
869 (std::max(UP.PartialThreshold, UP.BEInsns + 1) - UP.BEInsns) /
870 (LoopSize - UP.BEInsns);
872 << "Unrolled size exceeds threshold; reducing count "
873 << "from " << Count << " to " << NewCount << ".\n");
874 Count = NewCount;
875 }
876 if (Count > UP.MaxCount)
877 Count = UP.MaxCount;
878 while (Count != 0 && TripCount % Count != 0)
879 Count--;
880 if (UP.AllowRemainder && Count <= 1) {
881 // If there is no Count that is modulo of TripCount, set Count to
882 // largest power-of-two factor that satisfies the threshold limit.
883 // As we'll create fixup loop, do the type of unrolling only if
884 // remainder loop is allowed.
885 // Note: DefaultUnrollRuntimeCount is used as a reasonable starting point
886 // even though this is partial unrolling (not runtime unrolling).
888 while (Count != 0 &&
890 Count >>= 1;
891 }
892 if (Count < 2) {
894 << "Will not partially unroll: no profitable count.\n");
895 Count = 0;
896 }
897 } else {
898 Count = TripCount;
899 }
900 if (Count > UP.MaxCount)
901 Count = UP.MaxCount;
902
904 << "Partially unrolling with count: " << Count << "\n");
905
906 return Count;
907}
908
909static unsigned
910shouldRuntimeUnroll(Loop *L, unsigned MaxTripCount, unsigned TripMultiple,
911 const UnrollCostEstimator &UCE,
912 const UnrollPragmaInfo &PInfo, const ScalarOptions &Opts,
914 // Don't unroll a runtime trip count loop when it is disabled.
915 if (PInfo.PragmaRuntimeUnrollDisable) {
917 << "Not runtime unrolling: disabled by pragma.\n");
918 return 0;
919 }
920
921 // Don't unroll a small upper bound loop unless user or TTI asked to do so.
922 if (MaxTripCount && !UP.Force && MaxTripCount <= UP.MaxUpperBound) {
923 LLVM_DEBUG(dbgs().indent(2) << "Not runtime unrolling: max trip count "
924 << MaxTripCount << " is small (<= "
925 << UP.MaxUpperBound << ") and not forced.\n");
926 return 0;
927 }
928
929 // Check if the runtime trip count is too small when profile is available.
930 if (L->getHeader()->getParent()->hasProfileData()) {
931 if (auto ProfileTripCount = getLoopEstimatedTripCount(L)) {
932 if (*ProfileTripCount < Opts.flat_loop_tripcount_threshold)
933 return 0;
934 else
935 UP.AllowExpensiveTripCount = true;
936 }
937 }
938 if (!UP.Runtime) {
940 << "Will not try to unroll loop with runtime trip count "
941 << "because -unroll-runtime not given\n");
942 return 0;
943 }
944
945 unsigned Count = UP.DefaultUnrollRuntimeCount;
946
947 // Reduce unroll count to be the largest power-of-two factor of
948 // the original count which satisfies the threshold limit.
949 while (Count != 0 && UCE.getUnrolledLoopSize(UP, Count) > UP.PartialThreshold)
950 Count >>= 1;
951
952#ifndef NDEBUG
953 unsigned OrigCount = Count;
954#endif
955
956 if (!UP.AllowRemainder && Count != 0 && (TripMultiple % Count) != 0) {
957 while (Count != 0 && TripMultiple % Count != 0)
958 Count >>= 1;
960 << "Remainder loop is restricted (that could be architecture "
961 "specific or because the loop contains a convergent "
962 "instruction), so unroll count must divide the trip "
963 "multiple, "
964 << TripMultiple << ". Reducing unroll count from " << OrigCount
965 << " to " << Count << ".\n");
966 }
967
968 if (Count > UP.MaxCount)
969 Count = UP.MaxCount;
970
971 if (MaxTripCount && Count > MaxTripCount)
972 Count = MaxTripCount;
973
974 if (Count < 2)
975 Count = 0;
976 else
978 << "Runtime unrolling with count: " << Count << "\n");
979 return Count;
980}
981
982// Calculates and returns the unroll count, using metadata and command-line
983// options that are specific to the LoopUnroll pass (which, for instance, are
984// irrelevant for the LoopUnrollAndJam pass).
985// FIXME: This function is used by LoopUnroll and LoopUnrollAndJam, but consumes
986// many LoopUnroll-specific options. The shared functionality should be
987// refactored into it own function.
991 const SmallPtrSetImpl<const Value *> &EphValues,
992 OptimizationRemarkEmitter *ORE, const unsigned TripCount,
993 const unsigned MaxTripCount, const bool MaxOrZero,
994 const unsigned TripMultiple, const UnrollCostEstimator &UCE,
997 const ScalarOptions &Opts = getScalarOptions(*L);
998
999 unsigned LoopSize = UCE.getRolledLoopSize();
1000
1001 LLVM_DEBUG(dbgs().indent(1) << "Computing unroll count: TripCount="
1002 << TripCount << ", MaxTripCount=" << MaxTripCount
1003 << (MaxOrZero ? " (MaxOrZero)" : "")
1004 << ", TripMultiple=" << TripMultiple << "\n");
1005
1006 UnrollPragmaInfo PInfo(L);
1007 LLVM_DEBUG({
1008 if (PInfo.ExplicitUnroll) {
1009 dbgs().indent(1) << "Explicit unroll requested:";
1010 if (PInfo.UserUnrollCount)
1011 dbgs() << " user-count";
1012 if (PInfo.PragmaFullUnroll)
1013 dbgs() << " pragma-full";
1014 if (PInfo.PragmaCount > 0)
1015 dbgs() << " pragma-count(" << PInfo.PragmaCount << ")";
1016 if (PInfo.PragmaEnableUnroll)
1017 dbgs() << " pragma-enable";
1018 dbgs() << "\n";
1019 }
1020 });
1021
1022 // Use an explicit peel count that has been specified for testing. In this
1023 // case it's not permitted to also specify an explicit unroll count.
1024 if (PP.PeelCount) {
1025 if (Opts.unroll_count) {
1026 reportFatalUsageError("Cannot specify both explicit peel count and "
1027 "explicit unroll count");
1028 }
1030 << "Using explicit peel count: " << PP.PeelCount << ".\n");
1031 UP.Runtime = false;
1032 return 1;
1033 }
1034
1035 // If a user provided an explicit unroll pragma (with or without count),
1036 // enable runtime unrolling and override expensive trip count checks.
1037 if (PInfo.PragmaEnableUnroll || PInfo.PragmaCount > 0) {
1038 UP.AllowExpensiveTripCount = true;
1039 UP.Runtime = true;
1040 }
1041
1042 // Check for an explicit unroll count.
1043 // 1st priority is unroll count set by "unroll-count" option.
1044 // 2nd priority is unroll count set by pragma.
1045 LLVM_DEBUG(dbgs().indent(1) << "Trying pragma unroll...\n");
1046 if (auto UnrollFactor =
1047 shouldPragmaUnroll(Opts, L, PInfo, TripMultiple, TripCount,
1048 MaxTripCount, UCE, UP, ORE)) {
1049 if (PInfo.UserUnrollCount || (PInfo.PragmaCount > 0)) {
1050 UP.AllowExpensiveTripCount = true;
1051 UP.Force = true;
1052 }
1053 return *UnrollFactor;
1054 } else {
1055 if (PInfo.ExplicitUnroll && TripCount != 0) {
1056 // If the loop has an unrolling pragma, we want to be more aggressive with
1057 // unrolling limits. Set thresholds to at least the PragmaUnrollThreshold
1058 // value which is larger than the default limits.
1059 UP.Threshold = std::max(UP.Threshold, Opts.pragma_unroll_threshold);
1060 UP.PartialThreshold =
1061 std::max(UP.PartialThreshold, Opts.pragma_unroll_threshold);
1062 }
1063 }
1064
1065 // 3rd priority is exact full unrolling. This will eliminate all copies
1066 // of some exit test.
1067 LLVM_DEBUG(dbgs().indent(1) << "Trying full unroll...\n");
1068 if (TripCount) {
1069 if (auto UnrollFactor =
1070 shouldFullUnroll(L, TTI, DT, SE, EphValues, TripCount, UCE, UP))
1071 return *UnrollFactor;
1072 }
1073
1074 // 4th priority is bounded unrolling.
1075 // We can unroll by the upper bound amount if it's generally allowed or if
1076 // we know that the loop is executed either the upper bound or zero times.
1077 // (MaxOrZero unrolling keeps only the first loop test, so the number of
1078 // loop tests remains the same compared to the non-unrolled version, whereas
1079 // the generic upper bound unrolling keeps all but the last loop test so the
1080 // number of loop tests goes up which may end up being worse on targets with
1081 // constrained branch predictor resources so is controlled by an option.)
1082 // In addition we only unroll small upper bounds.
1083 // Note that the cost of bounded unrolling is always strictly greater than
1084 // cost of exact full unrolling. As such, if we have an exact count and
1085 // found it unprofitable, we'll never chose to bounded unroll.
1086 LLVM_DEBUG(dbgs().indent(1) << "Trying upper-bound unroll...\n");
1087 if (!TripCount && MaxTripCount && (UP.UpperBound || MaxOrZero) &&
1088 MaxTripCount <= UP.MaxUpperBound) {
1089 if (auto UnrollFactor =
1090 shouldFullUnroll(L, TTI, DT, SE, EphValues, MaxTripCount, UCE, UP))
1091 return *UnrollFactor;
1092 }
1093
1094 // 5th priority is loop peeling.
1095 LLVM_DEBUG(dbgs().indent(1) << "Trying loop peeling...\n");
1096 computePeelCount(L, LoopSize, PP, TripCount, DT, SE, TTI, AC, UP.Threshold);
1097 if (PP.PeelCount) {
1099 << "Peeling with count: " << PP.PeelCount << ".\n");
1100 UP.Runtime = false;
1101 return 1;
1102 }
1103
1104 // Before starting partial unrolling, set UP.Partial to true,
1105 // if user explicitly asked for unrolling.
1106 if (TripCount)
1107 UP.Partial |= PInfo.ExplicitUnroll;
1108
1109 // 6th priority is partial unrolling.
1110 // Try partial unroll only when TripCount could be statically calculated.
1111 LLVM_DEBUG(dbgs().indent(1) << "Trying partial unroll...\n");
1112 if (auto UnrollFactor = shouldPartialUnroll(LoopSize, TripCount, UCE, UP))
1113 return *UnrollFactor;
1114 assert(TripCount == 0 &&
1115 "All cases when TripCount is constant should be covered here.");
1116
1117 // 7th priority is runtime unrolling.
1118 LLVM_DEBUG(dbgs().indent(1) << "Trying runtime unroll...\n");
1119 return shouldRuntimeUnroll(L, MaxTripCount, TripMultiple, UCE, PInfo, Opts,
1120 UP);
1121}
1122
1123static LoopUnrollResult
1127 ProfileSummaryInfo *PSI, bool PreserveLCSSA, int OptLevel,
1128 bool OnlyFullUnroll, bool OnlyWhenForced, bool ForgetAllSCEV,
1129 bool PrepareForLTO, std::optional<unsigned> ProvidedThreshold,
1130 std::optional<bool> ProvidedAllowPartial,
1131 std::optional<bool> ProvidedRuntime,
1132 std::optional<bool> ProvidedUpperBound,
1133 std::optional<bool> ProvidedAllowPeeling,
1134 std::optional<bool> ProvidedAllowProfileBasedPeeling,
1135 std::optional<unsigned> ProvidedFullUnrollMaxCount,
1136 UniformityInfo *UI = nullptr, AAResults *AA = nullptr) {
1137
1138 LLVM_DEBUG(dbgs() << "Loop Unroll: F["
1139 << L->getHeader()->getParent()->getName() << "] Loop %"
1140 << L->getHeader()->getName()
1141 << " (depth=" << L->getLoopDepth() << ")\n");
1143 if (TM & TM_Disable) {
1144 LLVM_DEBUG(dbgs().indent(1) << "Not unrolling: transformation disabled by "
1145 << "metadata.\n");
1147 }
1148
1149 // If this loop isn't forced to be unrolled, avoid unrolling it when the
1150 // parent loop has an explicit unroll-and-jam pragma. This is to prevent
1151 // automatic unrolling from interfering with the user requested
1152 // transformation.
1153 Loop *ParentL = L->getParentLoop();
1154 if (ParentL != nullptr &&
1157 LLVM_DEBUG(dbgs().indent(1) << "Not unrolling loop since parent loop has"
1158 << " llvm.loop.unroll_and_jam.\n");
1160 }
1161
1162 // If this loop isn't forced to be unrolled, avoid unrolling it when the
1163 // loop has an explicit unroll-and-jam pragma. This is to prevent automatic
1164 // unrolling from interfering with the user requested transformation.
1167 LLVM_DEBUG(
1168 dbgs().indent(1)
1169 << "Not unrolling loop since it has llvm.loop.unroll_and_jam.\n");
1171 }
1172
1173 if (!L->isLoopSimplifyForm()) {
1175 << "Not unrolling loop which is not in loop-simplify form.\n");
1176 if (TM & TM_ForcedByUser) {
1177 ORE.emit([&]() {
1178 return OptimizationRemarkMissed(DEBUG_TYPE, "NotInLoopSimplifyForm",
1179 L->getStartLoc(), L->getHeader())
1180 << "unable to unroll loop: not in loop-simplify form";
1181 });
1182 }
1184 }
1185
1186 // When automatic unrolling is disabled, do not unroll unless overridden for
1187 // this loop.
1188 if (OnlyWhenForced && !(TM & TM_Enable)) {
1189 LLVM_DEBUG(dbgs().indent(1) << "Not unrolling: automatic unrolling "
1190 << "disabled and loop not explicitly "
1191 << "enabled.\n");
1193 }
1194
1195 bool OptForSize = L->getHeader()->getParent()->hasOptSize();
1197 L, SE, TTI, BFI, PSI, ORE, OptLevel, ProvidedThreshold,
1198 ProvidedAllowPartial, ProvidedRuntime, ProvidedUpperBound,
1199 ProvidedFullUnrollMaxCount);
1201 L, SE, TTI, ProvidedAllowPeeling, ProvidedAllowProfileBasedPeeling, true);
1202
1203 // Exit early if unrolling is disabled. For OptForSize, we pick the loop size
1204 // as threshold later on.
1205 if (UP.Threshold == 0 && (!UP.Partial || UP.PartialThreshold == 0) &&
1206 !OptForSize) {
1207 LLVM_DEBUG(dbgs().indent(1) << "Not unrolling: all thresholds are zero.\n");
1208 if (TM & TM_ForcedByUser) {
1209 ORE.emit([&]() {
1210 return OptimizationRemarkMissed(DEBUG_TYPE, "UnrollThresholdsZero",
1211 L->getStartLoc(), L->getHeader())
1212 << "unable to unroll loop: unroll threshold is zero";
1213 });
1214 }
1216 }
1217
1219 CodeMetrics::collectEphemeralValues(L, &AC, EphValues);
1220
1221 // Check if the backedge-taken count is uniform before constructing UCE.
1222 // This is used to allow runtime unrolling with a remainder for convergent
1223 // loops when all threads agree on the trip count.
1224 const SCEV *BTC = SE.getBackedgeTakenCount(L);
1225 bool TripCountIsUniform = UI && isSCEVUniform(BTC, *UI);
1226 UnrollCostEstimator UCE(L, TTI, EphValues, UP.BEInsns, PrepareForLTO,
1227 TripCountIsUniform);
1228 if (!UCE.canUnroll((TM & TM_ForcedByUser) ? &ORE : nullptr, L))
1230
1231 unsigned LoopSize = UCE.getRolledLoopSize();
1232 LLVM_DEBUG(dbgs() << "Loop Size = " << LoopSize << "\n");
1233
1234 // When optimizing for size, use LoopSize + 1 as threshold (we use < Threshold
1235 // later), to (fully) unroll loops, if it does not increase code size.
1236 if (OptForSize)
1237 UP.Threshold = std::max(UP.Threshold, LoopSize + 1);
1238
1239 if (UCE.NumInlineCandidates != 0) {
1241 << "Not unrolling loop with inlinable calls.\n");
1242 if (TM & TM_ForcedByUser) {
1243 ORE.emit([&]() {
1245 "InlineCandidatesPreventUnroll",
1246 L->getStartLoc(), L->getHeader())
1247 << "unable to unroll loop: contains inlinable calls";
1248 });
1249 }
1251 }
1252
1253 // Find the smallest exact trip count for any exit. This is an upper bound
1254 // on the loop trip count, but an exit at an earlier iteration is still
1255 // possible. An unroll by the smallest exact trip count guarantees that all
1256 // branches relating to at least one exit can be eliminated. This is unlike
1257 // the max trip count, which only guarantees that the backedge can be broken.
1258 unsigned TripCount = 0;
1259 unsigned TripMultiple = 1;
1260 SmallVector<BasicBlock *, 8> ExitingBlocks;
1261 L->getExitingBlocks(ExitingBlocks);
1262 for (BasicBlock *ExitingBlock : ExitingBlocks)
1263 if (unsigned TC = SE.getSmallConstantTripCount(L, ExitingBlock))
1264 if (!TripCount || TC < TripCount)
1265 TripCount = TripMultiple = TC;
1266
1267 if (!TripCount) {
1268 // If no exact trip count is known, determine the trip multiple of either
1269 // the loop latch or the single exiting block.
1270 // TODO: Relax for multiple exits.
1271 BasicBlock *ExitingBlock = L->getLoopLatch();
1272 if (!ExitingBlock || !L->isLoopExiting(ExitingBlock))
1273 ExitingBlock = L->getExitingBlock();
1274 if (ExitingBlock)
1275 TripMultiple = SE.getSmallConstantTripMultiple(L, ExitingBlock);
1276 }
1277
1278 // If the loop contains a convergent operation, the prelude we'd add
1279 // to do the first few instructions before we hit the unrolled loop
1280 // is unsafe -- it adds a control-flow dependency to the convergent
1281 // operation. Therefore restrict remainder loop (try unrolling without).
1283
1284 // Try to find the trip count upper bound if we cannot find the exact trip
1285 // count.
1286 unsigned MaxTripCount = 0;
1287 bool MaxOrZero = false;
1288 if (!TripCount) {
1289 MaxTripCount = SE.getSmallConstantMaxTripCount(L);
1290 MaxOrZero = SE.isBackedgeTakenCountMaxOrZero(L);
1291 }
1292
1293 // computeUnrollCount() decides whether it is beneficial to use upper bound to
1294 // fully unroll the loop.
1295 unsigned Count =
1296 computeUnrollCount(L, TTI, DT, LI, &AC, SE, EphValues, &ORE, TripCount,
1297 MaxTripCount, MaxOrZero, TripMultiple, UCE, UP, PP);
1298 if (!Count) {
1300 << "Not unrolling: no viable strategy found.\n");
1301 if (TM & TM_ForcedByUser) {
1302 ORE.emit([&]() {
1303 return OptimizationRemarkMissed(DEBUG_TYPE, "NoUnrollStrategy",
1304 L->getStartLoc(), L->getHeader())
1305 << "unable to unroll loop: no viable unroll count found";
1306 });
1307 }
1309 }
1310
1312
1313 if (PP.PeelCount) {
1314 assert(Count == 1 && "Cannot perform peel and unroll in the same step");
1315 LLVM_DEBUG(dbgs() << "PEELING loop %" << L->getHeader()->getName()
1316 << " with iteration count " << PP.PeelCount << "!\n");
1317 ORE.emit([&]() {
1318 return OptimizationRemark(DEBUG_TYPE, "Peeled", L->getStartLoc(),
1319 L->getHeader())
1320 << "peeled loop by " << ore::NV("PeelCount", PP.PeelCount)
1321 << " iterations";
1322 });
1323
1324 ValueToValueMapTy VMap;
1325 peelLoop(L, PP.PeelCount, PP.PeelLast, LI, &SE, DT, &AC, PreserveLCSSA,
1326 VMap);
1327 simplifyLoopAfterUnroll(L, true, LI, &SE, &DT, &AC, &TTI, L->getBlocks(),
1328 nullptr);
1329 // If the loop was peeled, we already "used up" the profile information
1330 // we had, so we don't want to unroll or peel again.
1332 L->setLoopAlreadyUnrolled();
1334 }
1335
1336 // Do not attempt partial/runtime unrolling in FullLoopUnrolling
1337 if (OnlyFullUnroll && ((!TripCount && !MaxTripCount) || Count < TripCount ||
1338 Count < MaxTripCount)) {
1340 << "Not attempting partial/runtime unroll in FullLoopUnroll.\n");
1342 }
1343
1344 // At this point, UP.Runtime indicates that run-time unrolling is allowed.
1345 // However, we only want to actually perform it if we don't know the trip
1346 // count and the unroll count doesn't divide the known trip multiple.
1347 // TODO: This decision should probably be pushed up into
1348 // computeUnrollCount().
1349 UP.Runtime &= TripCount == 0 && TripMultiple % Count != 0;
1350
1351 // Save loop properties before it is transformed.
1352 MDNode *OrigLoopID = L->getLoopID();
1353 UnrollPragmaInfo PInfo(L);
1354 DebugLoc LoopStartLoc = L->getStartLoc();
1355 BasicBlock *LoopHeader = L->getHeader();
1356
1357 // Unroll the loop.
1358 Loop *RemainderLoop = nullptr;
1360 ULO.Count = Count;
1361 ULO.Force = UP.Force;
1364 ULO.Runtime = UP.Runtime;
1365 ULO.ForgetAllSCEV = ForgetAllSCEV;
1370 LoopUnrollResult UnrollResult = UnrollLoop(
1371 L, ULO, LI, &SE, &DT, &AC, &TTI, &ORE, PreserveLCSSA, &RemainderLoop, AA);
1372 if (UnrollResult == LoopUnrollResult::Unmodified) {
1373 if (PInfo.ExplicitUnroll) {
1375 << "Failed to unroll loop as explicitly requested.\n");
1376 ORE.emit([&]() {
1377 return OptimizationRemarkMissed(DEBUG_TYPE, "FailedToUnrollAsRequested",
1378 LoopStartLoc, LoopHeader)
1379 << "failed to unroll loop as explicitly requested";
1380 });
1381 }
1383 }
1384
1385 if (PInfo.PragmaFullUnroll && ULO.Count != TripCount) {
1386 ORE.emit([&]() {
1387 return OptimizationRemarkMissed(DEBUG_TYPE, "FullUnrollAsDirectedFailed",
1388 LoopStartLoc, LoopHeader)
1389 << "unable to fully unroll loop as directed; "
1390 << "unrolled by factor " << ore::NV("UnrollCount", ULO.Count);
1391 });
1392 }
1393 if (PInfo.PragmaCount > 0 && ULO.Count != PInfo.PragmaCount) {
1394 ORE.emit([&]() {
1395 return OptimizationRemarkMissed(DEBUG_TYPE, "UnrollCountDiffers",
1396 LoopStartLoc, LoopHeader)
1397 << "unable to unroll loop with requested count "
1398 << ore::NV("RequestedCount", PInfo.PragmaCount)
1399 << "; unrolled by factor " << ore::NV("UnrollCount", ULO.Count);
1400 });
1401 }
1402
1403 if (RemainderLoop) {
1404 std::optional<MDNode *> RemainderLoopID =
1407 if (RemainderLoopID)
1408 RemainderLoop->setLoopID(*RemainderLoopID);
1409 }
1410
1411 if (UnrollResult != LoopUnrollResult::FullyUnrolled) {
1412 std::optional<MDNode *> NewLoopID =
1415 if (NewLoopID) {
1416 L->setLoopID(*NewLoopID);
1417
1418 // Do not setLoopAlreadyUnrolled if loop attributes have been specified
1419 // explicitly.
1420 return UnrollResult;
1421 }
1422 }
1423
1424 // If loop has an unroll count pragma or unrolled by explicitly set count
1425 // mark loop as unrolled to prevent unrolling beyond that requested.
1426 if (UnrollResult != LoopUnrollResult::FullyUnrolled && PInfo.ExplicitUnroll)
1427 L->setLoopAlreadyUnrolled();
1428
1429 return UnrollResult;
1430}
1431
1432namespace {
1433
1434class LoopUnroll : public LoopPass {
1435public:
1436 static char ID; // Pass ID, replacement for typeid
1437
1438 int OptLevel;
1439
1440 /// If false, use a cost model to determine whether unrolling of a loop is
1441 /// profitable. If true, only loops that explicitly request unrolling via
1442 /// metadata are considered. All other loops are skipped.
1443 bool OnlyWhenForced;
1444
1445 /// If false, when SCEV is invalidated, only forget everything in the
1446 /// top-most loop (call forgetTopMostLoop), of the loop being processed.
1447 /// Otherwise, forgetAllLoops and rebuild when needed next.
1448 bool ForgetAllSCEV;
1449
1450 std::optional<unsigned> ProvidedThreshold;
1451 std::optional<bool> ProvidedAllowPartial;
1452 std::optional<bool> ProvidedRuntime;
1453 std::optional<bool> ProvidedUpperBound;
1454 std::optional<bool> ProvidedAllowPeeling;
1455 std::optional<bool> ProvidedAllowProfileBasedPeeling;
1456 std::optional<unsigned> ProvidedFullUnrollMaxCount;
1457
1458 LoopUnroll(int OptLevel = 2, bool OnlyWhenForced = false,
1459 bool ForgetAllSCEV = false,
1460 std::optional<unsigned> Threshold = std::nullopt,
1461 std::optional<bool> AllowPartial = std::nullopt,
1462 std::optional<bool> Runtime = std::nullopt,
1463 std::optional<bool> UpperBound = std::nullopt,
1464 std::optional<bool> AllowPeeling = std::nullopt,
1465 std::optional<bool> AllowProfileBasedPeeling = std::nullopt,
1466 std::optional<unsigned> ProvidedFullUnrollMaxCount = std::nullopt)
1467 : LoopPass(ID), OptLevel(OptLevel), OnlyWhenForced(OnlyWhenForced),
1468 ForgetAllSCEV(ForgetAllSCEV), ProvidedThreshold(Threshold),
1469 ProvidedAllowPartial(AllowPartial), ProvidedRuntime(Runtime),
1470 ProvidedUpperBound(UpperBound), ProvidedAllowPeeling(AllowPeeling),
1471 ProvidedAllowProfileBasedPeeling(AllowProfileBasedPeeling),
1472 ProvidedFullUnrollMaxCount(ProvidedFullUnrollMaxCount) {
1474 }
1475
1476 bool runOnLoop(Loop *L, LPPassManager &LPM) override {
1477 if (skipLoop(L))
1478 return false;
1479
1480 Function &F = *L->getHeader()->getParent();
1481
1482 auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
1483 LoopInfo *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
1484 ScalarEvolution &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE();
1485 const TargetTransformInfo &TTI =
1486 getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
1487 auto &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
1488 UniformityInfo *UI =
1490 ? &getAnalysis<UniformityInfoWrapperPass>().getUniformityInfo()
1491 : nullptr;
1492 // For the old PM, we can't use OptimizationRemarkEmitter as an analysis
1493 // pass. Function analyses need to be preserved across loop transformations
1494 // but ORE cannot be preserved (see comment before the pass definition).
1495 OptimizationRemarkEmitter ORE(&F);
1496 bool PreserveLCSSA = mustPreserveAnalysisID(LCSSAID);
1497
1499 L, DT, LI, SE, TTI, AC, ORE, nullptr, nullptr, PreserveLCSSA, OptLevel,
1500 /*OnlyFullUnroll*/ false, OnlyWhenForced, ForgetAllSCEV,
1501 /*PrepareForLTO*/ false, ProvidedThreshold, ProvidedAllowPartial,
1502 ProvidedRuntime, ProvidedUpperBound, ProvidedAllowPeeling,
1503 ProvidedAllowProfileBasedPeeling, ProvidedFullUnrollMaxCount, UI);
1504
1505 if (Result == LoopUnrollResult::FullyUnrolled)
1506 LPM.markLoopAsDeleted(*L);
1507
1508 return Result != LoopUnrollResult::Unmodified;
1509 }
1510
1511 /// This transformation requires natural loop information & requires that
1512 /// loop preheaders be inserted into the CFG...
1513 void getAnalysisUsage(AnalysisUsage &AU) const override {
1514 AU.addRequired<AssumptionCacheTracker>();
1515 AU.addRequired<TargetTransformInfoWrapperPass>();
1516 AU.addRequired<UniformityInfoWrapperPass>();
1517 // FIXME: Loop passes are required to preserve domtree, and for now we just
1518 // recreate dom info if anything gets unrolled.
1520 }
1521};
1522
1523} // end anonymous namespace
1524
1525char LoopUnroll::ID = 0;
1526
1527INITIALIZE_PASS_BEGIN(LoopUnroll, "loop-unroll", "Unroll loops", false, false)
1532INITIALIZE_PASS_END(LoopUnroll, "loop-unroll", "Unroll loops", false, false)
1533
1534Pass *llvm::createLoopUnrollPass(int OptLevel, bool OnlyWhenForced,
1535 bool ForgetAllSCEV, int Threshold,
1536 int AllowPartial, int Runtime, int UpperBound,
1537 int AllowPeeling) {
1538 // TODO: It would make more sense for this function to take the optionals
1539 // directly, but that's dangerous since it would silently break out of tree
1540 // callers.
1541 return new LoopUnroll(
1542 OptLevel, OnlyWhenForced, ForgetAllSCEV,
1543 Threshold == -1 ? std::nullopt : std::optional<unsigned>(Threshold),
1544 AllowPartial == -1 ? std::nullopt : std::optional<bool>(AllowPartial),
1545 Runtime == -1 ? std::nullopt : std::optional<bool>(Runtime),
1546 UpperBound == -1 ? std::nullopt : std::optional<bool>(UpperBound),
1547 AllowPeeling == -1 ? std::nullopt : std::optional<bool>(AllowPeeling));
1548}
1549
1552 LPMUpdater &Updater) {
1553 // For the new PM, we can't use OptimizationRemarkEmitter as an analysis
1554 // pass. Function analyses need to be preserved across loop transformations
1555 // but ORE cannot be preserved (see comment before the pass definition).
1556 OptimizationRemarkEmitter ORE(L.getHeader()->getParent());
1557 const ScalarOptions &Opts = getScalarOptions(L);
1558
1559 // Keep track of the previous loop structure so we can identify new loops
1560 // created by unrolling.
1561 Loop *ParentL = L.getParentLoop();
1562 SmallPtrSet<Loop *, 4> OldLoops;
1563 if (ParentL)
1564 OldLoops.insert_range(*ParentL);
1565 else
1566 OldLoops.insert_range(AR.LI);
1567
1568 std::string LoopName = std::string(L.getName());
1569
1570 bool Changed =
1571 tryToUnrollLoop(&L, AR.DT, &AR.LI, AR.SE, AR.TTI, AR.AC, ORE,
1572 /*BFI*/ nullptr, /*PSI*/ nullptr,
1573 /*PreserveLCSSA*/ true, OptLevel, /*OnlyFullUnroll*/ true,
1574 OnlyWhenForced, ForgetSCEV, PrepareForLTO,
1575 /*Threshold*/ std::nullopt, /*AllowPartial*/ false,
1576 /*Runtime*/ false, /*UpperBound*/ false,
1577 /*AllowPeeling*/ true,
1578 /*AllowProfileBasedPeeling*/ false,
1579 /*FullUnrollMaxCount*/ std::nullopt) !=
1581 if (!Changed)
1582 return PreservedAnalyses::all();
1583
1584 // The parent must not be damaged by unrolling!
1585#ifndef NDEBUG
1586 if (ParentL)
1587 ParentL->verifyLoop();
1588#endif
1589
1590 // Unrolling can do several things to introduce new loops into a loop nest:
1591 // - Full unrolling clones child loops within the current loop but then
1592 // removes the current loop making all of the children appear to be new
1593 // sibling loops.
1594 //
1595 // When a new loop appears as a sibling loop after fully unrolling,
1596 // its nesting structure has fundamentally changed and we want to revisit
1597 // it to reflect that.
1598 //
1599 // When unrolling has removed the current loop, we need to tell the
1600 // infrastructure that it is gone.
1601 //
1602 // Finally, we support a debugging/testing mode where we revisit child loops
1603 // as well. These are not expected to require further optimizations as either
1604 // they or the loop they were cloned from have been directly visited already.
1605 // But the debugging mode allows us to check this assumption.
1606 bool IsCurrentLoopValid = false;
1607 SmallVector<Loop *, 4> SibLoops;
1608 if (ParentL)
1609 SibLoops.append(ParentL->begin(), ParentL->end());
1610 else
1611 SibLoops.append(AR.LI.begin(), AR.LI.end());
1612 erase_if(SibLoops, [&](Loop *SibLoop) {
1613 if (SibLoop == &L) {
1614 IsCurrentLoopValid = true;
1615 return true;
1616 }
1617
1618 // Otherwise erase the loop from the list if it was in the old loops.
1619 return OldLoops.contains(SibLoop);
1620 });
1621 Updater.addSiblingLoops(SibLoops);
1622
1623 if (!IsCurrentLoopValid) {
1624 Updater.markLoopAsDeleted(L, LoopName);
1625 } else {
1626 // We can only walk child loops if the current loop remained valid.
1627 if (Opts.unroll_revisit_child_loops) {
1628 // Walk *all* of the child loops.
1629 SmallVector<Loop *, 4> ChildLoops(L.begin(), L.end());
1630 Updater.addChildLoops(ChildLoops);
1631 }
1632 }
1633
1635}
1636
1639 auto &LI = AM.getResult<LoopAnalysis>(F);
1640 // There are no loops in the function. Return before computing other expensive
1641 // analyses.
1642 if (LI.empty())
1643 return PreservedAnalyses::all();
1644 auto &SE = AM.getResult<ScalarEvolutionAnalysis>(F);
1645 auto &TTI = AM.getResult<TargetIRAnalysis>(F);
1646 auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
1647 auto &AC = AM.getResult<AssumptionAnalysis>(F);
1650
1651 UniformityInfo *UI = TTI.hasBranchDivergence(&F)
1653 : nullptr;
1654
1655 LoopAnalysisManager *LAM = nullptr;
1656 if (auto *LAMProxy = AM.getCachedResult<LoopAnalysisManagerFunctionProxy>(F))
1657 LAM = &LAMProxy->getManager();
1658
1659 auto &MAMProxy = AM.getResult<ModuleAnalysisManagerFunctionProxy>(F);
1660 ProfileSummaryInfo *PSI =
1661 MAMProxy.getCachedResult<ProfileSummaryAnalysis>(*F.getParent());
1662 auto *BFI = (PSI && PSI->hasProfileSummary()) ?
1663 &AM.getResult<BlockFrequencyAnalysis>(F) : nullptr;
1664
1665 bool Changed = false;
1666
1667 // The unroller requires loops to be in simplified form, and also needs LCSSA.
1668 // Since simplification may add new inner loops, it has to run before the
1669 // legality and profitability checks. This means running the loop unroller
1670 // will simplify all loops, regardless of whether anything end up being
1671 // unrolled.
1672 for (const auto &L : LI) {
1673 Changed |=
1674 simplifyLoop(L, &DT, &LI, &SE, &AC, nullptr, false /* PreserveLCSSA */);
1675 Changed |= formLCSSARecursively(*L, DT, &LI, &SE);
1676 }
1677
1678 // Add the loop nests in the reverse order of LoopInfo. See method
1679 // declaration.
1681 appendLoopsToWorklist(LI, Worklist);
1682
1683 // Cache the number of loops in each top-level nest. The gated transforms
1684 // never add loops to the worklist, so the counts stay a safe upper bound.
1685 const unsigned MaxNestLoops = getScalarOptions(F).unroll_max_nest_loops;
1686 DenseMap<const Loop *, unsigned> TopLevelNestSize;
1687 if (MaxNestLoops)
1688 for (const Loop *TopL : LI)
1689 TopLevelNestSize[TopL] = TopL->getLoopsInPreorder().size();
1690
1691 while (!Worklist.empty()) {
1692 // Because the LoopInfo stores the loops in RPO, we walk the worklist
1693 // from back to front so that we work forward across the CFG, which
1694 // for unrolling is only needed to get optimization remarks emitted in
1695 // a forward order.
1696 Loop &L = *Worklist.pop_back_val();
1697#ifndef NDEBUG
1698 Loop *ParentL = L.getParentLoop();
1699#endif
1700
1701 // Check if the profile summary indicates that the profiled application
1702 // has a huge working set size, in which case we disable peeling to avoid
1703 // bloating it further.
1704 std::optional<bool> LocalAllowPeeling = UnrollOpts.AllowPeeling;
1705 if (PSI && PSI->hasHugeWorkingSetSize())
1706 LocalAllowPeeling = false;
1707
1708 // Suppress heuristic runtime/partial unrolling and peeling for loops in a
1709 // pathologically large nest, where each such transform forces a whole-nest
1710 // SCEV invalidation (quadratic compile time). Explicit unroll pragmas still
1711 // win: gatherUnrollingPreferences applies these overrides before
1712 // computeUnrollCount re-enables unrolling for pragma-marked loops.
1713 std::optional<bool> LocalAllowRuntime = UnrollOpts.AllowRuntime;
1714 std::optional<bool> LocalAllowPartial = UnrollOpts.AllowPartial;
1715 if (MaxNestLoops) {
1716 unsigned NestSize = TopLevelNestSize.lookup(L.getOutermostLoop());
1717 if (NestSize > MaxNestLoops) {
1718 LocalAllowRuntime = false;
1719 LocalAllowPartial = false;
1720 LocalAllowPeeling = false;
1722 << "Disabling runtime/partial unroll and peeling: "
1723 "outermost nest has "
1724 << NestSize << " loops (> " << MaxNestLoops << ").\n");
1725 }
1726 }
1727
1728 std::string LoopName = std::string(L.getName());
1729 // The API here is quite complex to call and we allow to select some
1730 // flavors of unrolling during construction time (by setting UnrollOpts).
1731 LoopUnrollResult Result =
1732 tryToUnrollLoop(&L, DT, &LI, SE, TTI, AC, ORE, BFI, PSI,
1733 /*PreserveLCSSA*/ true, UnrollOpts.OptLevel,
1734 /*OnlyFullUnroll*/ false, UnrollOpts.OnlyWhenForced,
1735 UnrollOpts.ForgetSCEV, UnrollOpts.PrepareForLTO,
1736 /*Threshold*/ std::nullopt, LocalAllowPartial,
1737 LocalAllowRuntime, UnrollOpts.AllowUpperBound,
1738 LocalAllowPeeling, UnrollOpts.AllowProfileBasedPeeling,
1739 UnrollOpts.FullUnrollMaxCount, UI, &AA);
1741
1742 // The parent must not be damaged by unrolling!
1743#ifndef NDEBUG
1744 if (Result != LoopUnrollResult::Unmodified && ParentL)
1745 ParentL->verifyLoop();
1746#endif
1747
1748 // Clear any cached analysis results for L if we removed it completely.
1749 if (LAM && Result == LoopUnrollResult::FullyUnrolled)
1750 LAM->clear(L, LoopName);
1751 }
1752
1753 if (!Changed)
1754 return PreservedAnalyses::all();
1755
1757}
1758
1760 raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
1761 static_cast<PassInfoMixin<LoopUnrollPass> *>(this)->printPipeline(
1762 OS, MapClassName2PassName);
1763 OS << '<';
1764 if (UnrollOpts.AllowPartial != std::nullopt)
1765 OS << (*UnrollOpts.AllowPartial ? "" : "no-") << "partial;";
1766 if (UnrollOpts.AllowPeeling != std::nullopt)
1767 OS << (*UnrollOpts.AllowPeeling ? "" : "no-") << "peeling;";
1768 if (UnrollOpts.AllowRuntime != std::nullopt)
1769 OS << (*UnrollOpts.AllowRuntime ? "" : "no-") << "runtime;";
1770 if (UnrollOpts.AllowUpperBound != std::nullopt)
1771 OS << (*UnrollOpts.AllowUpperBound ? "" : "no-") << "upperbound;";
1772 if (UnrollOpts.AllowProfileBasedPeeling != std::nullopt)
1773 OS << (*UnrollOpts.AllowProfileBasedPeeling ? "" : "no-")
1774 << "profile-peeling;";
1775 if (UnrollOpts.FullUnrollMaxCount != std::nullopt)
1776 OS << "full-unroll-max=" << UnrollOpts.FullUnrollMaxCount << ';';
1777 if (UnrollOpts.PrepareForLTO)
1778 OS << "prepare-for-lto;";
1779 OS << 'O' << UnrollOpts.OptLevel;
1780 OS << '>';
1781}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t uint64_t
Rewrite undef for PHI
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines DenseMapInfo traits for DenseMap.
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
#define DEBUG_TYPE
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This header defines various interfaces for pass management in LLVM.
This header provides classes for managing per-loop analyses.
This header provides classes for managing a pipeline of passes over loops in LLVM IR.
static LoopUnrollResult tryToUnrollLoop(Loop *L, DominatorTree &DT, LoopInfo *LI, ScalarEvolution &SE, const TargetTransformInfo &TTI, AssumptionCache &AC, OptimizationRemarkEmitter &ORE, BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI, bool PreserveLCSSA, int OptLevel, bool OnlyFullUnroll, bool OnlyWhenForced, bool ForgetAllSCEV, bool PrepareForLTO, std::optional< unsigned > ProvidedThreshold, std::optional< bool > ProvidedAllowPartial, std::optional< bool > ProvidedRuntime, std::optional< bool > ProvidedUpperBound, std::optional< bool > ProvidedAllowPeeling, std::optional< bool > ProvidedAllowProfileBasedPeeling, std::optional< unsigned > ProvidedFullUnrollMaxCount, UniformityInfo *UI=nullptr, AAResults *AA=nullptr)
static bool hasUnrollFullPragma(const Loop *L)
static bool isSCEVUniform(const SCEV *S, UniformityInfo &UI)
Returns true if the SCEV expression is uniform, i.e., all threads in a convergent execution agree on ...
static unsigned unrollCountPragmaValue(const Loop *L)
static bool hasUnrollEnablePragma(const Loop *L)
static std::optional< unsigned > shouldFullUnroll(Loop *L, const TargetTransformInfo &TTI, DominatorTree &DT, ScalarEvolution &SE, const SmallPtrSetImpl< const Value * > &EphValues, const unsigned FullUnrollTripCount, const UnrollCostEstimator UCE, const TargetTransformInfo::UnrollingPreferences &UP)
static std::optional< EstimatedUnrollCost > analyzeLoopUnrollCost(const Loop *L, unsigned TripCount, DominatorTree &DT, ScalarEvolution &SE, const SmallPtrSetImpl< const Value * > &EphValues, const TargetTransformInfo &TTI, unsigned MaxUnrolledLoopSize, unsigned MaxIterationsCountToAnalyze)
Figure out if the loop is worth full unrolling.
static std::optional< unsigned > shouldPragmaUnroll(const ScalarOptions &Opts, Loop *L, const UnrollPragmaInfo &PInfo, const unsigned TripMultiple, const unsigned TripCount, unsigned MaxTripCount, const UnrollCostEstimator UCE, const TargetTransformInfo::UnrollingPreferences &UP, OptimizationRemarkEmitter *ORE)
static std::optional< unsigned > shouldPartialUnroll(const unsigned LoopSize, const unsigned TripCount, const UnrollCostEstimator UCE, const TargetTransformInfo::UnrollingPreferences &UP)
static const unsigned NoThreshold
A magic value for use with the Threshold parameter to indicate that the loop unroll should be perform...
static unsigned shouldRuntimeUnroll(Loop *L, unsigned MaxTripCount, unsigned TripMultiple, const UnrollCostEstimator &UCE, const UnrollPragmaInfo &PInfo, const ScalarOptions &Opts, TargetTransformInfo::UnrollingPreferences &UP)
static bool hasRuntimeUnrollDisablePragma(const Loop *L)
static unsigned getFullUnrollBoostingFactor(const EstimatedUnrollCost &Cost, unsigned MaxPercentThresholdBoost)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Machine Trace Metrics
This file exposes an interface to building/using memory SSA to walk memory instructions using a use/d...
This file contains the declarations for metadata subclasses.
LoopAnalysisManager LAM
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
SI Fold Operands
This file contains some templates that are useful if you are working with the STL at all.
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
This pass exposes codegen information to IR-level passes.
LLVM IR instance of the generic uniformity analysis.
Value * RHS
Value * LHS
A manager for alias analyses.
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
AnalysisUsage & addRequired()
A function analysis which provides an AssumptionCache.
An immutable pass that tracks lazily created AssumptionCache objects.
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Conditional Branch instruction.
This is the shared class of boolean and integer constants.
Definition Constants.h:87
This is an important base class in LLVM.
Definition Constant.h:44
A debug info location.
Definition DebugLoc.h:126
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition DenseMap.h:757
unsigned size() const
Definition DenseMap.h:717
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
Definition DenseMap.h:793
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:827
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
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
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:696
bool isUniformAtDef(ConstValueRefT V) const
Whether V is uniform/non-divergent at its definition.
CostType getValue() const
This function is intended to be used as sparingly as possible, since the class provides the full rang...
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
void addChildLoops(ArrayRef< Loop * > NewChildLoops)
Loop passes should use this method to indicate they have added new child loops of the current loop.
void markLoopAsDeleted(Loop &L, llvm::StringRef Name)
Loop passes should use this method to indicate they have deleted a loop from the nest.
void addSiblingLoops(ArrayRef< Loop * > NewSibLoops)
Loop passes should use this method to indicate they have added new sibling loops to the current loop.
void markLoopAsDeleted(Loop &L)
Definition LoopPass.cpp:124
Analysis pass that exposes the LoopInfo for a function.
Definition LoopInfo.h:594
void verifyLoop() const
Verify loop structure.
iterator end() const
iterator begin() const
LLVM_ABI PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
iterator end() const
iterator begin() const
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
void setLoopID(MDNode *LoopID) const
Set the llvm.loop loop id metadata for this loop.
Definition LoopInfo.cpp:582
Metadata node.
Definition Metadata.h:1081
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1437
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1443
Diagnostic information for optimization analysis remarks.
The optimization diagnostic interface.
LLVM_ABI void emit(DiagnosticInfoOptimizationBase &OptDiag)
Output the remark via the diagnostic handler and to the optimization record file.
Diagnostic information for missed-optimization remarks.
Diagnostic information for applied optimization remarks.
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
Pass interface - Implemented by all 'passes'.
Definition Pass.h:97
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
bool empty() const
Determine if the PriorityWorklist is empty or not.
An analysis pass based on the new PM to deliver ProfileSummaryInfo.
Analysis providing profile information.
This class represents an analyzed expression in the program.
LLVM_ABI ArrayRef< SCEVUse > operands() const
Return operands of this SCEV expression.
Analysis pass that exposes the ScalarEvolution for a function.
The main scalar evolution driver.
LLVM_ABI const SCEV * getBackedgeTakenCount(const Loop *L, ExitCountKind Kind=Exact)
If the specified loop has a predictable backedge-taken count, return it, otherwise return a SCEVCould...
LLVM_ABI unsigned getSmallConstantTripMultiple(const Loop *L, const SCEV *ExitCount)
Returns the largest constant divisor of the trip count as a normal unsigned value,...
LLVM_ABI unsigned getSmallConstantMaxTripCount(const Loop *L, SmallVectorImpl< const SCEVPredicate * > *Predicates=nullptr)
Returns the upper bound of the loop trip count as a normal unsigned value.
LLVM_ABI bool isBackedgeTakenCountMaxOrZero(const Loop *L)
Return true if the backedge taken count is either the value returned by getConstantMaxBackedgeTakenCo...
LLVM_ABI unsigned getSmallConstantTripCount(const Loop *L)
Returns the exact trip count of the loop if we can compute it, and the result is a small constant.
size_type size() const
Determine the number of elements in the SetVector.
Definition SetVector.h:103
void clear()
Completely clear the SetVector.
Definition SetVector.h:273
bool empty() const
Determine if the SetVector is empty or not.
Definition SetVector.h:100
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:157
value_type pop_back_val()
Definition SetVector.h:285
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...
void insert_range(Range &&R)
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:345
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Multiway switch.
Analysis pass providing the TargetTransformInfo.
Wrapper pass for TargetTransformInfo.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
LLVM_ABI bool hasBranchDivergence(const Function *F=nullptr) const
Return true if branch divergence exists.
TargetCostKind
The kind of cost model.
@ TCK_CodeSize
Instruction code size.
@ TCK_SizeAndLatency
The weighted sum of size and latency.
Analysis pass which computes UniformityInfo.
Legacy analysis pass which computes a CycleInfo.
Produce an estimate of the unrolled cost of the specified loop.
Definition UnrollLoop.h:150
ConvergenceKind Convergence
Definition UnrollLoop.h:156
LLVM_ABI bool canUnroll(OptimizationRemarkEmitter *ORE=nullptr, const Loop *L=nullptr) const
Whether it is legal to unroll this loop.
LLVM_ABI uint64_t getUnrolledLoopSize(const TargetTransformInfo::UnrollingPreferences &UP, unsigned Count) const
Returns loop size estimation for an unrolled loop with the given unroll count and the unrolling confi...
LLVM_ABI UnrollCostEstimator(const Loop *L, const TargetTransformInfo &TTI, const SmallPtrSetImpl< const Value * > &EphValues, unsigned BEInsns, bool PrepareForLTO=false, bool TripCountIsUniform=false)
uint64_t getRolledLoopSize() const
Definition UnrollLoop.h:174
void visit(Iterator Start, Iterator End)
Definition InstVisitor.h:87
LLVM Value Representation.
Definition Value.h:75
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:209
iterator find(const_arg_type_t< ValueT > V)
Definition DenseSet.h:174
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
Abstract Attribute helper functions.
Definition Attributor.h:164
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:679
DiagnosticInfoOptimizationBase::Argument NV
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.
GenericUniformityInfo< SSAContext > UniformityInfo
LLVM_ABI Pass * createLoopUnrollPass(int OptLevel=2, bool OnlyWhenForced=false, bool ForgetAllSCEV=false, int Threshold=-1, int AllowPartial=-1, int Runtime=-1, int UpperBound=-1, int AllowPeeling=-1)
LLVM_ABI std::optional< unsigned > getLoopEstimatedTripCount(Loop *L, unsigned *EstimatedLoopInvocationWeight=nullptr)
Return either:
LLVM_ABI unsigned computeUnrollCount(Loop *L, const TargetTransformInfo &TTI, DominatorTree &DT, LoopInfo *LI, AssumptionCache *AC, ScalarEvolution &SE, const SmallPtrSetImpl< const Value * > &EphValues, OptimizationRemarkEmitter *ORE, unsigned TripCount, unsigned MaxTripCount, bool MaxOrZero, unsigned TripMultiple, const UnrollCostEstimator &UCE, TargetTransformInfo::UnrollingPreferences &UP, TargetTransformInfo::PeelingPreferences &PP)
bool isEqual(const GCNRPTracker::LiveRegSet &S1, const GCNRPTracker::LiveRegSet &S2)
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)
@ Runtime
Detect stack use after return if not disabled runtime with (ASAN_OPTIONS=detect_stack_use_after_retur...
OuterAnalysisManagerProxy< ModuleAnalysisManager, Function > ModuleAnalysisManagerFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
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
LLVM_ABI std::optional< MDNode * > makeFollowupLoopID(MDNode *OrigLoopID, ArrayRef< StringRef > FollowupAttrs, const char *InheritOptionsAttrsPrefix="", bool AlwaysNew=false)
Create a new loop identifier for a loop created from a loop transformation.
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
LLVM_ABI TargetTransformInfo::UnrollingPreferences gatherUnrollingPreferences(Loop *L, ScalarEvolution &SE, const TargetTransformInfo &TTI, BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI, llvm::OptimizationRemarkEmitter &ORE, int OptLevel, std::optional< unsigned > UserThreshold, std::optional< bool > UserAllowPartial, std::optional< bool > UserRuntime, std::optional< bool > UserUpperBound, std::optional< unsigned > UserFullUnrollMaxCount)
Gather the various unrolling parameters based on the defaults, compiler flags, TTI overrides and user...
LLVM_ABI char & LCSSAID
Definition LCSSA.cpp:545
LLVM_ABI void simplifyLoopAfterUnroll(Loop *L, bool SimplifyIVs, LoopInfo *LI, ScalarEvolution *SE, DominatorTree *DT, AssumptionCache *AC, const TargetTransformInfo *TTI, ArrayRef< BasicBlock * > Blocks, AAResults *AA=nullptr)
Perform some cleanup and simplifications on loops after unrolling.
const ScalarOptions & getScalarOptions(const LLVMContext &C)
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
Definition STLExtras.h:2042
LLVM_ABI void initializeLoopUnrollPass(PassRegistry &)
LLVM_ABI TargetTransformInfo::PeelingPreferences gatherPeelingPreferences(Loop *L, ScalarEvolution &SE, const TargetTransformInfo &TTI, std::optional< bool > UserAllowPeeling, std::optional< bool > UserAllowProfileBasedPeeling, bool UnrollingSpecficValues=false)
LLVM_ABI CallBase * getLoopConvergenceHeart(const Loop *TheLoop)
Find the convergence heart of the loop.
LLVM_ABI bool getForgetSCEVInLoopUnroll(const cl::LibraryOptionsContext &LibraryOptions)
Return -forget-scev-loop-unroll.
LLVM_ABI TransformationMode hasUnrollAndJamTransformation(const Loop *L)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI void computePeelCount(Loop *L, unsigned LoopSize, TargetTransformInfo::PeelingPreferences &PP, unsigned TripCount, DominatorTree &DT, ScalarEvolution &SE, const TargetTransformInfo &TTI, AssumptionCache *AC=nullptr, unsigned Threshold=UINT_MAX)
Definition LoopPeel.cpp:749
LLVM_TEMPLATE_ABI void appendLoopsToWorklist(RangeT &&, SmallPriorityWorklist< Loop *, 4 > &)
Utility that implements appending of loops onto a worklist given a range.
LLVM_ABI cl::opt< unsigned > SCEVCheapExpansionBudget
LLVM_ABI TransformationMode hasUnrollTransformation(const Loop *L)
LoopUnrollResult
Represents the result of a UnrollLoop invocation.
Definition UnrollLoop.h:58
@ PartiallyUnrolled
The loop was partially unrolled – we still have a loop, but with a smaller trip count.
Definition UnrollLoop.h:65
@ Unmodified
The loop was not modified.
Definition UnrollLoop.h:60
@ FullyUnrolled
The loop was fully unrolled into straight-line code.
Definition UnrollLoop.h:69
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
LLVM_ABI void getLoopAnalysisUsage(AnalysisUsage &AU)
Helper to consistently add the set of standard passes to a loop pass's AnalysisUsage.
LLVM_ABI void peelLoop(Loop *L, unsigned PeelCount, bool PeelLast, LoopInfo *LI, ScalarEvolution *SE, DominatorTree &DT, AssumptionCache *AC, bool PreserveLCSSA, ValueToValueMapTy &VMap)
VMap is the value-map that maps instructions from the original loop to instructions in the last peele...
const char *const LLVMLoopUnrollFollowupAll
Definition UnrollLoop.h:45
TargetTransformInfo TTI
TransformationMode
The mode sets how eager a transformation should be applied.
Definition LoopUtils.h:292
@ TM_ForcedByUser
The transformation was directed by the user, e.g.
Definition LoopUtils.h:309
@ TM_Disable
The transformation should not be applied.
Definition LoopUtils.h:301
@ TM_Enable
The transformation should be applied without considering a cost model.
Definition LoopUtils.h:298
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
LLVM_ABI MDNode * getUnrollMetadataForLoop(const Loop *L, StringRef Name)
DWARFExpression::Operation Op
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
const char *const LLVMLoopUnrollFollowupRemainder
Definition UnrollLoop.h:48
LLVM_ABI PreservedAnalyses getLoopPassPreservedAnalyses()
Returns the minimum set of Analyses that all loop passes must preserve.
const char *const LLVMLoopUnrollFollowupUnrolled
Definition UnrollLoop.h:46
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
Definition STLExtras.h:2208
constexpr bool valueOr(BoolOrDefault X, bool Default)
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI LoopUnrollResult UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI, ScalarEvolution *SE, DominatorTree *DT, AssumptionCache *AC, const llvm::TargetTransformInfo *TTI, OptimizationRemarkEmitter *ORE, bool PreserveLCSSA, Loop **RemainderLoop=nullptr, AAResults *AA=nullptr)
Unroll the given loop by Count.
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
Utility to calculate the size and a few similar metrics for a set of basic blocks.
Definition CodeMetrics.h:34
static LLVM_ABI void collectEphemeralValues(const Loop *L, AssumptionCache *AC, SmallPtrSetImpl< const Value * > &EphValues)
Collect a loop's ephemeral values (those used only by an assume or similar intrinsics in the loop).
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...
bool PeelLast
Peel off the last PeelCount loop iterations.
bool PeelProfiledIterations
Allow peeling basing on profile.
unsigned PeelCount
A forced peeling factor (the number of bodied of the original loop that should be peeled off before t...
Parameters that control the generic loop unrolling transformation.
bool UpperBound
Allow using trip count upper bound to unroll loops.
unsigned Threshold
The cost threshold for the unrolled loop.
bool Force
Apply loop unroll on any kind of loop (mainly to loops that fail runtime unrolling).
unsigned PartialOptSizeThreshold
The cost threshold for the unrolled loop when optimizing for size, like OptSizeThreshold,...
unsigned DefaultUnrollRuntimeCount
Default unroll count for loops with run-time trip count.
unsigned MaxPercentThresholdBoost
If complete unrolling will reduce the cost of the loop, we will boost the Threshold by a certain perc...
bool RuntimeUnrollMultiExit
Allow runtime unrolling multi-exit loops.
unsigned SCEVExpansionBudget
Don't allow runtime unrolling if expanding the trip count takes more than SCEVExpansionBudget.
bool AddAdditionalAccumulators
Allow unrolling to add parallel reduction phis.
unsigned UnrollAndJamInnerLoopThreshold
Threshold for unroll and jam, for inner loop size.
unsigned MaxIterationsCountToAnalyze
Don't allow loop unrolling to simulate more than this number of iterations when checking full unroll ...
bool AllowRemainder
Allow generation of a loop remainder (extra iterations after unroll).
bool UnrollAndJam
Allow unroll and jam. Used to enable unroll and jam for the target.
bool UnrollRemainder
Allow unrolling of all the iterations of the runtime loop remainder.
unsigned FullUnrollMaxCount
Set the maximum unrolling factor for full unrolling.
unsigned PartialThreshold
The cost threshold for the unrolled loop, like Threshold, but used for partial/runtime unrolling (set...
bool Runtime
Allow runtime unrolling (unrolling of loops to expand the size of the loop body even when the number ...
bool Partial
Allow partial unrolling (unrolling of loops to expand the size of the loop body, not only to eliminat...
unsigned OptSizeThreshold
The cost threshold for the unrolled loop when optimizing for size (set to UINT_MAX to disable).
bool AllowExpensiveTripCount
Allow emitting expensive instructions (such as divisions) when computing the trip count of a loop for...
unsigned MaxUpperBound
Set the maximum upper bound of trip count.
const Instruction * Heart
Definition UnrollLoop.h:79
const bool PragmaFullUnroll
Definition UnrollLoop.h:131
LLVM_ABI UnrollPragmaInfo(const Loop *L)
const unsigned PragmaCount
Definition UnrollLoop.h:132
const bool ExplicitUnroll
Definition UnrollLoop.h:135
const bool PragmaRuntimeUnrollDisable
Definition UnrollLoop.h:134
const bool UserUnrollCount
Definition UnrollLoop.h:130
const bool PragmaEnableUnroll
Definition UnrollLoop.h:133