LLVM 24.0.0git
LoopSimplify.cpp
Go to the documentation of this file.
1//===- LoopSimplify.cpp - Loop Canonicalization 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 performs several transformations to transform natural loops into a
10// simpler form, which makes subsequent analyses and transformations simpler and
11// more effective.
12//
13// Loop pre-header insertion guarantees that there is a single, non-critical
14// entry edge from outside of the loop to the loop header. This simplifies a
15// number of analyses and transformations, such as LICM.
16//
17// Loop exit-block insertion guarantees that all exit blocks from the loop
18// (blocks which are outside of the loop that have predecessors inside of the
19// loop) only have predecessors from inside of the loop (and are thus dominated
20// by the loop header). This simplifies transformations such as store-sinking
21// that are built into LICM.
22//
23// This pass also guarantees that loops will have exactly one backedge.
24//
25// Indirectbr instructions introduce several complications. If the loop
26// contains or is entered by an indirectbr instruction, it may not be possible
27// to transform the loop and make these guarantees. Client code should check
28// that these conditions are true before relying on them.
29//
30// Similar complications arise from callbr instructions, particularly in
31// asm-goto where blockaddress expressions are used.
32//
33// Note that the simplifycfg pass will clean up blocks which are split out but
34// end up being unnecessary, so usage of this pass should not pessimize
35// generated code.
36//
37// This pass obviously modifies the CFG, but updates loop information and
38// dominator information.
39//
40//===----------------------------------------------------------------------===//
41
43#include "llvm/ADT/SetVector.h"
45#include "llvm/ADT/Statistic.h"
57#include "llvm/IR/CFG.h"
58#include "llvm/IR/Constants.h"
59#include "llvm/IR/Dominators.h"
60#include "llvm/IR/Function.h"
62#include "llvm/IR/LLVMContext.h"
63#include "llvm/IR/Module.h"
65#include "llvm/Support/Debug.h"
71using namespace llvm;
72
73#define DEBUG_TYPE "loop-simplify"
74
75STATISTIC(NumNested , "Number of nested loops split out");
76
77// If the block isn't already, move the new block to right after some 'outside
78// block' block. This prevents the preheader from being placed inside the loop
79// body, e.g. when the loop hasn't been rotated.
82 Loop *L) {
83 // Check to see if NewBB is already well placed.
84 Function::iterator BBI = --NewBB->getIterator();
85 if (llvm::is_contained(SplitPreds, &*BBI))
86 return;
87
88 // If it isn't already after an outside block, move it after one. This is
89 // always good as it makes the uncond branch from the outside block into a
90 // fall-through.
91
92 // Figure out *which* outside block to put this after. Prefer an outside
93 // block that neighbors a BB actually in the loop.
94 BasicBlock *FoundBB = nullptr;
95 for (BasicBlock *Pred : SplitPreds) {
96 Function::iterator BBI = Pred->getIterator();
97 if (++BBI != NewBB->getParent()->end() && L->contains(&*BBI)) {
98 FoundBB = Pred;
99 break;
100 }
101 }
102
103 // If our heuristic for a *good* bb to place this after doesn't find
104 // anything, just pick something. It's likely better than leaving it within
105 // the loop.
106 if (!FoundBB)
107 FoundBB = SplitPreds[0];
108 NewBB->moveAfter(FoundBB);
109}
110
111/// InsertPreheaderForLoop - Once we discover that a loop doesn't have a
112/// preheader, this method is called to insert one. This method has two phases:
113/// preheader insertion and analysis updating.
114///
116 LoopInfo *LI, MemorySSAUpdater *MSSAU,
117 bool PreserveLCSSA) {
118 BasicBlock *Header = L->getHeader();
119
120 // Compute the set of predecessors of the loop that are not in the loop.
121 SmallVector<BasicBlock*, 8> OutsideBlocks;
122 for (BasicBlock *P : predecessors(Header)) {
123 if (!L->contains(P)) { // Coming in from outside the loop?
124 // If the loop is branched to from an indirect terminator, we won't
125 // be able to fully transform the loop, because it prohibits
126 // edge splitting.
127 if (isa<IndirectBrInst>(P->getTerminator()))
128 return nullptr;
129
130 // Keep track of it.
131 OutsideBlocks.push_back(P);
132 }
133 }
134
135 // Split out the loop pre-header.
136 BasicBlock *PreheaderBB;
137 PreheaderBB = SplitBlockPredecessors(Header, OutsideBlocks, ".preheader", DT,
138 LI, MSSAU, PreserveLCSSA);
139 if (!PreheaderBB)
140 return nullptr;
141
142 LLVM_DEBUG(dbgs() << "LoopSimplify: Creating pre-header "
143 << PreheaderBB->getName() << "\n");
144
145 // Make sure that NewBB is put someplace intelligent, which doesn't mess up
146 // code layout too horribly.
147 placeSplitBlockCarefully(PreheaderBB, OutsideBlocks, L);
148
149 return PreheaderBB;
150}
151
152/// Add the specified block, and all of its predecessors, to the specified set,
153/// if it's not already in there. Stop predecessor traversal when we reach
154/// StopBlock.
155static void addBlockAndPredsToSet(BasicBlock *InputBB, BasicBlock *StopBlock,
158 Worklist.push_back(InputBB);
159 do {
160 BasicBlock *BB = Worklist.pop_back_val();
161 if (Blocks.insert(BB).second && BB != StopBlock)
162 // If BB is not already processed and it is not a stop block then
163 // insert its predecessor in the work list
164 append_range(Worklist, predecessors(BB));
165 } while (!Worklist.empty());
166}
167
168/// The first part of loop-nestification is to find a PHI node that tells
169/// us how to partition the loops.
171 AssumptionCache *AC) {
172 const DataLayout &DL = L->getHeader()->getDataLayout();
173 for (BasicBlock::iterator I = L->getHeader()->begin(); isa<PHINode>(I); ) {
174 PHINode *PN = cast<PHINode>(I);
175 ++I;
176 if (Value *V = simplifyInstruction(PN, {DL, nullptr, DT, AC})) {
177 // This is a degenerate PHI already, don't modify it!
178 PN->replaceAllUsesWith(V);
179 PN->eraseFromParent();
180 continue;
181 }
182
183 // Scan this PHI node looking for a use of the PHI node by itself.
184 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
185 if (PN->getIncomingValue(i) == PN &&
186 L->contains(PN->getIncomingBlock(i)))
187 // We found something tasty to remove.
188 return PN;
189 }
190 return nullptr;
191}
192
193/// If this loop has multiple backedges, try to pull one of them out into
194/// a nested loop.
195///
196/// This is important for code that looks like
197/// this:
198///
199/// Loop:
200/// ...
201/// br cond, Loop, Next
202/// ...
203/// br cond2, Loop, Out
204///
205/// To identify this common case, we look at the PHI nodes in the header of the
206/// loop. PHI nodes with unchanging values on one backedge correspond to values
207/// that change in the "outer" loop, but not in the "inner" loop.
208///
209/// If we are able to separate out a loop, return the new outer loop that was
210/// created.
211///
212static Loop *separateNestedLoop(Loop *L, BasicBlock *Preheader,
213 DominatorTree *DT, LoopInfo *LI,
214 ScalarEvolution *SE, bool PreserveLCSSA,
215 AssumptionCache *AC, MemorySSAUpdater *MSSAU) {
216 // Don't try to separate loops without a preheader.
217 if (!Preheader)
218 return nullptr;
219
220 // Treat the presence of convergent functions conservatively. The
221 // transformation is invalid if calls to certain convergent
222 // functions (like an AMDGPU barrier) get included in the resulting
223 // inner loop. But blocks meant for the inner loop will be
224 // identified later at a point where it's too late to abort the
225 // transformation. Also, the convergent attribute is not really
226 // sufficient to express the semantics of functions that are
227 // affected by this transformation. So we choose to back off if such
228 // a function call is present until a better alternative becomes
229 // available. This is similar to the conservative treatment of
230 // convergent function calls in GVNHoist and JumpThreading.
231 for (auto *BB : L->blocks()) {
232 for (auto &II : *BB) {
233 if (auto CI = dyn_cast<CallBase>(&II)) {
234 if (CI->isConvergent()) {
235 return nullptr;
236 }
237 }
238 }
239 }
240
241 // The header is not a landing pad; preheader insertion should ensure this.
242 BasicBlock *Header = L->getHeader();
243 assert(!Header->isEHPad() && "Can't insert backedge to EH pad");
244
245 PHINode *PN = findPHIToPartitionLoops(L, DT, AC);
246 if (!PN) return nullptr; // No known way to partition.
247
248 // Pull out all predecessors that have varying values in the loop. This
249 // handles the case when a PHI node has multiple instances of itself as
250 // arguments.
251 SmallVector<BasicBlock*, 8> OuterLoopPreds;
252 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
253 if (PN->getIncomingValue(i) != PN ||
254 !L->contains(PN->getIncomingBlock(i))) {
255 // We can't split indirect control flow edges.
257 return nullptr;
258 OuterLoopPreds.push_back(PN->getIncomingBlock(i));
259 }
260 }
261 LLVM_DEBUG(dbgs() << "LoopSimplify: Splitting out a new outer loop\n");
262
263 // If ScalarEvolution is around and knows anything about values in
264 // this loop, tell it to forget them, because we're about to
265 // substantially change it.
266 if (SE)
267 SE->forgetLoop(L);
268
269 BasicBlock *NewBB = SplitBlockPredecessors(Header, OuterLoopPreds, ".outer",
270 DT, LI, MSSAU, PreserveLCSSA);
271
272 // Make sure that NewBB is put someplace intelligent, which doesn't mess up
273 // code layout too horribly.
274 placeSplitBlockCarefully(NewBB, OuterLoopPreds, L);
275
276 // Create the new outer loop.
277 Loop *NewOuter = LI->AllocateLoop();
278
279 // Change the parent loop to use the outer loop as its child now.
280 LI->replaceLoop(L, NewOuter);
281
282 // L is now a subloop of our outer loop.
283 NewOuter->addChildLoop(L);
284
285 for (BasicBlock *BB : L->blocks())
286 NewOuter->addBlockEntry(BB);
287
288 // Now reset the header in L, which had been moved by
289 // SplitBlockPredecessors for the outer loop.
290 L->moveToHeader(Header);
291
292 // Determine which blocks should stay in L and which should be moved out to
293 // the Outer loop now.
295 for (BasicBlock *P : predecessors(Header)) {
296 if (DT->dominates(Header, P))
297 addBlockAndPredsToSet(P, Header, BlocksInL);
298 }
299
300 // Scan all of the loop children of L, moving them to OuterLoop if they are
301 // not part of the inner loop.
302 const std::vector<Loop*> &SubLoops = L->getSubLoops();
303 for (size_t I = 0; I != SubLoops.size(); )
304 if (BlocksInL.count(SubLoops[I]->getHeader()))
305 ++I; // Loop remains in L
306 else
307 NewOuter->addChildLoop(L->removeChildLoop(SubLoops.begin() + I));
308
309 SmallVector<BasicBlock *, 8> OuterLoopBlocks;
310 OuterLoopBlocks.push_back(NewBB);
311 // Now that we know which blocks are in L and which need to be moved to
312 // OuterLoop, move any blocks that need it.
313 for (unsigned i = 0; i != L->getBlocks().size(); ++i) {
314 BasicBlock *BB = L->getBlocks()[i];
315 if (!BlocksInL.count(BB)) {
316 // Move this block to the parent, updating the exit blocks sets
317 L->removeBlockFromLoop(BB);
318 if ((*LI)[BB] == L) {
319 LI->changeLoopFor(BB, NewOuter);
320 OuterLoopBlocks.push_back(BB);
321 }
322 --i;
323 }
324 }
325
326 // Split edges to exit blocks from the inner loop, if they emerged in the
327 // process of separating the outer one.
328 formDedicatedExitBlocks(L, DT, LI, MSSAU, PreserveLCSSA);
329
330 if (PreserveLCSSA) {
331 // Fix LCSSA form for L. Some values, which previously were only used inside
332 // L, can now be used in NewOuter loop. We need to insert phi-nodes for them
333 // in corresponding exit blocks.
334 // We don't need to form LCSSA recursively, because there cannot be uses
335 // inside a newly created loop of defs from inner loops as those would
336 // already be a use of an LCSSA phi node.
337 formLCSSA(*L, *DT, LI, SE);
338
339 assert(NewOuter->isRecursivelyLCSSAForm(*DT, *LI) &&
340 "LCSSA is broken after separating nested loops!");
341 }
342
343 return NewOuter;
344}
345
346/// This method is called when the specified loop has more than one
347/// backedge in it.
348///
349/// If this occurs, revector all of these backedges to target a new basic block
350/// and have that block branch to the loop header. This ensures that loops
351/// have exactly one backedge.
353 DominatorTree *DT, LoopInfo *LI,
354 MemorySSAUpdater *MSSAU) {
355 assert(L->getNumBackEdges() > 1 && "Must have > 1 backedge!");
356
357 // Get information about the loop
358 BasicBlock *Header = L->getHeader();
359 Function *F = Header->getParent();
360
361 // Unique backedge insertion currently depends on having a preheader.
362 if (!Preheader)
363 return nullptr;
364
365 // The header is not an EH pad; preheader insertion should ensure this.
366 assert(!Header->isEHPad() && "Can't insert backedge to EH pad");
367
368 // Figure out which basic blocks contain back-edges to the loop header.
369 std::vector<BasicBlock*> BackedgeBlocks;
370 for (BasicBlock *P : predecessors(Header)) {
371 // Indirect edges cannot be split, so we must fail if we find one.
372 if (isa<IndirectBrInst>(P->getTerminator()))
373 return nullptr;
374
375 if (P != Preheader) BackedgeBlocks.push_back(P);
376 }
377
378 // Create and insert the new backedge block.
379 BasicBlock *BEBlock = BasicBlock::Create(Header->getContext(),
380 Header->getName() + ".backedge", F);
381 UncondBrInst *BETerminator = UncondBrInst::Create(Header, BEBlock);
382 BETerminator->setDebugLoc(Header->getFirstNonPHIIt()->getDebugLoc());
383
384 LLVM_DEBUG(dbgs() << "LoopSimplify: Inserting unique backedge block "
385 << BEBlock->getName() << "\n");
386
387 // Move the new backedge block to right after the last backedge block.
388 Function::iterator InsertPos = ++BackedgeBlocks.back()->getIterator();
389 F->splice(InsertPos, F, BEBlock->getIterator());
390
391 // Now that the block has been inserted into the function, create PHI nodes in
392 // the backedge block which correspond to any PHI nodes in the header block.
393 for (BasicBlock::iterator I = Header->begin(); isa<PHINode>(I); ++I) {
394 PHINode *PN = cast<PHINode>(I);
395 PHINode *NewPN = PHINode::Create(PN->getType(), BackedgeBlocks.size(),
396 PN->getName()+".be", BETerminator->getIterator());
397
398 // Loop over the PHI node, moving all entries except the one for the
399 // preheader over to the new PHI node.
400 unsigned PreheaderIdx = ~0U;
401 bool HasUniqueIncomingValue = true;
402 Value *UniqueValue = nullptr;
403 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
404 BasicBlock *IBB = PN->getIncomingBlock(i);
405 Value *IV = PN->getIncomingValue(i);
406 if (IBB == Preheader) {
407 PreheaderIdx = i;
408 } else {
409 NewPN->addIncoming(IV, IBB);
410 if (HasUniqueIncomingValue) {
411 if (!UniqueValue)
412 UniqueValue = IV;
413 else if (UniqueValue != IV)
414 HasUniqueIncomingValue = false;
415 }
416 }
417 }
418
419 // Delete all of the incoming values from the old PN except the preheader's
420 assert(PreheaderIdx != ~0U && "PHI has no preheader entry??");
421 if (PreheaderIdx != 0) {
422 PN->setIncomingValue(0, PN->getIncomingValue(PreheaderIdx));
423 PN->setIncomingBlock(0, PN->getIncomingBlock(PreheaderIdx));
424 }
425 // Nuke all entries except the zero'th.
426 PN->removeIncomingValueIf([](unsigned Idx) { return Idx != 0; },
427 /* DeletePHIIfEmpty */ false);
428
429 // Finally, add the newly constructed PHI node as the entry for the BEBlock.
430 PN->addIncoming(NewPN, BEBlock);
431
432 // As an optimization, if all incoming values in the new PhiNode (which is a
433 // subset of the incoming values of the old PHI node) have the same value,
434 // eliminate the PHI Node.
435 if (HasUniqueIncomingValue) {
436 NewPN->replaceAllUsesWith(UniqueValue);
437 NewPN->eraseFromParent();
438 }
439 }
440
441 // Now that all of the PHI nodes have been inserted and adjusted, modify the
442 // backedge blocks to jump to the BEBlock instead of the header.
443 // If one of the backedges has llvm.loop metadata attached, we remove
444 // it from the backedge and add it to BEBlock.
445 MDNode *LoopMD = nullptr;
446 for (BasicBlock *BB : BackedgeBlocks) {
447 Instruction *TI = BB->getTerminator();
448 if (!LoopMD)
449 LoopMD = TI->getMetadata(LLVMContext::MD_loop);
450 TI->setMetadata(LLVMContext::MD_loop, nullptr);
451 TI->replaceSuccessorWith(Header, BEBlock);
452 }
453 BEBlock->getTerminator()->setMetadata(LLVMContext::MD_loop, LoopMD);
454
455 //===--- Update all analyses which we must preserve now -----------------===//
456
457 // Update Loop Information - we know that this block is now in the current
458 // loop and all parent loops.
459 L->addBasicBlockToLoop(BEBlock, *LI);
460
461 // Update dominator information
462 DT->splitBlock(BEBlock);
463
464 if (MSSAU)
465 MSSAU->updatePhisWhenInsertingUniqueBackedgeBlock(Header, Preheader,
466 BEBlock);
467
468 return BEBlock;
469}
470
471/// Simplify one loop and queue further loops for simplification.
473 DominatorTree *DT, LoopInfo *LI,
475 MemorySSAUpdater *MSSAU, bool PreserveLCSSA) {
476 bool Changed = false;
477 if (MSSAU && VerifyMemorySSA)
478 MSSAU->getMemorySSA()->verifyMemorySSA();
479
480ReprocessLoop:
481
482 // Check to see that no blocks (other than the header) in this loop have
483 // predecessors that are not in the loop. This is not valid for natural
484 // loops, but can occur if the blocks are unreachable. Since they are
485 // unreachable we can just shamelessly delete those CFG edges!
486 for (BasicBlock *BB : L->blocks()) {
487 if (BB == L->getHeader())
488 continue;
489
491 for (BasicBlock *P : predecessors(BB))
492 if (!L->contains(P))
493 BadPreds.insert(P);
494
495 // Delete each unique out-of-loop (and thus dead) predecessor.
496 for (BasicBlock *P : BadPreds) {
497
498 LLVM_DEBUG(dbgs() << "LoopSimplify: Deleting edge from dead predecessor "
499 << P->getName() << "\n");
500
501 // Zap the dead pred's terminator and replace it with unreachable.
502 Instruction *TI = P->getTerminator();
503 changeToUnreachable(TI, PreserveLCSSA,
504 /*DTU=*/nullptr, MSSAU);
505 Changed = true;
506 }
507 }
508
509 if (MSSAU && VerifyMemorySSA)
510 MSSAU->getMemorySSA()->verifyMemorySSA();
511
512 // If there are exiting blocks with branches on undef, resolve the undef in
513 // the direction which will exit the loop. This will help simplify loop
514 // trip count computations.
515 SmallVector<BasicBlock*, 8> ExitingBlocks;
516 L->getExitingBlocks(ExitingBlocks);
517 for (BasicBlock *ExitingBlock : ExitingBlocks)
518 if (CondBrInst *BI = dyn_cast<CondBrInst>(ExitingBlock->getTerminator())) {
519 if (UndefValue *Cond = dyn_cast<UndefValue>(BI->getCondition())) {
520
522 dbgs() << "LoopSimplify: Resolving \"br i1 undef\" to exit in "
523 << ExitingBlock->getName() << "\n");
524
525 BI->setCondition(ConstantInt::get(Cond->getType(),
526 !L->contains(BI->getSuccessor(0))));
527
528 Changed = true;
529 }
530 }
531
532 // Does the loop already have a preheader? If so, don't insert one.
533 BasicBlock *Preheader = L->getLoopPreheader();
534 if (!Preheader) {
535 Preheader = InsertPreheaderForLoop(L, DT, LI, MSSAU, PreserveLCSSA);
536 if (Preheader)
537 Changed = true;
538 }
539
540 // Next, check to make sure that all exit nodes of the loop only have
541 // predecessors that are inside of the loop. This check guarantees that the
542 // loop preheader/header will dominate the exit blocks. If the exit block has
543 // predecessors from outside of the loop, split the edge now.
544 if (formDedicatedExitBlocks(L, DT, LI, MSSAU, PreserveLCSSA))
545 Changed = true;
546
547 if (MSSAU && VerifyMemorySSA)
548 MSSAU->getMemorySSA()->verifyMemorySSA();
549
550 // If the header has more than two predecessors at this point (from the
551 // preheader and from multiple backedges), we must adjust the loop.
552 BasicBlock *LoopLatch = L->getLoopLatch();
553 if (!LoopLatch) {
554 // If this is really a nested loop, rip it out into a child loop. Don't do
555 // this for loops with a giant number of backedges, just factor them into a
556 // common backedge instead.
557 if (L->getNumBackEdges() < 8) {
558 if (Loop *OuterL = separateNestedLoop(L, Preheader, DT, LI, SE,
559 PreserveLCSSA, AC, MSSAU)) {
560 ++NumNested;
561 // Enqueue the outer loop as it should be processed next in our
562 // depth-first nest walk.
563 Worklist.push_back(OuterL);
564
565 // This is a big restructuring change, reprocess the whole loop.
566 Changed = true;
567 // GCC doesn't tail recursion eliminate this.
568 // FIXME: It isn't clear we can't rely on LLVM to TRE this.
569 goto ReprocessLoop;
570 }
571 }
572
573 // If we either couldn't, or didn't want to, identify nesting of the loops,
574 // insert a new block that all backedges target, then make it jump to the
575 // loop header.
576 LoopLatch = insertUniqueBackedgeBlock(L, Preheader, DT, LI, MSSAU);
577 if (LoopLatch)
578 Changed = true;
579 }
580
581 if (MSSAU && VerifyMemorySSA)
582 MSSAU->getMemorySSA()->verifyMemorySSA();
583
584 const DataLayout &DL = L->getHeader()->getDataLayout();
585
586 // Scan over the PHI nodes in the loop header. Since they now have only two
587 // incoming values (the loop is canonicalized), we may have simplified the PHI
588 // down to 'X = phi [X, Y]', which should be replaced with 'Y'.
589 PHINode *PN;
590 for (BasicBlock::iterator I = L->getHeader()->begin();
591 (PN = dyn_cast<PHINode>(I++)); )
592 if (Value *V = simplifyInstruction(PN, {DL, nullptr, DT, AC})) {
593 if (SE) SE->forgetValue(PN);
594 if (!PreserveLCSSA || LI->replacementPreservesLCSSAForm(PN, V)) {
595 PN->replaceAllUsesWith(V);
596 PN->eraseFromParent();
597 Changed = true;
598 }
599 }
600
601 // If this loop has multiple exits and the exits all go to the same
602 // block, attempt to merge the exits. This helps several passes, such
603 // as LoopRotation, which do not support loops with multiple exits.
604 // SimplifyCFG also does this (and this code uses the same utility
605 // function), however this code is loop-aware, where SimplifyCFG is
606 // not. That gives it the advantage of being able to hoist
607 // loop-invariant instructions out of the way to open up more
608 // opportunities, and the disadvantage of having the responsibility
609 // to preserve dominator information.
610 auto HasUniqueExitBlock = [&]() {
611 BasicBlock *UniqueExit = nullptr;
612 for (auto *ExitingBB : ExitingBlocks)
613 for (auto *SuccBB : successors(ExitingBB)) {
614 if (L->contains(SuccBB))
615 continue;
616
617 if (!UniqueExit)
618 UniqueExit = SuccBB;
619 else if (UniqueExit != SuccBB)
620 return false;
621 }
622
623 return true;
624 };
625 if (HasUniqueExitBlock()) {
626 for (BasicBlock *ExitingBlock : ExitingBlocks) {
627 if (!ExitingBlock->getSinglePredecessor()) continue;
628 CondBrInst *BI = dyn_cast<CondBrInst>(ExitingBlock->getTerminator());
629 if (!BI)
630 continue;
632 if (!CI || CI->getParent() != ExitingBlock) continue;
633
634 // Attempt to hoist out all instructions except for the
635 // comparison and the branch.
636 bool AllInvariant = true;
637 bool AnyInvariant = false;
638 for (auto I = ExitingBlock->begin(); &*I != BI;) {
639 Instruction *Inst = &*I++;
640 if (Inst == CI)
641 continue;
642 if (!L->makeLoopInvariant(
643 Inst, AnyInvariant,
644 Preheader ? Preheader->getTerminator() : nullptr, MSSAU, SE)) {
645 AllInvariant = false;
646 break;
647 }
648 }
649 if (AnyInvariant)
650 Changed = true;
651 if (!AllInvariant) continue;
652
653 // The block has now been cleared of all instructions except for
654 // a comparison and a conditional branch. SimplifyCFG may be able
655 // to fold it now.
656 if (!foldBranchToCommonDest(BI, /*DTU=*/nullptr, MSSAU))
657 continue;
658
659 // Success. The block is now dead, so remove it from the loop,
660 // update the dominator tree and delete it.
661 LLVM_DEBUG(dbgs() << "LoopSimplify: Eliminating exiting block "
662 << ExitingBlock->getName() << "\n");
663
664 assert(pred_empty(ExitingBlock));
665 Changed = true;
666 LI->removeBlock(ExitingBlock);
667
668 DomTreeNode *Node = DT->getNode(ExitingBlock);
669 while (!Node->isLeaf())
670 DT->changeImmediateDominator(*Node->begin(), Node->getIDom());
671 DT->eraseNode(ExitingBlock);
672 if (MSSAU) {
674 ExitBlockSet.insert(ExitingBlock);
675 MSSAU->removeBlocks(ExitBlockSet);
676 }
677
679 ExitingBlock, /* KeepOneInputPHIs */ PreserveLCSSA);
681 ExitingBlock, /* KeepOneInputPHIs */ PreserveLCSSA);
682 ExitingBlock->eraseFromParent();
683 }
684 }
685
686 if (MSSAU && VerifyMemorySSA)
687 MSSAU->getMemorySSA()->verifyMemorySSA();
688
689 return Changed;
690}
691
694 MemorySSAUpdater *MSSAU, bool PreserveLCSSA) {
695 bool Changed = false;
696
697#ifndef NDEBUG
698 // If we're asked to preserve LCSSA, the loop nest needs to start in LCSSA
699 // form.
700 if (PreserveLCSSA) {
701 assert(DT && "DT not available.");
702 assert(LI && "LI not available.");
703 assert(L->isRecursivelyLCSSAForm(*DT, *LI) &&
704 "Requested to preserve LCSSA, but it's already broken.");
705 }
706#endif
707
708 // Worklist maintains our depth-first queue of loops in this nest to process.
709 SmallVector<Loop *, 4> Worklist;
710 Worklist.push_back(L);
711
712 // Walk the worklist from front to back, pushing newly found sub loops onto
713 // the back. This will let us process loops from back to front in depth-first
714 // order. We can use this simple process because loops form a tree.
715 for (unsigned Idx = 0; Idx != Worklist.size(); ++Idx) {
716 Loop *L2 = Worklist[Idx];
717 Worklist.append(L2->begin(), L2->end());
718 }
719
720 while (!Worklist.empty())
721 Changed |= simplifyOneLoop(Worklist.pop_back_val(), Worklist, DT, LI, SE,
722 AC, MSSAU, PreserveLCSSA);
723
724 // Changing exit conditions for blocks may affect exit counts of this loop and
725 // any of its parents, so we must invalidate the entire subtree if we've made
726 // any changes. Do this here rather than in simplifyOneLoop() as the top-most
727 // loop is going to be the same for all child loops.
728 if (Changed && SE)
729 SE->forgetTopmostLoop(L);
730
731 return Changed;
732}
733
734namespace {
735struct LoopSimplify : public FunctionPass {
736 static char ID; // Pass identification, replacement for typeid
737 LoopSimplify() : FunctionPass(ID) {
739 }
740
741 bool runOnFunction(Function &F) override;
742
743 void getAnalysisUsage(AnalysisUsage &AU) const override {
744 AU.addRequired<AssumptionCacheTracker>();
745
746 // We need loop information to identify the loops.
747 AU.addRequired<DominatorTreeWrapperPass>();
748 AU.addPreserved<DominatorTreeWrapperPass>();
749
750 AU.addRequired<LoopInfoWrapperPass>();
751 AU.addPreserved<LoopInfoWrapperPass>();
752
753 AU.addPreserved<BasicAAWrapperPass>();
754 AU.addPreserved<AAResultsWrapperPass>();
755 AU.addPreserved<GlobalsAAWrapperPass>();
756 AU.addPreserved<ScalarEvolutionWrapperPass>();
757 AU.addPreserved<SCEVAAWrapperPass>();
759 AU.addPreservedID(BreakCriticalEdgesID); // No critical edges added.
760 AU.addPreserved<BranchProbabilityInfoWrapperPass>();
761 AU.addPreserved<MemorySSAWrapperPass>();
762 }
763
764 /// verifyAnalysis() - Verify LoopSimplifyForm's guarantees.
765 void verifyAnalysis() const override;
766};
767} // namespace
768
769char LoopSimplify::ID = 0;
770INITIALIZE_PASS_BEGIN(LoopSimplify, "loop-simplify",
771 "Canonicalize natural loops", false, false)
775INITIALIZE_PASS_END(LoopSimplify, "loop-simplify", "Canonicalize natural loops",
777
778// Publicly exposed interface to pass.
779char &llvm::LoopSimplifyID = LoopSimplify::ID;
780Pass *llvm::createLoopSimplifyPass() { return new LoopSimplify(); }
781
782/// runOnFunction - Run down all loops in the CFG (recursively, but we could do
783/// it in any convenient order) inserting preheaders.
784///
785bool LoopSimplify::runOnFunction(Function &F) {
786 bool Changed = false;
787 LoopInfo *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
788 DominatorTree *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
789 auto *SEWP = getAnalysisIfAvailable<ScalarEvolutionWrapperPass>();
790 ScalarEvolution *SE = SEWP ? &SEWP->getSE() : nullptr;
791 AssumptionCache *AC =
792 &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
793 MemorySSA *MSSA = nullptr;
794 std::unique_ptr<MemorySSAUpdater> MSSAU;
795 auto *MSSAAnalysis = getAnalysisIfAvailable<MemorySSAWrapperPass>();
796 if (MSSAAnalysis) {
797 MSSA = &MSSAAnalysis->getMSSA();
798 MSSAU = std::make_unique<MemorySSAUpdater>(MSSA);
799 }
800
801 bool PreserveLCSSA = mustPreserveAnalysisID(LCSSAID);
802
803 // Simplify each loop nest in the function.
804 for (auto *L : *LI)
805 Changed |= simplifyLoop(L, DT, LI, SE, AC, MSSAU.get(), PreserveLCSSA);
806
807#ifndef NDEBUG
808 if (PreserveLCSSA) {
809 bool InLCSSA = all_of(
810 *LI, [&](Loop *L) { return L->isRecursivelyLCSSAForm(*DT, *LI); });
811 assert(InLCSSA && "LCSSA is broken after loop-simplify.");
812 }
813#endif
814 return Changed;
815}
816
819 bool Changed = false;
820 LoopInfo *LI = &AM.getResult<LoopAnalysis>(F);
824 auto *MSSAAnalysis = AM.getCachedResult<MemorySSAAnalysis>(F);
825 std::unique_ptr<MemorySSAUpdater> MSSAU;
826 if (MSSAAnalysis) {
827 auto *MSSA = &MSSAAnalysis->getMSSA();
828 MSSAU = std::make_unique<MemorySSAUpdater>(MSSA);
829 }
830
831
832 // Note that we don't preserve LCSSA in the new PM, if you need it run LCSSA
833 // after simplifying the loops. MemorySSA is preserved if it exists.
834 for (auto *L : *LI)
835 Changed |=
836 simplifyLoop(L, DT, LI, SE, AC, MSSAU.get(), /*PreserveLCSSA*/ false);
837
838 if (!Changed)
839 return PreservedAnalyses::all();
840
845 if (MSSAAnalysis)
847 // BPI maps conditional terminators to probabilities, LoopSimplify can insert
848 // blocks, but it does so only by splitting existing blocks and edges. This
849 // results in the interesting property that all new terminators inserted are
850 // unconditional branches which do not appear in BPI. All deletions are
851 // handled via ValueHandle callbacks w/in BPI.
853 return PA;
854}
855
856// FIXME: Restore this code when we re-enable verification in verifyAnalysis
857// below.
858#if 0
859static void verifyLoop(Loop *L) {
860 // Verify subloops.
861 for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I)
862 verifyLoop(*I);
863
864 // It used to be possible to just assert L->isLoopSimplifyForm(), however
865 // with the introduction of indirectbr, there are now cases where it's
866 // not possible to transform a loop as necessary. We can at least check
867 // that there is an indirectbr near any time there's trouble.
868
869 // Indirectbr can interfere with preheader and unique backedge insertion.
870 if (!L->getLoopPreheader() || !L->getLoopLatch()) {
871 bool HasIndBrPred = false;
872 for (BasicBlock *Pred : predecessors(L->getHeader()))
873 if (isa<IndirectBrInst>(Pred->getTerminator())) {
874 HasIndBrPred = true;
875 break;
876 }
877 assert(HasIndBrPred &&
878 "LoopSimplify has no excuse for missing loop header info!");
879 (void)HasIndBrPred;
880 }
881
882 // Indirectbr can interfere with exit block canonicalization.
883 if (!L->hasDedicatedExits()) {
884 bool HasIndBrExiting = false;
885 SmallVector<BasicBlock*, 8> ExitingBlocks;
886 L->getExitingBlocks(ExitingBlocks);
887 for (unsigned i = 0, e = ExitingBlocks.size(); i != e; ++i) {
888 if (isa<IndirectBrInst>((ExitingBlocks[i])->getTerminator())) {
889 HasIndBrExiting = true;
890 break;
891 }
892 }
893
894 assert(HasIndBrExiting &&
895 "LoopSimplify has no excuse for missing exit block info!");
896 (void)HasIndBrExiting;
897 }
898}
899#endif
900
901void LoopSimplify::verifyAnalysis() const {
902 // FIXME: This routine is being called mid-way through the loop pass manager
903 // as loop passes destroy this analysis. That's actually fine, but we have no
904 // way of expressing that here. Once all of the passes that destroy this are
905 // hoisted out of the loop pass manager we can add back verification here.
906#if 0
907 for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I)
908 verifyLoop(*I);
909#endif
910}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This is the interface for LLVM's primary stateless and local alias analysis.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static bool runOnFunction(Function &F, bool PostInlining)
This is the interface for a simple mod/ref and alias analysis over globals.
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
static void placeSplitBlockCarefully(BasicBlock *NewBB, SmallVectorImpl< BasicBlock * > &SplitPreds, Loop *L)
static PHINode * findPHIToPartitionLoops(Loop *L, DominatorTree *DT, AssumptionCache *AC)
The first part of loop-nestification is to find a PHI node that tells us how to partition the loops.
static void addBlockAndPredsToSet(BasicBlock *InputBB, BasicBlock *StopBlock, SmallPtrSetImpl< BasicBlock * > &Blocks)
Add the specified block, and all of its predecessors, to the specified set, if it's not already in th...
static bool simplifyOneLoop(Loop *L, SmallVectorImpl< Loop * > &Worklist, DominatorTree *DT, LoopInfo *LI, ScalarEvolution *SE, AssumptionCache *AC, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)
Simplify one loop and queue further loops for simplification.
static Loop * separateNestedLoop(Loop *L, BasicBlock *Preheader, DominatorTree *DT, LoopInfo *LI, ScalarEvolution *SE, bool PreserveLCSSA, AssumptionCache *AC, MemorySSAUpdater *MSSAU)
If this loop has multiple backedges, try to pull one of them out into a nested loop.
static BasicBlock * insertUniqueBackedgeBlock(Loop *L, BasicBlock *Preheader, DominatorTree *DT, LoopInfo *LI, MemorySSAUpdater *MSSAU)
This method is called when the specified loop has more than one backedge in it.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file exposes an interface to building/using memory SSA to walk memory instructions using a use/d...
uint64_t IntrinsicInst * II
#define P(N)
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
const SmallVectorImpl< MachineOperand > & Cond
This is the interface for a SCEV-based alias analysis.
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallVector class.
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
static const uint32_t IV[8]
Definition blake3_impl.h:83
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
AnalysisUsage & addPreservedID(const void *ID)
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
A function analysis which provides an AssumptionCache.
An immutable pass that tracks lazily created AssumptionCache objects.
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
Definition BasicBlock.h:206
LLVM_ABI void moveAfter(BasicBlock *MovePos)
Unlink this basic block from its current function and insert it right after MovePos in the function M...
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
LLVM_ABI void removePredecessor(BasicBlock *Pred, bool KeepOneInputPHIs=false)
Update PHI nodes in this BasicBlock before removal of predecessor Pred.
Analysis pass which computes BranchProbabilityInfo.
This class is the base class for the comparison instructions.
Definition InstrTypes.h:728
Conditional Branch instruction.
Value * getCondition() const
BasicBlock * getSuccessor(unsigned i) const
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Analysis pass which computes a DominatorTree.
Definition Dominators.h:241
void changeImmediateDominator(DomTreeNodeBase< NodeT > *N, DomTreeNodeBase< NodeT > *NewIDom)
changeImmediateDominator - This method is used to update the dominator tree information when a node's...
void splitBlock(NodeT *NewBB)
splitBlock - BB is split and now it has one successor.
void eraseNode(NodeT *BB)
eraseNode - Removes a node from the dominator tree.
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
Legacy analysis pass which computes a DominatorTree.
Definition Dominators.h:277
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
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.
FunctionPass class - This class is used to implement most global optimizations.
Definition Pass.h:314
BasicBlockListType::iterator iterator
Definition Function.h:70
iterator end()
Definition Function.h:840
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI void replaceSuccessorWith(BasicBlock *OldBB, BasicBlock *NewBB)
Replace specified successor OldBB to point at the provided block.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
Analysis pass that exposes the LoopInfo for a function.
Definition LoopInfo.h:594
typename std::vector< Loop * >::const_iterator iterator
iterator end() 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.
iterator begin() const
void removeBlock(BlockT *BB)
This method completely removes BB from all data structures, including all of the Loop objects it is n...
void replaceLoop(LoopT *Old, LoopT *New)
Replace a loop among its siblings (a parent loop's child list or the top-level list) with a new loop.
void changeLoopFor(const BlockT *BB, LoopT *L)
Change the top-level loop that contains BB to the specified loop.
The legacy pass manager's analysis pass to compute loop information.
Definition LoopInfo.h:619
bool replacementPreservesLCSSAForm(Instruction *From, Value *To)
Returns true if replacing From with To everywhere is guaranteed to preserve LCSSA form.
Definition LoopInfo.h:466
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
bool isRecursivelyLCSSAForm(const DominatorTree &DT, const LoopInfo &LI, bool IgnoreTokens=true) const
Return true if this Loop and all inner subloops are in LCSSA form.
Definition LoopInfo.cpp:501
Metadata node.
Definition Metadata.h:1069
An analysis that produces MemorySSA for a function.
Definition MemorySSA.h:922
MemorySSA * getMemorySSA() const
Get handle on MemorySSA.
LLVM_ABI void updatePhisWhenInsertingUniqueBackedgeBlock(BasicBlock *LoopHeader, BasicBlock *LoopPreheader, BasicBlock *BackedgeBlock)
Update MemorySSA when inserting a unique backedge block for a loop.
LLVM_ABI void removeBlocks(const SmallSetVector< BasicBlock *, 8 > &DeadBlocks)
Remove all MemoryAcceses in a set of BasicBlocks about to be deleted.
Encapsulates MemorySSA, including all data associated with memory accesses.
Definition MemorySSA.h:702
LLVM_ABI void verifyMemorySSA(VerificationLevel=VerificationLevel::Fast) const
Verify that MemorySSA is self consistent (IE definitions dominate all uses, uses appear in the right ...
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
LLVM_ABI void removeIncomingValueIf(function_ref< bool(unsigned)> Predicate, bool DeletePHIIfEmpty=true)
Remove all incoming values for which the predicate returns true.
void setIncomingBlock(unsigned i, BasicBlock *BB)
void setIncomingValue(unsigned i, Value *V)
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
Pass interface - Implemented by all 'passes'.
Definition Pass.h:99
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
PreservedAnalyses & preserve()
Mark an analysis as preserved.
Definition Analysis.h:132
Analysis pass that exposes the ScalarEvolution for a function.
The main scalar evolution driver.
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 void forgetTopmostLoop(const Loop *L)
LLVM_ABI void forgetValue(Value *V)
This method should be called by the client when it has changed a value in a way that may effect its v...
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:157
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:345
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Unconditional Branch instruction.
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
'undef' values are things that do not have specified contents.
Definition Constants.h:1631
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:553
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
Changed
LLVM_ABI Instruction * getTerminator() const
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool simplifyLoop(Loop *L, DominatorTree *DT, LoopInfo *LI, ScalarEvolution *SE, AssumptionCache *AC, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)
Simplify each loop in a loop nest recursively.
LLVM_ABI bool foldBranchToCommonDest(CondBrInst *BI, llvm::DomTreeUpdater *DTU=nullptr, MemorySSAUpdater *MSSAU=nullptr, const TargetTransformInfo *TTI=nullptr, AssumptionCache *AC=nullptr, unsigned BonusInstThreshold=1)
If this basic block is ONLY a setcc and a branch, and if a predecessor branches to us and one of our ...
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
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition STLExtras.h:1669
LLVM_ABI void initializeLoopSimplifyPass(PassRegistry &)
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)
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
LLVM_ABI char & LCSSAID
Definition LCSSA.cpp:545
LLVM_ABI char & LoopSimplifyID
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
DomTreeNodeBase< BasicBlock > DomTreeNode
Definition Dominators.h:65
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI char & BreakCriticalEdgesID
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI unsigned changeToUnreachable(Instruction *I, bool PreserveLCSSA=false, DomTreeUpdater *DTU=nullptr, MemorySSAUpdater *MSSAU=nullptr)
Insert an unreachable instruction before the specified instruction, making it and the rest of the cod...
Definition Local.cpp:2543
LLVM_ABI BasicBlock * SplitBlockPredecessors(BasicBlock *BB, ArrayRef< BasicBlock * > Preds, const char *Suffix, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, bool PreserveLCSSA=false)
This method introduces at least one new basic block into the function and moves some of the predecess...
LLVM_ABI bool VerifyMemorySSA
Enables verification of MemorySSA.
Definition MemorySSA.cpp:85
LLVM_ABI bool formDedicatedExitBlocks(Loop *L, DominatorTree *DT, LoopInfo *LI, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)
Ensure that all exit blocks of the loop are dedicated exits.
Definition LoopUtils.cpp:61
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
auto predecessors(const MachineBasicBlock *BB)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
bool pred_empty(const BasicBlock *BB)
Definition CFG.h:107
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI bool formLCSSA(Loop &L, const DominatorTree &DT, const LoopInfo *LI, ScalarEvolution *SE)
Put loop into LCSSA form.
Definition LCSSA.cpp:447
LLVM_ABI Pass * createLoopSimplifyPass()