1 //===- LoopNestAnalysis.cpp - Loop Nest Analysis --------------------------==//
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 /// \file
10 /// The implementation for the loop nest analysis.
11 ///
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm/Analysis/LoopNestAnalysis.h"
15 #include "llvm/ADT/BreadthFirstIterator.h"
16 #include "llvm/ADT/Statistic.h"
17 #include "llvm/Analysis/PostDominators.h"
18 #include "llvm/Analysis/ValueTracking.h"
19
20 using namespace llvm;
21
22 #define DEBUG_TYPE "loopnest"
23 #ifndef NDEBUG
24 static const char *VerboseDebug = DEBUG_TYPE "-verbose";
25 #endif
26
27 /// Determine whether the loops structure violates basic requirements for
28 /// perfect nesting:
29 /// - the inner loop should be the outer loop's only child
30 /// - the outer loop header should 'flow' into the inner loop preheader
31 /// or jump around the inner loop to the outer loop latch
32 /// - if the inner loop latch exits the inner loop, it should 'flow' into
33 /// the outer loop latch.
34 /// Returns true if the loop structure satisfies the basic requirements and
35 /// false otherwise.
36 static bool checkLoopsStructure(const Loop &OuterLoop, const Loop &InnerLoop,
37 ScalarEvolution &SE);
38
39 //===----------------------------------------------------------------------===//
40 // LoopNest implementation
41 //
42
LoopNest(Loop & Root,ScalarEvolution & SE)43 LoopNest::LoopNest(Loop &Root, ScalarEvolution &SE)
44 : MaxPerfectDepth(getMaxPerfectDepth(Root, SE)) {
45 append_range(Loops, breadth_first(&Root));
46 }
47
getLoopNest(Loop & Root,ScalarEvolution & SE)48 std::unique_ptr<LoopNest> LoopNest::getLoopNest(Loop &Root,
49 ScalarEvolution &SE) {
50 return std::make_unique<LoopNest>(Root, SE);
51 }
52
arePerfectlyNested(const Loop & OuterLoop,const Loop & InnerLoop,ScalarEvolution & SE)53 bool LoopNest::arePerfectlyNested(const Loop &OuterLoop, const Loop &InnerLoop,
54 ScalarEvolution &SE) {
55 assert(!OuterLoop.isInnermost() && "Outer loop should have subloops");
56 assert(!InnerLoop.isOutermost() && "Inner loop should have a parent");
57 LLVM_DEBUG(dbgs() << "Checking whether loop '" << OuterLoop.getName()
58 << "' and '" << InnerLoop.getName()
59 << "' are perfectly nested.\n");
60
61 // Determine whether the loops structure satisfies the following requirements:
62 // - the inner loop should be the outer loop's only child
63 // - the outer loop header should 'flow' into the inner loop preheader
64 // or jump around the inner loop to the outer loop latch
65 // - if the inner loop latch exits the inner loop, it should 'flow' into
66 // the outer loop latch.
67 if (!checkLoopsStructure(OuterLoop, InnerLoop, SE)) {
68 LLVM_DEBUG(dbgs() << "Not perfectly nested: invalid loop structure.\n");
69 return false;
70 }
71
72 // Bail out if we cannot retrieve the outer loop bounds.
73 auto OuterLoopLB = OuterLoop.getBounds(SE);
74 if (OuterLoopLB == None) {
75 LLVM_DEBUG(dbgs() << "Cannot compute loop bounds of OuterLoop: "
76 << OuterLoop << "\n";);
77 return false;
78 }
79
80 // Identify the outer loop latch comparison instruction.
81 const BasicBlock *Latch = OuterLoop.getLoopLatch();
82 assert(Latch && "Expecting a valid loop latch");
83 const BranchInst *BI = dyn_cast<BranchInst>(Latch->getTerminator());
84 assert(BI && BI->isConditional() &&
85 "Expecting loop latch terminator to be a branch instruction");
86
87 const CmpInst *OuterLoopLatchCmp = dyn_cast<CmpInst>(BI->getCondition());
88 DEBUG_WITH_TYPE(
89 VerboseDebug, if (OuterLoopLatchCmp) {
90 dbgs() << "Outer loop latch compare instruction: " << *OuterLoopLatchCmp
91 << "\n";
92 });
93
94 // Identify the inner loop guard instruction.
95 BranchInst *InnerGuard = InnerLoop.getLoopGuardBranch();
96 const CmpInst *InnerLoopGuardCmp =
97 (InnerGuard) ? dyn_cast<CmpInst>(InnerGuard->getCondition()) : nullptr;
98
99 DEBUG_WITH_TYPE(
100 VerboseDebug, if (InnerLoopGuardCmp) {
101 dbgs() << "Inner loop guard compare instruction: " << *InnerLoopGuardCmp
102 << "\n";
103 });
104
105 // Determine whether instructions in a basic block are one of:
106 // - the inner loop guard comparison
107 // - the outer loop latch comparison
108 // - the outer loop induction variable increment
109 // - a phi node, a cast or a branch
110 auto containsOnlySafeInstructions = [&](const BasicBlock &BB) {
111 return llvm::all_of(BB, [&](const Instruction &I) {
112 bool isAllowed = isSafeToSpeculativelyExecute(&I) || isa<PHINode>(I) ||
113 isa<BranchInst>(I);
114 if (!isAllowed) {
115 DEBUG_WITH_TYPE(VerboseDebug, {
116 dbgs() << "Instruction: " << I << "\nin basic block: " << BB
117 << " is considered unsafe.\n";
118 });
119 return false;
120 }
121
122 // The only binary instruction allowed is the outer loop step instruction,
123 // the only comparison instructions allowed are the inner loop guard
124 // compare instruction and the outer loop latch compare instruction.
125 if ((isa<BinaryOperator>(I) && &I != &OuterLoopLB->getStepInst()) ||
126 (isa<CmpInst>(I) && &I != OuterLoopLatchCmp &&
127 &I != InnerLoopGuardCmp)) {
128 DEBUG_WITH_TYPE(VerboseDebug, {
129 dbgs() << "Instruction: " << I << "\nin basic block:" << BB
130 << "is unsafe.\n";
131 });
132 return false;
133 }
134 return true;
135 });
136 };
137
138 // Check the code surrounding the inner loop for instructions that are deemed
139 // unsafe.
140 const BasicBlock *OuterLoopHeader = OuterLoop.getHeader();
141 const BasicBlock *OuterLoopLatch = OuterLoop.getLoopLatch();
142 const BasicBlock *InnerLoopPreHeader = InnerLoop.getLoopPreheader();
143
144 if (!containsOnlySafeInstructions(*OuterLoopHeader) ||
145 !containsOnlySafeInstructions(*OuterLoopLatch) ||
146 (InnerLoopPreHeader != OuterLoopHeader &&
147 !containsOnlySafeInstructions(*InnerLoopPreHeader)) ||
148 !containsOnlySafeInstructions(*InnerLoop.getExitBlock())) {
149 LLVM_DEBUG(dbgs() << "Not perfectly nested: code surrounding inner loop is "
150 "unsafe\n";);
151 return false;
152 }
153
154 LLVM_DEBUG(dbgs() << "Loop '" << OuterLoop.getName() << "' and '"
155 << InnerLoop.getName() << "' are perfectly nested.\n");
156
157 return true;
158 }
159
160 SmallVector<LoopVectorTy, 4>
getPerfectLoops(ScalarEvolution & SE) const161 LoopNest::getPerfectLoops(ScalarEvolution &SE) const {
162 SmallVector<LoopVectorTy, 4> LV;
163 LoopVectorTy PerfectNest;
164
165 for (Loop *L : depth_first(const_cast<Loop *>(Loops.front()))) {
166 if (PerfectNest.empty())
167 PerfectNest.push_back(L);
168
169 auto &SubLoops = L->getSubLoops();
170 if (SubLoops.size() == 1 && arePerfectlyNested(*L, *SubLoops.front(), SE)) {
171 PerfectNest.push_back(SubLoops.front());
172 } else {
173 LV.push_back(PerfectNest);
174 PerfectNest.clear();
175 }
176 }
177
178 return LV;
179 }
180
getMaxPerfectDepth(const Loop & Root,ScalarEvolution & SE)181 unsigned LoopNest::getMaxPerfectDepth(const Loop &Root, ScalarEvolution &SE) {
182 LLVM_DEBUG(dbgs() << "Get maximum perfect depth of loop nest rooted by loop '"
183 << Root.getName() << "'\n");
184
185 const Loop *CurrentLoop = &Root;
186 const auto *SubLoops = &CurrentLoop->getSubLoops();
187 unsigned CurrentDepth = 1;
188
189 while (SubLoops->size() == 1) {
190 const Loop *InnerLoop = SubLoops->front();
191 if (!arePerfectlyNested(*CurrentLoop, *InnerLoop, SE)) {
192 LLVM_DEBUG({
193 dbgs() << "Not a perfect nest: loop '" << CurrentLoop->getName()
194 << "' is not perfectly nested with loop '"
195 << InnerLoop->getName() << "'\n";
196 });
197 break;
198 }
199
200 CurrentLoop = InnerLoop;
201 SubLoops = &CurrentLoop->getSubLoops();
202 ++CurrentDepth;
203 }
204
205 return CurrentDepth;
206 }
207
skipEmptyBlockUntil(const BasicBlock * From,const BasicBlock * End,bool CheckUniquePred)208 const BasicBlock &LoopNest::skipEmptyBlockUntil(const BasicBlock *From,
209 const BasicBlock *End,
210 bool CheckUniquePred) {
211 assert(From && "Expecting valid From");
212 assert(End && "Expecting valid End");
213
214 if (From == End || !From->getUniqueSuccessor())
215 return *From;
216
217 auto IsEmpty = [](const BasicBlock *BB) {
218 return (BB->getInstList().size() == 1);
219 };
220
221 // Visited is used to avoid running into an infinite loop.
222 SmallPtrSet<const BasicBlock *, 4> Visited;
223 const BasicBlock *BB = From->getUniqueSuccessor();
224 const BasicBlock *PredBB = From;
225 while (BB && BB != End && IsEmpty(BB) && !Visited.count(BB) &&
226 (!CheckUniquePred || BB->getUniquePredecessor())) {
227 Visited.insert(BB);
228 PredBB = BB;
229 BB = BB->getUniqueSuccessor();
230 }
231
232 return (BB == End) ? *End : *PredBB;
233 }
234
checkLoopsStructure(const Loop & OuterLoop,const Loop & InnerLoop,ScalarEvolution & SE)235 static bool checkLoopsStructure(const Loop &OuterLoop, const Loop &InnerLoop,
236 ScalarEvolution &SE) {
237 // The inner loop must be the only outer loop's child.
238 if ((OuterLoop.getSubLoops().size() != 1) ||
239 (InnerLoop.getParentLoop() != &OuterLoop))
240 return false;
241
242 // We expect loops in normal form which have a preheader, header, latch...
243 if (!OuterLoop.isLoopSimplifyForm() || !InnerLoop.isLoopSimplifyForm())
244 return false;
245
246 const BasicBlock *OuterLoopHeader = OuterLoop.getHeader();
247 const BasicBlock *OuterLoopLatch = OuterLoop.getLoopLatch();
248 const BasicBlock *InnerLoopPreHeader = InnerLoop.getLoopPreheader();
249 const BasicBlock *InnerLoopLatch = InnerLoop.getLoopLatch();
250 const BasicBlock *InnerLoopExit = InnerLoop.getExitBlock();
251
252 // We expect rotated loops. The inner loop should have a single exit block.
253 if (OuterLoop.getExitingBlock() != OuterLoopLatch ||
254 InnerLoop.getExitingBlock() != InnerLoopLatch || !InnerLoopExit)
255 return false;
256
257 // Returns whether the block `ExitBlock` contains at least one LCSSA Phi node.
258 auto ContainsLCSSAPhi = [](const BasicBlock &ExitBlock) {
259 return any_of(ExitBlock.phis(), [](const PHINode &PN) {
260 return PN.getNumIncomingValues() == 1;
261 });
262 };
263
264 // Returns whether the block `BB` qualifies for being an extra Phi block. The
265 // extra Phi block is the additional block inserted after the exit block of an
266 // "guarded" inner loop which contains "only" Phi nodes corresponding to the
267 // LCSSA Phi nodes in the exit block.
268 auto IsExtraPhiBlock = [&](const BasicBlock &BB) {
269 return BB.getFirstNonPHI() == BB.getTerminator() &&
270 all_of(BB.phis(), [&](const PHINode &PN) {
271 return all_of(PN.blocks(), [&](const BasicBlock *IncomingBlock) {
272 return IncomingBlock == InnerLoopExit ||
273 IncomingBlock == OuterLoopHeader;
274 });
275 });
276 };
277
278 const BasicBlock *ExtraPhiBlock = nullptr;
279 // Ensure the only branch that may exist between the loops is the inner loop
280 // guard.
281 if (OuterLoopHeader != InnerLoopPreHeader) {
282 const BasicBlock &SingleSucc =
283 LoopNest::skipEmptyBlockUntil(OuterLoopHeader, InnerLoopPreHeader);
284
285 // no conditional branch present
286 if (&SingleSucc != InnerLoopPreHeader) {
287 const BranchInst *BI = dyn_cast<BranchInst>(SingleSucc.getTerminator());
288
289 if (!BI || BI != InnerLoop.getLoopGuardBranch())
290 return false;
291
292 bool InnerLoopExitContainsLCSSA = ContainsLCSSAPhi(*InnerLoopExit);
293
294 // The successors of the inner loop guard should be the inner loop
295 // preheader or the outer loop latch possibly through empty blocks.
296 for (const BasicBlock *Succ : BI->successors()) {
297 const BasicBlock *PotentialInnerPreHeader = Succ;
298 const BasicBlock *PotentialOuterLatch = Succ;
299
300 // Ensure the inner loop guard successor is empty before skipping
301 // blocks.
302 if (Succ->getInstList().size() == 1) {
303 PotentialInnerPreHeader =
304 &LoopNest::skipEmptyBlockUntil(Succ, InnerLoopPreHeader);
305 PotentialOuterLatch =
306 &LoopNest::skipEmptyBlockUntil(Succ, OuterLoopLatch);
307 }
308
309 if (PotentialInnerPreHeader == InnerLoopPreHeader)
310 continue;
311 if (PotentialOuterLatch == OuterLoopLatch)
312 continue;
313
314 // If `InnerLoopExit` contains LCSSA Phi instructions, additional block
315 // may be inserted before the `OuterLoopLatch` to which `BI` jumps. The
316 // loops are still considered perfectly nested if the extra block only
317 // contains Phi instructions from InnerLoopExit and OuterLoopHeader.
318 if (InnerLoopExitContainsLCSSA && IsExtraPhiBlock(*Succ) &&
319 Succ->getSingleSuccessor() == OuterLoopLatch) {
320 // Points to the extra block so that we can reference it later in the
321 // final check. We can also conclude that the inner loop is
322 // guarded and there exists LCSSA Phi node in the exit block later if
323 // we see a non-null `ExtraPhiBlock`.
324 ExtraPhiBlock = Succ;
325 continue;
326 }
327
328 DEBUG_WITH_TYPE(VerboseDebug, {
329 dbgs() << "Inner loop guard successor " << Succ->getName()
330 << " doesn't lead to inner loop preheader or "
331 "outer loop latch.\n";
332 });
333 return false;
334 }
335 }
336 }
337
338 // Ensure the inner loop exit block lead to the outer loop latch possibly
339 // through empty blocks.
340 if ((!ExtraPhiBlock ||
341 &LoopNest::skipEmptyBlockUntil(InnerLoop.getExitBlock(),
342 ExtraPhiBlock) != ExtraPhiBlock) &&
343 (&LoopNest::skipEmptyBlockUntil(InnerLoop.getExitBlock(),
344 OuterLoopLatch) != OuterLoopLatch)) {
345 DEBUG_WITH_TYPE(
346 VerboseDebug,
347 dbgs() << "Inner loop exit block " << *InnerLoopExit
348 << " does not directly lead to the outer loop latch.\n";);
349 return false;
350 }
351
352 return true;
353 }
354
355 AnalysisKey LoopNestAnalysis::Key;
356
operator <<(raw_ostream & OS,const LoopNest & LN)357 raw_ostream &llvm::operator<<(raw_ostream &OS, const LoopNest &LN) {
358 OS << "IsPerfect=";
359 if (LN.getMaxPerfectDepth() == LN.getNestDepth())
360 OS << "true";
361 else
362 OS << "false";
363 OS << ", Depth=" << LN.getNestDepth();
364 OS << ", OutermostLoop: " << LN.getOutermostLoop().getName();
365 OS << ", Loops: ( ";
366 for (const Loop *L : LN.getLoops())
367 OS << L->getName() << " ";
368 OS << ")";
369
370 return OS;
371 }
372
373 //===----------------------------------------------------------------------===//
374 // LoopNestPrinterPass implementation
375 //
376
run(Loop & L,LoopAnalysisManager & AM,LoopStandardAnalysisResults & AR,LPMUpdater & U)377 PreservedAnalyses LoopNestPrinterPass::run(Loop &L, LoopAnalysisManager &AM,
378 LoopStandardAnalysisResults &AR,
379 LPMUpdater &U) {
380 if (auto LN = LoopNest::getLoopNest(L, AR.SE))
381 OS << *LN << "\n";
382
383 return PreservedAnalyses::all();
384 }
385