LLVM 24.0.0git
LoopInterchange.cpp
Go to the documentation of this file.
1//===- LoopInterchange.cpp - Loop interchange 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 handles loop interchange transform.
10// This pass interchanges loops to provide a more cache-friendly memory access
11// patterns.
12//
13//===----------------------------------------------------------------------===//
14
16#include "llvm/ADT/STLExtras.h"
17#include "llvm/ADT/SmallSet.h"
19#include "llvm/ADT/Statistic.h"
20#include "llvm/ADT/StringMap.h"
21#include "llvm/ADT/StringRef.h"
30#include "llvm/IR/BasicBlock.h"
32#include "llvm/IR/Dominators.h"
33#include "llvm/IR/Function.h"
34#include "llvm/IR/IRBuilder.h"
35#include "llvm/IR/InstrTypes.h"
36#include "llvm/IR/Instruction.h"
38#include "llvm/IR/User.h"
39#include "llvm/IR/Value.h"
42#include "llvm/Support/Debug.h"
49#include <cassert>
50#include <utility>
51#include <vector>
52
53using namespace llvm;
54
55#define DEBUG_TYPE "loop-interchange"
56
57STATISTIC(LoopsInterchanged, "Number of loops interchanged");
58
60 "loop-interchange-threshold", cl::init(0), cl::Hidden,
61 cl::desc("Interchange if you gain more than this number"));
62
64 "loop-interchange-max-mem-instr-ratio", cl::init(4), cl::Hidden,
65 cl::desc("Maximum number of load/store instructions squared in relation to "
66 "the total number of instructions. Higher value may lead to more "
67 "interchanges at the cost of compile-time"));
68
69namespace {
70
72
73/// A list of direction vectors. Each entry represents a direction vector
74/// corresponding to one or more dependencies existing in the loop nest. The
75/// length of all direction vectors is equal and is N + 1, where N is the depth
76/// of the loop nest. The first N elements correspond to the dependency
77/// direction of each N loops. The last one indicates whether this entry is
78/// forward dependency ('<') or not ('*'). The term "forward" aligns with what
79/// is defined in LoopAccessAnalysis.
80// TODO: Check if we can use a sparse matrix here.
81using CharMatrix = std::vector<std::vector<char>>;
82
83/// Types of rules used in profitability check.
84enum class RuleTy {
85 PerLoopCacheAnalysis,
86 PerInstrOrderCost,
87 ForVectorization,
88 Ignore
89};
90
91} // end anonymous namespace
92
93// Minimum loop depth supported.
95 "loop-interchange-min-loop-nest-depth", cl::init(2), cl::Hidden,
96 cl::desc("Minimum depth of loop nest considered for the transform"));
97
98// Maximum loop depth supported.
100 "loop-interchange-max-loop-nest-depth", cl::init(10), cl::Hidden,
101 cl::desc("Maximum depth of loop nest considered for the transform"));
102
103// We prefer cache cost to vectorization by default.
105 "loop-interchange-profitabilities", cl::MiscFlags::CommaSeparated,
107 cl::desc("List of profitability heuristics to be used. They are applied in "
108 "the given order"),
109 cl::list_init<RuleTy>({RuleTy::PerInstrOrderCost,
110 RuleTy::ForVectorization}),
111 cl::values(clEnumValN(RuleTy::PerLoopCacheAnalysis, "cache",
112 "Prioritize loop cache cost"),
113 clEnumValN(RuleTy::PerInstrOrderCost, "instorder",
114 "Prioritize the IVs order of each instruction"),
115 clEnumValN(RuleTy::ForVectorization, "vectorize",
116 "Prioritize vectorization"),
117 clEnumValN(RuleTy::Ignore, "ignore",
118 "Ignore profitability, force interchange (does not "
119 "work with other options)")));
120
121// Support for the inner-loop reduction pattern.
123 "loop-interchange-reduction-to-mem", cl::init(false), cl::Hidden,
124 cl::desc("Support for the inner-loop reduction pattern."));
125
126#ifndef NDEBUG
129 for (RuleTy Rule : Rules) {
130 if (!Set.insert(Rule).second)
131 return false;
132 if (Rule == RuleTy::Ignore)
133 return false;
134 }
135 return true;
136}
137
138static void printDepMatrix(CharMatrix &DepMatrix) {
139 for (auto &Row : DepMatrix) {
140 // Drop the last element because it is a flag indicating whether this is
141 // forward dependency or not, which doesn't affect the legality check.
142 for (char D : drop_end(Row))
143 LLVM_DEBUG(dbgs() << D << " ");
144 LLVM_DEBUG(dbgs() << "\n");
145 }
146}
147
148/// Return true if \p Src appears before \p Dst in the same basic block.
149/// Precondition: \p Src and \Dst are distinct instructions within the same
150/// basic block.
151static bool inThisOrder(const Instruction *Src, const Instruction *Dst) {
152 assert(Src->getParent() == Dst->getParent() && Src != Dst &&
153 "Expected Src and Dst to be different instructions in the same BB");
154
155 bool FoundSrc = false;
156 for (const Instruction &I : *(Src->getParent())) {
157 if (&I == Src) {
158 FoundSrc = true;
159 continue;
160 }
161 if (&I == Dst)
162 return FoundSrc;
163 }
164
165 llvm_unreachable("Dst not found");
166}
167#endif
168
169static bool populateDependencyMatrix(CharMatrix &DepMatrix, unsigned Level,
170 Loop *L, DependenceInfo *DI,
171 ScalarEvolution *SE,
174
175 ValueVector MemInstr;
176 unsigned NumInsts = 0;
177
178 // For each block.
179 for (BasicBlock *BB : L->blocks()) {
180 // Scan the BB and collect legal loads and stores.
181 for (Instruction &I : *BB) {
182 NumInsts++;
183 if (auto *Ld = dyn_cast<LoadInst>(&I)) {
184 if (!Ld->isSimple())
185 return false;
186 MemInstr.push_back(&I);
187 } else if (auto *St = dyn_cast<StoreInst>(&I)) {
188 if (!St->isSimple())
189 return false;
190 MemInstr.push_back(&I);
191 }
192 }
193 }
194
195 // To populate the dependence matrix, we perform dependence test for each pair
196 // of memory instructions, which has O(NumMemInstr^2) complexity. This implies
197 // that even if the number of memory instructions is small, the analysis can
198 // still be expensive if the most of the instructions in the loop are memory
199 // instructions. On the other hand, if the number of memory instructions is
200 // not small, but the loop is large (i.e., it contains many non-memory
201 // instructions), the analysis can still be affordable.
202 unsigned NumMemInstr = MemInstr.size();
203 LLVM_DEBUG(dbgs() << "Found " << NumMemInstr
204 << " Loads and Stores to analyze\n");
205 if (MaxMemInstrRatio * NumInsts < NumMemInstr * NumMemInstr) {
206 ORE->emit([&]() {
207 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsupportedLoop",
208 L->getStartLoc(), L->getHeader())
209 << "Number of loads/stores exceeded, the supported maximum can be "
210 "increased with option -loop-interchange-max-mem-instr-ratio.";
211 });
212 return false;
213 }
214 ValueVector::iterator I, IE, J, JE;
215
216 // Manage direction vectors that are already seen. Map each direction vector
217 // to an index of DepMatrix at which it is stored.
219
220 for (I = MemInstr.begin(), IE = MemInstr.end(); I != IE; ++I) {
221 for (J = I, JE = MemInstr.end(); J != JE; ++J) {
222 std::vector<char> Dep;
225 // Ignore Input dependencies.
226 if (isa<LoadInst>(Src) && isa<LoadInst>(Dst))
227 continue;
228 // Track Output, Flow, and Anti dependencies.
229 if (auto D = DI->depends(Src, Dst)) {
230 assert(D->isOrdered() && "Expected an output, flow or anti dep.");
231 // If the direction vector is negative, normalize it to
232 // make it non-negative.
233 if (D->normalize(SE))
234 LLVM_DEBUG(dbgs() << "Negative dependence vector normalized.\n");
235 LLVM_DEBUG(StringRef DepType =
236 D->isFlow() ? "flow" : D->isAnti() ? "anti" : "output";
237 dbgs() << "Found " << DepType
238 << " dependency between Src and Dst\n"
239 << " Src:" << *Src << "\n Dst:" << *Dst << '\n');
240 unsigned Levels = D->getLevels();
241 char Direction;
242 for (unsigned II = 1; II <= Levels; ++II) {
243 // `DVEntry::LE` is converted to `*`. This is because `LE` means `<`
244 // or `=`, for which we don't have an equivalent representation, so
245 // that the conservative approximation is necessary. The same goes for
246 // `DVEntry::GE`.
247 // TODO: Use of fine-grained expressions allows for more accurate
248 // analysis.
249 unsigned Dir = D->getDirection(II);
250 if (Dir == Dependence::DVEntry::LT)
251 Direction = '<';
252 else if (Dir == Dependence::DVEntry::GT)
253 Direction = '>';
254 else if (Dir == Dependence::DVEntry::EQ)
255 Direction = '=';
256 else
257 Direction = '*';
258 Dep.push_back(Direction);
259 }
260
261 // If the Dependence object doesn't have any information, fill the
262 // dependency vector with '*'.
263 if (D->isConfused()) {
264 assert(Dep.empty() && "Expected empty dependency vector");
265 Dep.assign(Level, '*');
266 }
267
268 while (Dep.size() != Level) {
269 Dep.push_back('I');
270 }
271
272 // If all the elements of any direction vector have only '*', legality
273 // can't be proven. Exit early to save compile time.
274 if (all_of(Dep, equal_to('*'))) {
275 ORE->emit([&]() {
276 return OptimizationRemarkMissed(DEBUG_TYPE, "Dependence",
277 L->getStartLoc(), L->getHeader())
278 << "All loops have dependencies in all directions.";
279 });
280 return false;
281 }
282
283 // Test whether the dependency is forward or not.
284 bool IsKnownForward = true;
285 if (Src->getParent() != Dst->getParent()) {
286 // In general, when Src and Dst are in different BBs, the execution
287 // order of them within a single iteration is not guaranteed. Treat
288 // conservatively as not-forward dependency in this case.
289 IsKnownForward = false;
290 } else {
291 // Src and Dst are in the same BB. If they are the different
292 // instructions, Src should appear before Dst in the BB as they are
293 // stored to MemInstr in that order.
294 assert((Src == Dst || inThisOrder(Src, Dst)) &&
295 "Unexpected instructions");
296
297 // If the Dependence object is reversed (due to normalization), it
298 // represents the dependency from Dst to Src, meaning it is a backward
299 // dependency. Otherwise it should be a forward dependency.
300 bool IsReversed = D->getSrc() != Src;
301 if (IsReversed)
302 IsKnownForward = false;
303 }
304
305 // Initialize the last element. Assume forward dependencies only; it
306 // will be updated later if there is any non-forward dependency.
307 Dep.push_back('<');
308
309 // The last element should express the "summary" among one or more
310 // direction vectors whose first N elements are the same (where N is
311 // the depth of the loop nest). Hence we exclude the last element from
312 // the Seen map.
313 auto [Ite, Inserted] = Seen.try_emplace(
314 StringRef(Dep.data(), Dep.size() - 1), DepMatrix.size());
315
316 // Make sure we only add unique entries to the dependency matrix.
317 if (Inserted)
318 DepMatrix.push_back(Dep);
319
320 // If we cannot prove that this dependency is forward, change the last
321 // element of the corresponding entry. Since a `[... *]` dependency
322 // includes a `[... <]` dependency, we do not need to keep both and
323 // change the existing entry instead.
324 if (!IsKnownForward)
325 DepMatrix[Ite->second].back() = '*';
326 }
327 }
328 }
329
330 return true;
331}
332
333// A loop is moved from index 'from' to an index 'to'. Update the Dependence
334// matrix by exchanging the two columns.
335static void interChangeDependencies(CharMatrix &DepMatrix, unsigned FromIndx,
336 unsigned ToIndx) {
337 for (auto &Row : DepMatrix)
338 std::swap(Row[ToIndx], Row[FromIndx]);
339}
340
341// Check if a direction vector is lexicographically positive. Return true if it
342// is positive, nullopt if it is "zero", otherwise false.
343// [Theorem] A permutation of the loops in a perfect nest is legal if and only
344// if the direction matrix, after the same permutation is applied to its
345// columns, has no ">" direction as the leftmost non-"=" direction in any row.
346static std::optional<bool>
347isLexicographicallyPositive(ArrayRef<char> DV, unsigned Begin, unsigned End) {
348 for (unsigned char Direction : DV.slice(Begin, End - Begin)) {
349 if (Direction == '<')
350 return true;
351 if (Direction == '>' || Direction == '*')
352 return false;
353 }
354 return std::nullopt;
355}
356
357// Checks if it is legal to interchange 2 loops.
358static bool isLegalToInterChangeLoops(CharMatrix &DepMatrix,
359 unsigned InnerLoopId,
360 unsigned OuterLoopId) {
361 unsigned NumRows = DepMatrix.size();
362 std::vector<char> Cur;
363 // For each row check if it is valid to interchange.
364 for (unsigned Row = 0; Row < NumRows; ++Row) {
365 // Create temporary DepVector check its lexicographical order
366 // before and after swapping OuterLoop vs InnerLoop
367 Cur = DepMatrix[Row];
368
369 // If the surrounding loops already ensure that the direction vector is
370 // lexicographically positive, nothing within the loop will be able to break
371 // the dependence. In such a case we can skip the subsequent check.
372 if (isLexicographicallyPositive(Cur, 0, OuterLoopId) == true)
373 continue;
374
375 // Check if the direction vector is lexicographically positive (or zero)
376 // for both before/after exchanged. Ignore the last element because it
377 // doesn't affect the legality.
378 if (isLexicographicallyPositive(Cur, OuterLoopId, Cur.size() - 1) == false)
379 return false;
380 std::swap(Cur[InnerLoopId], Cur[OuterLoopId]);
381 if (isLexicographicallyPositive(Cur, OuterLoopId, Cur.size() - 1) == false)
382 return false;
383 }
384 return true;
385}
386
387static void populateWorklist(Loop &L, LoopVector &LoopList) {
388 LLVM_DEBUG(dbgs() << "Calling populateWorklist on Func: "
389 << L.getHeader()->getParent()->getName() << " Loop: %"
390 << L.getHeader()->getName() << '\n');
391 assert(LoopList.empty() && "LoopList should initially be empty!");
392 Loop *CurrentLoop = &L;
393 const std::vector<Loop *> *Vec = &CurrentLoop->getSubLoops();
394 while (!Vec->empty()) {
395 // The current loop has multiple subloops in it hence it is not tightly
396 // nested.
397 // Discard all loops above it added into Worklist.
398 if (Vec->size() != 1) {
399 LoopList = {};
400 return;
401 }
402
403 LoopList.push_back(CurrentLoop);
404 CurrentLoop = Vec->front();
405 Vec = &CurrentLoop->getSubLoops();
406 }
407 LoopList.push_back(CurrentLoop);
408}
409
412 unsigned LoopNestDepth = LoopList.size();
413 if (LoopNestDepth < MinLoopNestDepth || LoopNestDepth > MaxLoopNestDepth) {
414 LLVM_DEBUG(dbgs() << "Unsupported depth of loop nest " << LoopNestDepth
415 << ", the supported range is [" << MinLoopNestDepth
416 << ", " << MaxLoopNestDepth << "].\n");
417 Loop *OuterLoop = LoopList.front();
418 ORE.emit([&]() {
419 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsupportedLoopNestDepth",
420 OuterLoop->getStartLoc(),
421 OuterLoop->getHeader())
422 << "Unsupported depth of loop nest, the supported range is ["
423 << std::to_string(MinLoopNestDepth) << ", "
424 << std::to_string(MaxLoopNestDepth) << "].\n";
425 });
426 return false;
427 }
428 return true;
429}
430
432 ArrayRef<Loop *> LoopList) {
433 for (Loop *L : LoopList) {
434 const SCEV *ExitCountOuter = SE->getBackedgeTakenCount(L);
435 if (isa<SCEVCouldNotCompute>(ExitCountOuter)) {
436 LLVM_DEBUG(dbgs() << "Couldn't compute backedge count\n");
437 return false;
438 }
439 if (L->getNumBackEdges() != 1) {
440 LLVM_DEBUG(dbgs() << "NumBackEdges is not equal to 1\n");
441 return false;
442 }
443 if (!L->getExitingBlock()) {
444 LLVM_DEBUG(dbgs() << "Loop doesn't have unique exit block\n");
445 return false;
446 }
447 }
448 return true;
449}
450
451namespace {
452
453/// LoopInterchangeLegality checks if it is legal to interchange the loop.
454class LoopInterchangeLegality {
455public:
456 LoopInterchangeLegality(Loop *Outer, Loop *Inner, ScalarEvolution *SE,
457 OptimizationRemarkEmitter *ORE, DominatorTree *DT)
458 : OuterLoop(Outer), InnerLoop(Inner), SE(SE), DT(DT), ORE(ORE) {}
459
460 /// Check if the loops can be interchanged.
461 bool canInterchangeLoops(unsigned InnerLoopId, unsigned OuterLoopId,
462 CharMatrix &DepMatrix);
463
464 /// Check if the loop structure is understood. We do not handle triangular
465 /// loops for now.
466 bool isLoopStructureUnderstood();
467
468 bool currentLimitations();
469
470 const SmallPtrSetImpl<PHINode *> &getOuterInnerReductions() const {
471 return OuterInnerReductions;
472 }
473
474 const ArrayRef<PHINode *> getInnerLoopInductions() const {
475 return InnerLoopInductions;
476 }
477
478 ArrayRef<Instruction *> getHasNoWrapReductions() const {
479 return HasNoWrapReductions;
480 }
481
482 ArrayRef<Instruction *> getHasNoInfInsts() const { return HasNoInfInsts; }
483
484 /// Record reductions in the inner loop. Currently supported reductions:
485 /// - initialized from a constant.
486 /// - reduction PHI node has only one user.
487 /// - located in the innermost loop.
488 struct InnerReduction {
489 /// The reduction itself.
490 PHINode *Reduction;
491 Value *Init;
492 Value *Next;
493 /// The Lcssa PHI.
494 PHINode *LcssaPhi;
495 /// Store reduction result into memory object.
496 StoreInst *LcssaStore;
497 /// The memory Location.
498 Value *MemRef;
499 Type *ElemTy;
500 };
501
502 ArrayRef<InnerReduction> getInnerReductions() const {
503 return InnerReductions;
504 }
505
506private:
507 bool tightlyNested(Loop *Outer, Loop *Inner);
508 bool containsUnsafeInstructions(BasicBlock *BB, Instruction *Skip);
509
510 /// Traverse all PHI nodes in the header of each loop in the loop nest
511 /// starting from \p OuterLoop, and perform the following checks:
512 ///
513 /// - Identify induction variables in the child loop of \p OuterLoop.
514 /// - Check for reductions across the inner loop and \p OuterLoop.
515 /// - Detect unsupported PHI nodes.
516 ///
517 /// Return false if any unsupported PHI node is found or if no induction
518 /// variable is found in the child loop of \p OuterLoop. Otherwise return
519 /// true.
520 bool checkInductionsAndReductions(Loop *OuterLoop);
521
522 /// Detect and record the reduction of the inner loop. Add them to
523 /// InnerReductions.
524 ///
525 /// innerloop:
526 /// Re = phi<0.0, Next>
527 /// Next = Re op ...
528 /// OuterLoopLatch:
529 /// Lcssa = phi<Next> ; lcssa phi
530 /// store Lcssa, MemRef ; LcssaStore
531 ///
532 bool isInnerReduction(Loop *L, PHINode *Phi,
533 SmallVectorImpl<Instruction *> &HasNoWrapInsts);
534
535 Loop *OuterLoop;
536 Loop *InnerLoop;
537
538 ScalarEvolution *SE;
539 DominatorTree *DT;
540
541 /// Interface to emit optimization remarks.
542 OptimizationRemarkEmitter *ORE;
543
544 /// Set of reduction PHIs taking part of a reduction across the inner and
545 /// outer loop.
546 SmallPtrSet<PHINode *, 4> OuterInnerReductions;
547
548 /// Set of inner loop induction PHIs
549 SmallVector<PHINode *, 8> InnerLoopInductions;
550
551 /// Hold instructions that have nuw/nsw flags and involved in reductions,
552 /// like integer addition/multiplication. Those flags must be dropped when
553 /// interchanging the loops.
554 SmallVector<Instruction *, 4> HasNoWrapReductions;
555
556 /// Hold instructions that have ninf flags and involved in reductions. Those
557 /// flags must be dropped when interchanging the loops.
558 SmallVector<Instruction *, 4> HasNoInfInsts;
559
560 /// Vector of reductions in the inner loop.
561 SmallVector<InnerReduction, 8> InnerReductions;
562};
563
564/// Manages information utilized by the profitability check for cache. The main
565/// purpose of this class is to delay the computation of CacheCost until it is
566/// actually needed.
567class CacheCostManager {
568 Loop *OutermostLoop;
569 LoopStandardAnalysisResults *AR;
570 DependenceInfo *DI;
571
572 /// CacheCost for \ref OutermostLoop. Once it is computed, it is cached. Note
573 /// that the result can be nullptr.
574 std::optional<std::unique_ptr<CacheCost>> CC;
575
576 /// Maps each loop to an index representing the optimal position within the
577 /// loop-nest, as determined by the cache cost analysis.
578 DenseMap<const Loop *, unsigned> CostMap;
579
580 void computeIfUnitinialized();
581
582public:
583 CacheCostManager(Loop *OutermostLoop, LoopStandardAnalysisResults *AR,
584 DependenceInfo *DI)
585 : OutermostLoop(OutermostLoop), AR(AR), DI(DI) {}
586 CacheCost *getCacheCost();
587 const DenseMap<const Loop *, unsigned> &getCostMap();
588};
589
590/// LoopInterchangeProfitability checks if it is profitable to interchange the
591/// loop.
592class LoopInterchangeProfitability {
593public:
594 LoopInterchangeProfitability(Loop *Outer, Loop *Inner, ScalarEvolution *SE,
595 OptimizationRemarkEmitter *ORE)
596 : OuterLoop(Outer), InnerLoop(Inner), SE(SE), ORE(ORE) {}
597
598 /// Check if the loop interchange is profitable.
599 bool isProfitable(const Loop *InnerLoop, const Loop *OuterLoop,
600 unsigned InnerLoopId, unsigned OuterLoopId,
601 CharMatrix &DepMatrix, CacheCostManager &CCM);
602
603private:
604 int getInstrOrderCost();
605 std::optional<bool> isProfitablePerLoopCacheAnalysis(
606 const DenseMap<const Loop *, unsigned> &CostMap, CacheCost *CC);
607 std::optional<bool> isProfitablePerInstrOrderCost();
608 std::optional<bool> isProfitableForVectorization(unsigned InnerLoopId,
609 unsigned OuterLoopId,
610 CharMatrix &DepMatrix);
611 Loop *OuterLoop;
612 Loop *InnerLoop;
613
614 /// Scev analysis.
615 ScalarEvolution *SE;
616
617 /// Interface to emit optimization remarks.
618 OptimizationRemarkEmitter *ORE;
619};
620
621/// LoopInterchangeTransform interchanges the loop.
622class LoopInterchangeTransform {
623public:
624 LoopInterchangeTransform(Loop *Outer, Loop *Inner, ScalarEvolution *SE,
625 LoopInfo *LI, DominatorTree *DT,
626 const LoopInterchangeLegality &LIL)
627 : OuterLoop(Outer), InnerLoop(Inner), SE(SE), LI(LI), DT(DT), LIL(LIL) {}
628
629 /// Interchange OuterLoop and InnerLoop.
630 void transform(ArrayRef<Instruction *> DropNoWrapInsts,
631 ArrayRef<Instruction *> DropNoInfInsts);
632 void reduction2Memory();
633 void restructureLoops(Loop *NewInner, Loop *NewOuter,
634 BasicBlock *OrigInnerPreHeader,
635 BasicBlock *OrigOuterPreHeader);
636 void removeChildLoop(Loop *OuterLoop, Loop *InnerLoop);
637
638private:
639 void adjustLoopLinks();
640 void adjustLoopBranches();
641
642 Loop *OuterLoop;
643 Loop *InnerLoop;
644
645 /// Scev analysis.
646 ScalarEvolution *SE;
647
648 LoopInfo *LI;
649 DominatorTree *DT;
650
651 const LoopInterchangeLegality &LIL;
652};
653
654struct LoopInterchange {
655 ScalarEvolution *SE = nullptr;
656 LoopInfo *LI = nullptr;
657 DependenceInfo *DI = nullptr;
658 DominatorTree *DT = nullptr;
659 LoopStandardAnalysisResults *AR = nullptr;
660
661 /// Interface to emit optimization remarks.
662 OptimizationRemarkEmitter *ORE;
663
664 LoopInterchange(ScalarEvolution *SE, LoopInfo *LI, DependenceInfo *DI,
665 DominatorTree *DT, LoopStandardAnalysisResults *AR,
666 OptimizationRemarkEmitter *ORE)
667 : SE(SE), LI(LI), DI(DI), DT(DT), AR(AR), ORE(ORE) {}
668
669 bool run(Loop *L) {
670 if (L->getParentLoop())
671 return false;
672 SmallVector<Loop *, 8> LoopList;
673 populateWorklist(*L, LoopList);
674 return processLoopList(LoopList);
675 }
676
677 bool run(LoopNest &LN) {
678 SmallVector<Loop *, 8> LoopList(LN.getLoops());
679 for (unsigned I = 1; I < LoopList.size(); ++I)
680 if (LoopList[I]->getParentLoop() != LoopList[I - 1])
681 return false;
682 return processLoopList(LoopList);
683 }
684
685 unsigned selectLoopForInterchange(ArrayRef<Loop *> LoopList) {
686 // TODO: Add a better heuristic to select the loop to be interchanged based
687 // on the dependence matrix. Currently we select the innermost loop.
688 return LoopList.size() - 1;
689 }
690
691 bool processLoopList(SmallVectorImpl<Loop *> &LoopList) {
692 bool Changed = false;
693
694 // Ensure proper loop nest depth.
695 assert(hasSupportedLoopDepth(LoopList, *ORE) &&
696 "Unsupported depth of loop nest.");
697
698 unsigned LoopNestDepth = LoopList.size();
699
700 LLVM_DEBUG({
701 dbgs() << "Processing LoopList of size = " << LoopNestDepth
702 << " containing the following loops:\n";
703 for (auto *L : LoopList) {
704 dbgs() << " - ";
705 L->print(dbgs());
706 }
707 });
708
709 CharMatrix DependencyMatrix;
710 Loop *OuterMostLoop = *(LoopList.begin());
711 if (!populateDependencyMatrix(DependencyMatrix, LoopNestDepth,
712 OuterMostLoop, DI, SE, ORE)) {
713 LLVM_DEBUG(dbgs() << "Populating dependency matrix failed\n");
714 return false;
715 }
716
717 LLVM_DEBUG(dbgs() << "Dependency matrix before interchange:\n";
718 printDepMatrix(DependencyMatrix));
719
720 // Get the Outermost loop exit.
721 BasicBlock *LoopNestExit = OuterMostLoop->getExitBlock();
722 if (!LoopNestExit) {
723 LLVM_DEBUG(dbgs() << "OuterMostLoop '" << OuterMostLoop->getName()
724 << "' needs an unique exit block");
725 return false;
726 }
727
728 unsigned SelecLoopId = selectLoopForInterchange(LoopList);
729 CacheCostManager CCM(LoopList[0], AR, DI);
730 // We try to achieve the globally optimal memory access for the loopnest,
731 // and do interchange based on a bubble-sort fasion. We start from
732 // the innermost loop, move it outwards to the best possible position
733 // and repeat this process.
734 for (unsigned j = SelecLoopId; j > 0; j--) {
735 bool ChangedPerIter = false;
736 for (unsigned i = SelecLoopId; i > SelecLoopId - j; i--) {
737 bool Interchanged =
738 processLoop(LoopList, i, i - 1, DependencyMatrix, CCM);
739 ChangedPerIter |= Interchanged;
740 Changed |= Interchanged;
741 }
742 // Early abort if there was no interchange during an entire round of
743 // moving loops outwards.
744 if (!ChangedPerIter)
745 break;
746 }
747 return Changed;
748 }
749
750 bool processLoop(SmallVectorImpl<Loop *> &LoopList, unsigned InnerLoopId,
751 unsigned OuterLoopId,
752 std::vector<std::vector<char>> &DependencyMatrix,
753 CacheCostManager &CCM) {
754 Loop *OuterLoop = LoopList[OuterLoopId];
755 Loop *InnerLoop = LoopList[InnerLoopId];
756 LLVM_DEBUG(dbgs() << "Processing InnerLoopId = " << InnerLoopId
757 << " and OuterLoopId = " << OuterLoopId << "\n");
758 LoopInterchangeLegality LIL(OuterLoop, InnerLoop, SE, ORE, DT);
759 if (!LIL.canInterchangeLoops(InnerLoopId, OuterLoopId, DependencyMatrix)) {
760 LLVM_DEBUG(dbgs() << "Cannot prove legality, not interchanging loops '"
761 << OuterLoop->getName() << "' and '"
762 << InnerLoop->getName() << "'\n");
763 return false;
764 }
765 LLVM_DEBUG(dbgs() << "Loops '" << OuterLoop->getName() << "' and '"
766 << InnerLoop->getName()
767 << "' are legal to interchange\n");
768 LoopInterchangeProfitability LIP(OuterLoop, InnerLoop, SE, ORE);
769 if (!LIP.isProfitable(InnerLoop, OuterLoop, InnerLoopId, OuterLoopId,
770 DependencyMatrix, CCM)) {
771 LLVM_DEBUG(dbgs() << "Interchanging loops '" << OuterLoop->getName()
772 << "' and '" << InnerLoop->getName()
773 << "' not profitable.\n");
774 return false;
775 }
776
777 ORE->emit([&]() {
778 return OptimizationRemark(DEBUG_TYPE, "Interchanged",
779 InnerLoop->getStartLoc(),
780 InnerLoop->getHeader())
781 << "Loop interchanged with enclosing loop.";
782 });
783
784 LoopInterchangeTransform LIT(OuterLoop, InnerLoop, SE, LI, DT, LIL);
785 LIT.transform(LIL.getHasNoWrapReductions(), LIL.getHasNoInfInsts());
786 LLVM_DEBUG(dbgs() << "Loops interchanged: outer loop '"
787 << OuterLoop->getName() << "' and inner loop '"
788 << InnerLoop->getName() << "'\n");
789 LoopsInterchanged++;
790
791 llvm::formLCSSARecursively(*OuterLoop, *DT, LI, SE);
792
793 // Loops interchanged, update LoopList accordingly.
794 std::swap(LoopList[OuterLoopId], LoopList[InnerLoopId]);
795 // Update the DependencyMatrix
796 interChangeDependencies(DependencyMatrix, InnerLoopId, OuterLoopId);
797
798 LLVM_DEBUG(dbgs() << "Dependency matrix after interchange:\n";
799 printDepMatrix(DependencyMatrix));
800
801 return true;
802 }
803};
804
805} // end anonymous namespace
806
807bool LoopInterchangeLegality::containsUnsafeInstructions(BasicBlock *BB,
808 Instruction *Skip) {
809 return any_of(*BB, [Skip](const Instruction &I) {
810 if (&I == Skip)
811 return false;
812 return I.mayHaveSideEffects() || I.mayReadFromMemory();
813 });
814}
815
817 Loop *InnerLoop) {
818 // adjustLoopLinks swaps the preheader bodies after changing their loop
819 // roles, so the original outer-preheader body remains outside the new outer
820 // loop and retains its execution count.
821 BasicBlock *Blocks[] = {
822 OuterLoop->getHeader(),
823 OuterLoop->getLoopLatch(),
824 InnerLoop->getLoopPreheader(),
825 InnerLoop->getExitBlock(),
826 };
827 for (BasicBlock *BB : Blocks)
828 if (BB)
829 for (Instruction &I : *BB)
830 if (auto *Freeze = dyn_cast<FreezeInst>(&I))
831 return Freeze;
832 return nullptr;
833}
834
835static FreezeInst *
837 ArrayRef<PHINode *> InnerLoopInductions) {
838 // Mirror the latch-condition and induction-update operand closure cloned by
839 // MoveInstructions in LoopInterchangeTransform::transform.
841 auto IsDirectInnerLoopBlock = [InnerLoop](BasicBlock *BB) {
842 return InnerLoop->contains(BB) &&
843 none_of(InnerLoop->getSubLoops(),
844 [BB](Loop *SubLoop) { return SubLoop->contains(BB); });
845 };
846 auto *LatchBranch =
848 if (LatchBranch)
849 if (auto *Condition = dyn_cast<Instruction>(LatchBranch->getCondition()))
850 Worklist.insert(Condition);
851
852 for (PHINode *Induction : InnerLoopInductions) {
853 auto *Incoming = dyn_cast<Instruction>(
854 Induction->getIncomingValueForBlock(InnerLoop->getLoopLatch()));
855 if (Incoming && !is_contained(InnerLoopInductions, Incoming))
856 Worklist.insert(Incoming);
857 }
858
859 for (unsigned I = 0; I < Worklist.size(); ++I) {
860 Instruction *Current = Worklist[I];
861 if (auto *Freeze = dyn_cast<FreezeInst>(Current))
862 return Freeze;
863 for (Value *Operand : Current->operands()) {
864 auto *OperandI = dyn_cast<Instruction>(Operand);
865 if (!OperandI || !IsDirectInnerLoopBlock(OperandI->getParent()) ||
866 is_contained(InnerLoopInductions, OperandI))
867 continue;
868 Worklist.insert(OperandI);
869 }
870 }
871 return nullptr;
872}
873
874bool LoopInterchangeLegality::tightlyNested(Loop *OuterLoop, Loop *InnerLoop) {
875 BasicBlock *OuterLoopHeader = OuterLoop->getHeader();
876 BasicBlock *InnerLoopPreHeader = InnerLoop->getLoopPreheader();
877 BasicBlock *OuterLoopLatch = OuterLoop->getLoopLatch();
878
879 LLVM_DEBUG(dbgs() << "Checking if loops '" << OuterLoop->getName()
880 << "' and '" << InnerLoop->getName()
881 << "' are tightly nested\n");
882
883 // In a perfectly nested loop the outer header branches only into the inner
884 // loop. If it can also reach the outer latch, it conditionally guards the
885 // inner loop (an imperfect nest), so the inner loop runs on only a subset of
886 // the outer iterations. Interchanging such a nest would run the inner loop on
887 // every outer iteration, including the guarded-off ones, which is illegal
888 // when the inner loop relies on the guard to terminate (e.g. an eq/ne exit
889 // whose trip count is degenerate once the guard is false). Reject by allowing
890 // the outer header to branch only into the inner loop.
891 //
892 // TODO: This is conservative. A guarded nest is still safe to interchange
893 // when the inner loop has a computable trip count that is empty exactly when
894 // the guard is false, e.g.:
895 // for (i = 0; i < N; i++)
896 // if (M > 0) // loop-invariant guard
897 // for (j = 0; j < M; j++) // empty when M <= 0
898 // A[j][i] = ...;
899 // Interchanging is legal here because the inner loop runs zero times on the
900 // guarded-off iterations.
901 for (BasicBlock *Succ : successors(OuterLoopHeader))
902 if (Succ != InnerLoopPreHeader && Succ != InnerLoop->getHeader())
903 return false;
904
905 LLVM_DEBUG(dbgs() << "Checking instructions in Loop header and Loop latch\n");
906
907 // The inner loop reduction pattern requires storing the LCSSA PHI in
908 // the OuterLoop Latch. Therefore, when reduction2Memory is enabled, skip
909 // that store during checks.
910 Instruction *Skip = nullptr;
911 assert(InnerReductions.size() <= 1 &&
912 "So far we only support at most one reduction.");
913 if (InnerReductions.size() == 1)
914 Skip = InnerReductions[0].LcssaStore;
915
916 // We do not have any basic block in between now make sure the outer header
917 // and outer loop latch doesn't contain any unsafe instructions.
918 if (containsUnsafeInstructions(OuterLoopHeader, Skip) ||
919 containsUnsafeInstructions(OuterLoopLatch, Skip))
920 return false;
921
922 // Also make sure the inner loop preheader does not contain any unsafe
923 // instructions. Note that all instructions in the preheader will be moved to
924 // the outer loop header when interchanging.
925 if (InnerLoopPreHeader != OuterLoopHeader &&
926 containsUnsafeInstructions(InnerLoopPreHeader, Skip))
927 return false;
928
929 BasicBlock *InnerLoopExit = InnerLoop->getExitBlock();
930 // Ensure the inner loop exit block flows to the outer loop latch possibly
931 // through empty blocks.
932 const BasicBlock &SuccInner =
933 LoopNest::skipEmptyBlockUntil(InnerLoopExit, OuterLoopLatch);
934 if (&SuccInner != OuterLoopLatch) {
935 LLVM_DEBUG(dbgs() << "Inner loop exit block " << *InnerLoopExit
936 << " does not lead to the outer loop latch.\n";);
937 return false;
938 }
939 // The inner loop exit block does flow to the outer loop latch and not some
940 // other BBs, now make sure it contains safe instructions, since it will be
941 // moved into the (new) inner loop after interchange.
942 if (containsUnsafeInstructions(InnerLoopExit, Skip))
943 return false;
944
945 LLVM_DEBUG(dbgs() << "Loops are perfectly nested\n");
946 // We have a perfect loop nest.
947 return true;
948}
949
950bool LoopInterchangeLegality::isLoopStructureUnderstood() {
951 BasicBlock *InnerLoopPreheader = InnerLoop->getLoopPreheader();
952 for (PHINode *InnerInduction : InnerLoopInductions) {
953 unsigned Num = InnerInduction->getNumOperands();
954 for (unsigned i = 0; i < Num; ++i) {
955 Value *Val = InnerInduction->getOperand(i);
956 if (isa<Constant>(Val))
957 continue;
959 if (!I)
960 return false;
961 // TODO: Handle triangular loops.
962 // e.g. for(int i=0;i<N;i++)
963 // for(int j=i;j<N;j++)
964 unsigned IncomBlockIndx = PHINode::getIncomingValueNumForOperand(i);
965 if (InnerInduction->getIncomingBlock(IncomBlockIndx) ==
966 InnerLoopPreheader &&
967 !OuterLoop->isLoopInvariant(I)) {
968 return false;
969 }
970 }
971 }
972
973 // TODO: Handle triangular loops of another form.
974 // e.g. for(int i=0;i<N;i++)
975 // for(int j=0;j<i;j++)
976 // or,
977 // for(int i=0;i<N;i++)
978 // for(int j=0;j*i<N;j++)
979 BasicBlock *InnerLoopLatch = InnerLoop->getLoopLatch();
980 CondBrInst *InnerLoopLatchBI =
981 dyn_cast<CondBrInst>(InnerLoopLatch->getTerminator());
982 if (!InnerLoopLatchBI)
983 return false;
984
985 CmpInst *InnerLoopCmp = dyn_cast<CmpInst>(InnerLoopLatchBI->getCondition());
986 if (!InnerLoopCmp)
987 return false;
988
989 Value *Op0 = InnerLoopCmp->getOperand(0);
990 Value *Op1 = InnerLoopCmp->getOperand(1);
991
992 // LHS and RHS of the inner loop exit condition, e.g.,
993 // in "for(int j=0;j<i;j++)", LHS is j and RHS is i.
994 Value *Left = nullptr;
995 Value *Right = nullptr;
996
997 // Check if V only involves inner loop induction variable.
998 // Return true if V is InnerInduction, or a cast from
999 // InnerInduction, or a binary operator that involves
1000 // InnerInduction and a constant.
1001 std::function<bool(Value *)> IsPathToInnerIndVar;
1002 IsPathToInnerIndVar = [this, &IsPathToInnerIndVar](const Value *V) -> bool {
1003 if (llvm::is_contained(InnerLoopInductions, V))
1004 return true;
1005 if (isa<Constant>(V))
1006 return true;
1008 if (!I)
1009 return false;
1010 if (isa<CastInst>(I))
1011 return IsPathToInnerIndVar(I->getOperand(0));
1013 return IsPathToInnerIndVar(I->getOperand(0)) &&
1014 IsPathToInnerIndVar(I->getOperand(1));
1015 return false;
1016 };
1017
1018 // In case of multiple inner loop indvars, it is okay if LHS and RHS
1019 // are both inner indvar related variables.
1020 if (IsPathToInnerIndVar(Op0) && IsPathToInnerIndVar(Op1))
1021 return true;
1022
1023 // Otherwise we check if the cmp instruction compares an inner indvar
1024 // related variable (Left) with a outer loop invariant (Right).
1025 if (IsPathToInnerIndVar(Op0) && !isa<Constant>(Op0)) {
1026 Left = Op0;
1027 Right = Op1;
1028 } else if (IsPathToInnerIndVar(Op1) && !isa<Constant>(Op1)) {
1029 Left = Op1;
1030 Right = Op0;
1031 }
1032
1033 if (Left == nullptr)
1034 return false;
1035
1036 const SCEV *S = SE->getSCEV(Right);
1037 if (!SE->isLoopInvariant(S, OuterLoop))
1038 return false;
1039
1040 return true;
1041}
1042
1043// If SV is a LCSSA PHI node with a single incoming value, return the incoming
1044// value.
1047 if (!PHI)
1048 return SV;
1049
1050 if (PHI->getNumIncomingValues() != 1)
1051 return SV;
1052 return followLCSSA(PHI->getIncomingValue(0));
1053}
1054
1056 SmallVectorImpl<Instruction *> &HasNoWrapInsts,
1057 SmallVectorImpl<Instruction *> &HasNoInfInsts) {
1060 // Detect floating point reduction only when it can be reordered.
1061 if (RD.getExactFPMathInst() != nullptr)
1062 return false;
1063
1064 RecurKind RK = RD.getRecurrenceKind();
1065 switch (RK) {
1066 case RecurKind::Or:
1067 case RecurKind::And:
1068 case RecurKind::Xor:
1069 case RecurKind::SMin:
1070 case RecurKind::SMax:
1071 case RecurKind::UMin:
1072 case RecurKind::UMax:
1073 return true;
1074
1075 // Interchanging the loops that contain AnyOf reduction is not always legal.
1076 // Especially, when the result value of the AnyOf is not loop-invariant with
1077 // respect to the outer loop, interchanging may change the semantics. The
1078 // following is an example of such case:
1079 // int A = {{ 1, 0 }, { 0, 1 }};
1080 // int red = 0;
1081 // for (int i = 0; i < 2; i++)
1082 // for (int j = 0; j < 2; j++)
1083 // red = (A[j][i] == 0) ? i + 1 : red;
1084 //
1085 // TODO: We may be able to support interchanging loops with AnyOf reduction
1086 // by checking the operand of the reduction is loop-invariant with respect
1087 // to the outer loop as well.
1088 case RecurKind::AnyOf:
1089 return false;
1090
1091 // Changing the order of floating-point operations may alter the results. If
1092 // a certain instruction has the ninf flag, it means that reordering can
1093 // produce a poison value, which may lead to undefined behavior. To prevent
1094 // this, we must drop the ninf flags if we decide to apply the
1095 // transformation.
1096 case RecurKind::FAdd:
1097 case RecurKind::FMul:
1098 case RecurKind::FMin:
1099 case RecurKind::FMax:
1104 case RecurKind::FMulAdd:
1105 for (Instruction *I : RD.getReductionOpChain(PHI, L))
1106 if (isa<FPMathOperator>(I) && I->hasNoInfs())
1107 HasNoInfInsts.push_back(I);
1108 return true;
1109
1110 // Change the order of integer addition/multiplication may change the
1111 // semantics. Consider the following case:
1112 //
1113 // int A[2][2] = {{ INT_MAX, INT_MAX }, { INT_MIN, INT_MIN }};
1114 // int sum = 0;
1115 // for (int i = 0; i < 2; i++)
1116 // for (int j = 0; j < 2; j++)
1117 // sum += A[j][i];
1118 //
1119 // If the above loops are exchanged, the addition will cause an
1120 // overflow. To prevent this, we must drop the nuw/nsw flags from the
1121 // addition/multiplication instructions when we actually exchanges the
1122 // loops.
1123 case RecurKind::Add:
1124 case RecurKind::Mul: {
1125 unsigned OpCode = RecurrenceDescriptor::getOpcode(RK);
1127
1128 // Bail out when we fail to collect reduction instructions chain.
1129 if (Ops.empty())
1130 return false;
1131
1132 for (Instruction *I : Ops) {
1133 assert(I->getOpcode() == OpCode &&
1134 "Expected the instruction to be the reduction operation");
1135 (void)OpCode;
1136
1137 // If the instruction has nuw/nsw flags, we must drop them when the
1138 // transformation is actually performed.
1139 if (I->hasNoSignedWrap() || I->hasNoUnsignedWrap())
1140 HasNoWrapInsts.push_back(I);
1141 }
1142 return true;
1143 }
1144
1145 default:
1146 return false;
1147 }
1148 } else
1149 return false;
1150}
1151
1152// Check V's users to see if it is involved in a reduction in L.
1153static PHINode *
1155 SmallVectorImpl<Instruction *> &HasNoWrapInsts,
1156 SmallVectorImpl<Instruction *> &HasNoInfInsts) {
1157 // Reduction variables cannot be constants.
1158 if (isa<Constant>(V))
1159 return nullptr;
1160
1161 for (Value *User : V->users()) {
1163 if (PHI->getNumIncomingValues() == 1)
1164 continue;
1165
1166 if (checkReductionKind(L, PHI, HasNoWrapInsts, HasNoInfInsts))
1167 return PHI;
1168 else
1169 return nullptr;
1170 }
1171 }
1172
1173 return nullptr;
1174}
1175
1176bool LoopInterchangeLegality::isInnerReduction(
1177 Loop *L, PHINode *Phi, SmallVectorImpl<Instruction *> &HasNoWrapInsts) {
1178
1179 // Only support reduction2Mem when the loop nest to be interchanged is
1180 // the innermost two loops.
1181 if (!L->isInnermost()) {
1182 LLVM_DEBUG(dbgs() << "Only supported when the loop is the innermost.\n");
1183 ORE->emit([&]() {
1184 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsupportedInnerReduction",
1185 L->getStartLoc(), L->getHeader())
1186 << "Only supported when the loop is the innermost.";
1187 });
1188 return false;
1189 }
1190
1191 if (Phi->getNumIncomingValues() != 2)
1192 return false;
1193
1194 Value *Init = Phi->getIncomingValueForBlock(L->getLoopPreheader());
1195 Value *Next = Phi->getIncomingValueForBlock(L->getLoopLatch());
1196
1197 // So far only supports constant initial value.
1198 if (!isa<Constant>(Init)) {
1199 LLVM_DEBUG(
1200 dbgs()
1201 << "Only supported for the reduction with a constant initial value.\n");
1202 ORE->emit([&]() {
1203 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsupportedInnerReduction",
1204 L->getStartLoc(), L->getHeader())
1205 << "Only supported for the reduction with a constant initial "
1206 "value.";
1207 });
1208 return false;
1209 }
1210
1211 // The reduction result must live in the inner loop.
1212 if (Instruction *I = dyn_cast<Instruction>(Next)) {
1213 BasicBlock *BB = I->getParent();
1214 if (!L->contains(BB))
1215 return false;
1216 }
1217
1218 // The reduction should have only one user.
1219 if (!Phi->hasOneUser())
1220 return false;
1221
1222 // Check the reduction kind.
1223 if (!checkReductionKind(L, Phi, HasNoWrapInsts, HasNoInfInsts))
1224 return false;
1225
1226 // Find lcssa_phi in OuterLoop's Latch
1227 BasicBlock *ExitBlock = L->getExitBlock();
1228 if (!ExitBlock)
1229 return false;
1230
1231 PHINode *Lcssa = NULL;
1232 for (auto *U : Next->users()) {
1233 if (auto *P = dyn_cast<PHINode>(U)) {
1234 if (P == Phi)
1235 continue;
1236
1237 if (Lcssa == NULL && P->getParent() == ExitBlock &&
1238 P->getIncomingValueForBlock(L->getLoopLatch()) == Next)
1239 Lcssa = P;
1240 else
1241 return false;
1242 } else
1243 return false;
1244 }
1245 if (!Lcssa)
1246 return false;
1247
1248 if (!Lcssa->hasOneUser()) {
1249 LLVM_DEBUG(dbgs() << "Only supported when the reduction is used once in "
1250 "the outer loop.\n");
1251 ORE->emit([&]() {
1252 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsupportedInnerReduction",
1253 L->getStartLoc(), L->getHeader())
1254 << "Only supported when the reduction is used once in the outer "
1255 "loop.";
1256 });
1257 return false;
1258 }
1259
1260 StoreInst *LcssaStore =
1262 if (!LcssaStore || LcssaStore->getParent() != ExitBlock)
1263 return false;
1264
1265 Value *MemRef = LcssaStore->getOperand(1);
1266 Type *ElemTy = LcssaStore->getOperand(0)->getType();
1267
1268 // LcssaStore stores the reduction result in BB.
1269 // When the reduction is initialized from a constant value, we need to load
1270 // from the memory object into the target basic block of the inner loop. This
1271 // means the memory reference was used prematurely. So we must ensure that the
1272 // memory reference does not dominate the target basic block.
1273 // TODO: Move the memory reference definition into the loop header.
1274 if (!DT->dominates(dyn_cast<Instruction>(MemRef), L->getHeader())) {
1275 LLVM_DEBUG(dbgs() << "Only supported when memory reference dominate "
1276 "the inner loop.\n");
1277 ORE->emit([&]() {
1278 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsupportedInnerReduction",
1279 L->getStartLoc(), L->getHeader())
1280 << "Only supported when memory reference dominate the inner "
1281 "loop.";
1282 });
1283 return false;
1284 }
1285
1286 // Found a reduction in the inner loop.
1287 InnerReduction SR;
1288 SR.Reduction = Phi;
1289 SR.Init = Init;
1290 SR.Next = Next;
1291 SR.LcssaPhi = Lcssa;
1292 SR.LcssaStore = LcssaStore;
1293 SR.MemRef = MemRef;
1294 SR.ElemTy = ElemTy;
1295
1296 InnerReductions.push_back(SR);
1297 return true;
1298}
1299
1300bool LoopInterchangeLegality::checkInductionsAndReductions(Loop *OuterLoop) {
1301 auto ChildLoop = [](Loop *L) {
1302 assert(L->getSubLoops().size() <= 1 &&
1303 "Expect at most one child loop for now.");
1304 return L->getSubLoops().empty() ? nullptr : L->getSubLoops().front();
1305 };
1306
1307 Loop *InnerLoop = ChildLoop(OuterLoop);
1308 for (Loop *CurLoop = OuterLoop; CurLoop; CurLoop = ChildLoop(CurLoop)) {
1309 for (PHINode &PHI : CurLoop->getHeader()->phis()) {
1310 InductionDescriptor ID;
1311 if (InductionDescriptor::isInductionPHI(&PHI, CurLoop, SE, ID)) {
1312 if (CurLoop == InnerLoop) {
1313 const SCEV *Step = ID.getStep();
1314 if (!SE->isLoopInvariant(Step, OuterLoop))
1315 return false;
1316 InnerLoopInductions.push_back(&PHI);
1317 }
1318 continue;
1319 }
1320
1321 if (CurLoop == OuterLoop) {
1322 // PHIs in inner loops need to be part of a reduction in the outer loop,
1323 if (PHI.getNumIncomingValues() != 2) {
1324 LLVM_DEBUG(dbgs() << "Only PHI nodes in the outer loop header with 2 "
1325 "incoming values are supported.\n");
1326 return false;
1327 }
1328 // Check if we have a PHI node in the outer loop that has a reduction
1329 // result from the inner loop as an incoming value.
1330 Value *V = followLCSSA(
1331 PHI.getIncomingValueForBlock(OuterLoop->getLoopLatch()));
1332 PHINode *InnerRedPhi = findInnerReductionPhi(
1333 InnerLoop, V, HasNoWrapReductions, HasNoInfInsts);
1334
1335 // Reject if PHI has users other than InnerRedPhi. The typical case is
1336 // as follows:
1337 //
1338 // o.header:
1339 // %red.o = phi [ 0, ... ], [ %red.next, %o.latch ]
1340 // br label %i.header
1341 //
1342 // i.header:
1343 // %red.i = phi [ %red.o, %o.header ], [ %red.next, %i.latch ]
1344 // br label %i.body
1345 //
1346 // i.body:
1347 // store %red.o to %mem
1348 // ...
1349 //
1350 if (!InnerRedPhi ||
1351 !llvm::is_contained(InnerRedPhi->incoming_values(), &PHI) ||
1352 !all_of(PHI.users(),
1353 [InnerRedPhi](User *U) { return U == InnerRedPhi; })) {
1354 LLVM_DEBUG(
1355 dbgs()
1356 << "Failed to recognize PHI as an induction or reduction.\n");
1357 ORE->emit([&]() {
1358 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsupportedPHIOuter",
1359 OuterLoop->getStartLoc(),
1360 OuterLoop->getHeader())
1361 << "Only outer loops with induction or reduction PHI nodes "
1362 "can be interchanged currently.";
1363 });
1364 return false;
1365 }
1366
1367 OuterInnerReductions.insert(&PHI);
1368 OuterInnerReductions.insert(InnerRedPhi);
1369 } else {
1370 if (OuterInnerReductions.count(&PHI)) {
1371 LLVM_DEBUG(dbgs() << "Found a reduction across the outer loop.\n");
1372 } else if (EnableReduction2Memory &&
1373 isInnerReduction(CurLoop, &PHI, HasNoWrapReductions)) {
1374 LLVM_DEBUG(dbgs() << "Found a reduction in the inner loop: \n"
1375 << PHI << '\n');
1376 } else {
1377 ORE->emit([&]() {
1378 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsupportedPHIInner",
1379 CurLoop->getStartLoc(),
1380 CurLoop->getHeader())
1381 << "Only inner loops with induction or reduction PHI nodes "
1382 "can be interchanged currently.";
1383 });
1384 return false;
1385 }
1386 }
1387 }
1388
1389 // For now we only support at most one reduction.
1390 if (InnerReductions.size() > 1) {
1391 LLVM_DEBUG(dbgs() << "Only supports at most one reduction.\n");
1392 ORE->emit([&]() {
1393 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsupportedInnerReduction",
1394 CurLoop->getStartLoc(),
1395 CurLoop->getHeader())
1396 << "Only supports at most one reduction.";
1397 });
1398 return false;
1399 }
1400 }
1401
1402 return !InnerLoopInductions.empty();
1403}
1404
1405// This function indicates the current limitations in the transform as a result
1406// of which we do not proceed.
1407bool LoopInterchangeLegality::currentLimitations() {
1408 BasicBlock *InnerLoopLatch = InnerLoop->getLoopLatch();
1409
1410 // transform currently expects the loop latches to also be the exiting
1411 // blocks.
1412 if (InnerLoop->getExitingBlock() != InnerLoopLatch ||
1413 OuterLoop->getExitingBlock() != OuterLoop->getLoopLatch() ||
1414 !isa<CondBrInst>(InnerLoopLatch->getTerminator()) ||
1415 !isa<CondBrInst>(OuterLoop->getLoopLatch()->getTerminator())) {
1416 LLVM_DEBUG(
1417 dbgs() << "Loops where the latch is not the exiting block are not"
1418 << " supported currently.\n");
1419 ORE->emit([&]() {
1420 return OptimizationRemarkMissed(DEBUG_TYPE, "ExitingNotLatch",
1421 OuterLoop->getStartLoc(),
1422 OuterLoop->getHeader())
1423 << "Loops where the latch is not the exiting block cannot be"
1424 " interchange currently.";
1425 });
1426 return true;
1427 }
1428
1429 // TODO: Triangular loops are not handled for now.
1430 if (!isLoopStructureUnderstood()) {
1431 LLVM_DEBUG(dbgs() << "Loop structure not understood by pass\n");
1432 ORE->emit([&]() {
1433 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsupportedStructureInner",
1434 InnerLoop->getStartLoc(),
1435 InnerLoop->getHeader())
1436 << "Inner loop structure not understood currently.";
1437 });
1438 return true;
1439 }
1440
1441 // Currently, we do not support loops that have a predecessor entering the
1442 // loop via an indirectbr.
1443 for (Loop *L : {OuterLoop, InnerLoop}) {
1444 BasicBlock *Header = L->getHeader();
1445 for (BasicBlock *Pred : predecessors(Header)) {
1446 if (L->contains(Pred))
1447 continue;
1448 if (isa<IndirectBrInst>(Pred->getTerminator())) {
1449 LLVM_DEBUG(
1450 dbgs() << "Indirect branch found in the loop predecessor.\n");
1451 ORE->emit([&]() {
1452 return OptimizationRemarkMissed(DEBUG_TYPE, "IndirectBranchPreheader",
1453 L->getStartLoc(), L->getHeader())
1454 << "Indirect branch found in the loop predecessor.";
1455 });
1456 return true;
1457 }
1458 }
1459 }
1460
1461 // Currently, we do not support loops where the inner loop header has
1462 // duplicate successors.
1463 SmallPtrSet<BasicBlock *, 2> InnerLoopHeaderSuccs;
1464 for (BasicBlock *Succ : successors(InnerLoop->getHeader()))
1465 if (!InnerLoopHeaderSuccs.insert(Succ).second)
1466 return true;
1467
1468 return false;
1469}
1470
1471/// We currently only support LCSSA PHI nodes in the inner loop exit if their
1472/// users are either of the following:
1473///
1474/// - Reduction PHIs
1475/// - PHIs outside the outer loop
1476/// - PHIs belonging to the latch of the outer loop
1477///
1478/// These conditions mean that we are only interested in the final value after
1479/// the inner loop.
1480static bool
1483 PHINode *LcssaReduction) {
1484 BasicBlock *InnerExit = InnerL->getUniqueExitBlock();
1485 for (PHINode &PHI : InnerExit->phis()) {
1486 // The reduction LCSSA PHI will have only one incoming block, which comes
1487 // from the loop latch.
1488 if (PHI.getNumIncomingValues() > 1)
1489 return false;
1490 // The reduction LCSSA PHI's store user is rewritten by reduction2Memory();
1491 // skip its user-check but keep validating the remaining LCSSA PHIs.
1492 if (&PHI == LcssaReduction)
1493 continue;
1494 if (any_of(PHI.users(), [&Reductions, OuterL](User *U) {
1495 PHINode *PN = dyn_cast<PHINode>(U);
1496 if (!PN)
1497 return true;
1498 if (Reductions.count(PN))
1499 return false;
1500 BasicBlock *PB = PN->getParent();
1501 if (!OuterL->contains(PB))
1502 return false;
1503 return PB != OuterL->getLoopLatch();
1504 }))
1505 return false;
1506 }
1507 return true;
1508}
1509
1510// We currently support LCSSA PHI nodes in the outer loop exit, if their
1511// incoming values do not come from the outer loop latch or if the
1512// outer loop latch has a single predecessor. In that case, the value will
1513// be available if both the inner and outer loop conditions are true, which
1514// will still be true after interchanging. If we have multiple predecessor,
1515// that may not be the case, e.g. because the outer loop latch may be executed
1516// if the inner loop is not executed.
1517static bool areOuterLoopExitPHIsSupported(Loop *OuterLoop, Loop *InnerLoop) {
1518 BasicBlock *LoopNestExit = OuterLoop->getUniqueExitBlock();
1519 for (PHINode &PHI : LoopNestExit->phis()) {
1520 for (Value *Incoming : PHI.incoming_values()) {
1521 Instruction *IncomingI = dyn_cast<Instruction>(Incoming);
1522 if (!IncomingI || IncomingI->getParent() != OuterLoop->getLoopLatch())
1523 continue;
1524
1525 // The incoming value is defined in the outer loop latch. Currently we
1526 // only support that in case the outer loop latch has a single predecessor.
1527 // This guarantees that the outer loop latch is executed if and only if
1528 // the inner loop is executed (because tightlyNested() guarantees that the
1529 // outer loop header only branches to the inner loop or the outer loop
1530 // latch).
1531 // FIXME: We could weaken this logic and allow multiple predecessors,
1532 // if the values are produced outside the loop latch. We would need
1533 // additional logic to update the PHI nodes in the exit block as
1534 // well.
1535 if (OuterLoop->getLoopLatch()->getUniquePredecessor() == nullptr)
1536 return false;
1537 }
1538 }
1539 return true;
1540}
1541
1542/// The transform clones the inner latch's exit condition into the new latch
1543/// (see MoveInstructions in LoopInterchangeTransform::transform), but it does
1544/// not relocate PHI nodes. So if a PHI in the inner latch feeds that condition,
1545/// a later interchange can leave the cloned PHI with a stale incoming block,
1546/// producing invalid IR. Reject that case here.
1547///
1548/// For example, %p is a PHI in the inner latch and the inner loop's exit test
1549/// reads %p, so %p feeds the condition that would be cloned:
1550///
1551/// inner.latch:
1552/// %p = phi i64 [ %v, %subloop.latch ]
1553/// %ec = icmp eq i64 %iv, %p ; inner exit test reads %p
1554/// br i1 %ec, label %exit, label %inner.header
1555///
1556/// TODO: Handle transformation of lcssa phis in the InnerLoop latch in case of
1557/// multi-level loop nests.
1558static bool areInnerLoopLatchPHIsSupported(Loop *InnerLoop) {
1559 if (InnerLoop->getSubLoops().empty())
1560 return true;
1561
1562 BasicBlock *InnerLoopLatch = InnerLoop->getLoopLatch();
1563 auto *LatchBI = dyn_cast<CondBrInst>(InnerLoopLatch->getTerminator());
1564 if (!LatchBI)
1565 return true;
1566 auto *CondI = dyn_cast<Instruction>(LatchBI->getCondition());
1567 if (!CondI)
1568 return true;
1569
1570 // Bail if a phi in the inner latch feeds the exit condition, walking operands
1571 // within the inner loop.
1573 Worklist.insert(CondI);
1574 for (unsigned I = 0; I < Worklist.size(); ++I) {
1575 Instruction *Cur = Worklist[I];
1576 if (isa<PHINode>(Cur) && Cur->getParent() == InnerLoopLatch)
1577 return false;
1578 for (Value *Op : Cur->operands())
1579 if (auto *OpI = dyn_cast<Instruction>(Op))
1580 if (InnerLoop->contains(OpI))
1581 Worklist.insert(OpI);
1582 }
1583 return true;
1584}
1585
1586bool LoopInterchangeLegality::canInterchangeLoops(unsigned InnerLoopId,
1587 unsigned OuterLoopId,
1588 CharMatrix &DepMatrix) {
1589 if (!isLegalToInterChangeLoops(DepMatrix, InnerLoopId, OuterLoopId)) {
1590 LLVM_DEBUG(dbgs() << "Failed interchange InnerLoopId = " << InnerLoopId
1591 << " and OuterLoopId = " << OuterLoopId
1592 << " due to dependence\n");
1593 ORE->emit([&]() {
1594 return OptimizationRemarkMissed(DEBUG_TYPE, "Dependence",
1595 InnerLoop->getStartLoc(),
1596 InnerLoop->getHeader())
1597 << "Cannot interchange loops due to dependences.";
1598 });
1599 return false;
1600 }
1601 // Check if outer and inner loop contain legal instructions only.
1602 for (auto *BB : OuterLoop->blocks())
1603 for (Instruction &I : *BB) {
1604 // Loads and stores are checked separately, so we can skip them here.
1606 continue;
1607
1608 // We cannot ignore potential memory reads, e.g., loads inside the called
1609 // function.
1610 if (!I.mayHaveSideEffects() && !I.mayReadFromMemory())
1611 continue;
1612
1613 LLVM_DEBUG(
1614 dbgs()
1615 << "Loops contain instructions that cannot be safely interchanged\n");
1616 ORE->emit([&]() {
1617 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsafeInst",
1618 I.getDebugLoc(), I.getParent())
1619 << "Cannot interchange loops due to instruction that is "
1620 "potentially unsafe to interchange.";
1621 });
1622
1623 return false;
1624 }
1625
1626 if (!checkInductionsAndReductions(OuterLoop)) {
1627 LLVM_DEBUG(dbgs() << "Failed to find inner loop inductions or found "
1628 "unsupported reductions.\n");
1629 return false;
1630 }
1631
1632 if (!areInnerLoopLatchPHIsSupported(InnerLoop)) {
1633 LLVM_DEBUG(dbgs() << "Found unsupported PHI nodes in inner loop latch.\n");
1634 ORE->emit([&]() {
1635 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsupportedInnerLatchPHI",
1636 InnerLoop->getStartLoc(),
1637 InnerLoop->getHeader())
1638 << "Cannot interchange loops because unsupported PHI nodes found "
1639 "in inner loop latch.";
1640 });
1641 return false;
1642 }
1643
1644 FreezeInst *Freeze = findFreezeInReNestedBlocks(OuterLoop, InnerLoop);
1645 if (!Freeze)
1646 Freeze = findFreezeInInnerLatchCloneSet(InnerLoop, InnerLoopInductions);
1647 if (Freeze) {
1648 LLVM_DEBUG(dbgs() << "Interchange would re-nest or duplicate freeze\n");
1649 ORE->emit([&]() {
1650 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsafeInst",
1651 Freeze->getDebugLoc(),
1652 Freeze->getParent())
1653 << "Cannot interchange loops because re-nesting or duplicating "
1654 "freeze may change its sampling behavior.";
1655 });
1656 return false;
1657 }
1658
1659 // TODO: The loops could not be interchanged due to current limitations in the
1660 // transform module.
1661 if (currentLimitations()) {
1662 LLVM_DEBUG(dbgs() << "Not legal because of current transform limitation\n");
1663 return false;
1664 }
1665
1666 // Check if the loops are tightly nested.
1667 if (!tightlyNested(OuterLoop, InnerLoop)) {
1668 LLVM_DEBUG(dbgs() << "Loops not tightly nested\n");
1669 ORE->emit([&]() {
1670 return OptimizationRemarkMissed(DEBUG_TYPE, "NotTightlyNested",
1671 InnerLoop->getStartLoc(),
1672 InnerLoop->getHeader())
1673 << "Cannot interchange loops because they are not tightly "
1674 "nested.";
1675 });
1676 return false;
1677 }
1678
1679 // The LCSSA PHI for the reduction has passed checks before; its user
1680 // is a store instruction.
1681 PHINode *LcssaReduction = nullptr;
1682 assert(InnerReductions.size() <= 1 &&
1683 "So far we only support at most one reduction.");
1684 if (InnerReductions.size() == 1)
1685 LcssaReduction = InnerReductions[0].LcssaPhi;
1686
1687 if (!areInnerLoopExitPHIsSupported(OuterLoop, InnerLoop, OuterInnerReductions,
1688 LcssaReduction)) {
1689 LLVM_DEBUG(dbgs() << "Found unsupported PHI nodes in inner loop exit.\n");
1690 ORE->emit([&]() {
1691 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsupportedExitPHI",
1692 InnerLoop->getStartLoc(),
1693 InnerLoop->getHeader())
1694 << "Found unsupported PHI node in loop exit.";
1695 });
1696 return false;
1697 }
1698
1699 if (!areOuterLoopExitPHIsSupported(OuterLoop, InnerLoop)) {
1700 LLVM_DEBUG(dbgs() << "Found unsupported PHI nodes in outer loop exit.\n");
1701 ORE->emit([&]() {
1702 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsupportedExitPHI",
1703 OuterLoop->getStartLoc(),
1704 OuterLoop->getHeader())
1705 << "Found unsupported PHI node in loop exit.";
1706 });
1707 return false;
1708 }
1709
1710 if (any_of(OuterLoop->getLoopLatch()->phis(),
1711 [](PHINode &PHI) { return PHI.getNumIncomingValues() != 1; })) {
1712 LLVM_DEBUG(dbgs() << "Only outer loop latch PHI nodes with one incoming "
1713 "value are supported.\n");
1714 ORE->emit([&]() {
1715 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsupportedLatchPHI",
1716 OuterLoop->getStartLoc(),
1717 OuterLoop->getHeader())
1718 << "Only outer loop latch PHI nodes with one incoming value are "
1719 "supported.";
1720 });
1721 return false;
1722 }
1723
1724 // Regarding def-use chains that begin at an LCSSA PHI in the inner loop exit
1725 // and end at any instruction in the outer loop latch, we currently support
1726 // only the case where the chain contains only PHI nodes. Since we already
1727 // call `tightlyNested()`, we know that if there is a def-use chain that we
1728 // don't support (i.e., a chain that contains a non-PHI user), then the
1729 // non-PHI user must be in the outer loop latch.
1730 if (InnerLoop->getExitBlock() != OuterLoop->getLoopLatch())
1731 for (PHINode &PHI : OuterLoop->getLoopLatch()->phis())
1732 if (any_of(PHI.users(), [](const User *U) { return !isa<PHINode>(U); })) {
1733 LLVM_DEBUG(dbgs() << "Outer loop latch PHI has a non-PHI user.\n");
1734 ORE->emit([&]() {
1735 return OptimizationRemarkMissed(DEBUG_TYPE, "UnsupportedLatchPHI",
1736 OuterLoop->getStartLoc(),
1737 OuterLoop->getHeader())
1738 << "Cannot interchange loops because an outer loop latch PHI "
1739 "node has a non-PHI user.";
1740 });
1741 return false;
1742 }
1743
1744 return true;
1745}
1746
1747void CacheCostManager::computeIfUnitinialized() {
1748 if (CC.has_value())
1749 return;
1750
1751 LLVM_DEBUG(dbgs() << "Compute CacheCost.\n");
1752 CC = CacheCost::getCacheCost(*OutermostLoop, *AR, *DI);
1753 // Obtain the loop vector returned from loop cache analysis beforehand,
1754 // and put each <Loop, index> pair into a map for constant time query
1755 // later. Indices in loop vector reprsent the optimal order of the
1756 // corresponding loop, e.g., given a loopnest with depth N, index 0
1757 // indicates the loop should be placed as the outermost loop and index N
1758 // indicates the loop should be placed as the innermost loop.
1759 //
1760 // For the old pass manager CacheCost would be null.
1761 if (*CC != nullptr)
1762 for (const auto &[Idx, Cost] : enumerate((*CC)->getLoopCosts()))
1763 CostMap[Cost.first] = Idx;
1764}
1765
1766CacheCost *CacheCostManager::getCacheCost() {
1767 computeIfUnitinialized();
1768 return CC->get();
1769}
1770
1771const DenseMap<const Loop *, unsigned> &CacheCostManager::getCostMap() {
1772 computeIfUnitinialized();
1773 return CostMap;
1774}
1775
1776/// If \S contains an affine addrec for \p L, return the step recurrence of it.
1777/// If \S is loop invariant with respect to \p L, return nullptr. Otherwise,
1778/// return std::nullopt, which indicates we cannot determine the coefficient of
1779/// the addrec for \p L in \S.
1780/// TODO: Handle more complex cases. Maybe using SCEVTraversal is a good way to
1781/// do that.
1782static std::optional<const SCEV *>
1785 if (!AR) {
1786 if (SE.isLoopInvariant(S, L))
1787 return nullptr;
1788 return std::nullopt;
1789 }
1790
1791 if (!AR->isAffine()) {
1792 LLVM_DEBUG(dbgs() << "Unexpected non-affine addrec\n");
1793 return std::nullopt;
1794 }
1795
1796 std::optional<const SCEV *> Coeff =
1797 getAddRecCoefficient(SE, AR->getStart(), L);
1798 if (!Coeff.has_value())
1799 return std::nullopt;
1800
1801 if (AR->getLoop() == L) {
1802 assert(!*Coeff && "Found more than one addrec for the same loop");
1803 Coeff = AR->getStepRecurrence(SE);
1804 }
1805 return Coeff;
1806}
1807
1808int LoopInterchangeProfitability::getInstrOrderCost() {
1809 SmallPtrSet<const SCEV *, 4> GoodBasePtrs, BadBasePtrs;
1810 for (BasicBlock *BB : InnerLoop->blocks()) {
1811 for (Instruction &Ins : *BB) {
1812 if (!isa<LoadInst, StoreInst>(&Ins))
1813 continue;
1814 const SCEV *Access = SE->getSCEV(getLoadStorePointerOperand(&Ins));
1815 const SCEV *BasePtr = SE->getPointerBase(Access);
1816 std::optional<const SCEV *> OuterCoeff =
1817 getAddRecCoefficient(*SE, Access, OuterLoop);
1818 std::optional<const SCEV *> InnerCoeff =
1819 getAddRecCoefficient(*SE, Access, InnerLoop);
1820
1821 if (!OuterCoeff.has_value() || !*OuterCoeff || !InnerCoeff.has_value() ||
1822 !*InnerCoeff)
1823 continue;
1824
1825 // This heuristic assumes that a smaller step recurrence implies that the
1826 // induction variable corresponding to the loop is used in the inner
1827 // dimension of the array. Placing such a loop in the inner position would
1828 // be beneficial in terms of locality. If the array access is of the form
1829 // like `A[3*i + 2*j]`, this heuristic may lead to an unprofitable
1830 // interchange, but we expect such cases to be rare.
1831 const SCEV *OuterStep = SE->getAbsExpr(*OuterCoeff, /*IsNSW=*/false);
1832 const SCEV *InnerStep = SE->getAbsExpr(*InnerCoeff, /*IsNSW=*/false);
1833 // If we find the inner induction after an outer induction e.g.
1834 //
1835 // for(int i=0;i<N;i++)
1836 // for(int j=0;j<N;j++)
1837 // A[i][j] = A[i-1][j-1]+k;
1838 //
1839 //
1840 // then it is a good order. If we find the outer induction after an inner
1841 // induction e.g.
1842 //
1843 // for(int i=0;i<N;i++)
1844 // for(int j=0;j<N;j++)
1845 // A[j][i] = A[j-1][i-1]+k;
1846 //
1847 // then it is a bad order.
1848 //
1849 // To avoid counting the same base pointers multiple times, we deduplicate
1850 // them by using a set of base pointers.
1851 if (SE->isKnownPredicate(ICmpInst::ICMP_SLT, InnerStep, OuterStep))
1852 GoodBasePtrs.insert(BasePtr);
1853 else if (SE->isKnownPredicate(ICmpInst::ICMP_SLT, OuterStep, InnerStep))
1854 BadBasePtrs.insert(BasePtr);
1855 }
1856 }
1857
1858 int GoodOrder = GoodBasePtrs.size();
1859 int BadOrder = BadBasePtrs.size();
1860 return GoodOrder - BadOrder;
1861}
1862
1863std::optional<bool>
1864LoopInterchangeProfitability::isProfitablePerLoopCacheAnalysis(
1865 const DenseMap<const Loop *, unsigned> &CostMap, CacheCost *CC) {
1866 // This is the new cost model returned from loop cache analysis.
1867 // A smaller index means the loop should be placed an outer loop, and vice
1868 // versa.
1869 auto InnerLoopIt = CostMap.find(InnerLoop);
1870 if (InnerLoopIt == CostMap.end())
1871 return std::nullopt;
1872 auto OuterLoopIt = CostMap.find(OuterLoop);
1873 if (OuterLoopIt == CostMap.end())
1874 return std::nullopt;
1875
1876 if (CC->getLoopCost(*OuterLoop) == CC->getLoopCost(*InnerLoop))
1877 return std::nullopt;
1878 unsigned InnerIndex = InnerLoopIt->second;
1879 unsigned OuterIndex = OuterLoopIt->second;
1880 LLVM_DEBUG(dbgs() << "InnerIndex = " << InnerIndex
1881 << ", OuterIndex = " << OuterIndex << "\n");
1882 assert(InnerIndex != OuterIndex && "CostMap should assign unique "
1883 "numbers to each loop");
1884 return std::optional<bool>(InnerIndex < OuterIndex);
1885}
1886
1887std::optional<bool>
1888LoopInterchangeProfitability::isProfitablePerInstrOrderCost() {
1889 // Legacy cost model: this is rough cost estimation algorithm. It counts the
1890 // good and bad order of induction variables in the instruction and allows
1891 // reordering if number of bad orders is more than good.
1892 int Cost = getInstrOrderCost();
1893 LLVM_DEBUG(dbgs() << "Cost = " << Cost << "\n");
1895 return std::optional<bool>(true);
1896
1897 return std::nullopt;
1898}
1899
1900/// Return true if we can vectorize the loop specified by \p LoopId.
1901static bool canVectorize(const CharMatrix &DepMatrix, unsigned LoopId) {
1902 for (const auto &Dep : DepMatrix) {
1903 char Dir = Dep[LoopId];
1904 char DepType = Dep.back();
1905 assert((DepType == '<' || DepType == '*') &&
1906 "Unexpected element in dependency vector");
1907
1908 // There are no loop-carried dependencies.
1909 if (Dir == '=' || Dir == 'I')
1910 continue;
1911
1912 // DepType being '<' means that this direction vector represents a forward
1913 // dependency. In principle, a loop with '<' direction can be vectorized in
1914 // this case.
1915 if (Dir == '<' && DepType == '<')
1916 continue;
1917
1918 // We cannot prove that the loop is vectorizable.
1919 return false;
1920 }
1921 return true;
1922}
1923
1924std::optional<bool> LoopInterchangeProfitability::isProfitableForVectorization(
1925 unsigned InnerLoopId, unsigned OuterLoopId, CharMatrix &DepMatrix) {
1926 // If the outer loop cannot be vectorized, it is not profitable to move this
1927 // to inner position.
1928 if (!canVectorize(DepMatrix, OuterLoopId))
1929 return false;
1930
1931 // If the inner loop cannot be vectorized but the outer loop can be, then it
1932 // is profitable to interchange to enable inner loop parallelism.
1933 if (!canVectorize(DepMatrix, InnerLoopId))
1934 return true;
1935
1936 // If both the inner and the outer loop can be vectorized, it is necessary to
1937 // check the cost of each vectorized loop for profitability decision. At this
1938 // time we do not have a cost model to estimate them, so return nullopt.
1939 // TODO: Estimate the cost of vectorized loop when both the outer and the
1940 // inner loop can be vectorized.
1941 return std::nullopt;
1942}
1943
1944bool LoopInterchangeProfitability::isProfitable(
1945 const Loop *InnerLoop, const Loop *OuterLoop, unsigned InnerLoopId,
1946 unsigned OuterLoopId, CharMatrix &DepMatrix, CacheCostManager &CCM) {
1947 // Do not consider loops with a backedge that isn't taken, e.g. an
1948 // unconditional branch true/false, as candidates for interchange.
1949 // TODO: when interchange is forced, we should probably also allow
1950 // interchange for these loops, and thus this logic should be moved just
1951 // below the cost-model ignore check below. But this check is done first
1952 // to avoid the issue in #163954.
1953 const SCEV *InnerBTC = SE->getBackedgeTakenCount(InnerLoop);
1954 const SCEV *OuterBTC = SE->getBackedgeTakenCount(OuterLoop);
1955 if (InnerBTC && InnerBTC->isZero()) {
1956 LLVM_DEBUG(dbgs() << "Inner loop back-edge isn't taken, rejecting "
1957 "single iteration loop\n");
1958 return false;
1959 }
1960 if (OuterBTC && OuterBTC->isZero()) {
1961 LLVM_DEBUG(dbgs() << "Outer loop back-edge isn't taken, rejecting "
1962 "single iteration loop\n");
1963 return false;
1964 }
1965
1966 // Return true if interchange is forced and the cost-model ignored.
1967 if (Profitabilities.size() == 1 && Profitabilities[0] == RuleTy::Ignore)
1968 return true;
1970 "Duplicate rules and option 'ignore' are not allowed");
1971
1972 // isProfitable() is structured to avoid endless loop interchange. If the
1973 // highest priority rule (isProfitablePerLoopCacheAnalysis by default) could
1974 // decide the profitability then, profitability check will stop and return the
1975 // analysis result. If it failed to determine it (e.g., cache analysis failed
1976 // to analyze the loopnest due to delinearization issues) then go ahead the
1977 // second highest priority rule (isProfitablePerInstrOrderCost by default).
1978 // Likewise, if it failed to analysis the profitability then only, the last
1979 // rule (isProfitableForVectorization by default) will decide.
1980 std::optional<bool> shouldInterchange;
1981 for (RuleTy RT : Profitabilities) {
1982 switch (RT) {
1983 case RuleTy::PerLoopCacheAnalysis: {
1984 CacheCost *CC = CCM.getCacheCost();
1985 const DenseMap<const Loop *, unsigned> &CostMap = CCM.getCostMap();
1986 shouldInterchange = isProfitablePerLoopCacheAnalysis(CostMap, CC);
1987 break;
1988 }
1989 case RuleTy::PerInstrOrderCost:
1990 shouldInterchange = isProfitablePerInstrOrderCost();
1991 break;
1992 case RuleTy::ForVectorization:
1993 shouldInterchange =
1994 isProfitableForVectorization(InnerLoopId, OuterLoopId, DepMatrix);
1995 break;
1996 case RuleTy::Ignore:
1997 llvm_unreachable("Option 'ignore' is not supported with other options");
1998 break;
1999 }
2000
2001 // If this rule could determine the profitability, don't call subsequent
2002 // rules.
2003 if (shouldInterchange.has_value())
2004 break;
2005 }
2006
2007 if (!shouldInterchange.has_value()) {
2008 ORE->emit([&]() {
2009 return OptimizationRemarkMissed(DEBUG_TYPE, "InterchangeNotProfitable",
2010 InnerLoop->getStartLoc(),
2011 InnerLoop->getHeader())
2012 << "Insufficient information to calculate the cost of loop for "
2013 "interchange.";
2014 });
2015 return false;
2016 } else if (!shouldInterchange.value()) {
2017 ORE->emit([&]() {
2018 return OptimizationRemarkMissed(DEBUG_TYPE, "InterchangeNotProfitable",
2019 InnerLoop->getStartLoc(),
2020 InnerLoop->getHeader())
2021 << "Interchanging loops is not considered to improve cache "
2022 "locality nor vectorization.";
2023 });
2024 return false;
2025 }
2026 return true;
2027}
2028
2029void LoopInterchangeTransform::removeChildLoop(Loop *OuterLoop,
2030 Loop *InnerLoop) {
2031 for (Loop *L : *OuterLoop)
2032 if (L == InnerLoop) {
2033 OuterLoop->removeChildLoop(L);
2034 return;
2035 }
2036 llvm_unreachable("Couldn't find loop");
2037}
2038
2039/// Update LoopInfo, after interchanging. NewInner and NewOuter refer to the
2040/// new inner and outer loop after interchanging: NewInner is the original
2041/// outer loop and NewOuter is the original inner loop.
2042///
2043/// Before interchanging, we have the following structure
2044/// Outer preheader
2045// Outer header
2046// Inner preheader
2047// Inner header
2048// Inner body
2049// Inner latch
2050// outer bbs
2051// Outer latch
2052//
2053// After interchanging:
2054// Inner preheader
2055// Inner header
2056// Outer preheader
2057// Outer header
2058// Inner body
2059// outer bbs
2060// Outer latch
2061// Inner latch
2062void LoopInterchangeTransform::restructureLoops(
2063 Loop *NewInner, Loop *NewOuter, BasicBlock *OrigInnerPreHeader,
2064 BasicBlock *OrigOuterPreHeader) {
2065 Loop *OuterLoopParent = OuterLoop->getParentLoop();
2066 // The original inner loop preheader moves from the new inner loop to
2067 // the parent loop, if there is one.
2068 NewInner->removeBlockFromLoop(OrigInnerPreHeader);
2069 LI->changeLoopFor(OrigInnerPreHeader, OuterLoopParent);
2070
2071 // Switch the loop levels.
2072 if (OuterLoopParent) {
2073 // Remove the loop from its parent loop.
2074 removeChildLoop(OuterLoopParent, NewInner);
2075 removeChildLoop(NewInner, NewOuter);
2076 OuterLoopParent->addChildLoop(NewOuter);
2077 } else {
2078 removeChildLoop(NewInner, NewOuter);
2079 LI->changeTopLevelLoop(NewInner, NewOuter);
2080 }
2081 while (!NewOuter->isInnermost())
2082 NewInner->addChildLoop(NewOuter->removeChildLoop(NewOuter->begin()));
2083 NewOuter->addChildLoop(NewInner);
2084
2085 // BBs from the original inner loop.
2086 SmallVector<BasicBlock *, 8> OrigInnerBBs(NewOuter->blocks());
2087
2088 // Add BBs from the original outer loop to the original inner loop (excluding
2089 // BBs already in inner loop)
2090 for (BasicBlock *BB : NewInner->blocks())
2091 if (LI->getLoopFor(BB) == NewInner)
2092 NewOuter->addBlockEntry(BB);
2093
2094 // Now remove inner loop header and latch from the new inner loop and move
2095 // other BBs (the loop body) to the new inner loop.
2096 BasicBlock *OuterHeader = NewOuter->getHeader();
2097 BasicBlock *OuterLatch = NewOuter->getLoopLatch();
2098 for (BasicBlock *BB : OrigInnerBBs) {
2099 // Nothing will change for BBs in child loops.
2100 if (LI->getLoopFor(BB) != NewOuter)
2101 continue;
2102 // Remove the new outer loop header and latch from the new inner loop.
2103 if (BB == OuterHeader || BB == OuterLatch)
2104 NewInner->removeBlockFromLoop(BB);
2105 else
2106 LI->changeLoopFor(BB, NewInner);
2107 }
2108
2109 // The preheader of the original outer loop becomes part of the new
2110 // outer loop.
2111 NewOuter->addBlockEntry(OrigOuterPreHeader);
2112 LI->changeLoopFor(OrigOuterPreHeader, NewOuter);
2113
2114 // Tell SE that we move the loops around.
2115 SE->forgetLoop(NewOuter);
2116}
2117
2118/// User can write, or optimizers can generate the reduction for inner loop.
2119/// To make the interchange valid, apply Reduction2Mem by moving the
2120/// initializer and store instructions into the inner loop. So far we only
2121/// handle cases where the reduction variable is initialized to a constant.
2122/// For example, below code:
2123///
2124/// loop:
2125/// re = phi<0.0, next>
2126/// next = re op ...
2127/// endloop
2128/// reduc_sum = phi<next> // lcssa phi
2129/// MEM_REF[idx] = reduc_sum // LcssaStore
2130///
2131/// is transformed into:
2132///
2133/// loop:
2134/// tmp = MEM_REF[idx];
2135/// new_var = !first_iteration ? tmp : 0.0;
2136/// next = new_var op ...
2137/// MEM_REF[idx] = next; // after moving
2138/// endloop
2139///
2140/// In this way the initial const is used in the first iteration of loop.
2141void LoopInterchangeTransform::reduction2Memory() {
2143 LIL.getInnerReductions();
2144
2145 assert(InnerReductions.size() == 1 &&
2146 "So far we only support at most one reduction.");
2147
2148 LoopInterchangeLegality::InnerReduction SR = InnerReductions[0];
2149 BasicBlock *InnerLoopHeader = InnerLoop->getHeader();
2150 IRBuilder<> Builder(InnerLoopHeader, InnerLoopHeader->getFirstNonPHIIt());
2151
2152 // Check if it's the first iteration.
2153 LLVMContext &Context = InnerLoopHeader->getContext();
2154 PHINode *FirstIter =
2155 Builder.CreatePHI(Type::getInt1Ty(Context), 2, "first.iter");
2156 FirstIter->addIncoming(ConstantInt::get(Type::getInt1Ty(Context), 1),
2157 InnerLoop->getLoopPreheader());
2158 FirstIter->addIncoming(ConstantInt::get(Type::getInt1Ty(Context), 0),
2159 InnerLoop->getLoopLatch());
2160 assert(FirstIter->isComplete() && "The FirstIter PHI node is not complete.");
2161
2162 // When the reduction is initialized from a constant value, we need to add
2163 // a stmt loading from the memory object to target basic block in inner
2164 // loop.
2165 Instruction *LoadMem = Builder.CreateLoad(SR.ElemTy, SR.MemRef);
2166
2167 // Init new_var to MEM_REF or CONST depending on if it is the first iteration.
2168 Value *NewVar = Builder.CreateSelect(FirstIter, SR.Init, LoadMem, "new.var");
2169
2170 // Replace all uses of the reduction variable with a new variable.
2171 SR.Reduction->replaceAllUsesWith(NewVar);
2172
2173 // Move store instruction into inner loop, just after reduction next's
2174 // definition.
2175 SR.LcssaStore->setOperand(0, SR.Next);
2176 SR.LcssaStore->moveAfter(dyn_cast<Instruction>(SR.Next));
2177}
2178
2179void LoopInterchangeTransform::transform(
2180 ArrayRef<Instruction *> DropNoWrapInsts,
2181 ArrayRef<Instruction *> DropNoInfInsts) {
2182
2184 LIL.getInnerReductions();
2185 if (InnerReductions.size() == 1)
2186 reduction2Memory();
2187
2188 LLVM_DEBUG(dbgs() << "Splitting the inner loop latch\n");
2189 auto &InductionPHIs = LIL.getInnerLoopInductions();
2190 assert(!InductionPHIs.empty() &&
2191 "Expected at least one induction variable in the inner loop");
2192
2193 SmallVector<Instruction *, 8> InnerIndexVarList;
2194 for (PHINode *CurInductionPHI : InductionPHIs) {
2195 Instruction *IncomingValue = dyn_cast<Instruction>(
2196 CurInductionPHI->getIncomingValueForBlock(InnerLoop->getLoopLatch()));
2197 assert(IncomingValue &&
2198 "Incoming value from loop latch isn't an instruction");
2199 if (is_contained(InductionPHIs, IncomingValue))
2200 continue;
2201 InnerIndexVarList.push_back(IncomingValue);
2202 }
2203
2204 // Create a new latch block for the inner loop. We split at the
2205 // current latch's terminator and then move the condition and all
2206 // operands that are not either loop-invariant or the induction PHI into the
2207 // new latch block.
2208 BasicBlock *NewLatch =
2209 SplitBlock(InnerLoop->getLoopLatch(),
2210 InnerLoop->getLoopLatch()->getTerminator(), DT, LI);
2211
2212 // Keep these seeds and the operand filter aligned with
2213 // findFreezeInInnerLatchCloneSet.
2214 SmallSetVector<Instruction *, 4> WorkList;
2215 unsigned i = 0;
2216 auto MoveInstructions = [&i, &WorkList, this, &InductionPHIs, NewLatch]() {
2217 for (; i < WorkList.size(); i++) {
2218 // PHI nodes cannot be cloned and moved here; the legality check
2219 // (areInnerLoopLatchPHIsSupported) ensures none reach the worklist.
2220 assert(!isa<PHINode>(WorkList[i]) &&
2221 "MoveInstructions does not support PHI nodes");
2222 // Duplicate instruction and move it to the new latch. Update uses that
2223 // have been moved.
2224 Instruction *NewI = WorkList[i]->clone();
2225 NewI->insertBefore(NewLatch->getFirstNonPHIIt());
2226 assert(!NewI->mayHaveSideEffects() &&
2227 "Moving instructions with side-effects may change behavior of "
2228 "the loop nest!");
2229 for (Use &U : llvm::make_early_inc_range(WorkList[i]->uses())) {
2230 Instruction *UserI = cast<Instruction>(U.getUser());
2231 if (!InnerLoop->contains(UserI->getParent()) ||
2232 UserI->getParent() == NewLatch ||
2233 llvm::is_contained(InductionPHIs, UserI))
2234 U.set(NewI);
2235 }
2236 // Add operands of moved instruction to the worklist, except if they are
2237 // outside the inner loop or are the induction PHI.
2238 for (Value *Op : WorkList[i]->operands()) {
2240 if (!OpI || this->LI->getLoopFor(OpI->getParent()) != this->InnerLoop ||
2241 llvm::is_contained(InductionPHIs, OpI))
2242 continue;
2243 WorkList.insert(OpI);
2244 }
2245 }
2246 };
2247
2248 // FIXME: Should we interchange when we have a constant condition?
2251 ->getCondition());
2252 if (CondI)
2253 WorkList.insert(CondI);
2254 MoveInstructions();
2255 for (Instruction *InnerIndexVar : InnerIndexVarList)
2256 WorkList.insert(cast<Instruction>(InnerIndexVar));
2257 MoveInstructions();
2258
2259 // Split the inner header so that it has a unique successor.
2260 BasicBlock *InnerLoopHeader = InnerLoop->getHeader();
2261 SplitBlock(InnerLoopHeader, InnerLoopHeader->getFirstNonPHIIt(), DT, LI);
2262 LLVM_DEBUG(dbgs() << "splitting InnerLoopHeader done\n");
2263
2264 // Instructions in the original inner loop preheader may depend on values
2265 // defined in the outer loop header. Move them there, because the original
2266 // inner loop preheader will become the entry into the interchanged loop nest.
2267 // Currently we move all instructions and rely on LICM to move invariant
2268 // instructions outside the loop nest.
2269 BasicBlock *InnerLoopPreHeader = InnerLoop->getLoopPreheader();
2270 BasicBlock *OuterLoopHeader = OuterLoop->getHeader();
2271
2272 if (InnerLoopPreHeader != OuterLoopHeader) {
2273 // Eliminate PHIs in the inner-loop preheader.
2274 for (PHINode &P : make_early_inc_range(InnerLoopPreHeader->phis())) {
2275 assert(all_equal(P.incoming_values()) &&
2276 "Expected equivalent incoming values in inner loop preheader");
2277 P.replaceAllUsesWith(P.getIncomingValue(0));
2278 P.eraseFromParent();
2279 }
2280 for (Instruction &I :
2281 make_early_inc_range(make_range(InnerLoopPreHeader->begin(),
2282 std::prev(InnerLoopPreHeader->end()))))
2283 I.moveBeforePreserving(OuterLoopHeader->getTerminator()->getIterator());
2284 }
2285
2286 adjustLoopLinks();
2287
2288 // Finally, drop the nsw/nuw/ninf flags from the instructions for reduction
2289 // calculations.
2290 for (Instruction *Reduction : DropNoWrapInsts) {
2291 Reduction->setHasNoSignedWrap(false);
2292 Reduction->setHasNoUnsignedWrap(false);
2293 }
2294 for (Instruction *I : DropNoInfInsts)
2295 I->setHasNoInfs(false);
2296}
2297
2298/// \brief Move all instructions except the terminator from FromBB right before
2299/// InsertBefore
2300static void moveBBContents(BasicBlock *FromBB, Instruction *InsertBefore) {
2301 BasicBlock *ToBB = InsertBefore->getParent();
2302
2303 ToBB->splice(InsertBefore->getIterator(), FromBB, FromBB->begin(),
2304 FromBB->getTerminator()->getIterator());
2305}
2306
2307/// Swap instructions between \p BB1 and \p BB2 but keep terminators intact.
2308static void swapBBContents(BasicBlock *BB1, BasicBlock *BB2) {
2309 // Save all non-terminator instructions of BB1 into TempInstrs and unlink them
2310 // from BB1 afterwards.
2311 auto Iter = map_range(*BB1, [](Instruction &I) { return &I; });
2312 SmallVector<Instruction *, 4> TempInstrs(Iter.begin(), std::prev(Iter.end()));
2313 for (Instruction *I : TempInstrs)
2314 I->removeFromParent();
2315
2316 // Move instructions from BB2 to BB1.
2317 moveBBContents(BB2, BB1->getTerminator());
2318
2319 // Move instructions from TempInstrs to BB2.
2320 for (Instruction *I : TempInstrs)
2321 I->insertBefore(BB2->getTerminator()->getIterator());
2322}
2323
2324// Update BI to jump to NewBB instead of OldBB. Records updates to the
2325// dominator tree in DTUpdates. If \p MustUpdateOnce is true, assert that
2326// \p OldBB is exactly once in BI's successor list.
2327static void updateSuccessor(Instruction *Term, BasicBlock *OldBB,
2328 BasicBlock *NewBB,
2329 std::vector<DominatorTree::UpdateType> &DTUpdates,
2330 bool MustUpdateOnce = true) {
2331 assert((!MustUpdateOnce || llvm::count(successors(Term), OldBB) == 1) &&
2332 "BI must jump to OldBB exactly once.");
2333 bool Changed = false;
2334 for (Use &Op : Term->operands())
2335 if (Op == OldBB) {
2336 Op.set(NewBB);
2337 Changed = true;
2338 }
2339
2340 if (Changed) {
2341 DTUpdates.push_back(
2342 {DominatorTree::UpdateKind::Insert, Term->getParent(), NewBB});
2343 DTUpdates.push_back(
2344 {DominatorTree::UpdateKind::Delete, Term->getParent(), OldBB});
2345 }
2346 assert(Changed && "Expected a successor to be updated");
2347}
2348
2349// Move Lcssa PHIs to the right place.
2350static void moveLCSSAPhis(BasicBlock *InnerExit, BasicBlock *InnerHeader,
2351 BasicBlock *InnerLatch, BasicBlock *OuterHeader,
2352 BasicBlock *OuterLatch, BasicBlock *OuterExit,
2353 Loop *InnerLoop, LoopInfo *LI) {
2354
2355 // Deal with LCSSA PHI nodes in the exit block of the inner loop, that are
2356 // defined either in the header or latch. Those blocks will become header and
2357 // latch of the new outer loop, and the only possible users can PHI nodes
2358 // in the exit block of the loop nest or the outer loop header (reduction
2359 // PHIs, in that case, the incoming value must be defined in the inner loop
2360 // header). We can just substitute the user with the incoming value and remove
2361 // the PHI.
2362 for (PHINode &P : make_early_inc_range(InnerExit->phis())) {
2363 assert(P.getNumIncomingValues() == 1 &&
2364 "Only loops with a single exit are supported!");
2365
2366 Value *IncomingValue = P.getIncomingValueForBlock(InnerLatch);
2367 auto *IncI = dyn_cast<Instruction>(IncomingValue);
2368 if (!IncI) {
2369 // If the incoming value is not an instruction, it must be loop invariant.
2370 // In that case, we can just replace the PHI with the incoming value and
2371 // remove the PHI.
2372 assert(InnerLoop->isLoopInvariant(IncomingValue) &&
2373 "Expected non-instruction incoming value to be loop invariant");
2374 P.replaceAllUsesWith(IncomingValue);
2375 P.eraseFromParent();
2376 continue;
2377 }
2378
2379 // In case of multi-level nested loops, follow LCSSA to find the incoming
2380 // value defined from the innermost loop.
2381 auto *IncIInnerMost = dyn_cast<Instruction>(followLCSSA(IncI));
2382 // Skip phis when:
2383 // - they are not an instruction, e.g. incoming values are constants.
2384 // - Incomming values from the inner loop body, excluding the header and
2385 // latch.
2386 if (!IncIInnerMost || (IncIInnerMost->getParent() != InnerLatch &&
2387 IncIInnerMost->getParent() != InnerHeader))
2388 continue;
2389
2390 assert(all_of(P.users(),
2391 [OuterHeader, OuterExit, IncI, InnerHeader](User *U) {
2392 return (cast<PHINode>(U)->getParent() == OuterHeader &&
2393 IncI->getParent() == InnerHeader) ||
2394 cast<PHINode>(U)->getParent() == OuterExit;
2395 }) &&
2396 "Can only replace phis iff the uses are in the loop nest exit or "
2397 "the incoming value is defined in the inner header (it will "
2398 "dominate all loop blocks after interchanging)");
2399 P.replaceAllUsesWith(IncI);
2400 P.eraseFromParent();
2401 }
2402
2403 SmallVector<PHINode *, 8> LcssaInnerExit(
2404 llvm::make_pointer_range(InnerExit->phis()));
2405
2406 SmallVector<PHINode *, 8> LcssaInnerLatch(
2407 llvm::make_pointer_range(InnerLatch->phis()));
2408
2409 // Lcssa PHIs for values used outside the inner loop are in InnerExit.
2410 // If a PHI node has users outside of InnerExit, it has a use outside the
2411 // interchanged loop and we have to preserve it. We move these to
2412 // InnerLatch, which will become the new exit block for the innermost
2413 // loop after interchanging.
2414 for (PHINode *P : LcssaInnerExit)
2415 P->moveBefore(InnerLatch->getFirstNonPHIIt());
2416
2417 // If the inner loop latch contains LCSSA PHIs, those come from a child loop
2418 // and we have to move them to the new inner latch.
2419 for (PHINode *P : LcssaInnerLatch)
2420 P->moveBefore(InnerExit->getFirstNonPHIIt());
2421
2422 // Deal with LCSSA PHI nodes in the loop nest exit block. For PHIs that have
2423 // incoming values defined in the outer loop, we have to add a new PHI
2424 // in the inner loop latch, which became the exit block of the outer loop,
2425 // after interchanging.
2426 if (OuterExit) {
2427 for (PHINode &P : OuterExit->phis()) {
2428 if (P.getNumIncomingValues() != 1)
2429 continue;
2430 // Skip Phis with incoming values defined in the inner loop. Those should
2431 // already have been updated.
2432 auto I = dyn_cast<Instruction>(P.getIncomingValue(0));
2433 if (!I || LI->getLoopFor(I->getParent()) == InnerLoop)
2434 continue;
2435
2436 PHINode *NewPhi = dyn_cast<PHINode>(P.clone());
2437 NewPhi->setIncomingValue(0, P.getIncomingValue(0));
2438 NewPhi->setIncomingBlock(0, OuterLatch);
2439 // We might have incoming edges from other BBs, i.e., the original outer
2440 // header.
2441 for (auto *Pred : predecessors(InnerLatch)) {
2442 if (Pred == OuterLatch)
2443 continue;
2444 NewPhi->addIncoming(P.getIncomingValue(0), Pred);
2445 }
2446 NewPhi->insertBefore(InnerLatch->getFirstNonPHIIt());
2447 P.setIncomingValue(0, NewPhi);
2448 }
2449 }
2450
2451 // Now adjust the incoming blocks for the LCSSA PHIs.
2452 // For PHIs moved from Inner's exit block, we need to replace Inner's latch
2453 // with the new latch.
2454 InnerLatch->replacePhiUsesWith(InnerLatch, OuterLatch);
2455}
2456
2457/// This deals with a corner case when a LCSSA phi node appears in a non-exit
2458/// block: the outer loop latch block does not need to be exit block of the
2459/// inner loop. Consider a loop that was in LCSSA form, but then some
2460/// transformation like loop-unswitch comes along and creates an empty block,
2461/// where BB5 in this example is the outer loop latch block:
2462///
2463/// BB4:
2464/// br label %BB5
2465/// BB5:
2466/// %old.cond.lcssa = phi i16 [ %cond, %BB4 ]
2467/// br outer.header
2468///
2469/// Interchange then brings it in LCSSA form again resulting in this chain of
2470/// single-input phi nodes:
2471///
2472/// BB4:
2473/// %new.cond.lcssa = phi i16 [ %cond, %BB3 ]
2474/// br label %BB5
2475/// BB5:
2476/// %old.cond.lcssa = phi i16 [ %new.cond.lcssa, %BB4 ]
2477///
2478/// The problem is that interchange can reoder blocks BB4 and BB5 placing the
2479/// use before the def if we don't check this. The solution is to simplify
2480/// lcssa phi nodes (remove) if they appear in non-exit blocks.
2481///
2482static void simplifyLCSSAPhis(Loop *OuterLoop, Loop *InnerLoop) {
2483 BasicBlock *InnerLoopExit = InnerLoop->getExitBlock();
2484 BasicBlock *OuterLoopLatch = OuterLoop->getLoopLatch();
2485
2486 // Do not modify lcssa phis where they actually belong, i.e. in exit blocks.
2487 if (OuterLoopLatch == InnerLoopExit)
2488 return;
2489
2490 // Collect and remove phis in non-exit blocks if they have 1 input.
2492 llvm::make_pointer_range(OuterLoopLatch->phis()));
2493 for (PHINode *Phi : Phis) {
2494 assert(Phi->getNumIncomingValues() == 1 && "Single input phi expected");
2495 LLVM_DEBUG(dbgs() << "Removing 1-input phi in non-exit block: " << *Phi
2496 << "\n");
2497 Phi->replaceAllUsesWith(Phi->getIncomingValue(0));
2498 Phi->eraseFromParent();
2499 }
2500}
2501
2502void LoopInterchangeTransform::adjustLoopBranches() {
2503 LLVM_DEBUG(dbgs() << "adjustLoopBranches called\n");
2504 std::vector<DominatorTree::UpdateType> DTUpdates;
2505
2506 BasicBlock *OuterLoopPreHeader = OuterLoop->getLoopPreheader();
2507 BasicBlock *InnerLoopPreHeader = InnerLoop->getLoopPreheader();
2508
2509 assert(OuterLoopPreHeader != OuterLoop->getHeader() &&
2510 InnerLoopPreHeader != InnerLoop->getHeader() && OuterLoopPreHeader &&
2511 InnerLoopPreHeader && "Guaranteed by loop-simplify form");
2512
2513 simplifyLCSSAPhis(OuterLoop, InnerLoop);
2514
2515 // Ensure that both preheaders do not contain PHI nodes and have single
2516 // predecessors. This allows us to move them easily. We use
2517 // InsertPreHeaderForLoop to create an 'extra' preheader, if the existing
2518 // preheaders do not satisfy those conditions.
2519 if (isa<PHINode>(OuterLoopPreHeader->begin()) ||
2520 !OuterLoopPreHeader->getUniquePredecessor())
2521 OuterLoopPreHeader =
2522 InsertPreheaderForLoop(OuterLoop, DT, LI, nullptr, true);
2523 if (InnerLoopPreHeader == OuterLoop->getHeader())
2524 InnerLoopPreHeader =
2525 InsertPreheaderForLoop(InnerLoop, DT, LI, nullptr, true);
2526
2527 // Adjust the loop preheader
2528 BasicBlock *InnerLoopHeader = InnerLoop->getHeader();
2529 BasicBlock *OuterLoopHeader = OuterLoop->getHeader();
2530 BasicBlock *InnerLoopLatch = InnerLoop->getLoopLatch();
2531 BasicBlock *OuterLoopLatch = OuterLoop->getLoopLatch();
2532 BasicBlock *OuterLoopPredecessor = OuterLoopPreHeader->getUniquePredecessor();
2533 BasicBlock *InnerLoopLatchPredecessor =
2534 InnerLoopLatch->getUniquePredecessor();
2535 BasicBlock *InnerLoopLatchSuccessor;
2536 BasicBlock *OuterLoopLatchSuccessor;
2537
2538 CondBrInst *OuterLoopLatchBI =
2539 dyn_cast<CondBrInst>(OuterLoopLatch->getTerminator());
2540 CondBrInst *InnerLoopLatchBI =
2541 dyn_cast<CondBrInst>(InnerLoopLatch->getTerminator());
2542 Instruction *OuterLoopHeaderBI = OuterLoopHeader->getTerminator();
2543 Instruction *InnerLoopHeaderBI = InnerLoopHeader->getTerminator();
2544
2545 assert(OuterLoopPredecessor && InnerLoopLatchPredecessor &&
2546 "Failed to find a unique predecessor");
2547 assert(OuterLoopLatchBI && InnerLoopLatchBI &&
2548 "Failed to find a conditional branch");
2549
2550 Instruction *InnerLoopLatchPredecessorBI =
2551 InnerLoopLatchPredecessor->getTerminator();
2552 Instruction *OuterLoopPredecessorBI = OuterLoopPredecessor->getTerminator();
2553
2554 BasicBlock *InnerLoopHeaderSuccessor = InnerLoopHeader->getUniqueSuccessor();
2555 assert(InnerLoopHeaderSuccessor &&
2556 "Failed to find a unique successor for the inner loop header");
2557
2558 // Adjust Loop Preheader and headers.
2559 // The branches in the outer loop predecessor and the outer loop header can
2560 // be unconditional branches or conditional branches with duplicates. Consider
2561 // this when updating the successors.
2562 updateSuccessor(OuterLoopPredecessorBI, OuterLoopPreHeader,
2563 InnerLoopPreHeader, DTUpdates, /*MustUpdateOnce=*/false);
2564 // The outer loop header might or might not branch to the outer latch.
2565 // We are guaranteed to branch to the inner loop preheader.
2566 if (llvm::is_contained(successors(OuterLoopHeaderBI), OuterLoopLatch)) {
2567 // In this case the outerLoopHeader should branch to the InnerLoopLatch.
2568 updateSuccessor(OuterLoopHeaderBI, OuterLoopLatch, InnerLoopLatch,
2569 DTUpdates,
2570 /*MustUpdateOnce=*/false);
2571 }
2572 updateSuccessor(OuterLoopHeaderBI, InnerLoopPreHeader,
2573 InnerLoopHeaderSuccessor, DTUpdates,
2574 /*MustUpdateOnce=*/false);
2575
2576 // Adjust reduction PHI's now that the incoming block has changed.
2577 InnerLoopHeaderSuccessor->replacePhiUsesWith(InnerLoopHeader,
2578 OuterLoopHeader);
2579
2580 updateSuccessor(InnerLoopHeaderBI, InnerLoopHeaderSuccessor,
2581 OuterLoopPreHeader, DTUpdates);
2582
2583 // -------------Adjust loop latches-----------
2584 if (InnerLoopLatchBI->getSuccessor(0) == InnerLoopHeader)
2585 InnerLoopLatchSuccessor = InnerLoopLatchBI->getSuccessor(1);
2586 else
2587 InnerLoopLatchSuccessor = InnerLoopLatchBI->getSuccessor(0);
2588
2589 updateSuccessor(InnerLoopLatchPredecessorBI, InnerLoopLatch,
2590 InnerLoopLatchSuccessor, DTUpdates);
2591
2592 if (OuterLoopLatchBI->getSuccessor(0) == OuterLoopHeader)
2593 OuterLoopLatchSuccessor = OuterLoopLatchBI->getSuccessor(1);
2594 else
2595 OuterLoopLatchSuccessor = OuterLoopLatchBI->getSuccessor(0);
2596
2597 updateSuccessor(InnerLoopLatchBI, InnerLoopLatchSuccessor,
2598 OuterLoopLatchSuccessor, DTUpdates);
2599 updateSuccessor(OuterLoopLatchBI, OuterLoopLatchSuccessor, InnerLoopLatch,
2600 DTUpdates);
2601
2602 DT->applyUpdates(DTUpdates);
2603 restructureLoops(OuterLoop, InnerLoop, InnerLoopPreHeader,
2604 OuterLoopPreHeader);
2605
2606 moveLCSSAPhis(InnerLoopLatchSuccessor, InnerLoopHeader, InnerLoopLatch,
2607 OuterLoopHeader, OuterLoopLatch, InnerLoop->getExitBlock(),
2608 InnerLoop, LI);
2609 // For PHIs in the exit block of the outer loop, outer's latch has been
2610 // replaced by Inners'.
2611 OuterLoopLatchSuccessor->replacePhiUsesWith(OuterLoopLatch, InnerLoopLatch);
2612
2613 auto &OuterInnerReductions = LIL.getOuterInnerReductions();
2614 // Now update the reduction PHIs in the inner and outer loop headers.
2615 SmallVector<PHINode *, 4> InnerLoopPHIs, OuterLoopPHIs;
2616 for (PHINode &PHI : InnerLoopHeader->phis())
2617 if (OuterInnerReductions.contains(&PHI))
2618 InnerLoopPHIs.push_back(&PHI);
2619
2620 for (PHINode &PHI : OuterLoopHeader->phis())
2621 if (OuterInnerReductions.contains(&PHI))
2622 OuterLoopPHIs.push_back(&PHI);
2623
2624 // Now move the remaining reduction PHIs from outer to inner loop header and
2625 // vice versa. The PHI nodes must be part of a reduction across the inner and
2626 // outer loop and all the remains to do is and updating the incoming blocks.
2627 for (PHINode *PHI : OuterLoopPHIs) {
2628 LLVM_DEBUG(dbgs() << "Outer loop reduction PHIs:\n"; PHI->dump(););
2629 PHI->moveBefore(InnerLoopHeader->getFirstNonPHIIt());
2630 assert(OuterInnerReductions.count(PHI) && "Expected a reduction PHI node");
2631 }
2632 for (PHINode *PHI : InnerLoopPHIs) {
2633 LLVM_DEBUG(dbgs() << "Inner loop reduction PHIs:\n"; PHI->dump(););
2634 PHI->moveBefore(OuterLoopHeader->getFirstNonPHIIt());
2635 assert(OuterInnerReductions.count(PHI) && "Expected a reduction PHI node");
2636 }
2637
2638 // Update the incoming blocks for moved PHI nodes.
2639 OuterLoopHeader->replacePhiUsesWith(InnerLoopPreHeader, OuterLoopPreHeader);
2640 OuterLoopHeader->replacePhiUsesWith(InnerLoopLatch, OuterLoopLatch);
2641 InnerLoopHeader->replacePhiUsesWith(OuterLoopPreHeader, InnerLoopPreHeader);
2642 InnerLoopHeader->replacePhiUsesWith(OuterLoopLatch, InnerLoopLatch);
2643
2644 // Values defined in the outer loop header could be used in the inner loop
2645 // latch. In that case, we need to create LCSSA phis for them, because after
2646 // interchanging they will be defined in the new inner loop and used in the
2647 // new outer loop.
2648 SmallVector<Instruction *, 4> MayNeedLCSSAPhis;
2649 for (Instruction &I :
2650 make_range(OuterLoopHeader->begin(), std::prev(OuterLoopHeader->end())))
2651 MayNeedLCSSAPhis.push_back(&I);
2652 formLCSSAForInstructions(MayNeedLCSSAPhis, *DT, *LI, SE);
2653}
2654
2655void LoopInterchangeTransform::adjustLoopLinks() {
2656 // Adjust all branches in the inner and outer loop.
2657 adjustLoopBranches();
2658
2659 // We have interchanged the preheaders so we need to interchange the data in
2660 // the preheaders as well. This is because the content of the inner
2661 // preheader was previously executed inside the outer loop.
2662 BasicBlock *OuterLoopPreHeader = OuterLoop->getLoopPreheader();
2663 BasicBlock *InnerLoopPreHeader = InnerLoop->getLoopPreheader();
2664 swapBBContents(OuterLoopPreHeader, InnerLoopPreHeader);
2665}
2666
2670 LPMUpdater &U) {
2671 Function &F = *LN.getParent();
2672 SmallVector<Loop *, 8> LoopList(LN.getLoops());
2673
2675
2676 // Ensure minimum depth of the loop nest to do the interchange.
2677 if (!hasSupportedLoopDepth(LoopList, ORE))
2678 return PreservedAnalyses::all();
2679 // Ensure computable loop nest.
2680 if (!isComputableLoopNest(&AR.SE, LoopList)) {
2681 LLVM_DEBUG(dbgs() << "Not valid loop candidate for interchange\n");
2682 return PreservedAnalyses::all();
2683 }
2684
2685 ORE.emit([&]() {
2686 return OptimizationRemarkAnalysis(DEBUG_TYPE, "Dependence",
2689 << "Computed dependence info, invoking the transform.";
2690 });
2691
2692 DependenceInfo DI(&F, &AR.AA, &AR.SE, &AR.LI);
2693 if (!LoopInterchange(&AR.SE, &AR.LI, &DI, &AR.DT, &AR, &ORE).run(LN))
2694 return PreservedAnalyses::all();
2695 U.markLoopNestChanged(true);
2697}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
Rewrite undef for PHI
ReachingDefInfo InstSet InstSet & Ignore
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
DXIL Resource Access
#define DEBUG_TYPE
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
This file defines the interface for the loop cache analysis.
SmallVector< Loop *, 4 > LoopVector
Definition LoopFuse.cpp:362
Loop::LoopBounds::Direction Direction
Definition LoopInfo.cpp:253
static cl::list< RuleTy > Profitabilities("loop-interchange-profitabilities", cl::MiscFlags::CommaSeparated, cl::Hidden, cl::desc("List of profitability heuristics to be used. They are applied in " "the given order"), cl::list_init< RuleTy >({RuleTy::PerInstrOrderCost, RuleTy::ForVectorization}), cl::values(clEnumValN(RuleTy::PerLoopCacheAnalysis, "cache", "Prioritize loop cache cost"), clEnumValN(RuleTy::PerInstrOrderCost, "instorder", "Prioritize the IVs order of each instruction"), clEnumValN(RuleTy::ForVectorization, "vectorize", "Prioritize vectorization"), clEnumValN(RuleTy::Ignore, "ignore", "Ignore profitability, force interchange (does not " "work with other options)")))
static cl::opt< int > LoopInterchangeCostThreshold("loop-interchange-threshold", cl::init(0), cl::Hidden, cl::desc("Interchange if you gain more than this number"))
static FreezeInst * findFreezeInInnerLatchCloneSet(Loop *InnerLoop, ArrayRef< PHINode * > InnerLoopInductions)
static cl::opt< unsigned int > MinLoopNestDepth("loop-interchange-min-loop-nest-depth", cl::init(2), cl::Hidden, cl::desc("Minimum depth of loop nest considered for the transform"))
static void updateSuccessor(Instruction *Term, BasicBlock *OldBB, BasicBlock *NewBB, std::vector< DominatorTree::UpdateType > &DTUpdates, bool MustUpdateOnce=true)
static cl::opt< bool > EnableReduction2Memory("loop-interchange-reduction-to-mem", cl::init(false), cl::Hidden, cl::desc("Support for the inner-loop reduction pattern."))
static bool isComputableLoopNest(ScalarEvolution *SE, ArrayRef< Loop * > LoopList)
static bool areOuterLoopExitPHIsSupported(Loop *OuterLoop, Loop *InnerLoop)
static FreezeInst * findFreezeInReNestedBlocks(Loop *OuterLoop, Loop *InnerLoop)
static void moveBBContents(BasicBlock *FromBB, Instruction *InsertBefore)
Move all instructions except the terminator from FromBB right before InsertBefore.
static void simplifyLCSSAPhis(Loop *OuterLoop, Loop *InnerLoop)
This deals with a corner case when a LCSSA phi node appears in a non-exit block: the outer loop latch...
static void interChangeDependencies(CharMatrix &DepMatrix, unsigned FromIndx, unsigned ToIndx)
static void moveLCSSAPhis(BasicBlock *InnerExit, BasicBlock *InnerHeader, BasicBlock *InnerLatch, BasicBlock *OuterHeader, BasicBlock *OuterLatch, BasicBlock *OuterExit, Loop *InnerLoop, LoopInfo *LI)
static void printDepMatrix(CharMatrix &DepMatrix)
static cl::opt< unsigned int > MaxMemInstrRatio("loop-interchange-max-mem-instr-ratio", cl::init(4), cl::Hidden, cl::desc("Maximum number of load/store instructions squared in relation to " "the total number of instructions. Higher value may lead to more " "interchanges at the cost of compile-time"))
static void swapBBContents(BasicBlock *BB1, BasicBlock *BB2)
Swap instructions between BB1 and BB2 but keep terminators intact.
static PHINode * findInnerReductionPhi(Loop *L, Value *V, SmallVectorImpl< Instruction * > &HasNoWrapInsts, SmallVectorImpl< Instruction * > &HasNoInfInsts)
static bool areInnerLoopExitPHIsSupported(Loop *OuterL, Loop *InnerL, SmallPtrSetImpl< PHINode * > &Reductions, PHINode *LcssaReduction)
We currently only support LCSSA PHI nodes in the inner loop exit if their users are either of the fol...
static cl::opt< unsigned int > MaxLoopNestDepth("loop-interchange-max-loop-nest-depth", cl::init(10), cl::Hidden, cl::desc("Maximum depth of loop nest considered for the transform"))
static bool hasSupportedLoopDepth(ArrayRef< Loop * > LoopList, OptimizationRemarkEmitter &ORE)
static bool inThisOrder(const Instruction *Src, const Instruction *Dst)
Return true if Src appears before Dst in the same basic block.
static bool canVectorize(const CharMatrix &DepMatrix, unsigned LoopId)
Return true if we can vectorize the loop specified by LoopId.
static bool isLegalToInterChangeLoops(CharMatrix &DepMatrix, unsigned InnerLoopId, unsigned OuterLoopId)
#define DEBUG_TYPE
static Value * followLCSSA(Value *SV)
static void populateWorklist(Loop &L, LoopVector &LoopList)
static bool areInnerLoopLatchPHIsSupported(Loop *InnerLoop)
The transform clones the inner latch's exit condition into the new latch (see MoveInstructions in Loo...
static bool populateDependencyMatrix(CharMatrix &DepMatrix, unsigned Level, Loop *L, DependenceInfo *DI, ScalarEvolution *SE, OptimizationRemarkEmitter *ORE)
static std::optional< bool > isLexicographicallyPositive(ArrayRef< char > DV, unsigned Begin, unsigned End)
static bool checkReductionKind(Loop *L, PHINode *PHI, SmallVectorImpl< Instruction * > &HasNoWrapInsts, SmallVectorImpl< Instruction * > &HasNoInfInsts)
static std::optional< const SCEV * > getAddRecCoefficient(ScalarEvolution &SE, const SCEV *S, const Loop *L)
If \S contains an affine addrec for L, return the step recurrence of it.
static bool noDuplicateRulesAndIgnore(ArrayRef< RuleTy > Rules)
This file defines the interface for the loop nest analysis.
This header provides classes for managing a pipeline of passes over loops in LLVM IR.
loop Loop Strength Reduction
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
uint64_t IntrinsicInst * II
#define P(N)
This file contains some templates that are useful if you are working with the STL at all.
static bool processLoop(Loop &L, const AArch64Subtarget &ST, DataLayout DL)
SmallVector< Value *, 8 > ValueVector
This file defines the SmallSet class.
This file defines the SmallVector class.
static bool isProfitable(const StableFunctionMap::StableFunctionEntries &SFS)
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:119
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
const T & front() const
Get the first element.
Definition ArrayRef.h:144
size_t size() const
Get the array size.
Definition ArrayRef.h:141
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
Definition ArrayRef.h:185
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator end()
Definition BasicBlock.h:459
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:446
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
Definition BasicBlock.h:515
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
LLVM_ABI const BasicBlock * getUniqueSuccessor() const
Return the successor of this block if it has a unique successor.
LLVM_ABI void replacePhiUsesWith(BasicBlock *Old, BasicBlock *New)
Update all phi nodes in this basic block to refer to basic block New instead of basic block Old.
LLVM_ABI const BasicBlock * getUniquePredecessor() const
Return the predecessor of this block if it has a unique predecessor block.
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block lives.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
void splice(BasicBlock::iterator ToIt, BasicBlock *FromBB)
Transfer all instructions from FromBB to this basic block at ToIt.
Definition BasicBlock.h:644
static LLVM_ABI std::unique_ptr< CacheCost > getCacheCost(Loop &Root, LoopStandardAnalysisResults &AR, DependenceInfo &DI, std::optional< unsigned > TRT=std::nullopt)
Create a CacheCost for the loop nest rooted by Root.
CacheCostTy getLoopCost(const Loop &L) const
Return the estimated cost of loop L if the given loop is part of the loop nest associated with this o...
Value * getCondition() const
BasicBlock * getSuccessor(unsigned i) const
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:223
iterator end()
Definition DenseMap.h:141
DependenceInfo - This class is the main dependence-analysis driver.
LLVM_ABI std::unique_ptr< Dependence > depends(Instruction *Src, Instruction *Dst, bool UnderRuntimeAssumptions=false)
depends - Tests for a dependence between the Src and Dst instructions.
void applyUpdates(ArrayRef< UpdateType > Updates)
Inform the dominator tree about a sequence of CFG edge insertions and deletions and perform a batch u...
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
This class represents a freeze function that returns random concrete value if an operand is either a ...
static LLVM_ABI bool isInductionPHI(PHINode *Phi, const Loop *L, ScalarEvolution *SE, InductionDescriptor &D, ArrayRef< const SCEVPredicate * > NoWrapPreds={}, const SCEV *Expr=nullptr, SmallVectorImpl< Instruction * > *CastsToIgnore=nullptr)
Returns true if Phi is an induction in the loop L.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI void moveAfter(Instruction *MovePos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
LLVM_ABI bool mayHaveSideEffects() const LLVM_READONLY
Return true if the instruction may have side effects.
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
bool contains(const LoopT *L) const
Return true if the specified loop is contained within this loop.
BlockT * getLoopLatch() const
If there is a single latch block for this loop, return it.
bool isInnermost() const
Return true if the loop does not contain any (natural) loops.
void removeBlockFromLoop(BlockT *BB)
This removes the specified basic block from the current loop, updating the Blocks as appropriate.
const std::vector< LoopT * > & getSubLoops() const
Return the loops contained entirely within this loop.
BlockT * getHeader() const
iterator_range< block_iterator > blocks() const
void addChildLoop(LoopT *NewChild)
Add the specified loop to be a child of this loop.
void addBlockEntry(BlockT *BB)
This adds a basic block directly to the basic block list.
BlockT * getExitBlock() const
If getExitBlocks would return exactly one block, return that block.
BlockT * getLoopPreheader() const
If there is a preheader for this loop, return it.
BlockT * getExitingBlock() const
If getExitingBlocks would return exactly one block, return that block.
iterator begin() const
BlockT * getUniqueExitBlock() const
If getUniqueExitBlocks would return exactly one block, return that block.
LoopT * removeChildLoop(iterator I)
This removes the specified child from being a subloop of this loop.
void changeTopLevelLoop(LoopT *OldLoop, LoopT *NewLoop)
Replace the specified loop in the top-level loops list with the indicated loop.
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
void changeLoopFor(const BlockT *BB, LoopT *L)
Change the top-level loop that contains BB to the specified loop.
This class represents a loop nest and can be used to query its properties.
static const BasicBlock & skipEmptyBlockUntil(const BasicBlock *From, const BasicBlock *End, bool CheckUniquePred=false)
Recursivelly traverse all empty 'single successor' basic blocks of From (if there are any).
ArrayRef< Loop * > getLoops() const
Get the loops in the nest.
Function * getParent() const
Return the function to which the loop-nest belongs.
Loop & getOutermostLoop() const
Return the outermost loop in the loop nest.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
DebugLoc getStartLoc() const
Return the debug location of the start of this loop.
Definition LoopInfo.cpp:669
bool isLoopInvariant(const Value *V) const
Return true if the specified value is loop invariant.
Definition LoopInfo.cpp:67
StringRef getName() const
Definition LoopInfo.h:408
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.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
bool isComplete() const
If the PHI node is complete which means all of its parent's predecessors have incoming value in this ...
op_range incoming_values()
void setIncomingBlock(unsigned i, BasicBlock *BB)
void setIncomingValue(unsigned i, Value *V)
static unsigned getIncomingValueNumForOperand(unsigned i)
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
The RecurrenceDescriptor is used to identify recurrences variables in a loop.
Instruction * getExactFPMathInst() const
Returns 1st non-reassociative FP instruction in the PHI node's use-chain.
static LLVM_ABI bool isReductionPHI(PHINode *Phi, Loop *TheLoop, RecurrenceDescriptor &RedDes, DemandedBits *DB=nullptr, AssumptionCache *AC=nullptr, DominatorTree *DT=nullptr, ScalarEvolution *SE=nullptr)
Returns true if Phi is a reduction in TheLoop.
LLVM_ABI SmallVector< Instruction *, 4 > getReductionOpChain(PHINode *Phi, Loop *L) const
Attempts to find a chain of operations from Phi to LoopExitInst that can be treated as a set of reduc...
RecurKind getRecurrenceKind() const
This node represents a polynomial recurrence on the trip count of the specified loop.
bool isAffine() const
Return true if this represents an expression A + B*x where A and B are loop invariant values.
SCEVUse getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
This class represents an analyzed expression in the program.
LLVM_ABI bool isZero() const
Return true if the expression is a constant zero.
The main scalar evolution driver.
LLVM_ABI const SCEV * getAbsExpr(const SCEV *Op, bool IsNSW)
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 const SCEV * getSCEV(Value *V)
Return a SCEV expression for the full generality of the specified expression.
LLVM_ABI void forgetLoop(const Loop *L)
This method should be called by the client when it has changed a loop in a way that may effect Scalar...
LLVM_ABI bool isLoopInvariant(const SCEV *S, const Loop *L)
Return true if the value of the given SCEV is unchanging in the specified loop.
LLVM_ABI const SCEV * getPointerBase(const SCEV *V)
Transitively follow the chain of pointer-type operands until reaching a SCEV that does not have a sin...
LLVM_ABI bool isKnownPredicate(CmpPredicate Pred, SCEVUse LHS, SCEVUse RHS)
Test if the given expression is known to satisfy the condition described by Pred, LHS,...
size_type size() const
Determine the number of elements in the SetVector.
Definition SetVector.h:103
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:157
size_type size() const
Definition SmallPtrSet.h:99
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:345
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
Definition SmallSet.h:134
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition StringMap.h:128
std::pair< iterator, bool > try_emplace(StringRef Key, ArgsTy &&...Args)
Emplace a new element for the specified key into the map if the key isn't already in the map.
Definition StringMap.h:369
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr size_t size() const
Get the string size.
Definition StringRef.h:144
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
op_range operands()
Definition User.h:267
void setOperand(unsigned i, Value *Val)
Definition User.h:212
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 bool hasOneUser() const
Return true if there is exactly one user of this value.
Definition Value.cpp:163
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:553
iterator_range< user_iterator > users()
Definition Value.h:426
LLVM_ABI User * getUniqueUndroppableUser()
Return true if there is exactly one unique user of this value that cannot be dropped (that user can h...
Definition Value.cpp:185
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
list_initializer< Ty > list_init(ArrayRef< Ty > Vals)
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
DXILDebugInfoMap run(Module &M)
NodeAddr< PhiNode * > Phi
Definition RDFGraph.h:390
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 BasicBlock * InsertPreheaderForLoop(Loop *L, DominatorTree *DT, LoopInfo *LI, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)
InsertPreheaderForLoop - Once we discover that a loop doesn't have a preheader, this method is called...
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
InstructionCost Cost
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2554
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)
const Value * getLoadStorePointerOperand(const Value *V)
A helper function that returns the pointer operand of a load or store instruction.
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
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:633
constexpr auto equal_to(T &&Arg)
Functor variant of std::equal_to that can be used as a UnaryPredicate in functional algorithms like a...
Definition STLExtras.h:2173
auto map_range(ContainerTy &&C, FuncTy F)
Return a range that applies F to the elements of C.
Definition STLExtras.h:365
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
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:2026
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1753
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
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
auto drop_end(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the last N elements excluded.
Definition STLExtras.h:322
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
RecurKind
These are the kinds of recurrences that we support.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ FMinimumNum
FP min with llvm.minimumnum semantics.
@ Or
Bitwise or logical OR of integers.
@ FMinimum
FP min with llvm.minimum semantics.
@ Mul
Product of integers.
@ AnyOf
AnyOf reduction with select(cmp(),x,y) where one of (x,y) is loop invariant, and both x and y are int...
@ Xor
Bitwise or logical XOR of integers.
@ FMax
FP max implemented in terms of select(cmp()).
@ FMaximum
FP max with llvm.maximum semantics.
@ FMulAdd
Sum of float products with llvm.fmuladd(a * b + sum).
@ FMul
Product of floats.
@ SMax
Signed integer max implemented in terms of select(cmp()).
@ And
Bitwise or logical AND of integers.
@ SMin
Signed integer min implemented in terms of select(cmp()).
@ FMin
FP min implemented in terms of select(cmp()).
@ Add
Sum of integers.
@ FAdd
Sum of floats.
@ FMaximumNum
FP max with llvm.maximumnum semantics.
@ UMax
Unsigned integer max implemented in terms of select(cmp()).
LLVM_ABI BasicBlock * SplitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="")
Split the specified block at the specified instruction.
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
Definition STLExtras.h:2012
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI bool formLCSSAForInstructions(SmallVectorImpl< Instruction * > &Worklist, const DominatorTree &DT, const LoopInfo &LI, ScalarEvolution *SE, SmallVectorImpl< PHINode * > *PHIsToRemove=nullptr, SmallVectorImpl< PHINode * > *InsertedPHIs=nullptr)
Ensures LCSSA form for every instruction from the Worklist in the scope of innermost containing loop.
Definition LCSSA.cpp:328
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI PreservedAnalyses getLoopPassPreservedAnalyses()
Returns the minimum set of Analyses that all loop passes must preserve.
auto predecessors(const MachineBasicBlock *BB)
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
Definition iterator.h:368
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Next
Definition InstrProf.h:147
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition STLExtras.h:2166
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
LLVM_ABI PreservedAnalyses run(LoopNest &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...