LLVM 24.0.0git
LICM.cpp
Go to the documentation of this file.
1//===-- LICM.cpp - Loop Invariant Code Motion 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 loop invariant code motion, attempting to remove as much
10// code from the body of a loop as possible. It does this by either hoisting
11// code into the preheader block, or by sinking code to the exit blocks if it is
12// safe. This pass also promotes must-aliased memory locations in the loop to
13// live in registers, thus hoisting and sinking "invariant" loads and stores.
14//
15// Hoisting operations out of loops is a canonicalization transform. It
16// enables and simplifies subsequent optimizations in the middle-end.
17// Rematerialization of hoisted instructions to reduce register pressure is the
18// responsibility of the back-end, which has more accurate information about
19// register pressure and also handles other optimizations than LICM that
20// increase live-ranges.
21//
22// This pass uses alias analysis for two purposes:
23//
24// 1. Moving loop invariant loads and calls out of loops. If we can determine
25// that a load or call inside of a loop never aliases anything stored to,
26// we can hoist it or sink it like any other instruction.
27// 2. Scalar Promotion of Memory - If there is a store instruction inside of
28// the loop, we try to move the store to happen AFTER the loop instead of
29// inside of the loop. This can only happen if a few conditions are true:
30// A. The pointer stored through is loop invariant
31// B. There are no stores or loads in the loop which _may_ alias the
32// pointer. There are no calls in the loop which mod/ref the pointer.
33// If these conditions are true, we can promote the loads and stores in the
34// loop of the pointer to use a temporary alloca'd variable. We then use
35// the SSAUpdater to construct the appropriate SSA form for the value.
36//
37//===----------------------------------------------------------------------===//
38
40#include "ScalarOptions.h"
41#include "llvm/ADT/DenseMap.h"
43#include "llvm/ADT/Statistic.h"
51#include "llvm/Analysis/Loads.h"
65#include "llvm/IR/CFG.h"
66#include "llvm/IR/Constants.h"
67#include "llvm/IR/DataLayout.h"
70#include "llvm/IR/Dominators.h"
71#include "llvm/IR/IRBuilder.h"
74#include "llvm/IR/LLVMContext.h"
75#include "llvm/IR/Metadata.h"
76#include "llvm/IR/Module.h"
80#include "llvm/Support/Debug.h"
88#include <algorithm>
89#include <utility>
90using namespace llvm;
91
92namespace llvm {
93class LPMUpdater;
94} // namespace llvm
95
96#define DEBUG_TYPE "licm"
97
98STATISTIC(NumSunk, "Number of instructions sunk out of loop");
99STATISTIC(NumHoisted, "Number of instructions hoisted out of loop");
100STATISTIC(NumMovedLoads, "Number of load insts hoisted or sunk");
101STATISTIC(NumMovedCalls, "Number of call insts hoisted or sunk");
102STATISTIC(NumPromotionCandidates, "Number of promotion candidates");
103STATISTIC(NumLoadPromoted, "Number of load-only promotions");
104STATISTIC(NumLoadStorePromoted, "Number of load and store promotions");
105STATISTIC(NumMinMaxHoisted,
106 "Number of min/max expressions hoisted out of the loop");
107STATISTIC(NumGEPsHoisted,
108 "Number of geps reassociated and hoisted out of the loop");
109STATISTIC(NumAddSubHoisted, "Number of add/subtract expressions reassociated "
110 "and hoisted out of the loop");
111STATISTIC(NumFPAssociationsHoisted, "Number of invariant FP expressions "
112 "reassociated and hoisted out of the loop");
113STATISTIC(NumIntAssociationsHoisted,
114 "Number of invariant int expressions "
115 "reassociated and hoisted out of the loop");
116STATISTIC(NumBOAssociationsHoisted, "Number of invariant BinaryOp expressions "
117 "reassociated and hoisted out of the loop");
118
120 return ScalarOptions::Global.licm_mssa_optimization_cap;
121}
122
124 return ScalarOptions::Global.licm_mssa_max_acc_promotion;
125}
126
127static bool inSubLoop(BasicBlock *BB, Loop *CurLoop, LoopInfo *LI);
128static bool isNotUsedOrFoldableInLoop(const Instruction &I, const Loop *CurLoop,
129 const LoopSafetyInfo *SafetyInfo,
131 bool &FoldableInLoop, bool LoopNestMode);
132static void hoist(Instruction &I, const DominatorTree *DT, const Loop *CurLoop,
133 BasicBlock *Dest, ICFLoopSafetyInfo *SafetyInfo,
136static bool sink(Instruction &I, LoopInfo *LI, DominatorTree *DT,
137 const Loop *CurLoop, ICFLoopSafetyInfo *SafetyInfo,
140 Instruction &Inst, const DominatorTree *DT, const TargetLibraryInfo *TLI,
141 const Loop *CurLoop, const LoopSafetyInfo *SafetyInfo,
142 OptimizationRemarkEmitter *ORE, const Instruction *CtxI,
143 AssumptionCache *AC, bool AllowSpeculation);
145 AAResults *AA, Loop *CurLoop,
146 SinkAndHoistLICMFlags &Flags);
147static bool pointerInvalidatedByLoop(MemorySSA *MSSA, MemoryUse *MU,
148 Loop *CurLoop, Instruction &I,
150 bool InvariantGroup);
151static bool pointerInvalidatedByBlock(BasicBlock &BB, MemorySSA &MSSA,
152 MemoryUse &MU);
153/// Aggregates various functions for hoisting computations out of loop.
154static bool hoistArithmetics(Instruction &I, Loop &L,
155 ICFLoopSafetyInfo &SafetyInfo,
157 DominatorTree *DT);
158static bool hoistInsertPastInsert(InsertElementInst *Ins, Loop *CurLoop,
159 DominatorTree *DT, BasicBlock *HoistDest,
160 ICFLoopSafetyInfo *SafetyInfo,
164 Instruction &I, BasicBlock &ExitBlock, PHINode &PN, const LoopInfo *LI,
165 const LoopSafetyInfo *SafetyInfo, MemorySSAUpdater &MSSAU);
166
167static void eraseInstruction(Instruction &I, ICFLoopSafetyInfo &SafetyInfo,
168 MemorySSAUpdater &MSSAU);
169
171 ICFLoopSafetyInfo &SafetyInfo,
173
174static void foreachMemoryAccess(MemorySSA *MSSA, Loop *L,
175 function_ref<void(Instruction *)> Fn);
177 std::pair<SmallSetVector<Value *, 8>, bool>;
180 ICFLoopSafetyInfo *SafetyInfo,
181 const SmallPtrSetImpl<const MDNode *> &LoopLocalAliasScopes, Loop *L);
182
183namespace {
184struct LoopInvariantCodeMotion {
185 bool runOnLoop(Loop *L, AAResults *AA, LoopInfo *LI, DominatorTree *DT,
188 OptimizationRemarkEmitter *ORE, bool LoopNestMode = false);
189
190 LoopInvariantCodeMotion(unsigned LicmMssaOptCap,
191 unsigned LicmMssaNoAccForPromotionCap,
192 bool LicmAllowSpeculation)
193 : LicmMssaOptCap(LicmMssaOptCap),
194 LicmMssaNoAccForPromotionCap(LicmMssaNoAccForPromotionCap),
195 LicmAllowSpeculation(LicmAllowSpeculation) {}
196
197private:
198 unsigned LicmMssaOptCap;
199 unsigned LicmMssaNoAccForPromotionCap;
200 bool LicmAllowSpeculation;
201};
202
203struct LegacyLICMPass : public LoopPass {
204 static char ID; // Pass identification, replacement for typeid
205 LegacyLICMPass(unsigned LicmMssaOptCap =
206 ScalarOptions::Global.licm_mssa_optimization_cap,
207 unsigned LicmMssaNoAccForPromotionCap =
208 ScalarOptions::Global.licm_mssa_max_acc_promotion,
209 bool LicmAllowSpeculation = true)
210 : LoopPass(ID), LICM(LicmMssaOptCap, LicmMssaNoAccForPromotionCap,
211 LicmAllowSpeculation) {
213 }
214
215 bool runOnLoop(Loop *L, LPPassManager &LPM) override {
216 if (skipLoop(L))
217 return false;
218
219 LLVM_DEBUG(dbgs() << "Perform LICM on Loop with header at block "
220 << L->getHeader()->getNameOrAsOperand() << "\n");
221
222 Function *F = L->getHeader()->getParent();
223
224 auto *SE = getAnalysisIfAvailable<ScalarEvolutionWrapperPass>();
225 MemorySSA *MSSA = &getAnalysis<MemorySSAWrapperPass>().getMSSA();
226 // For the old PM, we can't use OptimizationRemarkEmitter as an analysis
227 // pass. Function analyses need to be preserved across loop transformations
228 // but ORE cannot be preserved (see comment before the pass definition).
229 OptimizationRemarkEmitter ORE(L->getHeader()->getParent());
230 return LICM.runOnLoop(
231 L, &getAnalysis<AAResultsWrapperPass>().getAAResults(),
232 &getAnalysis<LoopInfoWrapperPass>().getLoopInfo(),
233 &getAnalysis<DominatorTreeWrapperPass>().getDomTree(),
234 &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(*F),
235 &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(*F),
236 &getAnalysis<TargetTransformInfoWrapperPass>().getTTI(*F),
237 SE ? &SE->getSE() : nullptr, MSSA, &ORE);
238 }
239
240 /// This transformation requires natural loop information & requires that
241 /// loop preheaders be inserted into the CFG...
242 ///
243 void getAnalysisUsage(AnalysisUsage &AU) const override {
244 AU.addPreserved<DominatorTreeWrapperPass>();
245 AU.addPreserved<LoopInfoWrapperPass>();
246 AU.addRequired<TargetLibraryInfoWrapperPass>();
247 AU.addRequired<MemorySSAWrapperPass>();
248 AU.addPreserved<MemorySSAWrapperPass>();
249 AU.addRequired<TargetTransformInfoWrapperPass>();
250 AU.addRequired<AssumptionCacheTracker>();
253 AU.addPreserved<LazyBlockFrequencyInfoPass>();
254 AU.addPreserved<LazyBranchProbabilityInfoPass>();
255 }
256
257private:
258 LoopInvariantCodeMotion LICM;
259};
260} // namespace
261
264 if (!AR.MSSA)
265 reportFatalUsageError("LICM requires MemorySSA (loop-mssa)");
266
267 // For the new PM, we also can't use OptimizationRemarkEmitter as an analysis
268 // pass. Function analyses need to be preserved across loop transformations
269 // but ORE cannot be preserved (see comment before the pass definition).
270 OptimizationRemarkEmitter ORE(L.getHeader()->getParent());
271
272 LoopInvariantCodeMotion LICM(Opts.MssaOptCap, Opts.MssaNoAccForPromotionCap,
273 Opts.AllowSpeculation);
274 if (!LICM.runOnLoop(&L, &AR.AA, &AR.LI, &AR.DT, &AR.AC, &AR.TLI, &AR.TTI,
275 &AR.SE, AR.MSSA, &ORE))
276 return PreservedAnalyses::all();
277
279 PA.preserve<MemorySSAAnalysis>();
280
281 return PA;
282}
283
285 raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
286 static_cast<PassInfoMixin<LICMPass> *>(this)->printPipeline(
287 OS, MapClassName2PassName);
288
289 OS << '<';
290 OS << (Opts.AllowSpeculation ? "" : "no-") << "allowspeculation";
291 OS << '>';
292}
293
296 LPMUpdater &) {
297 if (!AR.MSSA)
298 reportFatalUsageError("LNICM requires MemorySSA (loop-mssa)");
299
300 // For the new PM, we also can't use OptimizationRemarkEmitter as an analysis
301 // pass. Function analyses need to be preserved across loop transformations
302 // but ORE cannot be preserved (see comment before the pass definition).
304
305 LoopInvariantCodeMotion LICM(Opts.MssaOptCap, Opts.MssaNoAccForPromotionCap,
306 Opts.AllowSpeculation);
307
308 Loop &OutermostLoop = LN.getOutermostLoop();
309 bool Changed = LICM.runOnLoop(&OutermostLoop, &AR.AA, &AR.LI, &AR.DT, &AR.AC,
310 &AR.TLI, &AR.TTI, &AR.SE, AR.MSSA, &ORE, true);
311
312 if (!Changed)
313 return PreservedAnalyses::all();
314
316
317 PA.preserve<DominatorTreeAnalysis>();
318 PA.preserve<LoopAnalysis>();
319 PA.preserve<MemorySSAAnalysis>();
320
321 return PA;
322}
323
325 raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
326 static_cast<PassInfoMixin<LNICMPass> *>(this)->printPipeline(
327 OS, MapClassName2PassName);
328
329 OS << '<';
330 OS << (Opts.AllowSpeculation ? "" : "no-") << "allowspeculation";
331 OS << '>';
332}
333
334char LegacyLICMPass::ID = 0;
335INITIALIZE_PASS_BEGIN(LegacyLICMPass, "licm", "Loop Invariant Code Motion",
336 false, false)
342INITIALIZE_PASS_END(LegacyLICMPass, "licm", "Loop Invariant Code Motion", false,
343 false)
344
345Pass *llvm::createLICMPass() { return new LegacyLICMPass(); }
346
348 MemorySSA &MSSA)
349 : SinkAndHoistLICMFlags(ScalarOptions::Global.licm_mssa_optimization_cap,
350 ScalarOptions::Global.licm_mssa_max_acc_promotion,
351 IsSink, L, MSSA) {}
352
354 unsigned LicmMssaOptCap, unsigned LicmMssaNoAccForPromotionCap, bool IsSink,
355 Loop &L, MemorySSA &MSSA)
358 IsSink(IsSink) {
359 unsigned AccessCapCount = 0;
360 for (auto *BB : L.getBlocks())
361 if (const auto *Accesses = MSSA.getBlockAccesses(BB))
362 for (const auto &MA : *Accesses) {
363 (void)MA;
364 ++AccessCapCount;
365 if (AccessCapCount > LicmMssaNoAccForPromotionCap) {
366 NoOfMemAccTooLarge = true;
367 return;
368 }
369 }
370}
371
372/// Hoist expressions out of the specified loop. Note, alias info for inner
373/// loop is not preserved so it is not a good idea to run LICM multiple
374/// times on one loop.
375bool LoopInvariantCodeMotion::runOnLoop(Loop *L, AAResults *AA, LoopInfo *LI,
379 ScalarEvolution *SE, MemorySSA *MSSA,
381 bool LoopNestMode) {
382 bool Changed = false;
383
384 assert(L->isLCSSAForm(*DT) && "Loop is not in LCSSA form.");
385
386 // If this loop has metadata indicating that LICM is not to be performed then
387 // just exit.
389 return false;
390 }
391
392 // Don't sink stores from loops with coroutine suspend instructions.
393 // LICM would sink instructions into the default destination of
394 // the coroutine switch. The default destination of the switch is to
395 // handle the case where the coroutine is suspended, by which point the
396 // coroutine frame may have been destroyed. No instruction can be sunk there.
397 // FIXME: This would unfortunately hurt the performance of coroutines, however
398 // there is currently no general solution for this. Similar issues could also
399 // potentially happen in other passes where instructions are being moved
400 // across that edge.
401 bool HasCoroSuspendInst = false;
402
403 // AA metadata declared to be local to each iteration cannot be used to infer
404 // alias information when promoting stores.
405 SmallPtrSet<const MDNode *, 4> LoopLocalAliasScopes;
406
407 for (BasicBlock *BB : L->getBlocks()) {
408 for (Instruction &I : *BB) {
409 using namespace PatternMatch;
410 HasCoroSuspendInst |= match(&I, m_Intrinsic<Intrinsic::coro_suspend>());
411
412 if (auto *Decl = dyn_cast<NoAliasScopeDeclInst>(&I))
413 for (const MDOperand &Op : Decl->getScopeList()->operands())
414 LoopLocalAliasScopes.insert(cast<MDNode>(Op.get()));
415 }
416 }
417
418 MemorySSAUpdater MSSAU(MSSA);
419 SinkAndHoistLICMFlags Flags(LicmMssaOptCap, LicmMssaNoAccForPromotionCap,
420 /*IsSink=*/true, *L, *MSSA);
421
422 // Get the preheader block to move instructions into...
423 BasicBlock *Preheader = L->getLoopPreheader();
424
425 // Compute loop safety information.
426 ICFLoopSafetyInfo SafetyInfo(L);
427
428 // We want to visit all of the instructions in this loop... that are not parts
429 // of our subloops (they have already had their invariants hoisted out of
430 // their loop, into this loop, so there is no need to process the BODIES of
431 // the subloops).
432 //
433 // Traverse the body of the loop in depth first order on the dominator tree so
434 // that we are guaranteed to see definitions before we see uses. This allows
435 // us to sink instructions in one pass, without iteration. After sinking
436 // instructions, we perform another pass to hoist them out of the loop.
437 if (L->hasDedicatedExits())
438 Changed |=
439 LoopNestMode
440 ? sinkRegionForLoopNest(DT->getNode(L->getHeader()), AA, LI, DT,
441 TLI, TTI, L, MSSAU, &SafetyInfo, Flags, ORE)
442 : sinkRegion(DT->getNode(L->getHeader()), AA, LI, DT, TLI, TTI, L,
443 MSSAU, &SafetyInfo, Flags, ORE);
444 Flags.setIsSink(false);
445 if (Preheader)
446 Changed |= hoistRegion(DT->getNode(L->getHeader()), AA, LI, DT, AC, TLI, L,
447 MSSAU, SE, &SafetyInfo, Flags, ORE, LoopNestMode,
448 LicmAllowSpeculation);
449
450 // Now that all loop invariants have been removed from the loop, promote any
451 // memory references to scalars that we can.
452 // Don't sink stores from loops without dedicated block exits. Exits
453 // containing indirect branches are not transformed by loop simplify,
454 // make sure we catch that. An additional load may be generated in the
455 // preheader for SSA updater, so also avoid sinking when no preheader
456 // is available.
457 if (!ScalarOptions::Global.disable_licm_promotion && Preheader &&
458 L->hasDedicatedExits() && !Flags.tooManyMemoryAccesses() &&
459 !HasCoroSuspendInst) {
460 // Figure out the loop exits and their insertion points
461 SmallVector<BasicBlock *, 8> ExitBlocks;
462 L->getUniqueExitBlocks(ExitBlocks);
463
464 // We can't insert into a catchswitch.
465 bool HasCatchSwitch = llvm::any_of(ExitBlocks, [](BasicBlock *Exit) {
466 return isa<CatchSwitchInst>(Exit->getTerminator());
467 });
468
469 if (!HasCatchSwitch) {
471 SmallVector<MemoryAccess *, 8> MSSAInsertPts;
472 InsertPts.reserve(ExitBlocks.size());
473 MSSAInsertPts.reserve(ExitBlocks.size());
475
476 // Promoting one set of accesses may make the pointers for another set
477 // loop invariant, so run this in a loop.
478 bool Promoted = false;
479 bool LocalPromoted;
480 do {
481 LocalPromoted = false;
482
483 // Recompute the insertion points each time we compute the promotion
484 // candidates, so we don't sink past a store which was promoted in a
485 // previous iteration.
486 InsertPts.clear();
487 MSSAInsertPts.clear();
488 for (BasicBlock *ExitBlock : ExitBlocks) {
489 InsertPts.push_back(ExitBlock->getFirstInsertionPt());
490 MSSAInsertPts.push_back(nullptr);
491 }
492
493 for (auto [PointerMustAliases, HasReadsOutsideSet] :
494 collectPromotionCandidates(MSSA, AA, DT, &SafetyInfo,
495 LoopLocalAliasScopes, L)) {
496 LocalPromoted |= promoteLoopAccessesToScalars(
497 PointerMustAliases, ExitBlocks, InsertPts, MSSAInsertPts, PIC, LI,
498 DT, AC, TLI, TTI, L, MSSAU, &SafetyInfo, ORE,
499 LicmAllowSpeculation, HasReadsOutsideSet);
500 }
501 Promoted |= LocalPromoted;
502 } while (LocalPromoted);
503
504 // Once we have promoted values across the loop body we have to
505 // recursively reform LCSSA as any nested loop may now have values defined
506 // within the loop used in the outer loop.
507 // FIXME: This is really heavy handed. It would be a bit better to use an
508 // SSAUpdater strategy during promotion that was LCSSA aware and reformed
509 // it as it went.
510 if (Promoted)
511 formLCSSARecursively(*L, *DT, LI, SE);
512
513 Changed |= Promoted;
514 }
515 }
516
517 // Check that neither this loop nor its parent have had LCSSA broken. LICM is
518 // specifically moving instructions across the loop boundary and so it is
519 // especially in need of basic functional correctness checking here.
520 assert(L->isLCSSAForm(*DT) && "Loop not left in LCSSA form after LICM!");
521 assert((L->isOutermost() || L->getParentLoop()->isLCSSAForm(*DT)) &&
522 "Parent loop not left in LCSSA form after LICM!");
523
524 if (VerifyMemorySSA)
525 MSSA->verifyMemorySSA();
526
527 if (Changed && SE)
529 return Changed;
530}
531
532/// Walk the specified region of the CFG (defined by all blocks dominated by
533/// the specified block, and that are in the current loop) in reverse depth
534/// first order w.r.t the DominatorTree. This allows us to visit uses before
535/// definitions, allowing us to sink a loop body in one pass without iteration.
536///
539 TargetTransformInfo *TTI, Loop *CurLoop,
540 MemorySSAUpdater &MSSAU, ICFLoopSafetyInfo *SafetyInfo,
542 OptimizationRemarkEmitter *ORE, Loop *OutermostLoop) {
543
544 // Verify inputs.
545 assert(N != nullptr && AA != nullptr && LI != nullptr && DT != nullptr &&
546 CurLoop != nullptr && SafetyInfo != nullptr &&
547 "Unexpected input to sinkRegion.");
548
549 // We want to visit children before parents. We will enqueue all the parents
550 // before their children in the worklist and process the worklist in reverse
551 // order.
553 collectChildrenInLoop(DT, N, CurLoop);
554
555 bool Changed = false;
556 for (BasicBlock *BB : reverse(Worklist)) {
557 // subloop (which would already have been processed).
558 if (inSubLoop(BB, CurLoop, LI))
559 continue;
560
561 for (BasicBlock::iterator II = BB->end(); II != BB->begin();) {
562 Instruction &I = *--II;
563
564 // The instruction is not used in the loop if it is dead. In this case,
565 // we just delete it instead of sinking it.
566 if (isInstructionTriviallyDead(&I, TLI)) {
567 LLVM_DEBUG(dbgs() << "LICM deleting dead inst: " << I << '\n');
570 ++II;
571 eraseInstruction(I, *SafetyInfo, MSSAU);
572 Changed = true;
573 continue;
574 }
575
576 // Check to see if we can sink this instruction to the exit blocks
577 // of the loop. We can do this if the all users of the instruction are
578 // outside of the loop. In this case, it doesn't even matter if the
579 // operands of the instruction are loop invariant.
580 //
581 bool FoldableInLoop = false;
582 bool LoopNestMode = OutermostLoop != nullptr;
583 if (!I.mayHaveSideEffects() &&
584 isNotUsedOrFoldableInLoop(I, LoopNestMode ? OutermostLoop : CurLoop,
585 SafetyInfo, TTI, FoldableInLoop,
586 LoopNestMode) &&
587 canSinkOrHoistInst(I, AA, DT, CurLoop, MSSAU, true, Flags, ORE)) {
588 if (sink(I, LI, DT, CurLoop, SafetyInfo, MSSAU, ORE)) {
589 if (!FoldableInLoop) {
590 ++II;
592 eraseInstruction(I, *SafetyInfo, MSSAU);
593 }
594 Changed = true;
595 }
596 }
597 }
598 }
599 if (VerifyMemorySSA)
600 MSSAU.getMemorySSA()->verifyMemorySSA();
601 return Changed;
602}
603
606 TargetTransformInfo *TTI, Loop *CurLoop,
607 MemorySSAUpdater &MSSAU,
608 ICFLoopSafetyInfo *SafetyInfo,
611
612 bool Changed = false;
614 Worklist.insert(CurLoop);
615 appendLoopsToWorklist(*CurLoop, Worklist);
616 while (!Worklist.empty()) {
617 Loop *L = Worklist.pop_back_val();
618 Changed |= sinkRegion(DT->getNode(L->getHeader()), AA, LI, DT, TLI, TTI, L,
619 MSSAU, SafetyInfo, Flags, ORE, CurLoop);
620 }
621 return Changed;
622}
623
624/// Walk the specified region of the CFG (defined by all blocks dominated by
625/// the specified block, and that are in the current loop) in depth first
626/// order w.r.t the DominatorTree. This allows us to visit definitions before
627/// uses, allowing us to hoist a loop body in one pass without iteration.
628///
631 TargetLibraryInfo *TLI, Loop *CurLoop,
633 ICFLoopSafetyInfo *SafetyInfo,
635 OptimizationRemarkEmitter *ORE, bool LoopNestMode,
636 bool AllowSpeculation) {
637 // Verify inputs.
638 assert(N != nullptr && AA != nullptr && LI != nullptr && DT != nullptr &&
639 CurLoop != nullptr && SafetyInfo != nullptr &&
640 "Unexpected input to hoistRegion.");
641
642 LoopBlocksRPO Worklist(CurLoop);
643 Worklist.perform(LI);
644 bool Changed = false;
645 BasicBlock *Preheader = CurLoop->getLoopPreheader();
646 for (BasicBlock *BB : Worklist) {
647 // Only need to process the contents of this block if it is not part of a
648 // subloop (which would already have been processed).
649 if (!LoopNestMode && inSubLoop(BB, CurLoop, LI))
650 continue;
651
653 // Try hoisting the instruction out to the preheader. We can only do
654 // this if all of the operands of the instruction are loop invariant and
655 // if it is safe to hoist the instruction.
656 if (CurLoop->hasLoopInvariantOperands(&I) &&
657 canSinkOrHoistInst(I, AA, DT, CurLoop, MSSAU, true, Flags, ORE) &&
658 isSafeToExecuteUnconditionally(I, DT, TLI, CurLoop, SafetyInfo, ORE,
659 Preheader->getTerminator(), AC,
660 AllowSpeculation)) {
661 hoist(I, DT, CurLoop, Preheader, SafetyInfo, MSSAU, SE, ORE);
662 Changed = true;
663 continue;
664 }
665
666 if (auto *Ins = dyn_cast<InsertElementInst>(&I))
667 if (hoistInsertPastInsert(Ins, CurLoop, DT, Preheader, SafetyInfo,
668 MSSAU, SE, ORE)) {
669 Changed = true;
670 continue;
671 }
672
673 // Attempt to remove floating point division out of the loop by
674 // converting it to a reciprocal multiplication.
675 if (I.getOpcode() == Instruction::FDiv && I.hasAllowReciprocal() &&
676 CurLoop->isLoopInvariant(I.getOperand(1))) {
677 auto Divisor = I.getOperand(1);
678 auto One = llvm::ConstantFP::get(Divisor->getType(), 1.0);
679 auto ReciprocalDivisor = BinaryOperator::CreateFDiv(One, Divisor);
680 ReciprocalDivisor->setFastMathFlags(I.getFastMathFlags());
681 SafetyInfo->insertInstructionTo(ReciprocalDivisor, I.getParent());
682 ReciprocalDivisor->insertBefore(I.getIterator());
683 ReciprocalDivisor->setDebugLoc(I.getDebugLoc());
684
685 auto Product =
686 BinaryOperator::CreateFMul(I.getOperand(0), ReciprocalDivisor);
687 Product->setFastMathFlags(I.getFastMathFlags());
688 SafetyInfo->insertInstructionTo(Product, I.getParent());
689 Product->insertAfter(I.getIterator());
690 Product->setDebugLoc(I.getDebugLoc());
691 I.replaceAllUsesWith(Product);
692 eraseInstruction(I, *SafetyInfo, MSSAU);
693
694 hoist(*ReciprocalDivisor, DT, CurLoop, Preheader, SafetyInfo, MSSAU, SE,
695 ORE);
696 Changed = true;
697 continue;
698 }
699
700 auto IsInvariantStart = [&](Instruction &I) {
701 using namespace PatternMatch;
702 return I.use_empty() &&
704 };
705 auto MustExecuteWithoutWritesBefore = [&](Instruction &I) {
706 return SafetyInfo->isGuaranteedToExecute(I, DT) &&
707 SafetyInfo->doesNotWriteMemoryBefore(I);
708 };
709 if ((IsInvariantStart(I) || isGuard(&I)) &&
710 CurLoop->hasLoopInvariantOperands(&I) &&
711 MustExecuteWithoutWritesBefore(I)) {
712 hoist(I, DT, CurLoop, Preheader, SafetyInfo, MSSAU, SE, ORE);
713 Changed = true;
714 continue;
715 }
716
717 // Try to reassociate instructions so that part of computations can be
718 // done out of loop.
719 if (hoistArithmetics(I, *CurLoop, *SafetyInfo, MSSAU, AC, DT)) {
720 Changed = true;
721 continue;
722 }
723 }
724 }
725
726 if (VerifyMemorySSA)
727 MSSAU.getMemorySSA()->verifyMemorySSA();
728
729 // Now that we've finished hoisting make sure that LI and DT are still
730 // valid.
731#ifdef EXPENSIVE_CHECKS
732 if (Changed) {
733 assert(DT->verify(DominatorTree::VerificationLevel::Fast) &&
734 "Dominator tree verification failed");
735 LI->verify();
736 }
737#endif
738
739 return Changed;
740}
741
742static std::optional<uint64_t>
744 // Must have constant insertion lane.
745 auto *InsertedIdxCI = dyn_cast<ConstantInt>(Ins->getOperand(2));
746 if (!InsertedIdxCI)
747 return std::nullopt;
748 auto *VecTy = cast<VectorType>(Ins->getType());
749
750 // Avoid hoisting past out of bounds inserts.
751 if (InsertedIdxCI->isNegative() ||
752 InsertedIdxCI->getValue().uge(
753 VecTy->getElementCount().getKnownMinValue()))
754 return std::nullopt;
755 return InsertedIdxCI->getValue().getLimitedValue();
756}
757
759 DominatorTree *DT, BasicBlock *HoistDest,
760 ICFLoopSafetyInfo *SafetyInfo,
763 // Canonicalize:
764 // %inner = insertelement %base, %variant, C1
765 // %outer = insertelement %inner, %invariant, C2
766 // into:
767 // %outer = insertelement %base, %invariant, C2
768 // %inner = insertelement %outer, %variant, C1
769 // so we can hoist %outer
770
771 // The instruction we are hoisting must have invariant insertion data
772 Value *InsertedElt = Ins->getOperand(1);
773 if (!CurLoop->isLoopInvariant(InsertedElt))
774 return false;
775
776 std::optional<uint64_t> HoistIdx = getConstantInsertionIndex(Ins);
777 if (!HoistIdx)
778 return false;
779
780 InsertElementInst *Inner = Ins;
781 while (!CurLoop->isLoopInvariant(Inner->getOperand(0))) {
782 // If the inner value isn't invariant, check to see if it is another insert
783 // All instructions in the chain must be in the same basic block
784 auto *InnerIns = dyn_cast<InsertElementInst>(Inner->getOperand(0));
785 if (!InnerIns || InnerIns->getParent() != Ins->getParent())
786 return false;
787
788 // Make sure not hoisting past insertions into the same lane
789 std::optional<uint64_t> InsertIdx = getConstantInsertionIndex(InnerIns);
790 if (!InsertIdx || *InsertIdx == *HoistIdx)
791 return false;
792
793 // Instruction being hoisted past must only have one use
794 if (!InnerIns->hasOneUse())
795 return false;
796
797 Inner = InnerIns;
798 }
799
800 // Base case of `insertelement <4 x i8> %invar0, i8 %invar1, i32 2` handled in
801 // base LICM logic
802 if (Inner == Ins)
803 return false;
804
805 Ins->replaceAllUsesWith(Ins->getOperand(0));
806 Ins->moveBefore(Inner->getIterator());
807 Ins->setOperand(0, Inner->getOperand(0));
808 Inner->setOperand(0, Ins);
809 hoist(*Ins, DT, CurLoop, HoistDest, SafetyInfo, MSSAU, SE, ORE);
810 return true;
811}
812
813// Return true if LI is invariant within scope of the loop. LI is invariant if
814// CurLoop is dominated by an invariant.start representing the same memory
815// location and size as the memory location LI loads from, and also the
816// invariant.start has no uses.
818 Loop *CurLoop) {
819 Value *Addr = LI->getPointerOperand();
820 const DataLayout &DL = LI->getDataLayout();
821 const TypeSize LocSizeInBits = DL.getTypeSizeInBits(LI->getType());
822
823 // It is not currently possible for clang to generate an invariant.start
824 // intrinsic with scalable vector types because we don't support thread local
825 // sizeless types and we don't permit sizeless types in structs or classes.
826 // Furthermore, even if support is added for this in future the intrinsic
827 // itself is defined to have a size of -1 for variable sized objects. This
828 // makes it impossible to verify if the intrinsic envelops our region of
829 // interest. For example, both <vscale x 32 x i8> and <vscale x 16 x i8>
830 // types would have a -1 parameter, but the former is clearly double the size
831 // of the latter.
832 if (LocSizeInBits.isScalable())
833 return false;
834
835 // If we've ended up at a global/constant, bail. We shouldn't be looking at
836 // uselists for non-local Values in a loop pass.
837 if (isa<Constant>(Addr))
838 return false;
839
840 unsigned UsesVisited = 0;
841 // Traverse all uses of the load operand value, to see if invariant.start is
842 // one of the uses, and whether it dominates the load instruction.
843 for (auto *U : Addr->users()) {
844 // Avoid traversing for Load operand with high number of users.
845 if (++UsesVisited > ScalarOptions::Global.licm_max_num_uses_traversed)
846 return false;
848 // If there are escaping uses of invariant.start instruction, the load maybe
849 // non-invariant.
850 if (!II || II->getIntrinsicID() != Intrinsic::invariant_start ||
851 !II->use_empty())
852 continue;
853 ConstantInt *InvariantSize = cast<ConstantInt>(II->getArgOperand(0));
854 // The intrinsic supports having a -1 argument for variable sized objects
855 // so we should check for that here.
856 if (InvariantSize->isNegative())
857 continue;
858 uint64_t InvariantSizeInBits = InvariantSize->getSExtValue() * 8;
859 // Confirm the invariant.start location size contains the load operand size
860 // in bits. Also, the invariant.start should dominate the load, and we
861 // should not hoist the load out of a loop that contains this dominating
862 // invariant.start.
863 if (LocSizeInBits.getFixedValue() <= InvariantSizeInBits &&
864 DT->properlyDominates(II->getParent(), CurLoop->getHeader()))
865 return true;
866 }
867
868 return false;
869}
870
871/// Return true if-and-only-if we know how to (mechanically) both hoist and
872/// sink a given instruction out of a loop. Does not address legality
873/// concerns such as aliasing or speculation safety.
884
885/// Return true if I is the only Instruction with a MemoryAccess in L.
886static bool isOnlyMemoryAccess(const Instruction *I, const Loop *L,
887 const MemorySSAUpdater &MSSAU) {
888 for (auto *BB : L->getBlocks())
889 if (auto *Accs = MSSAU.getMemorySSA()->getBlockAccesses(BB)) {
890 int NotAPhi = 0;
891 for (const auto &Acc : *Accs) {
892 if (isa<MemoryPhi>(&Acc))
893 continue;
894 const auto *MUD = cast<MemoryUseOrDef>(&Acc);
895 if (MUD->getMemoryInst() != I || NotAPhi++ == 1)
896 return false;
897 }
898 }
899 return true;
900}
901
903 BatchAAResults &BAA,
905 MemoryUseOrDef *MA) {
906 // See declaration of SetLicmMssaOptCap for usage details.
907 if (Flags.tooManyClobberingCalls())
908 return MA->getDefiningAccess();
909
910 MemoryAccess *Source =
912 Flags.incrementClobberingCalls();
913 return Source;
914}
915
917 Loop *CurLoop, MemorySSA &MSSA,
918 bool TargetExecutesOncePerLoop,
921 if (!LI.isUnordered())
922 return false; // Don't sink/hoist volatile or ordered atomic loads!
923
924 // Loads from constant memory are always safe to move, even if they end up
925 // in the same alias set as something that ends up being modified.
926 if (!isModSet(AA->getModRefInfoMask(LI.getOperand(0))))
927 return true;
928 if (LI.hasMetadata(LLVMContext::MD_invariant_load))
929 return true;
930
931 if (LI.isAtomic() && !TargetExecutesOncePerLoop)
932 return false; // Don't risk duplicating unordered loads
933
934 // This checks for an invariant.start dominating the load.
935 if (isLoadInvariantInLoop(&LI, DT, CurLoop))
936 return true;
937
938 auto *MU = cast<MemoryUse>(MSSA.getMemoryAccess(&LI));
939
940 bool InvariantGroup = LI.hasMetadata(LLVMContext::MD_invariant_group);
941
942 bool Invalidated =
943 pointerInvalidatedByLoop(&MSSA, MU, CurLoop, LI, Flags, InvariantGroup);
944 // Check loop-invariant address because this may also be a sinkable load
945 // whose address is not necessarily loop-invariant.
946 if (ORE && Invalidated && CurLoop->isLoopInvariant(LI.getPointerOperand()))
947 ORE->emit([&]() {
949 DEBUG_TYPE, "LoadWithLoopInvariantAddressInvalidated", &LI)
950 << "failed to move load with loop-invariant address "
951 "because the loop may invalidate its value";
952 });
953
954 return !Invalidated;
955}
956
958 Loop *CurLoop, MemorySSAUpdater &MSSAU,
959 bool TargetExecutesOncePerLoop,
962 // If we don't understand the instruction, bail early.
964 return false;
965
966 MemorySSA *MSSA = MSSAU.getMemorySSA();
967 // Loads have extra constraints we have to verify before we can hoist them.
968 if (LoadInst *LI = dyn_cast<LoadInst>(&I)) {
969 return canHoistLoad(*LI, AA, DT, CurLoop, *MSSA, TargetExecutesOncePerLoop,
970 Flags, ORE);
971 } else if (CallInst *CI = dyn_cast<CallInst>(&I)) {
972 // Don't sink calls which can throw.
973 if (CI->mayThrow())
974 return false;
975
976 // Convergent attribute has been used on operations that involve
977 // inter-thread communication which results are implicitly affected by the
978 // enclosing control flows. It is not safe to hoist or sink such operations
979 // across control flow.
980 if (CI->isConvergent())
981 return false;
982
983 // FIXME: Current LLVM IR semantics don't work well with coroutines and
984 // thread local globals. We currently treat getting the address of a thread
985 // local global as not accessing memory, even though it may not be a
986 // constant throughout a function with coroutines. Remove this check after
987 // we better model semantics of thread local globals.
988 if (CI->getFunction()->isPresplitCoroutine())
989 return false;
990
991 using namespace PatternMatch;
993 // Assumes don't actually alias anything or throw
994 return true;
995
996 // Handle simple cases by querying alias analysis.
997 MemoryEffects Behavior = AA->getMemoryEffects(CI);
998
999 if (Behavior.doesNotAccessMemory())
1000 return true;
1001 if (Behavior.onlyReadsMemory()) {
1002 // Might have stale MemoryDef for call that was later inferred to be
1003 // read-only.
1004 auto *MU = dyn_cast<MemoryUse>(MSSA->getMemoryAccess(CI));
1005 if (!MU)
1006 return false;
1007
1008 // If we can prove there are no writes to the memory read by the call, we
1009 // can hoist or sink.
1011 MSSA, MU, CurLoop, I, Flags, /*InvariantGroup=*/false);
1012 }
1013
1014 if (Behavior.onlyWritesMemory()) {
1015 // can hoist or sink if there are no conflicting read/writes to the
1016 // memory location written to by the call.
1017 return noConflictingReadWrites(CI, MSSA, AA, CurLoop, Flags);
1018 }
1019
1020 return false;
1021 } else if (auto *FI = dyn_cast<FenceInst>(&I)) {
1022 // Fences alias (most) everything to provide ordering. For the moment,
1023 // just give up if there are any other memory operations in the loop.
1024 return isOnlyMemoryAccess(FI, CurLoop, MSSAU);
1025 } else if (auto *SI = dyn_cast<StoreInst>(&I)) {
1026 if (!SI->isUnordered())
1027 return false; // Don't sink/hoist volatile or ordered atomic store!
1028
1029 // We can only hoist a store that we can prove writes a value which is not
1030 // read or overwritten within the loop. For those cases, we fallback to
1031 // load store promotion instead. TODO: We can extend this to cases where
1032 // there is exactly one write to the location and that write dominates an
1033 // arbitrary number of reads in the loop.
1034 if (isOnlyMemoryAccess(SI, CurLoop, MSSAU))
1035 return true;
1036 return noConflictingReadWrites(SI, MSSA, AA, CurLoop, Flags);
1037 }
1038
1039 assert(!I.mayReadOrWriteMemory() && "unhandled aliasing");
1040
1041 // We've established mechanical ability and aliasing, it's up to the caller
1042 // to check fault safety
1043 return true;
1044}
1045
1046/// Returns true if a PHINode is a trivially replaceable with an
1047/// Instruction.
1048/// This is true when all incoming values are that instruction.
1049/// This pattern occurs most often with LCSSA PHI nodes.
1050///
1051static bool isTriviallyReplaceablePHI(const PHINode &PN, const Instruction &I) {
1052 for (const Value *IncValue : PN.incoming_values())
1053 if (IncValue != &I)
1054 return false;
1055
1056 return true;
1057}
1058
1059/// Return true if the instruction is foldable in the loop.
1060static bool isFoldableInLoop(const Instruction &I, const Loop *CurLoop,
1061 const TargetTransformInfo *TTI) {
1062 if (auto *GEP = dyn_cast<GetElementPtrInst>(&I)) {
1063 InstructionCost CostI =
1064 TTI->getInstructionCost(&I, TargetTransformInfo::TCK_SizeAndLatency);
1065 if (CostI != TargetTransformInfo::TCC_Free)
1066 return false;
1067 // For a GEP, we cannot simply use getInstructionCost because currently
1068 // it optimistically assumes that a GEP will fold into addressing mode
1069 // regardless of its users.
1070 const BasicBlock *BB = GEP->getParent();
1071 for (const User *U : GEP->users()) {
1072 const Instruction *UI = cast<Instruction>(U);
1073 if (CurLoop->contains(UI) &&
1074 (BB != UI->getParent() ||
1075 (!isa<StoreInst>(UI) && !isa<LoadInst>(UI))))
1076 return false;
1077 }
1078 return true;
1079 }
1080
1081 return false;
1082}
1083
1084/// Return true if the only users of this instruction are outside of
1085/// the loop. If this is true, we can sink the instruction to the exit
1086/// blocks of the loop.
1087///
1088/// We also return true if the instruction could be folded away in lowering.
1089/// (e.g., a GEP can be folded into a load as an addressing mode in the loop).
1090static bool isNotUsedOrFoldableInLoop(const Instruction &I, const Loop *CurLoop,
1091 const LoopSafetyInfo *SafetyInfo,
1093 bool &FoldableInLoop, bool LoopNestMode) {
1094 bool IsFoldable = isFoldableInLoop(I, CurLoop, TTI);
1095 for (const User *U : I.users()) {
1096 const Instruction *UI = cast<Instruction>(U);
1097 if (const PHINode *PN = dyn_cast<PHINode>(UI)) {
1098 const BasicBlock *BB = PN->getParent();
1099 // We cannot sink uses in catchswitches.
1101 return false;
1102
1103 // We need to sink a callsite to a unique funclet. Avoid sinking if the
1104 // phi use is too muddled.
1105 if (isa<CallInst>(I)) {
1106 const auto &BlockColors = SafetyInfo->getBlockColors();
1107 if (!BlockColors.empty() &&
1108 BlockColors.find(const_cast<BasicBlock *>(BB))->second.size() != 1)
1109 return false;
1110 }
1111
1112 if (LoopNestMode) {
1113 while (isa<PHINode>(UI) && UI->hasOneUser() &&
1114 UI->getNumOperands() == 1) {
1115 if (!CurLoop->contains(UI))
1116 break;
1117 UI = cast<Instruction>(UI->user_back());
1118 }
1119 }
1120 }
1121
1122 if (CurLoop->contains(UI)) {
1123 if (IsFoldable) {
1124 FoldableInLoop = true;
1125 continue;
1126 }
1127 return false;
1128 }
1129 }
1130 return true;
1131}
1132
1134 Instruction &I, BasicBlock &ExitBlock, PHINode &PN, const LoopInfo *LI,
1135 const LoopSafetyInfo *SafetyInfo, MemorySSAUpdater &MSSAU) {
1136 Instruction *New;
1137 if (auto *CI = dyn_cast<CallInst>(&I)) {
1138 const auto &BlockColors = SafetyInfo->getBlockColors();
1139
1140 // Sinking call-sites need to be handled differently from other
1141 // instructions. The cloned call-site needs a funclet bundle operand
1142 // appropriate for its location in the CFG.
1144 for (unsigned BundleIdx = 0, BundleEnd = CI->getNumOperandBundles();
1145 BundleIdx != BundleEnd; ++BundleIdx) {
1146 OperandBundleUse Bundle = CI->getOperandBundleAt(BundleIdx);
1147 if (Bundle.getTagID() == LLVMContext::OB_funclet)
1148 continue;
1149
1150 OpBundles.emplace_back(Bundle);
1151 }
1152
1153 if (!BlockColors.empty()) {
1154 const ColorVector &CV = BlockColors.find(&ExitBlock)->second;
1155 assert(CV.size() == 1 && "non-unique color for exit block!");
1156 BasicBlock *BBColor = CV.front();
1157 BasicBlock::iterator EHPad = BBColor->getFirstNonPHIIt();
1158 if (EHPad->isEHPad())
1159 OpBundles.emplace_back("funclet", &*EHPad);
1160 }
1161
1162 New = CallInst::Create(CI, OpBundles);
1163 New->copyMetadata(*CI);
1164 } else {
1165 New = I.clone();
1166 }
1167
1168 New->insertInto(&ExitBlock, ExitBlock.getFirstInsertionPt());
1169 if (!I.getName().empty())
1170 New->setName(I.getName() + ".le");
1171
1172 if (MSSAU.getMemorySSA()->getMemoryAccess(&I)) {
1173 // Create a new MemoryAccess and let MemorySSA set its defining access.
1174 // After running some passes, MemorySSA might be outdated, and the
1175 // instruction `I` may have become a non-memory touching instruction.
1176 MemoryAccess *NewMemAcc = MSSAU.createMemoryAccessInBB(
1177 New, nullptr, New->getParent(), MemorySSA::Beginning,
1178 /*CreationMustSucceed=*/false);
1179 if (NewMemAcc) {
1180 if (auto *MemDef = dyn_cast<MemoryDef>(NewMemAcc))
1181 MSSAU.insertDef(MemDef, /*RenameUses=*/true);
1182 else {
1183 auto *MemUse = cast<MemoryUse>(NewMemAcc);
1184 MSSAU.insertUse(MemUse, /*RenameUses=*/true);
1185 }
1186 }
1187 }
1188
1189 // Build LCSSA PHI nodes for any in-loop operands (if legal). Note that
1190 // this is particularly cheap because we can rip off the PHI node that we're
1191 // replacing for the number and blocks of the predecessors.
1192 // OPT: If this shows up in a profile, we can instead finish sinking all
1193 // invariant instructions, and then walk their operands to re-establish
1194 // LCSSA. That will eliminate creating PHI nodes just to nuke them when
1195 // sinking bottom-up.
1196 for (Use &Op : New->operands())
1197 if (LI->wouldBeOutOfLoopUseRequiringLCSSA(Op.get(), PN.getParent())) {
1198 auto *OInst = cast<Instruction>(Op.get());
1199 PHINode *OpPN =
1200 PHINode::Create(OInst->getType(), PN.getNumIncomingValues(),
1201 OInst->getName() + ".lcssa");
1202 OpPN->insertBefore(ExitBlock.begin());
1203 for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i)
1204 OpPN->addIncoming(OInst, PN.getIncomingBlock(i));
1205 Op = OpPN;
1206 }
1207 return New;
1208}
1209
1211 MemorySSAUpdater &MSSAU) {
1212 MSSAU.removeMemoryAccess(&I);
1213 SafetyInfo.removeInstruction(&I);
1214 I.eraseFromParent();
1215}
1216
1218 ICFLoopSafetyInfo &SafetyInfo,
1219 MemorySSAUpdater &MSSAU,
1220 ScalarEvolution *SE) {
1221 SafetyInfo.removeInstruction(&I);
1222 SafetyInfo.insertInstructionTo(&I, Dest->getParent());
1223 I.moveBefore(*Dest->getParent(), Dest);
1225 MSSAU.getMemorySSA()->getMemoryAccess(&I)))
1226 MSSAU.moveToPlace(OldMemAcc, Dest->getParent(),
1228 if (SE)
1230}
1231
1233 PHINode *TPN, Instruction *I, LoopInfo *LI,
1235 const LoopSafetyInfo *SafetyInfo, const Loop *CurLoop,
1236 MemorySSAUpdater &MSSAU) {
1238 "Expect only trivially replaceable PHI");
1239 BasicBlock *ExitBlock = TPN->getParent();
1240 auto [It, Inserted] = SunkCopies.try_emplace(ExitBlock);
1241 if (Inserted)
1242 It->second = cloneInstructionInExitBlock(*I, *ExitBlock, *TPN, LI,
1243 SafetyInfo, MSSAU);
1244 return It->second;
1245}
1246
1247static bool canSplitPredecessors(PHINode *PN, LoopSafetyInfo *SafetyInfo) {
1248 BasicBlock *BB = PN->getParent();
1249 if (!BB->canSplitPredecessors())
1250 return false;
1251 // It's not impossible to split EHPad blocks, but if BlockColors already exist
1252 // it require updating BlockColors for all offspring blocks accordingly. By
1253 // skipping such corner case, we can make updating BlockColors after splitting
1254 // predecessor fairly simple.
1255 if (!SafetyInfo->getBlockColors().empty() &&
1256 BB->getFirstNonPHIIt()->isEHPad())
1257 return false;
1258 for (BasicBlock *BBPred : predecessors(BB)) {
1259 if (isa<IndirectBrInst>(BBPred->getTerminator()))
1260 return false;
1261 }
1262 return true;
1263}
1264
1266 LoopInfo *LI, const Loop *CurLoop,
1267 LoopSafetyInfo *SafetyInfo,
1268 MemorySSAUpdater *MSSAU) {
1269#ifndef NDEBUG
1271 CurLoop->getUniqueExitBlocks(ExitBlocks);
1272 SmallPtrSet<BasicBlock *, 32> ExitBlockSet(llvm::from_range, ExitBlocks);
1273#endif
1274 BasicBlock *ExitBB = PN->getParent();
1275 assert(ExitBlockSet.count(ExitBB) && "Expect the PHI is in an exit block.");
1276
1277 // Split predecessors of the loop exit to make instructions in the loop are
1278 // exposed to exit blocks through trivially replaceable PHIs while keeping the
1279 // loop in the canonical form where each predecessor of each exit block should
1280 // be contained within the loop. For example, this will convert the loop below
1281 // from
1282 //
1283 // LB1:
1284 // %v1 =
1285 // br %LE, %LB2
1286 // LB2:
1287 // %v2 =
1288 // br %LE, %LB1
1289 // LE:
1290 // %p = phi [%v1, %LB1], [%v2, %LB2] <-- non-trivially replaceable
1291 //
1292 // to
1293 //
1294 // LB1:
1295 // %v1 =
1296 // br %LE.split, %LB2
1297 // LB2:
1298 // %v2 =
1299 // br %LE.split2, %LB1
1300 // LE.split:
1301 // %p1 = phi [%v1, %LB1] <-- trivially replaceable
1302 // br %LE
1303 // LE.split2:
1304 // %p2 = phi [%v2, %LB2] <-- trivially replaceable
1305 // br %LE
1306 // LE:
1307 // %p = phi [%p1, %LE.split], [%p2, %LE.split2]
1308 //
1309 const auto &BlockColors = SafetyInfo->getBlockColors();
1310 SmallSetVector<BasicBlock *, 8> PredBBs(pred_begin(ExitBB), pred_end(ExitBB));
1311 DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy);
1312 while (!PredBBs.empty()) {
1313 BasicBlock *PredBB = *PredBBs.begin();
1314 assert(CurLoop->contains(PredBB) &&
1315 "Expect all predecessors are in the loop");
1316 if (PN->getBasicBlockIndex(PredBB) >= 0) {
1318 ExitBB, PredBB, ".split.loop.exit", &DTU, LI, MSSAU, true);
1319 // Since we do not allow splitting EH-block with BlockColors in
1320 // canSplitPredecessors(), we can simply assign predecessor's color to
1321 // the new block.
1322 if (!BlockColors.empty())
1323 // Grab a reference to the ColorVector to be inserted before getting the
1324 // reference to the vector we are copying because inserting the new
1325 // element in BlockColors might cause the map to be reallocated.
1326 SafetyInfo->copyColors(NewPred, PredBB);
1327 }
1328 PredBBs.remove(PredBB);
1329 }
1330}
1331
1332/// When an instruction is found to only be used outside of the loop, this
1333/// function moves it to the exit blocks and patches up SSA form as needed.
1334/// This method is guaranteed to remove the original instruction from its
1335/// position, and may either delete it or move it to outside of the loop.
1336///
1337static bool sink(Instruction &I, LoopInfo *LI, DominatorTree *DT,
1338 const Loop *CurLoop, ICFLoopSafetyInfo *SafetyInfo,
1340 bool Changed = false;
1341 LLVM_DEBUG(dbgs() << "LICM sinking instruction: " << I << "\n");
1342
1343 // Iterate over users to be ready for actual sinking. Replace users via
1344 // unreachable blocks with undef and make all user PHIs trivially replaceable.
1345 SmallPtrSet<Instruction *, 8> VisitedUsers;
1346 for (Instruction::user_iterator UI = I.user_begin(), UE = I.user_end();
1347 UI != UE;) {
1348 auto *User = cast<Instruction>(*UI);
1349 Use &U = UI.getUse();
1350 ++UI;
1351
1352 if (VisitedUsers.count(User) || CurLoop->contains(User))
1353 continue;
1354
1355 if (!DT->isReachableFromEntry(User->getParent())) {
1356 U = PoisonValue::get(I.getType());
1357 Changed = true;
1358 continue;
1359 }
1360
1361 // The user must be a PHI node.
1362 PHINode *PN = cast<PHINode>(User);
1363
1364 // Surprisingly, instructions can be used outside of loops without any
1365 // exits. This can only happen in PHI nodes if the incoming block is
1366 // unreachable.
1367 BasicBlock *BB = PN->getIncomingBlock(U);
1368 if (!DT->isReachableFromEntry(BB)) {
1369 U = PoisonValue::get(I.getType());
1370 Changed = true;
1371 continue;
1372 }
1373
1374 VisitedUsers.insert(PN);
1375 if (isTriviallyReplaceablePHI(*PN, I))
1376 continue;
1377
1378 if (!canSplitPredecessors(PN, SafetyInfo))
1379 return Changed;
1380
1381 // Split predecessors of the PHI so that we can make users trivially
1382 // replaceable.
1383 splitPredecessorsOfLoopExit(PN, DT, LI, CurLoop, SafetyInfo, &MSSAU);
1384
1385 // Should rebuild the iterators, as they may be invalidated by
1386 // splitPredecessorsOfLoopExit().
1387 UI = I.user_begin();
1388 UE = I.user_end();
1389 }
1390
1391 if (VisitedUsers.empty())
1392 return Changed;
1393
1394 ORE->emit([&]() {
1395 return OptimizationRemark(DEBUG_TYPE, "InstSunk", &I)
1396 << "sinking " << ore::NV("Inst", &I);
1397 });
1398 if (isa<LoadInst>(I))
1399 ++NumMovedLoads;
1400 else if (isa<CallInst>(I))
1401 ++NumMovedCalls;
1402 ++NumSunk;
1403
1404#ifndef NDEBUG
1406 CurLoop->getUniqueExitBlocks(ExitBlocks);
1407 SmallPtrSet<BasicBlock *, 32> ExitBlockSet(llvm::from_range, ExitBlocks);
1408#endif
1409
1410 // Clones of this instruction. Don't create more than one per exit block!
1412
1413 // If this instruction is only used outside of the loop, then all users are
1414 // PHI nodes in exit blocks due to LCSSA form. Just RAUW them with clones of
1415 // the instruction.
1416 // First check if I is worth sinking for all uses. Sink only when it is worth
1417 // across all uses.
1418 SmallSetVector<User*, 8> Users(I.user_begin(), I.user_end());
1419 for (auto *UI : Users) {
1420 auto *User = cast<Instruction>(UI);
1421
1422 if (CurLoop->contains(User))
1423 continue;
1424
1425 PHINode *PN = cast<PHINode>(User);
1426 assert(ExitBlockSet.count(PN->getParent()) &&
1427 "The LCSSA PHI is not in an exit block!");
1428
1429 // The PHI must be trivially replaceable.
1431 PN, &I, LI, SunkCopies, SafetyInfo, CurLoop, MSSAU);
1432 // As we sink the instruction out of the BB, drop its debug location.
1433 New->dropLocation();
1434 PN->replaceAllUsesWith(New);
1435 eraseInstruction(*PN, *SafetyInfo, MSSAU);
1436 Changed = true;
1437 }
1438 return Changed;
1439}
1440
1441/// When an instruction is found to only use loop invariant operands that
1442/// is safe to hoist, this instruction is called to do the dirty work.
1443///
1444static void hoist(Instruction &I, const DominatorTree *DT, const Loop *CurLoop,
1445 BasicBlock *Dest, ICFLoopSafetyInfo *SafetyInfo,
1448 LLVM_DEBUG(dbgs() << "LICM hoisting to " << Dest->getNameOrAsOperand() << ": "
1449 << I << "\n");
1450 ORE->emit([&]() {
1451 return OptimizationRemark(DEBUG_TYPE, "Hoisted", &I) << "hoisting "
1452 << ore::NV("Inst", &I);
1453 });
1454
1455 // Metadata can be dependent on conditions we are hoisting above.
1456 // Conservatively strip all metadata on the instruction unless we were
1457 // guaranteed to execute I if we entered the loop, in which case the metadata
1458 // is valid in the loop preheader.
1459 // Similarly, If I is a call and it is not guaranteed to execute in the loop,
1460 // then moving to the preheader means we should strip attributes on the call
1461 // that can cause UB since we may be hoisting above conditions that allowed
1462 // inferring those attributes. They may not be valid at the preheader.
1463 if ((I.hasMetadataOtherThanDebugLoc() || isa<CallInst>(I)) &&
1464 // The check on hasMetadataOtherThanDebugLoc is to prevent us from burning
1465 // time in isGuaranteedToExecute if we don't actually have anything to
1466 // drop. It is a compile time optimization, not required for correctness.
1467 !SafetyInfo->isGuaranteedToExecute(I, DT)) {
1468 I.dropUBImplyingAttrsAndMetadata();
1469 }
1470
1471 if (isa<PHINode>(I))
1472 // Move the new node to the end of the phi list in the destination block.
1473 moveInstructionBefore(I, Dest->getFirstNonPHIIt(), *SafetyInfo, MSSAU, SE);
1474 else
1475 // Move the new node to the destination block, before its terminator.
1476 moveInstructionBefore(I, Dest->getTerminator()->getIterator(), *SafetyInfo,
1477 MSSAU, SE);
1478
1479 I.updateLocationAfterHoist();
1480
1481 if (isa<LoadInst>(I))
1482 ++NumMovedLoads;
1483 else if (isa<CallInst>(I))
1484 ++NumMovedCalls;
1485 ++NumHoisted;
1486}
1487
1488/// Only sink or hoist an instruction if it is not a trapping instruction,
1489/// or if the instruction is known not to trap when moved to the preheader.
1490/// or if it is a trapping instruction and is guaranteed to execute.
1492 Instruction &Inst, const DominatorTree *DT, const TargetLibraryInfo *TLI,
1493 const Loop *CurLoop, const LoopSafetyInfo *SafetyInfo,
1494 OptimizationRemarkEmitter *ORE, const Instruction *CtxI,
1495 AssumptionCache *AC, bool AllowSpeculation) {
1496 if (AllowSpeculation &&
1497 isSafeToSpeculativelyExecute(&Inst, CtxI, AC, DT, TLI))
1498 return true;
1499
1500 bool GuaranteedToExecute = SafetyInfo->isGuaranteedToExecute(Inst, DT);
1501
1502 if (!GuaranteedToExecute) {
1503 auto *LI = dyn_cast<LoadInst>(&Inst);
1504 if (LI && CurLoop->isLoopInvariant(LI->getPointerOperand()))
1505 ORE->emit([&]() {
1507 DEBUG_TYPE, "LoadWithLoopInvariantAddressCondExecuted", LI)
1508 << "failed to hoist load with loop-invariant address "
1509 "because load is conditionally executed";
1510 });
1511 }
1512
1513 return GuaranteedToExecute;
1514}
1515
1516namespace {
1517class LoopPromoter : public LoadAndStorePromoter {
1518 Value *SomePtr; // Designated pointer to store to.
1519 SmallVectorImpl<BasicBlock *> &LoopExitBlocks;
1520 SmallVectorImpl<BasicBlock::iterator> &LoopInsertPts;
1521 SmallVectorImpl<MemoryAccess *> &MSSAInsertPts;
1522 PredIteratorCache &PredCache;
1523 MemorySSAUpdater &MSSAU;
1524 LoopInfo &LI;
1525 DebugLoc DL;
1527 bool UnorderedAtomic;
1528 AAMDNodes AATags;
1529 ICFLoopSafetyInfo &SafetyInfo;
1530 bool CanInsertStoresInExitBlocks;
1532
1533 // We're about to add a use of V in a loop exit block. Insert an LCSSA phi
1534 // (if legal) if doing so would add an out-of-loop use to an instruction
1535 // defined in-loop.
1536 Value *maybeInsertLCSSAPHI(Value *V, BasicBlock *BB) const {
1537 if (!LI.wouldBeOutOfLoopUseRequiringLCSSA(V, BB))
1538 return V;
1539
1541 // We need to create an LCSSA PHI node for the incoming value and
1542 // store that.
1543 PHINode *PN = PHINode::Create(I->getType(), PredCache.size(BB),
1544 I->getName() + ".lcssa");
1545 PN->insertBefore(BB->begin());
1546 for (BasicBlock *Pred : PredCache.get(BB))
1547 PN->addIncoming(I, Pred);
1548 return PN;
1549 }
1550
1551public:
1552 LoopPromoter(Value *SP, ArrayRef<const Instruction *> Insts, SSAUpdater &S,
1553 SmallVectorImpl<BasicBlock *> &LEB,
1554 SmallVectorImpl<BasicBlock::iterator> &LIP,
1555 SmallVectorImpl<MemoryAccess *> &MSSAIP, PredIteratorCache &PIC,
1556 MemorySSAUpdater &MSSAU, LoopInfo &li, DebugLoc dl,
1557 Align Alignment, bool UnorderedAtomic, const AAMDNodes &AATags,
1558 ICFLoopSafetyInfo &SafetyInfo, bool CanInsertStoresInExitBlocks)
1559 : LoadAndStorePromoter(Insts, S), SomePtr(SP), LoopExitBlocks(LEB),
1560 LoopInsertPts(LIP), MSSAInsertPts(MSSAIP), PredCache(PIC), MSSAU(MSSAU),
1561 LI(li), DL(std::move(dl)), Alignment(Alignment),
1562 UnorderedAtomic(UnorderedAtomic), AATags(AATags),
1563 SafetyInfo(SafetyInfo),
1564 CanInsertStoresInExitBlocks(CanInsertStoresInExitBlocks), Uses(Insts) {}
1565
1566 void insertStoresInLoopExitBlocks() {
1567 // Insert stores after in the loop exit blocks. Each exit block gets a
1568 // store of the live-out values that feed them. Since we've already told
1569 // the SSA updater about the defs in the loop and the preheader
1570 // definition, it is all set and we can start using it.
1571 DIAssignID *NewID = nullptr;
1572 for (unsigned i = 0, e = LoopExitBlocks.size(); i != e; ++i) {
1573 BasicBlock *ExitBlock = LoopExitBlocks[i];
1574 Value *LiveInValue = SSA.GetValueInMiddleOfBlock(ExitBlock);
1575 LiveInValue = maybeInsertLCSSAPHI(LiveInValue, ExitBlock);
1576 Value *Ptr = maybeInsertLCSSAPHI(SomePtr, ExitBlock);
1577 BasicBlock::iterator InsertPos = LoopInsertPts[i];
1578 StoreInst *NewSI = new StoreInst(LiveInValue, Ptr, InsertPos);
1579 if (UnorderedAtomic)
1580 NewSI->setOrdering(AtomicOrdering::Unordered);
1581 NewSI->setAlignment(Alignment);
1582 NewSI->setDebugLoc(DL);
1583 // Attach DIAssignID metadata to the new store, generating it on the
1584 // first loop iteration.
1585 if (i == 0) {
1586 // NewSI will have its DIAssignID set here if there are any stores in
1587 // Uses with a DIAssignID attachment. This merged ID will then be
1588 // attached to the other inserted stores (in the branch below).
1589 NewSI->mergeDIAssignID(Uses);
1591 NewSI->getMetadata(LLVMContext::MD_DIAssignID));
1592 } else {
1593 // Attach the DIAssignID (or nullptr) merged from Uses in the branch
1594 // above.
1595 NewSI->setMetadata(LLVMContext::MD_DIAssignID, NewID);
1596 }
1597
1598 if (AATags)
1599 NewSI->setAAMetadata(AATags);
1600
1601 MemoryAccess *MSSAInsertPoint = MSSAInsertPts[i];
1602 MemoryAccess *NewMemAcc;
1603 if (!MSSAInsertPoint) {
1604 NewMemAcc = MSSAU.createMemoryAccessInBB(
1605 NewSI, nullptr, NewSI->getParent(), MemorySSA::Beginning);
1606 } else {
1607 NewMemAcc =
1608 MSSAU.createMemoryAccessAfter(NewSI, nullptr, MSSAInsertPoint);
1609 }
1610 MSSAInsertPts[i] = NewMemAcc;
1611 MSSAU.insertDef(cast<MemoryDef>(NewMemAcc), true);
1612 // FIXME: true for safety, false may still be correct.
1613 }
1614 }
1615
1616 void doExtraRewritesBeforeFinalDeletion() override {
1617 if (CanInsertStoresInExitBlocks)
1618 insertStoresInLoopExitBlocks();
1619 }
1620
1621 void instructionDeleted(Instruction *I) const override {
1622 SafetyInfo.removeInstruction(I);
1623 MSSAU.removeMemoryAccess(I);
1624 }
1625
1626 bool shouldDelete(Instruction *I) const override {
1627 if (isa<StoreInst>(I))
1628 return CanInsertStoresInExitBlocks;
1629 return true;
1630 }
1631};
1632
1633bool isNotCapturedBeforeOrInLoop(const Value *V, const Loop *L,
1634 DominatorTree *DT) {
1635 // We can perform the captured-before check against any instruction in the
1636 // loop header, as the loop header is reachable from any instruction inside
1637 // the loop.
1638 // TODO: ReturnCaptures=true shouldn't be necessary here.
1640 V, /*ReturnCaptures=*/true, L->getHeader()->getTerminator(), DT,
1641 /*IncludeI=*/false, CaptureComponents::Provenance));
1642}
1643
1644/// Return true if we can prove that a caller cannot inspect the object if an
1645/// unwind occurs inside the loop.
1646bool isNotVisibleOnUnwindInLoop(const Value *Object, const Loop *L,
1647 DominatorTree *DT) {
1648 bool RequiresNoCaptureBeforeUnwind;
1649 if (!isNotVisibleOnUnwind(Object, RequiresNoCaptureBeforeUnwind))
1650 return false;
1651
1652 return !RequiresNoCaptureBeforeUnwind ||
1653 isNotCapturedBeforeOrInLoop(Object, L, DT);
1654}
1655
1656bool isThreadLocalObject(const Value *Object, const Loop *L,
1657 DominatorTree *DT) {
1658 // The object must be function-local to start with, and then not captured
1659 // before/in the loop.
1660 if (isIdentifiedFunctionLocal(Object) &&
1661 isNotCapturedBeforeOrInLoop(Object, L, DT))
1662 return true;
1663
1664 // In a single-threaded environment, all objects are effectively thread-local.
1665 const Module *M = L->getHeader()->getModule();
1666 return M->getThreadModel() == ThreadModel::Single;
1667}
1668
1669} // namespace
1670
1671/// Try to promote memory values to scalars by sinking stores out of the
1672/// loop and moving loads to before the loop. We do this by looping over
1673/// the stores in the loop, looking for stores to Must pointers which are
1674/// loop invariant.
1675///
1677 const SmallSetVector<Value *, 8> &PointerMustAliases,
1682 const TargetLibraryInfo *TLI, TargetTransformInfo *TTI, Loop *CurLoop,
1683 MemorySSAUpdater &MSSAU, ICFLoopSafetyInfo *SafetyInfo,
1684 OptimizationRemarkEmitter *ORE, bool AllowSpeculation,
1685 bool HasReadsOutsideSet) {
1686 // Verify inputs.
1687 assert(LI != nullptr && DT != nullptr && CurLoop != nullptr &&
1688 SafetyInfo != nullptr &&
1689 "Unexpected Input to promoteLoopAccessesToScalars");
1690
1691 LLVM_DEBUG({
1692 dbgs() << "Trying to promote set of must-aliased pointers:\n";
1693 for (Value *Ptr : PointerMustAliases)
1694 dbgs() << " " << *Ptr << "\n";
1695 });
1696 ++NumPromotionCandidates;
1697
1698 Value *SomePtr = *PointerMustAliases.begin();
1699 BasicBlock *Preheader = CurLoop->getLoopPreheader();
1700
1701 // It is not safe to promote a load/store from the loop if the load/store is
1702 // conditional. For example, turning:
1703 //
1704 // for () { if (c) *P += 1; }
1705 //
1706 // into:
1707 //
1708 // tmp = *P; for () { if (c) tmp +=1; } *P = tmp;
1709 //
1710 // is not safe, because *P may only be valid to access if 'c' is true.
1711 //
1712 // The safety property divides into two parts:
1713 // p1) The memory may not be dereferenceable on entry to the loop. In this
1714 // case, we can't insert the required load in the preheader.
1715 // p2) The memory model does not allow us to insert a store along any dynamic
1716 // path which did not originally have one.
1717 //
1718 // If at least one store is guaranteed to execute, both properties are
1719 // satisfied, and promotion is legal.
1720 //
1721 // This, however, is not a necessary condition. Even if no store/load is
1722 // guaranteed to execute, we can still establish these properties.
1723 // We can establish (p1) by proving that hoisting the load into the preheader
1724 // is safe (i.e. proving dereferenceability on all paths through the loop). We
1725 // can use any access within the alias set to prove dereferenceability,
1726 // since they're all must alias.
1727 //
1728 // There are two ways establish (p2):
1729 // a) Prove the location is thread-local. In this case the memory model
1730 // requirement does not apply, and stores are safe to insert.
1731 // b) Prove a store dominates every exit block. In this case, if an exit
1732 // blocks is reached, the original dynamic path would have taken us through
1733 // the store, so inserting a store into the exit block is safe. Note that this
1734 // is different from the store being guaranteed to execute. For instance,
1735 // if an exception is thrown on the first iteration of the loop, the original
1736 // store is never executed, but the exit blocks are not executed either.
1737
1738 bool DereferenceableInPH = false;
1739 bool StoreIsGuaranteedToExecute = false;
1740 bool LoadIsGuaranteedToExecute = false;
1741 bool FoundLoadToPromote = false;
1742
1743 // Goes from Unknown to either Safe or Unsafe, but can't switch between them.
1744 enum {
1745 StoreSafe,
1746 StoreUnsafe,
1747 StoreSafetyUnknown,
1748 } StoreSafety = StoreSafetyUnknown;
1749
1751
1752 // We start with an alignment of one and try to find instructions that allow
1753 // us to prove better alignment.
1754 Align Alignment;
1755 // Keep track of which types of access we see
1756 bool SawUnorderedAtomic = false;
1757 bool SawNotAtomic = false;
1758 AAMDNodes AATags;
1759
1760 const DataLayout &MDL = Preheader->getDataLayout();
1761
1762 // If there are reads outside the promoted set, then promoting stores is
1763 // definitely not safe.
1764 if (HasReadsOutsideSet)
1765 StoreSafety = StoreUnsafe;
1766
1767 if (StoreSafety == StoreSafetyUnknown && SafetyInfo->anyBlockMayThrow()) {
1768 // If a loop can throw, we have to insert a store along each unwind edge.
1769 // That said, we can't actually make the unwind edge explicit. Therefore,
1770 // we have to prove that the store is dead along the unwind edge. We do
1771 // this by proving that the caller can't have a reference to the object
1772 // after return and thus can't possibly load from the object.
1773 Value *Object = getUnderlyingObject(SomePtr);
1774 if (!isNotVisibleOnUnwindInLoop(Object, CurLoop, DT))
1775 StoreSafety = StoreUnsafe;
1776 }
1777
1778 // Check that all accesses to pointers in the alias set use the same type.
1779 // We cannot (yet) promote a memory location that is loaded and stored in
1780 // different sizes. While we are at it, collect alignment and AA info.
1781 Type *AccessTy = nullptr;
1782 for (Value *ASIV : PointerMustAliases) {
1783 for (Use &U : ASIV->uses()) {
1784 // Ignore instructions that are outside the loop.
1785 Instruction *UI = dyn_cast<Instruction>(U.getUser());
1786 if (!UI || !CurLoop->contains(UI))
1787 continue;
1788
1789 // If there is an non-load/store instruction in the loop, we can't promote
1790 // it.
1791 if (LoadInst *Load = dyn_cast<LoadInst>(UI)) {
1792 if (!Load->isUnordered())
1793 return false;
1794
1795 SawUnorderedAtomic |= Load->isAtomic();
1796 SawNotAtomic |= !Load->isAtomic();
1797 FoundLoadToPromote = true;
1798
1799 Align InstAlignment = Load->getAlign();
1800
1801 if (!LoadIsGuaranteedToExecute)
1802 LoadIsGuaranteedToExecute =
1803 SafetyInfo->isGuaranteedToExecute(*UI, DT);
1804
1805 // Note that proving a load safe to speculate requires proving
1806 // sufficient alignment at the target location. Proving it guaranteed
1807 // to execute does as well. Thus we can increase our guaranteed
1808 // alignment as well.
1809 if (!DereferenceableInPH || (InstAlignment > Alignment))
1811 *Load, DT, TLI, CurLoop, SafetyInfo, ORE,
1812 Preheader->getTerminator(), AC, AllowSpeculation)) {
1813 DereferenceableInPH = true;
1814 Alignment = std::max(Alignment, InstAlignment);
1815 }
1816 } else if (const StoreInst *Store = dyn_cast<StoreInst>(UI)) {
1817 // Stores *of* the pointer are not interesting, only stores *to* the
1818 // pointer.
1819 if (U.getOperandNo() != StoreInst::getPointerOperandIndex())
1820 continue;
1821 if (!Store->isUnordered())
1822 return false;
1823
1824 SawUnorderedAtomic |= Store->isAtomic();
1825 SawNotAtomic |= !Store->isAtomic();
1826
1827 // If the store is guaranteed to execute, both properties are satisfied.
1828 // We may want to check if a store is guaranteed to execute even if we
1829 // already know that promotion is safe, since it may have higher
1830 // alignment than any other guaranteed stores, in which case we can
1831 // raise the alignment on the promoted store.
1832 Align InstAlignment = Store->getAlign();
1833 bool GuaranteedToExecute = SafetyInfo->isGuaranteedToExecute(*UI, DT);
1834 StoreIsGuaranteedToExecute |= GuaranteedToExecute;
1835 if (GuaranteedToExecute) {
1836 DereferenceableInPH = true;
1837 if (StoreSafety == StoreSafetyUnknown)
1838 StoreSafety = StoreSafe;
1839 Alignment = std::max(Alignment, InstAlignment);
1840 }
1841
1842 // If a store dominates all exit blocks, it is safe to sink.
1843 // As explained above, if an exit block was executed, a dominating
1844 // store must have been executed at least once, so we are not
1845 // introducing stores on paths that did not have them.
1846 // Note that this only looks at explicit exit blocks. If we ever
1847 // start sinking stores into unwind edges (see above), this will break.
1848 if (StoreSafety == StoreSafetyUnknown &&
1849 llvm::all_of(ExitBlocks, [&](BasicBlock *Exit) {
1850 return DT->dominates(Store->getParent(), Exit);
1851 }))
1852 StoreSafety = StoreSafe;
1853
1854 // If the store is not guaranteed to execute, we may still get
1855 // deref info through it.
1856 if (!DereferenceableInPH) {
1857 DereferenceableInPH = isDereferenceableAndAlignedPointer(
1858 Store->getPointerOperand(), Store->getValueOperand()->getType(),
1859 Store->getAlign(),
1860 SimplifyQuery(MDL, TLI, DT, AC, Preheader->getTerminator()));
1861 }
1862 } else
1863 continue; // Not a load or store.
1864
1865 if (!AccessTy)
1866 AccessTy = getLoadStoreType(UI);
1867 else if (AccessTy != getLoadStoreType(UI))
1868 return false;
1869
1870 // Merge the AA tags.
1871 if (LoopUses.empty()) {
1872 // On the first load/store, just take its AA tags.
1873 AATags = UI->getAAMetadata();
1874 } else if (AATags) {
1875 AATags = AATags.merge(UI->getAAMetadata());
1876 }
1877
1878 LoopUses.push_back(UI);
1879 }
1880 }
1881
1882 // If we found both an unordered atomic instruction and a non-atomic memory
1883 // access, bail. We can't blindly promote non-atomic to atomic since we
1884 // might not be able to lower the result. We can't downgrade since that
1885 // would violate memory model. Also, align 0 is an error for atomics.
1886 if (SawUnorderedAtomic && SawNotAtomic)
1887 return false;
1888
1889 // If we're inserting an atomic load in the preheader, we must be able to
1890 // lower it. We're only guaranteed to be able to lower naturally aligned
1891 // atomics.
1892 if (SawUnorderedAtomic && Alignment < MDL.getTypeStoreSize(AccessTy))
1893 return false;
1894
1895 // If we couldn't prove we can hoist the load, bail.
1896 if (!DereferenceableInPH) {
1897 LLVM_DEBUG(dbgs() << "Not promoting: Not dereferenceable in preheader\n");
1898 return false;
1899 }
1900
1901 // We know we can hoist the load, but don't have a guaranteed store.
1902 // Check whether the location is writable and thread-local. If it is, then we
1903 // can insert stores along paths which originally didn't have them without
1904 // violating the memory model.
1905 if (StoreSafety == StoreSafetyUnknown) {
1906 Value *Object = getUnderlyingObject(SomePtr);
1907 bool ExplicitlyDereferenceableOnly;
1908 // The dereferenceability query here is only required to satisfy the
1909 // writable contract, actual dereferenceability has already been proven
1910 // above. As such, we can ignore frees.
1911 if (isWritableObject(Object, ExplicitlyDereferenceableOnly) &&
1912 (!ExplicitlyDereferenceableOnly ||
1913 isDereferenceablePointer(SomePtr, AccessTy, MDL,
1914 /*IgnoreFree=*/true)) &&
1915 isThreadLocalObject(Object, CurLoop, DT))
1916 StoreSafety = StoreSafe;
1917 }
1918
1919 // If we've still failed to prove we can sink the store, hoist the load
1920 // only, if possible.
1921 if (StoreSafety != StoreSafe && !FoundLoadToPromote)
1922 // If we cannot hoist the load either, give up.
1923 return false;
1924
1925 // Lets do the promotion!
1926 if (StoreSafety == StoreSafe) {
1927 LLVM_DEBUG(dbgs() << "LICM: Promoting load/store of the value: " << *SomePtr
1928 << '\n');
1929 ++NumLoadStorePromoted;
1930 } else {
1931 LLVM_DEBUG(dbgs() << "LICM: Promoting load of the value: " << *SomePtr
1932 << '\n');
1933 ++NumLoadPromoted;
1934 }
1935
1936 ORE->emit([&]() {
1937 return OptimizationRemark(DEBUG_TYPE, "PromoteLoopAccessesToScalar",
1938 LoopUses[0])
1939 << "Moving accesses to memory location out of the loop";
1940 });
1941
1942 // Look at all the loop uses, and try to merge their locations.
1943 std::vector<DebugLoc> LoopUsesLocs;
1944 for (auto U : LoopUses)
1945 LoopUsesLocs.push_back(U->getDebugLoc());
1946 auto DL = DebugLoc::getMergedLocations(LoopUsesLocs);
1947
1948 // We use the SSAUpdater interface to insert phi nodes as required.
1950 SSAUpdater SSA(&NewPHIs);
1951 LoopPromoter Promoter(SomePtr, LoopUses, SSA, ExitBlocks, InsertPts,
1952 MSSAInsertPts, PIC, MSSAU, *LI, DL, Alignment,
1953 SawUnorderedAtomic,
1954 StoreIsGuaranteedToExecute ? AATags : AAMDNodes(),
1955 *SafetyInfo, StoreSafety == StoreSafe);
1956
1957 // Set up the preheader to have a definition of the value. It is the live-out
1958 // value from the preheader that uses in the loop will use.
1959 LoadInst *PreheaderLoad = nullptr;
1960 if (FoundLoadToPromote || !StoreIsGuaranteedToExecute) {
1961 PreheaderLoad =
1962 new LoadInst(AccessTy, SomePtr, SomePtr->getName() + ".promoted",
1963 Preheader->getTerminator()->getIterator());
1964 if (SawUnorderedAtomic)
1965 PreheaderLoad->setOrdering(AtomicOrdering::Unordered);
1966 PreheaderLoad->setAlignment(Alignment);
1967 PreheaderLoad->setDebugLoc(DebugLoc::getDropped());
1968 if (AATags && LoadIsGuaranteedToExecute)
1969 PreheaderLoad->setAAMetadata(AATags);
1970
1971 MemoryAccess *PreheaderLoadMemoryAccess = MSSAU.createMemoryAccessInBB(
1972 PreheaderLoad, nullptr, PreheaderLoad->getParent(), MemorySSA::End);
1973 MemoryUse *NewMemUse = cast<MemoryUse>(PreheaderLoadMemoryAccess);
1974 MSSAU.insertUse(NewMemUse, /*RenameUses=*/true);
1975 SSA.AddAvailableValue(Preheader, PreheaderLoad);
1976 } else {
1977 SSA.AddAvailableValue(Preheader, PoisonValue::get(AccessTy));
1978 }
1979
1980 if (VerifyMemorySSA)
1981 MSSAU.getMemorySSA()->verifyMemorySSA();
1982 // Rewrite all the loads in the loop and remember all the definitions from
1983 // stores in the loop.
1984 Promoter.run(LoopUses);
1985
1986 if (VerifyMemorySSA)
1987 MSSAU.getMemorySSA()->verifyMemorySSA();
1988 // If the SSAUpdater didn't use the load in the preheader, just zap it now.
1989 if (PreheaderLoad && PreheaderLoad->use_empty())
1990 eraseInstruction(*PreheaderLoad, *SafetyInfo, MSSAU);
1991
1992 return true;
1993}
1994
1995static void foreachMemoryAccess(MemorySSA *MSSA, Loop *L,
1996 function_ref<void(Instruction *)> Fn) {
1997 for (const BasicBlock *BB : L->blocks())
1998 if (const auto *Accesses = MSSA->getBlockAccesses(BB))
1999 for (const auto &Access : *Accesses)
2000 if (const auto *MUD = dyn_cast<MemoryUseOrDef>(&Access))
2001 Fn(MUD->getMemoryInst());
2002}
2003
2004/// Returns whether \p I is a memory access that may be a candidate for
2005/// promotion out of the loop \p L.
2006static bool isPotentiallyPromotable(const Instruction *I, const Loop *L) {
2007 if (const auto *SI = dyn_cast<StoreInst>(I)) {
2008 const Value *PtrOp = SI->getPointerOperand();
2009 if (isStrongerThanMonotonic(SI->getOrdering()))
2010 return false;
2011 return !isa<ConstantData>(PtrOp) && L->isLoopInvariant(PtrOp);
2012 }
2013 if (const auto *LI = dyn_cast<LoadInst>(I)) {
2014 const Value *PtrOp = LI->getPointerOperand();
2015 if (isStrongerThanMonotonic(LI->getOrdering()))
2016 return false;
2017 return !isa<ConstantData>(PtrOp) && L->isLoopInvariant(PtrOp);
2018 }
2019 return false;
2020}
2021
2022/// Returns whether \p N has any operand from the set \p Operands.
2023static bool
2026 return N && llvm::any_of(N->operands(), [&](const MDOperand &Op) {
2027 return Operands.contains(cast<MDNode>(Op.get()));
2028 });
2029}
2030
2031/// Returns the potentially promotable stores with AA tags that are valid along
2032/// all non-unwinding execution paths of the loop \p L, which allows for the AA
2033/// tags to be used when deciding promotions.
2035 MemorySSA *MSSA, DominatorTree *DT,
2036 const SmallPtrSetImpl<const MDNode *> &LoopLocalAliasScopes, Loop *L) {
2038 StoresByLoc;
2039 foreachMemoryAccess(MSSA, L, [&](Instruction *I) {
2040 const auto *SI = dyn_cast<StoreInst>(I);
2041 if (SI && SI->getAAMetadata() && isPotentiallyPromotable(SI, L))
2042 StoresByLoc[MemoryLocation::get(SI)].push_back(SI);
2043 });
2044
2045 // This only looks at explicit exiting blocks. If we ever start sinking
2046 // stores into unwind edges, this will break.
2047 SmallVector<BasicBlock *, 4> ExitingBlocks;
2048 L->getExitingBlocks(ExitingBlocks);
2049
2050 SmallPtrSet<const StoreInst *, 8> StoresWithInvariantAATags;
2051 for (const auto &Pair : StoresByLoc) {
2052 const MemoryLocation &Loc = Pair.first;
2053 const SmallVector<const StoreInst *, 1> &Stores = Pair.second;
2054
2055 // A scope declared inside the loop denotes a different scope on each
2056 // iteration, and thus should not be preserved.
2057 if (hasAnyMDOperandsFrom(Loc.AATags.Scope, LoopLocalAliasScopes) ||
2058 hasAnyMDOperandsFrom(Loc.AATags.NoAlias, LoopLocalAliasScopes))
2059 continue;
2060
2061 // Without exiting blocks the loop is never left, and promotion has no
2062 // exit block to insert a store into either.
2063 if (llvm::all_of(ExitingBlocks, [&](BasicBlock *ExitingBB) {
2064 return llvm::any_of(Stores, [&](const StoreInst *SI) {
2065 return DT->dominates(SI->getParent(), ExitingBB);
2066 });
2067 }))
2068 StoresWithInvariantAATags.insert_range(Stores);
2069 }
2070 return StoresWithInvariantAATags;
2071}
2072
2073// The bool indicates whether there might be reads outside the set, in which
2074// case only loads may be promoted.
2077 ICFLoopSafetyInfo *SafetyInfo,
2078 const SmallPtrSetImpl<const MDNode *> &LoopLocalAliasScopes, Loop *L) {
2079 BatchAAResults BatchAA(*AA);
2080 AliasSetTracker AST(BatchAA);
2081
2082 // Only conditionally executed stores need this, so compute it on demand to
2083 // keep the common case free.
2084 std::optional<SmallPtrSet<const StoreInst *, 8>> StoresWithInvariantAATags;
2085 auto HasInvariantAATags = [&](const StoreInst *SI) {
2086 if (!StoresWithInvariantAATags)
2087 StoresWithInvariantAATags =
2088 collectStoresWithInvariantAATags(MSSA, DT, LoopLocalAliasScopes, L);
2089 return StoresWithInvariantAATags->contains(SI);
2090 };
2091
2092 // Populate AST with potentially promotable accesses.
2093 SmallPtrSet<Value *, 16> AttemptingPromotion;
2094 foreachMemoryAccess(MSSA, L, [&](Instruction *I) {
2095 if (isPotentiallyPromotable(I, L)) {
2096 AttemptingPromotion.insert(I);
2098 SI && SI->getAAMetadata() &&
2099 !SafetyInfo->isGuaranteedToExecute(*SI, DT) &&
2100 !HasInvariantAATags(SI)) {
2101 // Promotion requires inserting a new store at the loop exits; we need
2102 // to prove that store doesn't alias anything, in addition to proving
2103 // aliasing for the stores we're removing. The new store is executed
2104 // unconditionally, so when we're proving aliasing for that store, we
2105 // can only rely on AA tags that likewise hold unconditionally.
2106 AST.addWithoutAATags(SI);
2107 } else {
2108 AST.add(I);
2109 }
2110 }
2111 });
2112
2113 // We're only interested in must-alias sets that contain a mod.
2115 for (AliasSet &AS : AST)
2116 if (!AS.isForwardingAliasSet() && AS.isMod() && AS.isMustAlias())
2117 Sets.push_back({&AS, false});
2118
2119 if (Sets.empty())
2120 return {}; // Nothing to promote...
2121
2122 // Discard any sets for which there is an aliasing non-promotable access.
2123 foreachMemoryAccess(MSSA, L, [&](Instruction *I) {
2124 if (AttemptingPromotion.contains(I))
2125 return;
2126
2128 ModRefInfo MR = Pair.getPointer()->aliasesUnknownInst(I, BatchAA);
2129 // Cannot promote if there are writes outside the set.
2130 if (isModSet(MR))
2131 return true;
2132 if (isRefSet(MR)) {
2133 // Remember reads outside the set.
2134 Pair.setInt(true);
2135 // If this is a mod-only set and there are reads outside the set,
2136 // we will not be able to promote, so bail out early.
2137 return !Pair.getPointer()->isRef();
2138 }
2139 return false;
2140 });
2141 });
2142
2144 for (auto [Set, HasReadsOutsideSet] : Sets) {
2145 SmallSetVector<Value *, 8> PointerMustAliases;
2146 for (const auto &MemLoc : *Set)
2147 PointerMustAliases.insert(const_cast<Value *>(MemLoc.Ptr));
2148 Result.emplace_back(std::move(PointerMustAliases), HasReadsOutsideSet);
2149 }
2150
2151 return Result;
2152}
2153
2154// For a given store instruction or writeonly call instruction, this function
2155// checks that there are no read or writes that conflict with the memory
2156// access in the instruction
2158 AAResults *AA, Loop *CurLoop,
2159 SinkAndHoistLICMFlags &Flags) {
2161 // If there are more accesses than the Promotion cap, then give up as we're
2162 // not walking a list that long.
2163 if (Flags.tooManyMemoryAccesses())
2164 return false;
2165
2166 auto *IMD = MSSA->getMemoryAccess(I);
2167 BatchAAResults BAA(*AA);
2168 auto *Source = getClobberingMemoryAccess(*MSSA, BAA, Flags, IMD);
2169 // Make sure there are no clobbers inside the loop.
2170 if (!MSSA->isLiveOnEntryDef(Source) && CurLoop->contains(Source->getBlock()))
2171 return false;
2172
2173 // If there are interfering Uses don't move this store.
2174 // TODO: Cache set of Uses on the first walk in runOnLoop, update when
2175 // moving accesses. Can also extend to dominating uses.
2176 for (auto *BB : CurLoop->getBlocks()) {
2177 auto *Accesses = MSSA->getBlockAccesses(BB);
2178 if (!Accesses)
2179 continue;
2180 for (const auto &MA : *Accesses) {
2181 // Accesses are ordered. If we find one that I dominates we can stop.
2182 if (!Flags.getIsSink() && MSSA->dominates(IMD, &MA))
2183 break;
2184
2185 if (const auto *MemUseOrDef = dyn_cast<MemoryUseOrDef>(&MA)) {
2186 // Skip unrelated accesses.
2187 if (isNoModRef(BAA.getModRefInfo(MemUseOrDef->getMemoryInst(), I)))
2188 continue;
2189
2190 return false;
2191 }
2192 }
2193 }
2194 return true;
2195}
2196
2198 Loop *CurLoop, Instruction &I,
2199 SinkAndHoistLICMFlags &Flags,
2200 bool InvariantGroup) {
2201 // For hoisting, use the walker to determine safety
2202 if (!Flags.getIsSink()) {
2203 // If hoisting an invariant group, we only need to check that there
2204 // is no store to the loaded pointer between the start of the loop,
2205 // and the load (since all values must be the same).
2206
2207 // This can be checked in two conditions:
2208 // 1) if the memoryaccess is outside the loop
2209 // 2) the earliest access is at the loop header,
2210 // if the memory loaded is the phi node
2211
2212 BatchAAResults BAA(MSSA->getAA());
2213 MemoryAccess *Source = getClobberingMemoryAccess(*MSSA, BAA, Flags, MU);
2214 return !MSSA->isLiveOnEntryDef(Source) &&
2215 CurLoop->contains(Source->getBlock()) &&
2216 !(InvariantGroup && Source->getBlock() == CurLoop->getHeader() && isa<MemoryPhi>(Source));
2217 }
2218
2219 // For sinking, we'd need to check all Defs below this use. The getClobbering
2220 // call will look on the backedge of the loop, but will check aliasing with
2221 // the instructions on the previous iteration.
2222 // For example:
2223 // for (i ... )
2224 // load a[i] ( Use (LoE)
2225 // store a[i] ( 1 = Def (2), with 2 = Phi for the loop.
2226 // i++;
2227 // The load sees no clobbering inside the loop, as the backedge alias check
2228 // does phi translation, and will check aliasing against store a[i-1].
2229 // However sinking the load outside the loop, below the store is incorrect.
2230
2231 // For now, only sink if there are no Defs in the loop, and the existing ones
2232 // precede the use and are in the same block.
2233 // FIXME: Increase precision: Safe to sink if Use post dominates the Def;
2234 // needs PostDominatorTreeAnalysis.
2235 // FIXME: More precise: no Defs that alias this Use.
2236 if (Flags.tooManyMemoryAccesses())
2237 return true;
2238 for (auto *BB : CurLoop->getBlocks())
2239 if (pointerInvalidatedByBlock(*BB, *MSSA, *MU))
2240 return true;
2241 // When sinking, the source block may not be part of the loop so check it.
2242 if (!CurLoop->contains(&I))
2243 return pointerInvalidatedByBlock(*I.getParent(), *MSSA, *MU);
2244
2245 return false;
2246}
2247
2249 if (const auto *Accesses = MSSA.getBlockDefs(&BB))
2250 for (const auto &MA : *Accesses)
2251 if (const auto *MD = dyn_cast<MemoryDef>(&MA))
2252 if (MU.getBlock() != MD->getBlock() || !MSSA.locallyDominates(MD, &MU))
2253 return true;
2254 return false;
2255}
2256
2257/// Try to simplify things like (A < INV_1 AND icmp A < INV_2) into (A <
2258/// min(INV_1, INV_2)), if INV_1 and INV_2 are both loop invariants and their
2259/// minimun can be computed outside of loop, and X is not a loop-invariant.
2260static bool hoistMinMax(Instruction &I, Loop &L, ICFLoopSafetyInfo &SafetyInfo,
2261 MemorySSAUpdater &MSSAU) {
2262 bool Inverse = false;
2263 using namespace PatternMatch;
2264 Value *Cond1, *Cond2;
2265 if (match(&I, m_LogicalOr(m_Value(Cond1), m_Value(Cond2)))) {
2266 Inverse = true;
2267 } else if (match(&I, m_LogicalAnd(m_Value(Cond1), m_Value(Cond2)))) {
2268 // Do nothing
2269 } else
2270 return false;
2271
2272 auto MatchICmpAgainstInvariant = [&](Value *C, CmpPredicate &P, Value *&LHS,
2273 Value *&RHS) {
2274 if (!match(C, m_OneUse(m_ICmp(P, m_Value(LHS), m_Value(RHS)))))
2275 return false;
2276 if (!LHS->getType()->isIntegerTy())
2277 return false;
2279 return false;
2280 if (L.isLoopInvariant(LHS)) {
2281 std::swap(LHS, RHS);
2283 }
2284 if (L.isLoopInvariant(LHS) || !L.isLoopInvariant(RHS))
2285 return false;
2286 if (Inverse)
2288 return true;
2289 };
2290 CmpPredicate P1, P2;
2291 Value *LHS1, *LHS2, *RHS1, *RHS2;
2292 if (!MatchICmpAgainstInvariant(Cond1, P1, LHS1, RHS1) ||
2293 !MatchICmpAgainstInvariant(Cond2, P2, LHS2, RHS2))
2294 return false;
2295 auto MatchingPred = CmpPredicate::getMatching(P1, P2);
2296 if (!MatchingPred || LHS1 != LHS2)
2297 return false;
2298
2299 // Everything is fine, we can do the transform.
2300 bool UseMin = ICmpInst::isLT(*MatchingPred) || ICmpInst::isLE(*MatchingPred);
2301 assert(
2302 (UseMin || ICmpInst::isGT(*MatchingPred) ||
2303 ICmpInst::isGE(*MatchingPred)) &&
2304 "Relational predicate is either less (or equal) or greater (or equal)!");
2305 Intrinsic::ID id = ICmpInst::isSigned(*MatchingPred)
2306 ? (UseMin ? Intrinsic::smin : Intrinsic::smax)
2307 : (UseMin ? Intrinsic::umin : Intrinsic::umax);
2308 auto *Preheader = L.getLoopPreheader();
2309 assert(Preheader && "Loop is not in simplify form?");
2310 IRBuilder<> Builder(Preheader->getTerminator());
2311 // We are about to create a new guaranteed use for RHS2 which might not exist
2312 // before (if it was a non-taken input of logical and/or instruction). If it
2313 // was poison, we need to freeze it. Note that no new use for LHS and RHS1 are
2314 // introduced, so they don't need this.
2315 if (isa<SelectInst>(I))
2316 RHS2 = Builder.CreateFreeze(RHS2, RHS2->getName() + ".fr");
2317 Value *NewRHS = Builder.CreateBinaryIntrinsic(
2318 id, RHS1, RHS2, nullptr,
2319 StringRef("invariant.") +
2320 (ICmpInst::isSigned(*MatchingPred) ? "s" : "u") +
2321 (UseMin ? "min" : "max"));
2322 Builder.SetInsertPoint(&I);
2323 ICmpInst::Predicate P = *MatchingPred;
2324 if (Inverse)
2326 Value *NewCond = Builder.CreateICmp(P, LHS1, NewRHS);
2327 NewCond->takeName(&I);
2328 I.replaceAllUsesWith(NewCond);
2329 eraseInstruction(I, SafetyInfo, MSSAU);
2330 Instruction &CondI1 = *cast<Instruction>(Cond1);
2331 Instruction &CondI2 = *cast<Instruction>(Cond2);
2332 salvageDebugInfo(CondI1);
2333 salvageDebugInfo(CondI2);
2334 eraseInstruction(CondI1, SafetyInfo, MSSAU);
2335 eraseInstruction(CondI2, SafetyInfo, MSSAU);
2336 return true;
2337}
2338
2339/// Reassociate gep (gep ptr, idx1), idx2 to gep (gep ptr, idx2), idx1 if
2340/// this allows hoisting the inner GEP.
2341static bool hoistGEP(Instruction &I, Loop &L, ICFLoopSafetyInfo &SafetyInfo,
2343 DominatorTree *DT) {
2345 if (!GEP)
2346 return false;
2347
2348 // Do not try to hoist a constant GEP out of the loop via reassociation.
2349 // Constant GEPs can often be folded into addressing modes, and reassociating
2350 // them may inhibit CSE of a common base.
2351 if (GEP->hasAllConstantIndices())
2352 return false;
2353
2354 auto *Src = dyn_cast<GetElementPtrInst>(GEP->getPointerOperand());
2355 if (!Src || !Src->hasOneUse() || !L.contains(Src))
2356 return false;
2357
2358 Value *SrcPtr = Src->getPointerOperand();
2359 auto LoopInvariant = [&](Value *V) { return L.isLoopInvariant(V); };
2360 if (!L.isLoopInvariant(SrcPtr) || !all_of(GEP->indices(), LoopInvariant))
2361 return false;
2362
2363 // This can only happen if !AllowSpeculation, otherwise this would already be
2364 // handled.
2365 // FIXME: Should we respect AllowSpeculation in these reassociation folds?
2366 // The flag exists to prevent metadata dropping, which is not relevant here.
2367 if (all_of(Src->indices(), LoopInvariant))
2368 return false;
2369
2370 // The swapped GEPs are inbounds if both original GEPs are inbounds
2371 // and the sign of the offsets is the same. For simplicity, only
2372 // handle both offsets being non-negative.
2373 const DataLayout &DL = GEP->getDataLayout();
2374 auto NonNegative = [&](Value *V) {
2375 return isKnownNonNegative(V, SimplifyQuery(DL, DT, AC, GEP));
2376 };
2377 bool IsInBounds = Src->isInBounds() && GEP->isInBounds() &&
2378 all_of(Src->indices(), NonNegative) &&
2379 all_of(GEP->indices(), NonNegative);
2380
2381 BasicBlock *Preheader = L.getLoopPreheader();
2382 IRBuilder<> Builder(Preheader->getTerminator());
2383 Value *NewSrc = Builder.CreateGEP(GEP->getSourceElementType(), SrcPtr,
2384 SmallVector<Value *>(GEP->indices()),
2385 "invariant.gep", IsInBounds);
2386 Builder.SetInsertPoint(GEP);
2387 Value *NewGEP = Builder.CreateGEP(Src->getSourceElementType(), NewSrc,
2388 SmallVector<Value *>(Src->indices()), "gep",
2389 IsInBounds);
2390 GEP->replaceAllUsesWith(NewGEP);
2391 eraseInstruction(*GEP, SafetyInfo, MSSAU);
2392 salvageDebugInfo(*Src);
2393 eraseInstruction(*Src, SafetyInfo, MSSAU);
2394 return true;
2395}
2396
2397/// Try to turn things like "LV + C1 < C2" into "LV < C2 - C1". Here
2398/// C1 and C2 are loop invariants and LV is a loop-variant.
2399static bool hoistAdd(ICmpInst::Predicate Pred, Value *VariantLHS,
2400 Value *InvariantRHS, ICmpInst &ICmp, Loop &L,
2401 ICFLoopSafetyInfo &SafetyInfo, MemorySSAUpdater &MSSAU,
2402 AssumptionCache *AC, DominatorTree *DT) {
2403 assert(!L.isLoopInvariant(VariantLHS) && "Precondition.");
2404 assert(L.isLoopInvariant(InvariantRHS) && "Precondition.");
2405
2406 bool IsSigned = ICmpInst::isSigned(Pred);
2407
2408 // Try to represent VariantLHS as sum of invariant and variant operands.
2409 using namespace PatternMatch;
2410 Value *VariantOp, *InvariantOp;
2411 if (IsSigned && !match(VariantLHS, m_NSWAddLike(m_Value(VariantOp),
2412 m_Value(InvariantOp))))
2413 return false;
2414 if (!IsSigned && !match(VariantLHS, m_NUWAddLike(m_Value(VariantOp),
2415 m_Value(InvariantOp))))
2416 return false;
2417
2418 // LHS itself is a loop-variant, try to represent it in the form:
2419 // "VariantOp + InvariantOp". If it is possible, then we can reassociate.
2420 if (L.isLoopInvariant(VariantOp))
2421 std::swap(VariantOp, InvariantOp);
2422 if (L.isLoopInvariant(VariantOp) || !L.isLoopInvariant(InvariantOp))
2423 return false;
2424
2425 // In order to turn "LV + C1 < C2" into "LV < C2 - C1", we need to be able to
2426 // freely move values from left side of inequality to right side (just as in
2427 // normal linear arithmetics). Overflows make things much more complicated, so
2428 // we want to avoid this.
2429 auto &DL = L.getHeader()->getDataLayout();
2430 SimplifyQuery SQ(DL, DT, AC, &ICmp);
2431 if (IsSigned && computeOverflowForSignedSub(InvariantRHS, InvariantOp, SQ) !=
2433 return false;
2434 if (!IsSigned &&
2435 computeOverflowForUnsignedSub(InvariantRHS, InvariantOp, SQ) !=
2437 return false;
2438 auto *Preheader = L.getLoopPreheader();
2439 assert(Preheader && "Loop is not in simplify form?");
2440 IRBuilder<> Builder(Preheader->getTerminator());
2441 Value *NewCmpOp =
2442 Builder.CreateSub(InvariantRHS, InvariantOp, "invariant.op",
2443 /*HasNUW*/ !IsSigned, /*HasNSW*/ IsSigned);
2444 ICmp.setPredicate(Pred);
2445 ICmp.setOperand(0, VariantOp);
2446 ICmp.setOperand(1, NewCmpOp);
2447 // The new LHS is a different value, so a samesign (or any other
2448 // poison-generating) flag asserted about the old operands may no longer hold.
2450
2451 Instruction &DeadI = cast<Instruction>(*VariantLHS);
2452 salvageDebugInfo(DeadI);
2453 eraseInstruction(DeadI, SafetyInfo, MSSAU);
2454 return true;
2455}
2456
2457/// Try to reassociate and hoist the following two patterns:
2458/// LV - C1 < C2 --> LV < C1 + C2,
2459/// C1 - LV < C2 --> LV > C1 - C2.
2460static bool hoistSub(ICmpInst::Predicate Pred, Value *VariantLHS,
2461 Value *InvariantRHS, ICmpInst &ICmp, Loop &L,
2462 ICFLoopSafetyInfo &SafetyInfo, MemorySSAUpdater &MSSAU,
2463 AssumptionCache *AC, DominatorTree *DT) {
2464 assert(!L.isLoopInvariant(VariantLHS) && "Precondition.");
2465 assert(L.isLoopInvariant(InvariantRHS) && "Precondition.");
2466
2467 bool IsSigned = ICmpInst::isSigned(Pred);
2468
2469 // Try to represent VariantLHS as sum of invariant and variant operands.
2470 using namespace PatternMatch;
2471 Value *VariantOp, *InvariantOp;
2472 if (IsSigned &&
2473 !match(VariantLHS, m_NSWSub(m_Value(VariantOp), m_Value(InvariantOp))))
2474 return false;
2475 if (!IsSigned &&
2476 !match(VariantLHS, m_NUWSub(m_Value(VariantOp), m_Value(InvariantOp))))
2477 return false;
2478
2479 bool VariantSubtracted = false;
2480 // LHS itself is a loop-variant, try to represent it in the form:
2481 // "VariantOp + InvariantOp". If it is possible, then we can reassociate. If
2482 // the variant operand goes with minus, we use a slightly different scheme.
2483 if (L.isLoopInvariant(VariantOp)) {
2484 std::swap(VariantOp, InvariantOp);
2485 VariantSubtracted = true;
2486 Pred = ICmpInst::getSwappedPredicate(Pred);
2487 }
2488 if (L.isLoopInvariant(VariantOp) || !L.isLoopInvariant(InvariantOp))
2489 return false;
2490
2491 // In order to turn "LV - C1 < C2" into "LV < C2 + C1", we need to be able to
2492 // freely move values from left side of inequality to right side (just as in
2493 // normal linear arithmetics). Overflows make things much more complicated, so
2494 // we want to avoid this. Likewise, for "C1 - LV < C2" we need to prove that
2495 // "C1 - C2" does not overflow.
2496 auto &DL = L.getHeader()->getDataLayout();
2497 SimplifyQuery SQ(DL, DT, AC, &ICmp);
2498 if (VariantSubtracted && IsSigned) {
2499 // C1 - LV < C2 --> LV > C1 - C2
2500 if (computeOverflowForSignedSub(InvariantOp, InvariantRHS, SQ) !=
2502 return false;
2503 } else if (VariantSubtracted && !IsSigned) {
2504 // C1 - LV < C2 --> LV > C1 - C2
2505 if (computeOverflowForUnsignedSub(InvariantOp, InvariantRHS, SQ) !=
2507 return false;
2508 } else if (!VariantSubtracted && IsSigned) {
2509 // LV - C1 < C2 --> LV < C1 + C2
2510 if (computeOverflowForSignedAdd(InvariantOp, InvariantRHS, SQ) !=
2512 return false;
2513 } else { // !VariantSubtracted && !IsSigned
2514 // LV - C1 < C2 --> LV < C1 + C2
2515 if (computeOverflowForUnsignedAdd(InvariantOp, InvariantRHS, SQ) !=
2517 return false;
2518 }
2519 auto *Preheader = L.getLoopPreheader();
2520 assert(Preheader && "Loop is not in simplify form?");
2521 IRBuilder<> Builder(Preheader->getTerminator());
2522 Value *NewCmpOp =
2523 VariantSubtracted
2524 ? Builder.CreateSub(InvariantOp, InvariantRHS, "invariant.op",
2525 /*HasNUW*/ !IsSigned, /*HasNSW*/ IsSigned)
2526 : Builder.CreateAdd(InvariantOp, InvariantRHS, "invariant.op",
2527 /*HasNUW*/ !IsSigned, /*HasNSW*/ IsSigned);
2528 ICmp.setPredicate(Pred);
2529 ICmp.setOperand(0, VariantOp);
2530 ICmp.setOperand(1, NewCmpOp);
2531 // The new LHS is a different value, so a samesign (or any other
2532 // poison-generating) flag asserted about the old operands may no longer hold.
2534
2535 Instruction &DeadI = cast<Instruction>(*VariantLHS);
2536 salvageDebugInfo(DeadI);
2537 eraseInstruction(DeadI, SafetyInfo, MSSAU);
2538 return true;
2539}
2540
2541/// Reassociate and hoist add/sub expressions.
2542static bool hoistAddSub(Instruction &I, Loop &L, ICFLoopSafetyInfo &SafetyInfo,
2544 DominatorTree *DT) {
2545 using namespace PatternMatch;
2546 CmpPredicate Pred;
2547 Value *LHS, *RHS;
2548 if (!match(&I, m_ICmp(Pred, m_Value(LHS), m_Value(RHS))))
2549 return false;
2550
2551 // Put variant operand to LHS position.
2552 if (L.isLoopInvariant(LHS)) {
2553 std::swap(LHS, RHS);
2554 Pred = ICmpInst::getSwappedPredicate(Pred);
2555 }
2556 // We want to delete the initial operation after reassociation, so only do it
2557 // if it has no other uses.
2558 if (L.isLoopInvariant(LHS) || !L.isLoopInvariant(RHS) || !LHS->hasOneUse())
2559 return false;
2560
2561 // TODO: We could go with smarter context, taking common dominator of all I's
2562 // users instead of I itself.
2563 if (hoistAdd(Pred, LHS, RHS, cast<ICmpInst>(I), L, SafetyInfo, MSSAU, AC, DT))
2564 return true;
2565
2566 if (hoistSub(Pred, LHS, RHS, cast<ICmpInst>(I), L, SafetyInfo, MSSAU, AC, DT))
2567 return true;
2568
2569 return false;
2570}
2571
2572static bool isReassociableOp(Instruction *I, unsigned IntOpcode,
2573 unsigned FPOpcode) {
2574 if (I->getOpcode() == IntOpcode)
2575 return true;
2576 if (I->getOpcode() == FPOpcode && I->hasAllowReassoc() &&
2577 I->hasNoSignedZeros())
2578 return true;
2579 return false;
2580}
2581
2582/// Try to reassociate expressions like ((A1 * B1) + (A2 * B2) + ...) * C where
2583/// A1, A2, ... and C are loop invariants into expressions like
2584/// ((A1 * C * B1) + (A2 * C * B2) + ...) and hoist the (A1 * C), (A2 * C), ...
2585/// invariant expressions. This functions returns true only if any hoisting has
2586/// actually occurred.
2588 ICFLoopSafetyInfo &SafetyInfo,
2590 DominatorTree *DT) {
2591 const ScalarOptions &Opts = ScalarOptions::Global;
2592 if (!isReassociableOp(&I, Instruction::Mul, Instruction::FMul))
2593 return false;
2594 Value *VariantOp = I.getOperand(0);
2595 Value *InvariantOp = I.getOperand(1);
2596 if (L.isLoopInvariant(VariantOp))
2597 std::swap(VariantOp, InvariantOp);
2598 if (L.isLoopInvariant(VariantOp) || !L.isLoopInvariant(InvariantOp))
2599 return false;
2600 Value *Factor = InvariantOp;
2601
2602 // First, we need to make sure we should do the transformation.
2603 SmallVector<Use *> Changes;
2606 if (BinaryOperator *VariantBinOp = dyn_cast<BinaryOperator>(VariantOp))
2607 Worklist.push_back(VariantBinOp);
2608 while (!Worklist.empty()) {
2609 BinaryOperator *BO = Worklist.pop_back_val();
2610 if (!BO->hasOneUse())
2611 return false;
2612 if (isReassociableOp(BO, Instruction::Add, Instruction::FAdd) &&
2615 Worklist.push_back(cast<BinaryOperator>(BO->getOperand(0)));
2616 Worklist.push_back(cast<BinaryOperator>(BO->getOperand(1)));
2617 Adds.push_back(BO);
2618 continue;
2619 }
2620 if (!isReassociableOp(BO, Instruction::Mul, Instruction::FMul) ||
2621 L.isLoopInvariant(BO))
2622 return false;
2623 Use &U0 = BO->getOperandUse(0);
2624 Use &U1 = BO->getOperandUse(1);
2625 if (L.isLoopInvariant(U0))
2626 Changes.push_back(&U0);
2627 else if (L.isLoopInvariant(U1))
2628 Changes.push_back(&U1);
2629 else
2630 return false;
2631 unsigned Limit = I.getType()->isIntOrIntVectorTy()
2632 ? Opts.licm_max_num_int_reassociations
2633 : Opts.licm_max_num_fp_reassociations;
2634 if (Changes.size() > Limit)
2635 return false;
2636 }
2637 if (Changes.empty())
2638 return false;
2639
2640 // Drop the poison flags for any adds we looked through.
2641 if (I.getType()->isIntOrIntVectorTy()) {
2642 for (auto *Add : Adds)
2643 Add->dropPoisonGeneratingFlags();
2644 }
2645
2646 // We know we should do it so let's do the transformation.
2647 auto *Preheader = L.getLoopPreheader();
2648 assert(Preheader && "Loop is not in simplify form?");
2649 IRBuilder<> Builder(Preheader->getTerminator());
2650 for (auto *U : Changes) {
2651 assert(L.isLoopInvariant(U->get()));
2652 auto *Ins = cast<BinaryOperator>(U->getUser());
2653 Value *Mul;
2654 if (I.getType()->isIntOrIntVectorTy()) {
2655 Mul = Builder.CreateMul(U->get(), Factor, "factor.op.mul");
2656 // Drop the poison flags on the original multiply.
2657 Ins->dropPoisonGeneratingFlags();
2658 } else
2659 Mul = Builder.CreateFMulFMF(U->get(), Factor, Ins, "factor.op.fmul");
2660
2661 // Rewrite the reassociable instruction.
2662 unsigned OpIdx = U->getOperandNo();
2663 auto *LHS = OpIdx == 0 ? Mul : Ins->getOperand(0);
2664 auto *RHS = OpIdx == 1 ? Mul : Ins->getOperand(1);
2665 auto *NewBO =
2666 BinaryOperator::Create(Ins->getOpcode(), LHS, RHS,
2667 Ins->getName() + ".reass", Ins->getIterator());
2668 NewBO->setDebugLoc(DebugLoc::getDropped());
2669 NewBO->copyIRFlags(Ins);
2670 if (VariantOp == Ins)
2671 VariantOp = NewBO;
2672 Ins->replaceAllUsesWith(NewBO);
2673 eraseInstruction(*Ins, SafetyInfo, MSSAU);
2674 }
2675
2676 I.replaceAllUsesWith(VariantOp);
2677 eraseInstruction(I, SafetyInfo, MSSAU);
2678 return true;
2679}
2680
2681/// Reassociate associative binary expressions of the form
2682///
2683/// 1. "(LV op C1) op C2" ==> "LV op (C1 op C2)"
2684/// 2. "(C1 op LV) op C2" ==> "LV op (C1 op C2)"
2685/// 3. "C2 op (C1 op LV)" ==> "LV op (C1 op C2)"
2686/// 4. "C2 op (LV op C1)" ==> "LV op (C1 op C2)"
2687///
2688/// where op is an associative BinOp, LV is a loop variant, and C1 and C2 are
2689/// loop invariants that we want to hoist, noting that associativity implies
2690/// commutativity.
2692 ICFLoopSafetyInfo &SafetyInfo,
2694 DominatorTree *DT) {
2695 auto *BO = dyn_cast<BinaryOperator>(&I);
2696 if (!BO || !BO->isAssociative())
2697 return false;
2698
2699 Instruction::BinaryOps Opcode = BO->getOpcode();
2700 bool LVInRHS = L.isLoopInvariant(BO->getOperand(0));
2701 auto *BO0 = dyn_cast<BinaryOperator>(BO->getOperand(LVInRHS));
2702 if (!BO0 || BO0->getOpcode() != Opcode || !BO0->isAssociative() ||
2703 BO0->hasNUsesOrMore(BO0->getType()->isIntegerTy() ? 2 : 3))
2704 return false;
2705
2706 Value *LV = BO0->getOperand(0);
2707 Value *C1 = BO0->getOperand(1);
2708 Value *C2 = BO->getOperand(!LVInRHS);
2709
2710 assert(BO->isCommutative() && BO0->isCommutative() &&
2711 "Associativity implies commutativity");
2712 if (L.isLoopInvariant(LV) && !L.isLoopInvariant(C1))
2713 std::swap(LV, C1);
2714 if (L.isLoopInvariant(LV) || !L.isLoopInvariant(C1) || !L.isLoopInvariant(C2))
2715 return false;
2716
2717 auto *Preheader = L.getLoopPreheader();
2718 assert(Preheader && "Loop is not in simplify form?");
2719
2720 IRBuilder<> Builder(Preheader->getTerminator());
2721 auto *Inv = Builder.CreateBinOp(Opcode, C1, C2, "invariant.op");
2722
2723 auto *NewBO = BinaryOperator::Create(
2724 Opcode, LV, Inv, BO->getName() + ".reass", BO->getIterator());
2725 NewBO->setDebugLoc(DebugLoc::getDropped());
2726
2727 if (Opcode == Instruction::FAdd || Opcode == Instruction::FMul) {
2728 // Intersect FMF flags for FADD and FMUL.
2729 FastMathFlags Intersect = BO->getFastMathFlags() & BO0->getFastMathFlags();
2730 if (auto *I = dyn_cast<Instruction>(Inv))
2731 I->setFastMathFlags(Intersect);
2732 NewBO->setFastMathFlags(Intersect);
2733 } else {
2734 OverflowTracking Flags;
2735 Flags.AllKnownNonNegative = false;
2736 Flags.AllKnownNonZero = false;
2737 Flags.mergeFlags(*BO);
2738 Flags.mergeFlags(*BO0);
2739 // If `Inv` was not constant-folded, a new Instruction has been created.
2740 auto *InvI = dyn_cast<Instruction>(Inv);
2741 if (InvI)
2742 Flags.applyFlags(*InvI);
2743 Flags.applyFlags(*NewBO);
2744
2745 // The original nsw flags guarantee that LV + C1 + C2 is representable.
2746 // If C1 + C2 is representable too, both reassociated adds keep nsw.
2747 SimplifyQuery SQ(L.getHeader()->getDataLayout(), DT, AC,
2748 Preheader->getTerminator());
2749 if (Opcode == Instruction::Add && Flags.HasNSW && !Flags.HasNUW &&
2750 computeOverflowForSignedAdd(C1, C2, SQ) ==
2752 if (InvI)
2753 InvI->setHasNoSignedWrap();
2754 NewBO->setHasNoSignedWrap();
2755 }
2756 }
2757
2758 BO->replaceAllUsesWith(NewBO);
2759 eraseInstruction(*BO, SafetyInfo, MSSAU);
2760
2761 // (LV op C1) might not be erased if it has more uses than the one we just
2762 // replaced.
2763 if (BO0->use_empty()) {
2764 salvageDebugInfo(*BO0);
2765 eraseInstruction(*BO0, SafetyInfo, MSSAU);
2766 }
2767
2768 return true;
2769}
2770
2771/// Reassociate add/sub expressions of the form:
2772///
2773/// 1. "(LV + C1) - C2" ==> "LV + (C1 - C2)"
2774/// 2. "(LV - C1) - C2" ==> "LV - (C1 + C2)"
2775/// 3. "(LV - C1) + C2" ==> "LV + (C2 - C1)"
2776///
2777/// where LV is a loop variant, and C1 and C2 are loop invariants.
2778/// Sub is not associative, but these algebraic identities allow hoisting
2779/// invariant computations out of the loop.
2781 ICFLoopSafetyInfo &SafetyInfo,
2783 DominatorTree *DT) {
2784 using namespace PatternMatch;
2785
2786 Instruction *BO;
2787 Value *LV, *C1, *C2;
2788 Instruction::BinaryOps InvOp, ResultOp;
2789
2790 // Try to match one of three reassociation patterns involving sub.
2791 //
2792 // 1. (LV + C1) - C2 ==> LV + (C1 - C2)
2793 // 2. (LV - C1) - C2 ==> LV - (C1 + C2)
2794 // 3. (LV - C1) + C2 ==> LV + (C2 - C1)
2795 // ^ ^
2796 // \ \___ InvOp
2797 // \
2798 // \____ ResultOp
2799 //
2800 if (match(&I,
2802 m_Value(C2)))) {
2803 // Case 1.
2804 //
2805 // Depending on which of the addition is invariant, we might need to swap
2806 // the arguments
2807 if (L.isLoopInvariant(LV) && !L.isLoopInvariant(C1))
2808 std::swap(LV, C1);
2809 InvOp = Instruction::Sub;
2810 ResultOp = Instruction::Add;
2811 } else if (match(&I, m_Sub(m_OneUse(m_Instruction(
2812 BO, m_Sub(m_Value(LV), m_Value(C1)))),
2813 m_Value(C2)))) {
2814 // Case 2.
2815 InvOp = Instruction::Add;
2816 ResultOp = Instruction::Sub;
2817 } else if (match(&I, m_c_Add(m_OneUse(m_Instruction(
2818 BO, m_Sub(m_Value(LV), m_Value(C1)))),
2819 m_Value(C2)))) {
2820 // Case 3.
2821 //
2822 // We use (C2 - C1) as the invariant as opposed to case 1, but instead of
2823 // adding a special case in invariant creation, we can just swap the
2824 // operands here.
2825 std::swap(C1, C2);
2826 InvOp = Instruction::Sub;
2827 ResultOp = Instruction::Add;
2828 } else {
2829 return false;
2830 }
2831
2832 if (L.isLoopInvariant(LV) || !L.isLoopInvariant(C1) || !L.isLoopInvariant(C2))
2833 return false;
2834
2835 auto *Preheader = L.getLoopPreheader();
2836 assert(Preheader && "Loop is not in simplify form?");
2837
2838 IRBuilder<> Builder(Preheader->getTerminator());
2839 auto *Inv = Builder.CreateBinOp(InvOp, C1, C2, "invariant.op");
2840
2841 auto *NewBO = BinaryOperator::Create(ResultOp, LV, Inv,
2842 I.getName() + ".reass", I.getIterator());
2843 NewBO->setDebugLoc(DebugLoc::getDropped());
2844
2845 // No overflow flags are set on the new instructions -- reassociation
2846 // involving sub does not preserve nsw/nuw in general.
2847
2848 I.replaceAllUsesWith(NewBO);
2849 eraseInstruction(I, SafetyInfo, MSSAU);
2850
2851 salvageDebugInfo(*BO);
2852 eraseInstruction(*BO, SafetyInfo, MSSAU);
2853
2854 return true;
2855}
2856
2858 ICFLoopSafetyInfo &SafetyInfo,
2860 DominatorTree *DT) {
2861 // Optimize complex patterns, such as (x < INV1 && x < INV2), turning them
2862 // into (x < min(INV1, INV2)), and hoisting the invariant part of this
2863 // expression out of the loop.
2864 if (hoistMinMax(I, L, SafetyInfo, MSSAU)) {
2865 ++NumHoisted;
2866 ++NumMinMaxHoisted;
2867 return true;
2868 }
2869
2870 // Try to hoist GEPs by reassociation.
2871 if (hoistGEP(I, L, SafetyInfo, MSSAU, AC, DT)) {
2872 ++NumHoisted;
2873 ++NumGEPsHoisted;
2874 return true;
2875 }
2876
2877 // Try to hoist add/sub's by reassociation.
2878 if (hoistAddSub(I, L, SafetyInfo, MSSAU, AC, DT)) {
2879 ++NumHoisted;
2880 ++NumAddSubHoisted;
2881 return true;
2882 }
2883
2884 bool IsInt = I.getType()->isIntOrIntVectorTy();
2885 if (hoistMulAddAssociation(I, L, SafetyInfo, MSSAU, AC, DT)) {
2886 ++NumHoisted;
2887 if (IsInt)
2888 ++NumIntAssociationsHoisted;
2889 else
2890 ++NumFPAssociationsHoisted;
2891 return true;
2892 }
2893
2894 if (hoistBOAssociation(I, L, SafetyInfo, MSSAU, AC, DT)) {
2895 ++NumHoisted;
2896 ++NumBOAssociationsHoisted;
2897 return true;
2898 }
2899
2900 if (hoistSubAddAssociation(I, L, SafetyInfo, MSSAU, AC, DT)) {
2901 ++NumHoisted;
2902 ++NumBOAssociationsHoisted;
2903 return true;
2904 }
2905
2906 return false;
2907}
2908
2909/// Little predicate that returns true if the specified basic block is in
2910/// a subloop of the current one, not the current one itself.
2911///
2912static bool inSubLoop(BasicBlock *BB, Loop *CurLoop, LoopInfo *LI) {
2913 assert(CurLoop->contains(BB) && "Only valid if BB is IN the loop");
2914 return LI->getLoopFor(BB) != CurLoop;
2915}
for(const MachineOperand &MO :llvm::drop_begin(OldMI.operands(), Desc.getNumOperands()))
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static msgpack::DocNode getNode(msgpack::DocNode DN, msgpack::Type Type, MCValue Val)
unsigned uint64_t
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
DXIL Forward Handle Accesses
DXIL Resource Access
This file defines the DenseMap class.
early cse Early CSE w MemorySSA
#define DEBUG_TYPE
Hexagon Common GEP
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.
iv Induction Variable Users
Definition IVUsers.cpp:48
static bool isReassociableOp(Instruction *I, unsigned IntOpcode, unsigned FPOpcode)
Definition LICM.cpp:2572
static bool isNotUsedOrFoldableInLoop(const Instruction &I, const Loop *CurLoop, const LoopSafetyInfo *SafetyInfo, TargetTransformInfo *TTI, bool &FoldableInLoop, bool LoopNestMode)
Return true if the only users of this instruction are outside of the loop.
Definition LICM.cpp:1090
static bool hoistGEP(Instruction &I, Loop &L, ICFLoopSafetyInfo &SafetyInfo, MemorySSAUpdater &MSSAU, AssumptionCache *AC, DominatorTree *DT)
Reassociate gep (gep ptr, idx1), idx2 to gep (gep ptr, idx2), idx1 if this allows hoisting the inner ...
Definition LICM.cpp:2341
static void splitPredecessorsOfLoopExit(PHINode *PN, DominatorTree *DT, LoopInfo *LI, const Loop *CurLoop, LoopSafetyInfo *SafetyInfo, MemorySSAUpdater *MSSAU)
Definition LICM.cpp:1265
static bool isFoldableInLoop(const Instruction &I, const Loop *CurLoop, const TargetTransformInfo *TTI)
Return true if the instruction is foldable in the loop.
Definition LICM.cpp:1060
static bool hoistMinMax(Instruction &I, Loop &L, ICFLoopSafetyInfo &SafetyInfo, MemorySSAUpdater &MSSAU)
Try to simplify things like (A < INV_1 AND icmp A < INV_2) into (A < min(INV_1, INV_2)),...
Definition LICM.cpp:2260
static void moveInstructionBefore(Instruction &I, BasicBlock::iterator Dest, ICFLoopSafetyInfo &SafetyInfo, MemorySSAUpdater &MSSAU, ScalarEvolution *SE)
Definition LICM.cpp:1217
static Instruction * cloneInstructionInExitBlock(Instruction &I, BasicBlock &ExitBlock, PHINode &PN, const LoopInfo *LI, const LoopSafetyInfo *SafetyInfo, MemorySSAUpdater &MSSAU)
Definition LICM.cpp:1133
static bool pointerInvalidatedByLoop(MemorySSA *MSSA, MemoryUse *MU, Loop *CurLoop, Instruction &I, SinkAndHoistLICMFlags &Flags, bool InvariantGroup)
Definition LICM.cpp:2197
static bool hoistSubAddAssociation(Instruction &I, Loop &L, ICFLoopSafetyInfo &SafetyInfo, MemorySSAUpdater &MSSAU, AssumptionCache *AC, DominatorTree *DT)
Reassociate add/sub expressions of the form:
Definition LICM.cpp:2780
static bool hoistAdd(ICmpInst::Predicate Pred, Value *VariantLHS, Value *InvariantRHS, ICmpInst &ICmp, Loop &L, ICFLoopSafetyInfo &SafetyInfo, MemorySSAUpdater &MSSAU, AssumptionCache *AC, DominatorTree *DT)
Try to turn things like "LV + C1 < C2" into "LV < C2 - C1".
Definition LICM.cpp:2399
static MemoryAccess * getClobberingMemoryAccess(MemorySSA &MSSA, BatchAAResults &BAA, SinkAndHoistLICMFlags &Flags, MemoryUseOrDef *MA)
Definition LICM.cpp:902
static void hoist(Instruction &I, const DominatorTree *DT, const Loop *CurLoop, BasicBlock *Dest, ICFLoopSafetyInfo *SafetyInfo, MemorySSAUpdater &MSSAU, ScalarEvolution *SE, OptimizationRemarkEmitter *ORE)
When an instruction is found to only use loop invariant operands that is safe to hoist,...
Definition LICM.cpp:1444
static SmallVector< PointersAndHasReadsOutsideSet, 0 > collectPromotionCandidates(MemorySSA *MSSA, AliasAnalysis *AA, DominatorTree *DT, ICFLoopSafetyInfo *SafetyInfo, const SmallPtrSetImpl< const MDNode * > &LoopLocalAliasScopes, Loop *L)
Definition LICM.cpp:2075
static bool canSplitPredecessors(PHINode *PN, LoopSafetyInfo *SafetyInfo)
Definition LICM.cpp:1247
static bool sink(Instruction &I, LoopInfo *LI, DominatorTree *DT, const Loop *CurLoop, ICFLoopSafetyInfo *SafetyInfo, MemorySSAUpdater &MSSAU, OptimizationRemarkEmitter *ORE)
When an instruction is found to only be used outside of the loop, this function moves it to the exit ...
Definition LICM.cpp:1337
static bool isPotentiallyPromotable(const Instruction *I, const Loop *L)
Returns whether I is a memory access that may be a candidate for promotion out of the loop L.
Definition LICM.cpp:2006
static SmallPtrSet< const StoreInst *, 8 > collectStoresWithInvariantAATags(MemorySSA *MSSA, DominatorTree *DT, const SmallPtrSetImpl< const MDNode * > &LoopLocalAliasScopes, Loop *L)
Returns the potentially promotable stores with AA tags that are valid along all non-unwinding executi...
Definition LICM.cpp:2034
static bool hoistAddSub(Instruction &I, Loop &L, ICFLoopSafetyInfo &SafetyInfo, MemorySSAUpdater &MSSAU, AssumptionCache *AC, DominatorTree *DT)
Reassociate and hoist add/sub expressions.
Definition LICM.cpp:2542
static bool hoistMulAddAssociation(Instruction &I, Loop &L, ICFLoopSafetyInfo &SafetyInfo, MemorySSAUpdater &MSSAU, AssumptionCache *AC, DominatorTree *DT)
Try to reassociate expressions like ((A1 * B1) + (A2 * B2) + ...) * C where A1, A2,...
Definition LICM.cpp:2587
static bool isOnlyMemoryAccess(const Instruction *I, const Loop *L, const MemorySSAUpdater &MSSAU)
Return true if I is the only Instruction with a MemoryAccess in L.
Definition LICM.cpp:886
static void foreachMemoryAccess(MemorySSA *MSSA, Loop *L, function_ref< void(Instruction *)> Fn)
Definition LICM.cpp:1995
static bool isLoadInvariantInLoop(LoadInst *LI, DominatorTree *DT, Loop *CurLoop)
Definition LICM.cpp:817
static bool hoistInsertPastInsert(InsertElementInst *Ins, Loop *CurLoop, DominatorTree *DT, BasicBlock *HoistDest, ICFLoopSafetyInfo *SafetyInfo, MemorySSAUpdater &MSSAU, ScalarEvolution *SE, OptimizationRemarkEmitter *ORE)
Definition LICM.cpp:758
static bool isHoistableAndSinkableInst(Instruction &I)
Return true if-and-only-if we know how to (mechanically) both hoist and sink a given instruction out ...
Definition LICM.cpp:874
static Instruction * sinkThroughTriviallyReplaceablePHI(PHINode *TPN, Instruction *I, LoopInfo *LI, SmallDenseMap< BasicBlock *, Instruction *, 32 > &SunkCopies, const LoopSafetyInfo *SafetyInfo, const Loop *CurLoop, MemorySSAUpdater &MSSAU)
Definition LICM.cpp:1232
static bool hasAnyMDOperandsFrom(const MDNode *N, const SmallPtrSetImpl< const MDNode * > &Operands)
Returns whether N has any operand from the set Operands.
Definition LICM.cpp:2024
static bool inSubLoop(BasicBlock *BB, Loop *CurLoop, LoopInfo *LI)
Little predicate that returns true if the specified basic block is in a subloop of the current one,...
Definition LICM.cpp:2912
static bool hoistSub(ICmpInst::Predicate Pred, Value *VariantLHS, Value *InvariantRHS, ICmpInst &ICmp, Loop &L, ICFLoopSafetyInfo &SafetyInfo, MemorySSAUpdater &MSSAU, AssumptionCache *AC, DominatorTree *DT)
Try to reassociate and hoist the following two patterns: LV - C1 < C2 --> LV < C1 + C2,...
Definition LICM.cpp:2460
static void eraseInstruction(Instruction &I, ICFLoopSafetyInfo &SafetyInfo, MemorySSAUpdater &MSSAU)
Definition LICM.cpp:1210
static bool isSafeToExecuteUnconditionally(Instruction &Inst, const DominatorTree *DT, const TargetLibraryInfo *TLI, const Loop *CurLoop, const LoopSafetyInfo *SafetyInfo, OptimizationRemarkEmitter *ORE, const Instruction *CtxI, AssumptionCache *AC, bool AllowSpeculation)
Only sink or hoist an instruction if it is not a trapping instruction, or if the instruction is known...
Definition LICM.cpp:1491
static bool hoistArithmetics(Instruction &I, Loop &L, ICFLoopSafetyInfo &SafetyInfo, MemorySSAUpdater &MSSAU, AssumptionCache *AC, DominatorTree *DT)
Aggregates various functions for hoisting computations out of loop.
Definition LICM.cpp:2857
static bool noConflictingReadWrites(Instruction *I, MemorySSA *MSSA, AAResults *AA, Loop *CurLoop, SinkAndHoistLICMFlags &Flags)
Definition LICM.cpp:2157
static bool isTriviallyReplaceablePHI(const PHINode &PN, const Instruction &I)
Returns true if a PHINode is a trivially replaceable with an Instruction.
Definition LICM.cpp:1051
std::pair< SmallSetVector< Value *, 8 >, bool > PointersAndHasReadsOutsideSet
Definition LICM.cpp:176
static std::optional< uint64_t > getConstantInsertionIndex(InsertElementInst *Ins)
Definition LICM.cpp:743
static bool hoistBOAssociation(Instruction &I, Loop &L, ICFLoopSafetyInfo &SafetyInfo, MemorySSAUpdater &MSSAU, AssumptionCache *AC, DominatorTree *DT)
Reassociate associative binary expressions of the form.
Definition LICM.cpp:2691
static bool pointerInvalidatedByBlock(BasicBlock &BB, MemorySSA &MSSA, MemoryUse &MU)
Definition LICM.cpp:2248
This file defines the interface for the loop nest analysis.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file provides utility analysis objects describing memory locations.
Memory SSA
Definition MemorySSA.cpp:73
This file exposes an interface to building/using memory SSA to walk memory instructions using a use/d...
This file contains the declarations for metadata subclasses.
Contains a collection of routines for determining if a given instruction is guaranteed to execute if ...
uint64_t IntrinsicInst * II
#define P(N)
if(PassOpts->AAPipeline)
PassInstrumentationCallbacks PIC
#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
This file provides a priority worklist.
static DominatorTree getDomTree(Function &F)
Remove Loads Into Fake Uses
SI Fold Operands
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
This pass exposes codegen information to IR-level passes.
Value * RHS
Value * LHS
BinaryOperator * Mul
LLVM_ABI void addWithoutAATags(StoreInst *SI)
LLVM_ABI void add(const MemoryLocation &Loc)
These methods are used to add different types of instructions to the alias sets.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:446
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
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 DataLayout & getDataLayout() const
Get the data layout of the module this basic block belongs to.
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
LLVM_ABI bool canSplitPredecessors() const
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
ModRefInfo getModRefInfo(const Instruction *I, const std::optional< MemoryLocation > &OptLoc)
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
void setPredicate(Predicate P)
Set the predicate for this instruction to the specified value.
Definition InstrTypes.h:831
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
bool isSigned() const
Definition InstrTypes.h:993
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:890
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:852
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI std::optional< CmpPredicate > getMatching(CmpPredicate A, CmpPredicate B)
Compares two CmpPredicates taking samesign into account and returns the canonicalized CmpPredicate if...
This is the shared class of boolean and integer constants.
Definition Constants.h:87
bool isNegative() const
Definition Constants.h:214
int64_t getSExtValue() const
Return the constant as a 64-bit integer value after it has been sign extended as appropriate for the ...
Definition Constants.h:174
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
TypeSize getTypeStoreSize(Type *Ty) const
Returns the maximum number of bytes that may be overwritten by storing the specified type.
Definition DataLayout.h:579
static LLVM_ABI DebugLoc getMergedLocations(ArrayRef< DebugLoc > Locs)
Try to combine the vector of locations passed as input in a single one.
Definition DebugLoc.cpp:173
static DebugLoc getDropped()
Definition DebugLoc.h:155
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:857
Analysis pass which computes a DominatorTree.
Definition Dominators.h:241
bool verify(VerificationLevel VL=VerificationLevel::Full) const
verify - checks if the tree is correct.
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
bool properlyDominates(const DomTreeNodeBase< NodeT > *A, const DomTreeNodeBase< NodeT > *B) const
properlyDominates - Returns true iff A dominates B and A != B.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
LLVM_ABI bool isReachableFromEntry(const Use &U) const
Provide an overload for a Use.
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.
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:23
This implementation of LoopSafetyInfo use ImplicitControlFlowTracking to give precise answers on "may...
bool doesNotWriteMemoryBefore(const BasicBlock *BB) const
Returns true if we could not execute a memory-modifying instruction before we enter BB under assumpti...
bool isGuaranteedToExecute(const Instruction &Inst, const DominatorTree *DT) const override
Returns true if the instruction in a loop is guaranteed to execute at least once (under the assumptio...
void removeInstruction(const Instruction *Inst)
Inform safety info that we are planning to remove the instruction Inst from its block.
bool anyBlockMayThrow() const override
Returns true iff any block of the loop for which this info is contains an instruction that may throw ...
void insertInstructionTo(const Instruction *Inst, const BasicBlock *BB)
Inform the safety info that we are planning to insert a new instruction Inst into the basic block BB.
This instruction compares its operands according to the predicate given to the constructor.
static bool isGE(Predicate P)
Return true if the predicate is SGE or UGE.
static bool isLT(Predicate P)
Return true if the predicate is SLT or ULT.
static bool isGT(Predicate P)
Return true if the predicate is SGT or UGT.
bool isRelational() const
Return true if the predicate is relational (not EQ or NE).
static bool isLE(Predicate P)
Return true if the predicate is SLE or ULE.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2918
This instruction inserts a single (scalar) element into a VectorType value.
VectorType * getType() const
Overload to return most specific vector type.
LLVM_ABI void mergeDIAssignID(ArrayRef< const Instruction * > SourceInstructions)
Merge the DIAssignID metadata from this instruction and those attached to instructions in SourceInstr...
LLVM_ABI void setAAMetadata(const AAMDNodes &N)
Sets the AA metadata on this instruction from the AAMDNodes structure.
user_iterator_impl< Instruction > user_iterator
Specialize the methods defined in Value, as we know that an instruction can only be used by other ins...
bool hasMetadata() const
Return true if this instruction has any metadata attached to it.
LLVM_ABI void moveBefore(InstListType::iterator InsertPos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
LLVM_ABI bool isAtomic() const LLVM_READONLY
Return true if this instruction has an AtomicOrdering of unordered or higher.
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
Instruction * user_back()
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.
LLVM_ABI AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
LLVM_ABI void dropPoisonGeneratingFlags()
Drops flags that may cause this instruction to evaluate to poison despite having non-poison inputs.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
A wrapper class for inspecting calls to intrinsic functions.
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
Definition LICM.cpp:284
LLVM_ABI PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
Definition LICM.cpp:262
LLVM_ABI PreservedAnalyses run(LoopNest &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
Definition LICM.cpp:294
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
Definition LICM.cpp:324
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
static void getLazyBFIAnalysisUsage(AnalysisUsage &AU)
Helper for client passes to set up the analysis usage on behalf of this pass.
Helper class for promoting a collection of loads and stores into SSA Form using the SSAUpdater.
Definition SSAUpdater.h:149
An instruction for reading from memory.
void setAlignment(Align Align)
Value * getPointerOperand()
void setOrdering(AtomicOrdering Ordering)
Sets the ordering constraint of this load instruction.
bool isUnordered() const
Analysis pass that exposes the LoopInfo for a function.
Definition LoopInfo.h:594
bool contains(const LoopT *L) const
Return true if the specified loop is contained within this loop.
BlockT * getHeader() const
BlockT * getLoopPreheader() const
If there is a preheader for this loop, return it.
ArrayRef< BlockT * > getBlocks() const
Get a list of the basic blocks which make up this loop.
void getUniqueExitBlocks(SmallVectorImpl< BlockT * > &ExitBlocks) const
Return all unique successor blocks of this loop.
Wrapper class to LoopBlocksDFS that provides a standard begin()/end() interface for the DFS reverse p...
void perform(const LoopInfo *LI)
Traverse the loop blocks and store the DFS result.
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
LLVM_ABI bool wouldBeOutOfLoopUseRequiringLCSSA(const Value *V, const BasicBlock *ExitBB) const
This class represents a loop nest and can be used to query its properties.
Function * getParent() const
Return the function to which the loop-nest belongs.
Loop & getOutermostLoop() const
Return the outermost loop in the loop nest.
Captures loop safety information.
Definition MustExecute.h:55
LLVM_ABI void copyColors(BasicBlock *New, BasicBlock *Old)
Copy colors of block Old into the block New.
LLVM_ABI const DenseMap< BasicBlock *, ColorVector > & getBlockColors() const
Returns block colors map that is used to update funclet operand bundles.
virtual bool isGuaranteedToExecute(const Instruction &Inst, const DominatorTree *DT) const =0
Returns true if the instruction in a loop is guaranteed to execute at least once (under the assumptio...
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
bool hasLoopInvariantOperands(const Instruction *I) const
Return true if all the operands of the specified instruction are loop invariant.
Definition LoopInfo.cpp:73
bool isLoopInvariant(const Value *V) const
Return true if the specified value is loop invariant.
Definition LoopInfo.cpp:67
Metadata node.
Definition Metadata.h:1081
Tracking metadata reference owned by Metadata.
Definition Metadata.h:902
BasicBlock * getBlock() const
Definition MemorySSA.h:162
bool onlyWritesMemory() const
Whether this function only (at most) writes memory.
Definition ModRef.h:252
bool doesNotAccessMemory() const
Whether this function accesses no memory.
Definition ModRef.h:246
bool onlyReadsMemory() const
Whether this function only (at most) reads memory.
Definition ModRef.h:249
Representation for a specific memory location.
static LLVM_ABI MemoryLocation get(const LoadInst *LI)
Return a location with information about the memory reference by the given instruction.
An analysis that produces MemorySSA for a function.
Definition MemorySSA.h:922
MemorySSA * getMemorySSA() const
Get handle on MemorySSA.
LLVM_ABI void insertDef(MemoryDef *Def, bool RenameUses=false)
Insert a definition into the MemorySSA IR.
LLVM_ABI void insertUse(MemoryUse *Use, bool RenameUses=false)
LLVM_ABI MemoryAccess * createMemoryAccessInBB(Instruction *I, MemoryAccess *Definition, const BasicBlock *BB, MemorySSA::InsertionPlace Point, bool CreationMustSucceed=true)
Create a MemoryAccess in MemorySSA at a specified point in a block.
LLVM_ABI void removeMemoryAccess(MemoryAccess *, bool OptimizePhis=false)
Remove a MemoryAccess from MemorySSA, including updating all definitions and uses.
LLVM_ABI MemoryUseOrDef * createMemoryAccessAfter(Instruction *I, MemoryAccess *Definition, MemoryAccess *InsertPt)
Create a MemoryAccess in MemorySSA after an existing MemoryAccess.
LLVM_ABI void moveToPlace(MemoryUseOrDef *What, BasicBlock *BB, MemorySSA::InsertionPlace Where)
MemoryAccess * getClobberingMemoryAccess(const Instruction *I, BatchAAResults &AA)
Given a memory Mod/Ref/ModRef'ing instruction, calling this will give you the nearest dominating Memo...
Definition MemorySSA.h:1035
Legacy analysis pass which computes MemorySSA.
Definition MemorySSA.h:975
Encapsulates MemorySSA, including all data associated with memory accesses.
Definition MemorySSA.h:702
AliasAnalysis & getAA()
Definition MemorySSA.h:800
DefsList * getBlockDefs(const BasicBlock *BB) const
Return the list of MemoryDef's and MemoryPhi's for a given basic block.
Definition MemorySSA.h:765
LLVM_ABI MemorySSAWalker * getSkipSelfWalker()
AccessList * getBlockAccesses(const BasicBlock *BB) const
Return the list of MemoryAccess's for a given basic block.
Definition MemorySSA.h:758
LLVM_ABI bool dominates(const MemoryAccess *A, const MemoryAccess *B) const
Given two memory accesses in potentially different blocks, determine whether MemoryAccess A dominates...
LLVM_ABI void verifyMemorySSA(VerificationLevel=VerificationLevel::Fast) const
Verify that MemorySSA is self consistent (IE definitions dominate all uses, uses appear in the right ...
MemoryUseOrDef * getMemoryAccess(const Instruction *I) const
Given a memory Mod/Ref'ing instruction, get the MemorySSA access associated with it.
Definition MemorySSA.h:720
LLVM_ABI bool locallyDominates(const MemoryAccess *A, const MemoryAccess *B) const
Given two memory accesses in the same basic block, determine whether MemoryAccess A dominates MemoryA...
bool isLiveOnEntryDef(const MemoryAccess *MA) const
Return true if MA represents the live on entry value.
Definition MemorySSA.h:740
Class that has the common methods + fields of memory uses/defs.
Definition MemorySSA.h:250
MemoryAccess * getDefiningAccess() const
Get the access that produces the memory state used by this Use.
Definition MemorySSA.h:260
Represents read-only accesses to memory.
Definition MemorySSA.h:310
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
The optimization diagnostic interface.
LLVM_ABI void emit(DiagnosticInfoOptimizationBase &OptDiag)
Output the remark via the diagnostic handler and to the optimization record file.
Diagnostic information for missed-optimization remarks.
Diagnostic information for applied optimization remarks.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
op_range incoming_values()
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
int getBasicBlockIndex(const BasicBlock *BB) const
Return the first index of the specified basic block in the value list for this PHI.
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
PointerIntPair - This class implements a pair of a pointer and small integer.
void setInt(IntType IntVal) &
PointerTy getPointer() const
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
PredIteratorCache - This class is an extremely trivial cache for predecessor iterator queries.
size_t size(BasicBlock *BB)
ArrayRef< BasicBlock * > get(BasicBlock *BB)
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
bool empty() const
Determine if the PriorityWorklist is empty or not.
bool insert(const T &X)
Insert a new element into the PriorityWorklist.
Helper class for SSA formation on a set of values defined in multiple blocks.
Definition SSAUpdater.h:39
The main scalar evolution driver.
LLVM_ABI void forgetBlockAndLoopDispositions(Value *V=nullptr)
Called when the client has changed the disposition of values in a loop or block.
LLVM_ABI void forgetLoopDispositions()
Called when the client has changed the disposition of values in this loop.
bool remove(const value_type &X)
Remove an item from the set vector.
Definition SetVector.h:187
bool empty() const
Determine if the SetVector is empty or not.
Definition SetVector.h:100
iterator begin()
Get an iterator to the beginning of the SetVector.
Definition SetVector.h:112
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:157
Flags controlling how much is checked when sinking or hoisting instructions.
Definition LoopUtils.h:123
LLVM_ABI SinkAndHoistLICMFlags(unsigned LicmMssaOptCap, unsigned LicmMssaNoAccForPromotionCap, bool IsSink, Loop &L, MemorySSA &MSSA)
Definition LICM.cpp:353
unsigned LicmMssaNoAccForPromotionCap
Definition LoopUtils.h:142
A version of PriorityWorklist that selects small size optimized data structures for the vector and ma...
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
void insert_range(Range &&R)
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:345
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
void setAlignment(Align Align)
void setOrdering(AtomicOrdering Ordering)
Sets the ordering constraint of this store instruction.
static unsigned getPointerOperandIndex()
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Provides information about what library functions are available for the current target.
Wrapper pass for TargetTransformInfo.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
@ TCK_SizeAndLatency
The weighted sum of size and latency.
@ TCC_Free
Expected to fold away in lowering.
EltTy front() const
unsigned size() const
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
const Use & getOperandUse(unsigned i) const
Definition User.h:220
void setOperand(unsigned i, Value *Val)
Definition User.h:212
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
LLVM_ABI bool hasOneUser() const
Return true if there is exactly one user of this value.
Definition Value.cpp:163
LLVM_ABI std::string getNameOrAsOperand() const
Definition Value.cpp:461
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:441
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:428
bool use_empty() const
Definition Value.h:348
iterator_range< use_iterator > uses()
Definition Value.h:382
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:400
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
Changed
Abstract Attribute helper functions.
Definition Attributor.h:165
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:83
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWSub(const LHS &L, const RHS &R)
bool match(Val *V, const Pattern &P)
match_bind< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
auto m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
auto m_Intrinsic(const Ts &...Ops)
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWSub(const LHS &L, const RHS &R)
match_combine_or< OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoSignedWrap >, DisjointOr_match< LHS, RHS > > m_NSWAddLike(const LHS &L, const RHS &R)
Match either "add nsw" or "or disjoint".
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
match_combine_or< OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap >, DisjointOr_match< LHS, RHS > > m_NUWAddLike(const LHS &L, const RHS &R)
Match either "add nuw" or "or disjoint".
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
DiagnosticInfoOptimizationBase::Argument NV
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
@ NeverOverflows
Never overflows.
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:1755
LLVM_ABI bool canSinkOrHoistInst(Instruction &I, AAResults *AA, DominatorTree *DT, Loop *CurLoop, MemorySSAUpdater &MSSAU, bool TargetExecutesOncePerLoop, SinkAndHoistLICMFlags &LICMFlags, OptimizationRemarkEmitter *ORE=nullptr)
Returns true if is legal to hoist or sink this instruction disregarding the possible introduction of ...
Definition LICM.cpp:957
auto pred_end(const MachineBasicBlock *BB)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
bool isStrongerThanMonotonic(AtomicOrdering AO)
LLVM_ABI void salvageDebugInfo(const MachineRegisterInfo &MRI, MachineInstr &MI)
Assuming the instruction MI is going to be deleted, attempt to salvage debug users of MI by writing t...
Definition Utils.cpp:1676
@ Load
The value being inserted comes from a load (InsertElement only).
@ Store
The extracted value is stored (ExtractElement only).
constexpr from_range_t from_range
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< 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:649
auto cast_or_null(const Y &Val)
Definition Casting.h:714
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
Definition ModRef.h:356
LLVM_ABI bool isSafeToSpeculativelyExecute(const Instruction *I, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr, bool UseVariableInfo=true, bool IgnoreUBImplyingAttrs=true)
Return true if the instruction does not have any effects besides calculating the result and does not ...
LLVM_ABI bool PointerMayBeCapturedBefore(const Value *V, bool ReturnCaptures, const Instruction *I, const DominatorTree *DT, bool IncludeI=false, unsigned MaxUsesToExplore=0, const LoopInfo *LI=nullptr)
PointerMayBeCapturedBefore - Return true if this pointer value may be captured by the enclosing funct...
LLVM_ABI Pass * createLICMPass()
Definition LICM.cpp:345
LLVM_ABI SmallVector< BasicBlock *, 16 > collectChildrenInLoop(DominatorTree *DT, DomTreeNode *N, const Loop *CurLoop)
Does a BFS from a given node to all of its children inside a given loop.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
DomTreeNodeBase< BasicBlock > DomTreeNode
Definition Dominators.h:65
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
LLVM_ABI bool hoistRegion(DomTreeNode *, AAResults *, LoopInfo *, DominatorTree *, AssumptionCache *, TargetLibraryInfo *, Loop *, MemorySSAUpdater &, ScalarEvolution *, ICFLoopSafetyInfo *, SinkAndHoistLICMFlags &, OptimizationRemarkEmitter *, bool, bool AllowSpeculation)
Walk the specified region of the CFG (defined by all blocks dominated by the specified block,...
Definition LICM.cpp:629
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:1762
LLVM_ABI bool isInstructionTriviallyDead(Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction is not used, and the instruction will return.
Definition Local.cpp:406
LLVM_ABI bool isGuard(const User *U)
Returns true iff U has semantics of a guard expressed in a form of call of llvm.experimental....
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
LLVM_ABI OverflowResult computeOverflowForSignedSub(const Value *LHS, const Value *RHS, const SimplifyQuery &SQ)
LLVM_ABI void initializeLegacyLICMPassPass(PassRegistry &)
bool isModSet(const ModRefInfo MRI)
Definition ModRef.h:49
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_TEMPLATE_ABI void appendLoopsToWorklist(RangeT &&, SmallPriorityWorklist< Loop *, 4 > &)
Utility that implements appending of loops onto a worklist given a range.
LLVM_ABI bool isNotVisibleOnUnwind(const Value *Object, bool &RequiresNoCaptureBeforeUnwind)
Return true if Object memory is not visible after an unwind, in the sense that program semantics cann...
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth, bool MustPreserveProvenance=false)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI void getLoopAnalysisUsage(AnalysisUsage &AU)
Helper to consistently add the set of standard passes to a loop pass's AnalysisUsage.
LLVM_ABI unsigned getLicmMssaNoAccForPromotionCap()
Returns -licm-mssa-max-acc-promotion.
Definition LICM.cpp:123
@ Global
Append to llvm.global_dtors.
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...
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
Definition ModRef.h:28
TargetTransformInfo TTI
LLVM_ABI bool VerifyMemorySSA
Enables verification of MemorySSA.
Definition MemorySSA.cpp:85
LLVM_ABI bool salvageKnowledge(Instruction *I, AssumptionCache *AC=nullptr, DominatorTree *DT=nullptr)
Calls BuildAssumeFromInst and if the resulting llvm.assume is valid insert if before I.
LLVM_ABI bool hasDisableLICMTransformsHint(const Loop *L)
Look for the loop attribute that disables the LICM transformation heuristics.
LLVM_ABI OverflowResult computeOverflowForSignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const SimplifyQuery &SQ)
@ Add
Sum of integers.
DWARFExpression::Operation Op
LLVM_ABI bool isDereferenceableAndAlignedPointer(const Value *V, Type *Ty, Align Alignment, const SimplifyQuery &Q, bool IgnoreFree=false)
Returns true if V is always a dereferenceable pointer with alignment greater or equal than requested.
Definition Loads.cpp:244
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI bool isIdentifiedFunctionLocal(const Value *V)
Return true if V is umabigously identified at the function-level.
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1933
LLVM_ABI OverflowResult computeOverflowForUnsignedSub(const Value *LHS, const Value *RHS, const SimplifyQuery &SQ)
TinyPtrVector< BasicBlock * > ColorVector
auto pred_begin(const MachineBasicBlock *BB)
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.
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
Definition STLExtras.h:2208
LLVM_ABI unsigned getLicmMssaOptCap()
Returns -licm-mssa-optimization-cap.
Definition LICM.cpp:119
auto predecessors(const MachineBasicBlock *BB)
Type * getLoadStoreType(const Value *I)
A helper function that returns the type of a load or store instruction.
LLVM_ABI bool sinkRegion(DomTreeNode *, AAResults *, LoopInfo *, DominatorTree *, TargetLibraryInfo *, TargetTransformInfo *, Loop *CurLoop, MemorySSAUpdater &, ICFLoopSafetyInfo *, SinkAndHoistLICMFlags &, OptimizationRemarkEmitter *, Loop *OutermostLoop=nullptr)
Walk the specified region of the CFG (defined by all blocks dominated by the specified block,...
Definition LICM.cpp:537
LLVM_ABI OverflowResult computeOverflowForUnsignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const SimplifyQuery &SQ)
LLVM_ABI bool canHoistLoad(LoadInst &LI, AAResults *AA, DominatorTree *DT, Loop *CurLoop, MemorySSA &MSSA, bool TargetExecutesOncePerLoop, SinkAndHoistLICMFlags &LICMFlags, OptimizationRemarkEmitter *ORE=nullptr)
Returns true if it is legal to hoist LI out of CurLoop.
Definition LICM.cpp:916
LLVM_ABI bool isDereferenceablePointer(const Value *V, Type *Ty, const SimplifyQuery &Q, bool IgnoreFree=false)
Equivalent to isDereferenceableAndAlignedPointer with an alignment of 1.
Definition Loads.cpp:264
AAResults AliasAnalysis
Temporary typedef for legacy code that uses a generic AliasAnalysis pointer or reference.
bool capturesNothing(CaptureComponents CC)
Definition ModRef.h:375
LLVM_ABI bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the give value is known to be non-negative.
LLVM_ABI bool promoteLoopAccessesToScalars(const SmallSetVector< Value *, 8 > &, SmallVectorImpl< BasicBlock * > &, SmallVectorImpl< BasicBlock::iterator > &, SmallVectorImpl< MemoryAccess * > &, PredIteratorCache &, LoopInfo *, DominatorTree *, AssumptionCache *AC, const TargetLibraryInfo *, TargetTransformInfo *, Loop *, MemorySSAUpdater &, ICFLoopSafetyInfo *, OptimizationRemarkEmitter *, bool AllowSpeculation, bool HasReadsOutsideSet)
Try to promote memory values to scalars by sinking stores out of the loop and moving loads to before ...
Definition LICM.cpp:1676
bool isNoModRef(const ModRefInfo MRI)
Definition ModRef.h:40
LLVM_ABI bool sinkRegionForLoopNest(DomTreeNode *, AAResults *, LoopInfo *, DominatorTree *, TargetLibraryInfo *, TargetTransformInfo *, Loop *, MemorySSAUpdater &, ICFLoopSafetyInfo *, SinkAndHoistLICMFlags &, OptimizationRemarkEmitter *)
Call sinkRegion on loops contained within the specified loop in order from innermost to outermost.
Definition LICM.cpp:604
bool isRefSet(const ModRefInfo MRI)
Definition ModRef.h:52
LLVM_ABI bool isWritableObject(const Value *Object, bool &ExplicitlyDereferenceableOnly)
Return true if the Object is writable, in the sense that any location based on this pointer that can ...
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:774
LLVM_ABI AAMDNodes merge(const AAMDNodes &Other) const
Given two sets of AAMDNodes applying to potentially different locations, determine the best AAMDNodes...
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...
A lightweight accessor for an operand bundle meant to be passed around by value.
uint32_t getTagID() const
Return the tag of this operand bundle as an integer.