LLVM 24.0.0git
GVN.cpp
Go to the documentation of this file.
1//===- GVN.cpp - Eliminate redundant values and loads ---------------------===//
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 global value numbering to eliminate fully redundant
10// instructions. It also performs simple dead load elimination.
11//
12// Note that this pass does the value numbering itself; it does not use the
13// ValueNumbering analysis passes.
14//
15//===----------------------------------------------------------------------===//
16
18#include "llvm/ADT/DenseMap.h"
20#include "llvm/ADT/Hashing.h"
21#include "llvm/ADT/MapVector.h"
23#include "llvm/ADT/STLExtras.h"
24#include "llvm/ADT/SetVector.h"
27#include "llvm/ADT/Statistic.h"
31#include "llvm/Analysis/CFG.h"
36#include "llvm/Analysis/Loads.h"
46#include "llvm/IR/Attributes.h"
47#include "llvm/IR/BasicBlock.h"
48#include "llvm/IR/Constant.h"
49#include "llvm/IR/Constants.h"
50#include "llvm/IR/DebugLoc.h"
51#include "llvm/IR/Dominators.h"
52#include "llvm/IR/Function.h"
53#include "llvm/IR/InstrTypes.h"
54#include "llvm/IR/Instruction.h"
57#include "llvm/IR/LLVMContext.h"
58#include "llvm/IR/Metadata.h"
59#include "llvm/IR/Module.h"
60#include "llvm/IR/PassManager.h"
62#include "llvm/IR/Type.h"
63#include "llvm/IR/Use.h"
64#include "llvm/IR/Value.h"
66#include "llvm/Pass.h"
70#include "llvm/Support/Debug.h"
78#include <algorithm>
79#include <cassert>
80#include <cstdint>
81#include <optional>
82#include <utility>
83
84using namespace llvm;
85using namespace llvm::VNCoercion;
86using namespace PatternMatch;
87
90
91#define DEBUG_TYPE "gvn"
92
93STATISTIC(NumGVNInstr, "Number of instructions deleted");
94STATISTIC(NumGVNLoad, "Number of loads deleted");
95STATISTIC(NumGVNPRE, "Number of instructions PRE'd");
96STATISTIC(NumGVNBlocks, "Number of blocks merged");
97STATISTIC(NumGVNSimpl, "Number of instructions simplified");
98STATISTIC(NumGVNEqProp, "Number of equalities propagated");
99STATISTIC(NumPRELoad, "Number of loads PRE'd");
100STATISTIC(NumPRELoopLoad, "Number of loop loads PRE'd");
101STATISTIC(NumPRELoadMoved2CEPred,
102 "Number of loads moved to predecessor of a critical edge in PRE");
103
104STATISTIC(IsValueFullyAvailableInBlockNumSpeculationsMax,
105 "Number of blocks speculated as available in "
106 "IsValueFullyAvailableInBlock(), max");
107STATISTIC(MaxBBSpeculationCutoffReachedTimes,
108 "Number of times we we reached gvn-max-block-speculations cut-off "
109 "preventing further exploration");
110
111static cl::opt<bool> GVNEnableScalarPRE("enable-scalar-pre", cl::init(true),
112 cl::Hidden);
113static cl::opt<bool> GVNEnableLoadPRE("enable-load-pre", cl::init(true));
114static cl::opt<bool> GVNEnableLoadInLoopPRE("enable-load-in-loop-pre",
115 cl::init(true));
116static cl::opt<bool>
117GVNEnableSplitBackedgeInLoadPRE("enable-split-backedge-in-load-pre",
118 cl::init(false));
119static cl::opt<bool> GVNEnableMemDep("enable-gvn-memdep", cl::init(true));
120static cl::opt<bool> GVNEnableMemorySSA("enable-gvn-memoryssa",
121 cl::init(false));
122
124 "gvn-scan-users-limit", cl::Hidden, cl::init(100),
125 cl::desc("The number of memory accesses to scan in a block in reaching "
126 "memory values analysis (default = 100)"));
127
129 "gvn-max-num-deps", cl::Hidden, cl::init(100),
130 cl::desc("Max number of dependences to attempt Load PRE (default = 100)"));
131
133 "gvn-max-num-reaching-blocks", cl::Hidden, cl::init(200),
134 cl::desc("Max number of blocks scanned per load in the MemorySSA "
135 "reaching-value analysis (default = 200)"));
136
137// This is based on IsValueFullyAvailableInBlockNumSpeculationsMax stat.
139 "gvn-max-block-speculations", cl::Hidden, cl::init(600),
140 cl::desc("Max number of blocks we're willing to speculate on (and recurse "
141 "into) when deducing if a value is fully available or not in GVN "
142 "(default = 600)"));
143
145 "gvn-max-num-visited-insts", cl::Hidden, cl::init(100),
146 cl::desc("Max number of visited instructions when trying to find "
147 "dominating value of select dependency (default = 100)"));
148
150 "gvn-max-num-insns", cl::Hidden, cl::init(100),
151 cl::desc("Max number of instructions to scan in each basic block in GVN "
152 "(default = 100)"));
153
156 bool Commutative = false;
157 // The type is not necessarily the result type of the expression, it may be
158 // any additional type needed to disambiguate the expression.
159 Type *Ty = nullptr;
161
162 AttributeList Attrs;
163
165
166 bool operator==(const Expression &Other) const {
167 if (Opcode != Other.Opcode)
168 return false;
169 if (Opcode == ~0U || Opcode == ~1U)
170 return true;
171 if (Ty != Other.Ty)
172 return false;
173 if (VarArgs != Other.VarArgs)
174 return false;
175 if ((!Attrs.isEmpty() || !Other.Attrs.isEmpty()) &&
176 !Attrs.intersectWith(Ty->getContext(), Other.Attrs).has_value())
177 return false;
178 return true;
179 }
180
182 return hash_combine(Value.Opcode, Value.Ty,
183 hash_combine_range(Value.VarArgs));
184 }
185};
186
188 static unsigned getHashValue(const GVNPass::Expression &E) {
189 using llvm::hash_value;
190
191 return static_cast<unsigned>(hash_value(E));
192 }
193
194 static bool isEqual(const GVNPass::Expression &LHS,
195 const GVNPass::Expression &RHS) {
196 return LHS == RHS;
197 }
198};
199
200/// Represents a particular available value that we know how to materialize.
201/// Materialization of an AvailableValue never fails. An AvailableValue is
202/// implicitly associated with a rematerialization point which is the
203/// location of the instruction from which it was formed.
205 enum class ValType {
206 SimpleVal, // A simple offsetted value that is accessed.
207 LoadVal, // A value produced by a load.
208 MemIntrin, // A memory intrinsic which is loaded from.
209 UndefVal, // A UndefValue representing a value from dead block (which
210 // is not yet physically removed from the CFG).
211 SelectVal, // A pointer select which is loaded from and for which the load
212 // can be replace by a value select.
213 };
214
215 /// Val - The value that is live out of the block.
217 /// Kind of the live-out value.
219
220 /// Offset - The byte offset in Val that is interesting for the load query.
221 unsigned Offset = 0;
222 /// V1, V2 - The dominating non-clobbered values of SelectVal.
223 Value *V1 = nullptr, *V2 = nullptr;
224
225 static AvailableValue get(Value *V, unsigned Offset = 0) {
226 AvailableValue Res;
227 Res.Val = V;
229 Res.Offset = Offset;
230 return Res;
231 }
232
233 static AvailableValue getMI(MemIntrinsic *MI, unsigned Offset = 0) {
234 AvailableValue Res;
235 Res.Val = MI;
237 Res.Offset = Offset;
238 return Res;
239 }
240
241 static AvailableValue getLoad(LoadInst *Load, unsigned Offset = 0) {
242 AvailableValue Res;
243 Res.Val = Load;
245 Res.Offset = Offset;
246 return Res;
247 }
248
250 AvailableValue Res;
251 Res.Val = nullptr;
253 Res.Offset = 0;
254 return Res;
255 }
256
258 AvailableValue Res;
259 Res.Val = Cond;
261 Res.Offset = 0;
262 Res.V1 = V1;
263 Res.V2 = V2;
264 return Res;
265 }
266
267 bool isSimpleValue() const { return Kind == ValType::SimpleVal; }
268 bool isCoercedLoadValue() const { return Kind == ValType::LoadVal; }
269 bool isMemIntrinValue() const { return Kind == ValType::MemIntrin; }
270 bool isUndefValue() const { return Kind == ValType::UndefVal; }
271 bool isSelectValue() const { return Kind == ValType::SelectVal; }
272
274 assert(isSimpleValue() && "Wrong accessor");
275 return Val;
276 }
277
279 assert(isCoercedLoadValue() && "Wrong accessor");
280 return cast<LoadInst>(Val);
281 }
282
284 assert(isMemIntrinValue() && "Wrong accessor");
285 return cast<MemIntrinsic>(Val);
286 }
287
289 assert(isSelectValue() && "Wrong accessor");
290 return Val;
291 }
292
293 /// Emit code at the specified insertion point to adjust the value defined
294 /// here to the specified type. This handles various coercion cases.
296};
297
298/// Represents an AvailableValue which can be rematerialized at the end of
299/// the associated BasicBlock.
301 /// BB - The basic block in question.
302 BasicBlock *BB = nullptr;
303
304 /// AV - The actual available value.
306
309 Res.BB = BB;
310 Res.AV = std::move(AV);
311 return Res;
312 }
313
315 unsigned Offset = 0) {
316 return get(BB, AvailableValue::get(V, Offset));
317 }
318
322
323 /// Emit code at the end of this block to adjust the value defined here to
324 /// the specified type. This handles various coercion cases.
326 return AV.MaterializeAdjustedValue(Load, BB->getTerminator());
327 }
328};
329
330//===----------------------------------------------------------------------===//
331// ValueTable Internal Functions
332//===----------------------------------------------------------------------===//
333
334GVNPass::Expression GVNPass::ValueTable::createExpr(Instruction *I) {
335 Expression E;
336 E.Ty = I->getType();
337 E.Opcode = I->getOpcode();
338 if (const GCRelocateInst *GCR = dyn_cast<GCRelocateInst>(I)) {
339 // gc.relocate is 'special' call: its second and third operands are
340 // not real values, but indices into statepoint's argument list.
341 // Use the refered to values for purposes of identity.
342 E.VarArgs.push_back(lookupOrAdd(GCR->getOperand(0)));
343 E.VarArgs.push_back(lookupOrAdd(GCR->getBasePtr()));
344 E.VarArgs.push_back(lookupOrAdd(GCR->getDerivedPtr()));
345 } else {
346 for (Use &Op : I->operands())
347 E.VarArgs.push_back(lookupOrAdd(Op));
348 }
349 if (I->isCommutative()) {
350 // Ensure that commutative instructions that only differ by a permutation
351 // of their operands get the same value number by sorting the operand value
352 // numbers. Since commutative operands are the 1st two operands it is more
353 // efficient to sort by hand rather than using, say, std::sort.
354 assert(I->getNumOperands() >= 2 && "Unsupported commutative instruction!");
355 if (E.VarArgs[0] > E.VarArgs[1])
356 std::swap(E.VarArgs[0], E.VarArgs[1]);
357 E.Commutative = true;
358 }
359
360 if (auto *C = dyn_cast<CmpInst>(I)) {
361 // Sort the operand value numbers so x<y and y>x get the same value number.
362 CmpInst::Predicate Predicate = C->getPredicate();
363 if (E.VarArgs[0] > E.VarArgs[1]) {
364 std::swap(E.VarArgs[0], E.VarArgs[1]);
366 }
367 E.Opcode = (C->getOpcode() << 8) | Predicate;
368 E.Commutative = true;
369 } else if (auto *IVI = dyn_cast<InsertValueInst>(I)) {
370 E.VarArgs.append(IVI->idx_begin(), IVI->idx_end());
371 } else if (auto *SVI = dyn_cast<ShuffleVectorInst>(I)) {
372 ArrayRef<int> ShuffleMask = SVI->getShuffleMask();
373 E.VarArgs.append(ShuffleMask.begin(), ShuffleMask.end());
374 } else if (auto *CB = dyn_cast<CallBase>(I)) {
375 E.Attrs = CB->getAttributes();
376 }
377
378 return E;
379}
380
381GVNPass::Expression GVNPass::ValueTable::createCmpExpr(
382 unsigned Opcode, CmpInst::Predicate Predicate, Value *LHS, Value *RHS) {
383 assert((Opcode == Instruction::ICmp || Opcode == Instruction::FCmp) &&
384 "Not a comparison!");
387 E.VarArgs.push_back(lookupOrAdd(LHS));
388 E.VarArgs.push_back(lookupOrAdd(RHS));
389
390 // Sort the operand value numbers so x<y and y>x get the same value number.
391 if (E.VarArgs[0] > E.VarArgs[1]) {
392 std::swap(E.VarArgs[0], E.VarArgs[1]);
394 }
395 E.Opcode = (Opcode << 8) | Predicate;
396 E.Commutative = true;
397 return E;
398}
399
400GVNPass::Expression
401GVNPass::ValueTable::createExtractvalueExpr(ExtractValueInst *EI) {
402 assert(EI && "Not an ExtractValueInst?");
404 E.Ty = EI->getType();
405 E.Opcode = 0;
406
407 WithOverflowInst *WO = dyn_cast<WithOverflowInst>(EI->getAggregateOperand());
408 if (WO != nullptr && EI->getNumIndices() == 1 && *EI->idx_begin() == 0) {
409 // EI is an extract from one of our with.overflow intrinsics. Synthesize
410 // a semantically equivalent expression instead of an extract value
411 // expression.
412 E.Opcode = WO->getBinaryOp();
413 E.VarArgs.push_back(lookupOrAdd(WO->getLHS()));
414 E.VarArgs.push_back(lookupOrAdd(WO->getRHS()));
415 return E;
416 }
417
418 // Not a recognised intrinsic. Fall back to producing an extract value
419 // expression.
420 E.Opcode = EI->getOpcode();
421 for (Use &Op : EI->operands())
422 E.VarArgs.push_back(lookupOrAdd(Op));
423
424 append_range(E.VarArgs, EI->indices());
425
426 return E;
427}
428
429GVNPass::Expression GVNPass::ValueTable::createGEPExpr(GetElementPtrInst *GEP) {
431 Type *PtrTy = GEP->getType()->getScalarType();
432 const DataLayout &DL = GEP->getDataLayout();
433 unsigned BitWidth = DL.getIndexTypeSizeInBits(PtrTy);
434 SmallMapVector<Value *, APInt, 4> VariableOffsets;
435 APInt ConstantOffset(BitWidth, 0);
436 if (GEP->collectOffset(DL, BitWidth, VariableOffsets, ConstantOffset)) {
437 // Convert into offset representation, to recognize equivalent address
438 // calculations that use different type encoding.
439 LLVMContext &Context = GEP->getContext();
440 E.Opcode = GEP->getOpcode();
441 E.Ty = nullptr;
442 E.VarArgs.push_back(lookupOrAdd(GEP->getPointerOperand()));
443 for (const auto &[V, Scale] : VariableOffsets) {
444 E.VarArgs.push_back(lookupOrAdd(V));
445 E.VarArgs.push_back(lookupOrAdd(ConstantInt::get(Context, Scale)));
446 }
447 if (!ConstantOffset.isZero())
448 E.VarArgs.push_back(
449 lookupOrAdd(ConstantInt::get(Context, ConstantOffset)));
450 } else {
451 // If converting to offset representation fails (for scalable vectors),
452 // fall back to type-based implementation.
453 E.Opcode = GEP->getOpcode();
454 E.Ty = GEP->getSourceElementType();
455 for (Use &Op : GEP->operands())
456 E.VarArgs.push_back(lookupOrAdd(Op));
457 }
458 return E;
459}
460
461//===----------------------------------------------------------------------===//
462// ValueTable External Functions
463//===----------------------------------------------------------------------===//
464
465GVNPass::ValueTable::ValueTable() = default;
466GVNPass::ValueTable::ValueTable(const ValueTable &) = default;
467GVNPass::ValueTable::ValueTable(ValueTable &&) = default;
468GVNPass::ValueTable::~ValueTable() = default;
469GVNPass::ValueTable &
470GVNPass::ValueTable::operator=(const GVNPass::ValueTable &Arg) = default;
471
472/// add - Insert a value into the table with a specified value number.
473void GVNPass::ValueTable::add(Value *V, uint32_t Num) {
474 ValueNumbering.insert(std::make_pair(V, Num));
475 if (PHINode *PN = dyn_cast<PHINode>(V))
476 NumberingPhi[Num] = PN;
477}
478
479/// Include the incoming memory state into the hash of the expression for the
480/// given instruction. If the incoming memory state is:
481/// * LiveOnEntry, add the value number of the entry block,
482/// * a MemoryPhi, add the value number of the basic block corresponding to that
483/// MemoryPhi,
484/// * a MemoryDef, add the value number of the memory setting instruction.
485void GVNPass::ValueTable::addMemoryStateToExp(Instruction *I, Expression &Exp) {
486 assert(MSSA && "addMemoryStateToExp should not be called without MemorySSA");
487 assert(MSSA->getMemoryAccess(I) && "Instruction does not access memory");
488 MemoryAccess *MA = MSSA->getSkipSelfWalker()->getClobberingMemoryAccess(I);
489 Exp.VarArgs.push_back(lookupOrAdd(MA));
490}
491
492uint32_t GVNPass::ValueTable::lookupOrAddCall(CallInst *C) {
493 // FIXME: Currently the calls which may access the thread id may
494 // be considered as not accessing the memory. But this is
495 // problematic for coroutines, since coroutines may resume in a
496 // different thread. So we disable the optimization here for the
497 // correctness. However, it may block many other correct
498 // optimizations. Revert this one when we detect the memory
499 // accessing kind more precisely.
500 if (C->getFunction()->isPresplitCoroutine()) {
501 ValueNumbering[C] = NextValueNumber;
502 return NextValueNumber++;
503 }
504
505 // Do not combine convergent calls since they implicitly depend on the set of
506 // threads that is currently executing, and they might be in different basic
507 // blocks.
508 if (C->isConvergent()) {
509 ValueNumbering[C] = NextValueNumber;
510 return NextValueNumber++;
511 }
512
513 // Conservatively assign unique value numbers to calls with operand bundles.
514 // TODO: Bundle names could be included in the value numbering expression to
515 // allow combining calls with identical bundles.
516 if (C->hasOperandBundles()) {
517 ValueNumbering[C] = NextValueNumber;
518 return NextValueNumber++;
519 }
520
521 if (AA->doesNotAccessMemory(C)) {
522 Expression Exp = createExpr(C);
523 uint32_t E = assignExpNewValueNum(Exp).first;
524 ValueNumbering[C] = E;
525 return E;
526 }
527
528 if (MD && AA->onlyReadsMemory(C)) {
529 Expression Exp = createExpr(C);
530 auto [E, IsValNumNew] = assignExpNewValueNum(Exp);
531 if (IsValNumNew) {
532 ValueNumbering[C] = E;
533 return E;
534 }
535
536 MemDepResult LocalDep = MD->getDependency(C);
537
538 if (!LocalDep.isDef() && !LocalDep.isNonLocal()) {
539 ValueNumbering[C] = NextValueNumber;
540 return NextValueNumber++;
541 }
542
543 if (LocalDep.isDef()) {
544 // For masked load/store intrinsics, the local_dep may actually be
545 // a normal load or store instruction.
546 CallInst *LocalDepCall = dyn_cast<CallInst>(LocalDep.getInst());
547
548 if (!LocalDepCall || LocalDepCall->arg_size() != C->arg_size()) {
549 ValueNumbering[C] = NextValueNumber;
550 return NextValueNumber++;
551 }
552
553 for (unsigned I = 0, E = C->arg_size(); I < E; ++I) {
554 uint32_t CVN = lookupOrAdd(C->getArgOperand(I));
555 uint32_t LocalDepCallVN = lookupOrAdd(LocalDepCall->getArgOperand(I));
556 if (CVN != LocalDepCallVN) {
557 ValueNumbering[C] = NextValueNumber;
558 return NextValueNumber++;
559 }
560 }
561
562 uint32_t V = lookupOrAdd(LocalDepCall);
563 ValueNumbering[C] = V;
564 return V;
565 }
566
567 // Non-local case.
569 MD->getNonLocalCallDependency(C);
570 // FIXME: Move the checking logic to MemDep!
571 CallInst *CDep = nullptr;
572
573 // Check to see if we have a single dominating call instruction that is
574 // identical to C.
575 for (const NonLocalDepEntry &I : Deps) {
576 if (I.getResult().isNonLocal())
577 continue;
578
579 // We don't handle non-definitions. If we already have a call, reject
580 // instruction dependencies.
581 if (!I.getResult().isDef() || CDep != nullptr) {
582 CDep = nullptr;
583 break;
584 }
585
586 CallInst *NonLocalDepCall = dyn_cast<CallInst>(I.getResult().getInst());
587 // FIXME: All duplicated with non-local case.
588 if (NonLocalDepCall && DT->properlyDominates(I.getBB(), C->getParent())) {
589 CDep = NonLocalDepCall;
590 continue;
591 }
592
593 CDep = nullptr;
594 break;
595 }
596
597 if (!CDep) {
598 ValueNumbering[C] = NextValueNumber;
599 return NextValueNumber++;
600 }
601
602 if (CDep->arg_size() != C->arg_size()) {
603 ValueNumbering[C] = NextValueNumber;
604 return NextValueNumber++;
605 }
606 for (unsigned I = 0, E = C->arg_size(); I < E; ++I) {
607 uint32_t CVN = lookupOrAdd(C->getArgOperand(I));
608 uint32_t CDepVN = lookupOrAdd(CDep->getArgOperand(I));
609 if (CVN != CDepVN) {
610 ValueNumbering[C] = NextValueNumber;
611 return NextValueNumber++;
612 }
613 }
614
615 uint32_t V = lookupOrAdd(CDep);
616 ValueNumbering[C] = V;
617 return V;
618 }
619
620 if (MSSA && IsMSSAEnabled && AA->onlyReadsMemory(C)) {
621 Expression Exp = createExpr(C);
622 addMemoryStateToExp(C, Exp);
623 auto [V, _] = assignExpNewValueNum(Exp);
624 ValueNumbering[C] = V;
625 return V;
626 }
627
628 ValueNumbering[C] = NextValueNumber;
629 return NextValueNumber++;
630}
631
632/// Returns the value number for the specified load or store instruction.
633uint32_t GVNPass::ValueTable::computeLoadStoreVN(Instruction *I) {
634 if (!MSSA || !IsMSSAEnabled) {
635 ValueNumbering[I] = NextValueNumber;
636 return NextValueNumber++;
637 }
638
640 Exp.Ty = I->getType();
641 Exp.Opcode = I->getOpcode();
642 for (Use &Op : I->operands())
643 Exp.VarArgs.push_back(lookupOrAdd(Op));
644 addMemoryStateToExp(I, Exp);
645
646 auto [V, _] = assignExpNewValueNum(Exp);
647 ValueNumbering[I] = V;
648 return V;
649}
650
651/// Returns true if a value number exists for the specified value.
652bool GVNPass::ValueTable::exists(Value *V) const {
653 return ValueNumbering.contains(V);
654}
655
656uint32_t GVNPass::ValueTable::lookupOrAdd(MemoryAccess *MA) {
657 return MSSA->isLiveOnEntryDef(MA) || isa<MemoryPhi>(MA)
658 ? lookupOrAdd(MA->getBlock())
659 : lookupOrAdd(cast<MemoryUseOrDef>(MA)->getMemoryInst());
660}
661
662/// lookupOrAdd - Returns the value number for the specified value, assigning
663/// it a new number if it did not have one before.
664uint32_t GVNPass::ValueTable::lookupOrAdd(Value *V) {
665 auto VI = ValueNumbering.find(V);
666 if (VI != ValueNumbering.end())
667 return VI->second;
668
669 auto *I = dyn_cast<Instruction>(V);
670 if (!I) {
671 ValueNumbering[V] = NextValueNumber;
672 if (isa<BasicBlock>(V))
673 NumberingBB[NextValueNumber] = cast<BasicBlock>(V);
674 return NextValueNumber++;
675 }
676
677 Expression Exp;
678 switch (I->getOpcode()) {
679 case Instruction::Call:
680 return lookupOrAddCall(cast<CallInst>(I));
681 case Instruction::FNeg:
682 case Instruction::Add:
683 case Instruction::FAdd:
684 case Instruction::Sub:
685 case Instruction::FSub:
686 case Instruction::Mul:
687 case Instruction::FMul:
688 case Instruction::UDiv:
689 case Instruction::SDiv:
690 case Instruction::FDiv:
691 case Instruction::URem:
692 case Instruction::SRem:
693 case Instruction::FRem:
694 case Instruction::Shl:
695 case Instruction::LShr:
696 case Instruction::AShr:
697 case Instruction::And:
698 case Instruction::Or:
699 case Instruction::Xor:
700 case Instruction::ICmp:
701 case Instruction::FCmp:
702 case Instruction::Trunc:
703 case Instruction::ZExt:
704 case Instruction::SExt:
705 case Instruction::FPToUI:
706 case Instruction::FPToSI:
707 case Instruction::UIToFP:
708 case Instruction::SIToFP:
709 case Instruction::FPTrunc:
710 case Instruction::FPExt:
711 case Instruction::PtrToInt:
712 case Instruction::PtrToAddr:
713 case Instruction::IntToPtr:
714 case Instruction::AddrSpaceCast:
715 case Instruction::BitCast:
716 case Instruction::Select:
717 case Instruction::Freeze:
718 case Instruction::ExtractElement:
719 case Instruction::InsertElement:
720 case Instruction::ShuffleVector:
721 case Instruction::InsertValue:
722 Exp = createExpr(I);
723 break;
724 case Instruction::GetElementPtr:
725 Exp = createGEPExpr(cast<GetElementPtrInst>(I));
726 break;
727 case Instruction::ExtractValue:
728 Exp = createExtractvalueExpr(cast<ExtractValueInst>(I));
729 break;
730 case Instruction::PHI:
731 ValueNumbering[V] = NextValueNumber;
732 NumberingPhi[NextValueNumber] = cast<PHINode>(V);
733 return NextValueNumber++;
734 case Instruction::Load:
735 case Instruction::Store:
736 return computeLoadStoreVN(I);
737 default:
738 ValueNumbering[V] = NextValueNumber;
739 return NextValueNumber++;
740 }
741
742 uint32_t E = assignExpNewValueNum(Exp).first;
743 ValueNumbering[V] = E;
744 return E;
745}
746
747/// Returns the value number of the specified value. Fails if
748/// the value has not yet been numbered.
749uint32_t GVNPass::ValueTable::lookup(Value *V, bool Verify) const {
750 auto VI = ValueNumbering.find(V);
751 if (Verify) {
752 assert(VI != ValueNumbering.end() && "Value not numbered?");
753 return VI->second;
754 }
755 return (VI != ValueNumbering.end()) ? VI->second : 0;
756}
757
758/// Returns the value number of the given comparison,
759/// assigning it a new number if it did not have one before. Useful when
760/// we deduced the result of a comparison, but don't immediately have an
761/// instruction realizing that comparison to hand.
762uint32_t GVNPass::ValueTable::lookupOrAddCmp(unsigned Opcode,
763 CmpInst::Predicate Predicate,
764 Value *LHS, Value *RHS) {
765 Expression Exp = createCmpExpr(Opcode, Predicate, LHS, RHS);
766 return assignExpNewValueNum(Exp).first;
767}
768
769/// Returns the value number of ptrtoint \p Ptr to \Ty.
770uint32_t GVNPass::ValueTable::lookupPtrToInt(Value *Ptr, Type *Ty) {
771 Expression Exp(Instruction::PtrToInt);
772 Exp.Ty = Ty;
773 Exp.VarArgs.push_back(lookupOrAdd(Ptr));
774 return ExpressionNumbering.lookup(Exp);
775}
776
777/// Remove all entries from the ValueTable.
779 ValueNumbering.clear();
780 ExpressionNumbering.clear();
781 NumberingPhi.clear();
782 NumberingBB.clear();
783 PhiTranslateTable.clear();
784 NextValueNumber = 1;
785 Expressions.clear();
786 ExprIdx.clear();
787 NextExprNumber = 0;
788}
789
790/// Remove a value from the value numbering.
792 uint32_t Num = ValueNumbering.lookup(V);
793 ValueNumbering.erase(V);
794 // If V is PHINode, V <--> value number is an one-to-one mapping.
795 if (isa<PHINode>(V))
796 NumberingPhi.erase(Num);
797 else if (isa<BasicBlock>(V))
798 NumberingBB.erase(Num);
799}
800
801/// verifyRemoved - Verify that the value is removed from all internal data
802/// structures.
803void GVNPass::ValueTable::verifyRemoved(const Value *V) const {
804 assert(!ValueNumbering.contains(V) &&
805 "Inst still occurs in value numbering map!");
806}
807
808//===----------------------------------------------------------------------===//
809// LeaderMap External Functions
810//===----------------------------------------------------------------------===//
811
812/// Push a new Value to the LeaderTable onto the list for its value number.
813void GVNPass::LeaderMap::insert(uint32_t N, Value *V, const BasicBlock *BB) {
814 const auto &[It, Inserted] = NumToLeaders.try_emplace(N, V, BB, nullptr);
815 if (!Inserted) {
816 // Key already exists: insert new node after the head.
817 auto *NewSlot = TableAllocator.Allocate<LeaderListNode>();
818 new (NewSlot) LeaderListNode(V, BB, It->second.Next);
819 It->second.Next = NewSlot;
820 }
821}
822
823/// Scan the list of values corresponding to a given
824/// value number, and remove the given instruction if encountered.
825void GVNPass::LeaderMap::erase(uint32_t N, Instruction *I,
826 const BasicBlock *BB) {
827 auto It = NumToLeaders.find(N);
828 if (It == NumToLeaders.end())
829 return;
830
831 LeaderListNode *Prev = nullptr;
832 LeaderListNode *Curr = &It->second;
833
834 while (Curr && (Curr->Entry.Val != I || Curr->Entry.BB != BB)) {
835 Prev = Curr;
836 Curr = Curr->Next;
837 }
838
839 if (!Curr)
840 return;
841
842 if (Prev) {
843 // Non-head node: unlink and destroy.
844 Prev->Next = Curr->Next;
845 Curr->~LeaderListNode();
846 TableAllocator.Deallocate<LeaderListNode>(Curr);
847 } else {
848 // Head node (stored by value in DenseMap).
849 if (!Curr->Next) {
850 // Only node; erase from map (DenseMap calls the destructor).
851 NumToLeaders.erase(It);
852 } else {
853 // Move second node's data into head, then destroy second node.
854 LeaderListNode *Next = Curr->Next;
855 Curr->Entry.Val = std::move(Next->Entry.Val);
856 Curr->Entry.BB = Next->Entry.BB;
857 Curr->Next = Next->Next;
858 Next->~LeaderListNode();
859 TableAllocator.Deallocate<LeaderListNode>(Next);
860 }
861 }
862}
863
864//===----------------------------------------------------------------------===//
865// GVN Pass
866//===----------------------------------------------------------------------===//
867
869 return Options.AllowScalarPRE.value_or(GVNEnableScalarPRE);
870}
871
873 return Options.AllowLoadPRE.value_or(GVNEnableLoadPRE);
874}
875
877 return Options.AllowLoadInLoopPRE.value_or(GVNEnableLoadInLoopPRE);
878}
879
881 return Options.AllowLoadPRESplitBackedge.value_or(
883}
884
886 // MemDep and MemorySSA are mutually exclusive. parseGVNOptions() enforces
887 // this for pass parameters, but the -enable-gvn-{memdep,memoryssa} cl::opt
888 // overrides default independently, so honor MemorySSA winning here too.
889 if (isMemorySSAEnabled())
890 return Options.AllowMemDep.value_or(false);
891 return Options.AllowMemDep.value_or(GVNEnableMemDep);
892}
893
895 return Options.AllowMemorySSA.value_or(GVNEnableMemorySSA);
896}
897
899 // FIXME: The order of evaluation of these 'getResult' calls is very
900 // significant! Re-ordering these variables will cause GVN when run alone to
901 // be less effective! We should fix memdep and basic-aa to not exhibit this
902 // behavior, but until then don't change the order here.
903 auto &AC = AM.getResult<AssumptionAnalysis>(F);
904 auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
905 auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
906 auto &AA = AM.getResult<AAManager>(F);
907 auto *MemDep =
909 auto &LI = AM.getResult<LoopAnalysis>(F);
910 auto *MSSA = AM.getCachedResult<MemorySSAAnalysis>(F);
911 if (isMemorySSAEnabled() && !MSSA) {
912 assert(!MemDep &&
913 "On-demand computation of MemSSA implies that MemDep is disabled!");
914 MSSA = &AM.getResult<MemorySSAAnalysis>(F);
915 }
917 bool Changed = runImpl(F, AC, DT, TLI, AA, MemDep, LI, &ORE,
918 MSSA ? &MSSA->getMSSA() : nullptr);
919 if (!Changed)
920 return PreservedAnalyses::all();
924 if (MSSA)
927 return PA;
928}
929
931 raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
932 static_cast<PassInfoMixin<GVNPass> *>(this)->printPipeline(
933 OS, MapClassName2PassName);
934
935 OS << '<';
936 if (Options.AllowScalarPRE != std::nullopt)
937 OS << (*Options.AllowScalarPRE ? "" : "no-") << "scalar-pre;";
938 if (Options.AllowLoadPRE != std::nullopt)
939 OS << (*Options.AllowLoadPRE ? "" : "no-") << "load-pre;";
940 if (Options.AllowLoadPRESplitBackedge != std::nullopt)
941 OS << (*Options.AllowLoadPRESplitBackedge ? "" : "no-")
942 << "split-backedge-load-pre;";
943 if (Options.AllowMemDep != std::nullopt)
944 OS << (*Options.AllowMemDep ? "" : "no-") << "memdep;";
945 if (Options.AllowMemorySSA != std::nullopt)
946 OS << (*Options.AllowMemorySSA ? "" : "no-") << "memoryssa";
947 OS << '>';
948}
949
951 salvageKnowledge(I, AC);
953 removeInstruction(I);
954}
955
956enum class AvailabilityState : char {
957 /// We know the block *is not* fully available. This is a fixpoint.
959 /// We know the block *is* fully available. This is a fixpoint.
961 /// We do not know whether the block is fully available or not,
962 /// but we are currently speculating that it will be.
963 /// If it would have turned out that the block was, in fact, not fully
964 /// available, this would have been cleaned up into an Unavailable.
966};
967
968/// Return true if we can prove that the value
969/// we're analyzing is fully available in the specified block. As we go, keep
970/// track of which blocks we know are fully alive in FullyAvailableBlocks. This
971/// map is actually a tri-state map with the following values:
972/// 0) we know the block *is not* fully available.
973/// 1) we know the block *is* fully available.
974/// 2) we do not know whether the block is fully available or not, but we are
975/// currently speculating that it will be.
977 BasicBlock *BB,
978 DenseMap<BasicBlock *, AvailabilityState> &FullyAvailableBlocks) {
980 std::optional<BasicBlock *> UnavailableBB;
981
982 // The number of times we didn't find an entry for a block in a map and
983 // optimistically inserted an entry marking block as speculatively available.
984 unsigned NumNewNewSpeculativelyAvailableBBs = 0;
985
986#ifndef NDEBUG
987 SmallPtrSet<BasicBlock *, 32> NewSpeculativelyAvailableBBs;
989#endif
990
991 Worklist.emplace_back(BB);
992 while (!Worklist.empty()) {
993 BasicBlock *CurrBB = Worklist.pop_back_val(); // LoadFO - depth-first!
994 // Optimistically assume that the block is Speculatively Available and check
995 // to see if we already know about this block in one lookup.
996 std::pair<DenseMap<BasicBlock *, AvailabilityState>::iterator, bool> IV =
997 FullyAvailableBlocks.try_emplace(
999 AvailabilityState &State = IV.first->second;
1000
1001 // Did the entry already exist for this block?
1002 if (!IV.second) {
1003 if (State == AvailabilityState::Unavailable) {
1004 UnavailableBB = CurrBB;
1005 break; // Backpropagate unavailability info.
1006 }
1007
1008#ifndef NDEBUG
1009 AvailableBBs.emplace_back(CurrBB);
1010#endif
1011 continue; // Don't recurse further, but continue processing worklist.
1012 }
1013
1014 // No entry found for block.
1015 ++NumNewNewSpeculativelyAvailableBBs;
1016 bool OutOfBudget = NumNewNewSpeculativelyAvailableBBs > MaxBBSpeculations;
1017
1018 // If we have exhausted our budget, mark this block as unavailable.
1019 // Also, if this block has no predecessors, the value isn't live-in here.
1020 if (OutOfBudget || pred_empty(CurrBB)) {
1021 MaxBBSpeculationCutoffReachedTimes += (int)OutOfBudget;
1023 UnavailableBB = CurrBB;
1024 break; // Backpropagate unavailability info.
1025 }
1026
1027 // Tentatively consider this block as speculatively available.
1028#ifndef NDEBUG
1029 NewSpeculativelyAvailableBBs.insert(CurrBB);
1030#endif
1031 // And further recurse into block's predecessors, in depth-first order!
1032 Worklist.append(pred_begin(CurrBB), pred_end(CurrBB));
1033 }
1034
1035#if LLVM_ENABLE_STATS
1036 IsValueFullyAvailableInBlockNumSpeculationsMax.updateMax(
1037 NumNewNewSpeculativelyAvailableBBs);
1038#endif
1039
1040 // If the block isn't marked as fixpoint yet
1041 // (the Unavailable and Available states are fixpoints).
1042 auto MarkAsFixpointAndEnqueueSuccessors =
1043 [&](BasicBlock *BB, AvailabilityState FixpointState) {
1044 auto It = FullyAvailableBlocks.find(BB);
1045 if (It == FullyAvailableBlocks.end())
1046 return; // Never queried this block, leave as-is.
1047 switch (AvailabilityState &State = It->second) {
1050 return; // Don't backpropagate further, continue processing worklist.
1052 State = FixpointState;
1053#ifndef NDEBUG
1054 assert(NewSpeculativelyAvailableBBs.erase(BB) &&
1055 "Found a speculatively available successor leftover?");
1056#endif
1057 // Queue successors for further processing.
1058 Worklist.append(succ_begin(BB), succ_end(BB));
1059 return;
1060 }
1061 };
1062
1063 if (UnavailableBB) {
1064 // Okay, we have encountered an unavailable block.
1065 // Mark speculatively available blocks reachable from UnavailableBB as
1066 // unavailable as well. Paths are terminated when they reach blocks not in
1067 // FullyAvailableBlocks or they are not marked as speculatively available.
1068 Worklist.clear();
1069 Worklist.append(succ_begin(*UnavailableBB), succ_end(*UnavailableBB));
1070 while (!Worklist.empty())
1071 MarkAsFixpointAndEnqueueSuccessors(Worklist.pop_back_val(),
1073 }
1074
1075#ifndef NDEBUG
1076 Worklist.clear();
1077 for (BasicBlock *AvailableBB : AvailableBBs)
1078 Worklist.append(succ_begin(AvailableBB), succ_end(AvailableBB));
1079 while (!Worklist.empty())
1080 MarkAsFixpointAndEnqueueSuccessors(Worklist.pop_back_val(),
1082
1083 assert(NewSpeculativelyAvailableBBs.empty() &&
1084 "Must have fixed all the new speculatively available blocks.");
1085#endif
1086
1087 return !UnavailableBB;
1088}
1089
1090/// If the specified OldValue exists in ValuesPerBlock, replace its value with
1091/// NewValue.
1093 SmallVectorImpl<AvailableValueInBlock> &ValuesPerBlock, Value *OldValue,
1094 Value *NewValue) {
1095 for (AvailableValueInBlock &V : ValuesPerBlock) {
1096 if (V.AV.Val == OldValue)
1097 V.AV.Val = NewValue;
1098 if (V.AV.isSelectValue()) {
1099 if (V.AV.V1 == OldValue)
1100 V.AV.V1 = NewValue;
1101 if (V.AV.V2 == OldValue)
1102 V.AV.V2 = NewValue;
1103 }
1104 }
1105}
1106
1107/// Given a set of loads specified by ValuesPerBlock,
1108/// construct SSA form, allowing us to eliminate Load. This returns the value
1109/// that should be used at Load's definition site.
1110static Value *
1113 GVNPass &GVN) {
1114 // Check for the fully redundant, dominating load case. In this case, we can
1115 // just use the dominating value directly.
1116 if (ValuesPerBlock.size() == 1 &&
1117 GVN.getDominatorTree().properlyDominates(ValuesPerBlock[0].BB,
1118 Load->getParent())) {
1119 assert(!ValuesPerBlock[0].AV.isUndefValue() &&
1120 "Dead BB dominate this block");
1121 return ValuesPerBlock[0].MaterializeAdjustedValue(Load);
1122 }
1123
1124 // Otherwise, we have to construct SSA form.
1126 SSAUpdater SSAUpdate(&NewPHIs);
1127 SSAUpdate.Initialize(Load->getType(), Load->getName());
1128
1129 for (const AvailableValueInBlock &AV : ValuesPerBlock) {
1130 BasicBlock *BB = AV.BB;
1131
1132 if (AV.AV.isUndefValue())
1133 continue;
1134
1135 if (SSAUpdate.HasValueForBlock(BB))
1136 continue;
1137
1138 // If the value is the load that we will be eliminating, and the block it's
1139 // available in is the block that the load is in, then don't add it as
1140 // SSAUpdater will resolve the value to the relevant phi which may let it
1141 // avoid phi construction entirely if there's actually only one value.
1142 if (BB == Load->getParent() &&
1143 ((AV.AV.isSimpleValue() && AV.AV.getSimpleValue() == Load) ||
1144 (AV.AV.isCoercedLoadValue() && AV.AV.getCoercedLoadValue() == Load)))
1145 continue;
1146
1147 SSAUpdate.AddAvailableValue(BB, AV.MaterializeAdjustedValue(Load));
1148 }
1149
1150 // Perform PHI construction.
1151 return SSAUpdate.GetValueInMiddleOfBlock(Load->getParent());
1152}
1153
1155 Instruction *InsertPt) const {
1156 Value *Res;
1157 Type *LoadTy = Load->getType();
1158 const DataLayout &DL = Load->getDataLayout();
1159 if (isSimpleValue()) {
1160 Res = getSimpleValue();
1161 if (Res->getType() != LoadTy) {
1162 Res = getValueForLoad(Res, Offset, LoadTy, InsertPt, Load->getFunction());
1163
1164 LLVM_DEBUG(dbgs() << "GVN COERCED NONLOCAL VAL:\nOffset: " << Offset
1165 << " " << *getSimpleValue() << '\n'
1166 << *Res << '\n'
1167 << "\n\n\n");
1168 }
1169 } else if (isCoercedLoadValue()) {
1170 LoadInst *CoercedLoad = getCoercedLoadValue();
1171 if (CoercedLoad->getType() == LoadTy && Offset == 0) {
1172 Res = CoercedLoad;
1173 combineMetadataForCSE(CoercedLoad, Load, false);
1174 } else {
1175 Res = getValueForLoad(CoercedLoad, Offset, LoadTy, InsertPt,
1176 Load->getFunction());
1177 // We are adding a new user for this load, for which the original
1178 // metadata may not hold. Additionally, the new load may have a different
1179 // size and type, so their metadata cannot be combined in any
1180 // straightforward way.
1181 // Drop all metadata that is not known to cause immediate UB on violation,
1182 // unless the load has !noundef, in which case all metadata violations
1183 // will be promoted to UB.
1184 // !noalias and !alias.scope are kept: the load is not moved and still
1185 // accesses the same memory, and these are independent of the load type
1186 // and offset, so they remain valid for the coerced result.
1187 if (!CoercedLoad->hasMetadata(LLVMContext::MD_noundef))
1188 CoercedLoad->dropUnknownNonDebugMetadata(
1189 {LLVMContext::MD_dereferenceable,
1190 LLVMContext::MD_dereferenceable_or_null,
1191 LLVMContext::MD_invariant_load, LLVMContext::MD_invariant_group,
1192 LLVMContext::MD_alias_scope, LLVMContext::MD_noalias});
1193 LLVM_DEBUG(dbgs() << "GVN COERCED NONLOCAL LOAD:\nOffset: " << Offset
1194 << " " << *getCoercedLoadValue() << '\n'
1195 << *Res << '\n'
1196 << "\n\n\n");
1197 }
1198 } else if (isMemIntrinValue()) {
1200 InsertPt, DL);
1201 LLVM_DEBUG(dbgs() << "GVN COERCED NONLOCAL MEM INTRIN:\nOffset: " << Offset
1202 << " " << *getMemIntrinValue() << '\n'
1203 << *Res << '\n'
1204 << "\n\n\n");
1205 } else if (isSelectValue()) {
1206 // Introduce a new value select for a load from an eligible pointer select.
1208 assert(V1 && V2 && "both value operands of the select must be present");
1209 Res = SelectInst::Create(Cond, V1, V2, "", InsertPt->getIterator());
1210 // We use the DebugLoc from the original load here, as this instruction
1211 // materializes the value that would previously have been loaded.
1212 cast<SelectInst>(Res)->setDebugLoc(Load->getDebugLoc());
1213 } else {
1214 llvm_unreachable("Should not materialize value from dead block");
1215 }
1216 assert(Res && "failed to materialize?");
1217 return Res;
1218}
1219
1220static bool isLifetimeStart(const Instruction *Inst) {
1221 if (const IntrinsicInst* II = dyn_cast<IntrinsicInst>(Inst))
1222 return II->getIntrinsicID() == Intrinsic::lifetime_start;
1223 return false;
1224}
1225
1226/// Assuming To can be reached from both From and Between, does Between lie on
1227/// every path from From to To?
1228static bool liesBetween(const Instruction *From, Instruction *Between,
1229 const Instruction *To, const DominatorTree *DT) {
1230 if (From->getParent() == Between->getParent())
1231 return DT->dominates(From, Between);
1233 Exclusion.insert(Between->getParent());
1234 return !isPotentiallyReachable(From, To, &Exclusion, DT);
1235}
1236
1238 const DominatorTree *DT) {
1239 Value *PtrOp = Load->getPointerOperand();
1240 if (!PtrOp->hasUseList())
1241 return nullptr;
1242
1243 Instruction *OtherAccess = nullptr;
1244
1245 for (auto *U : PtrOp->users()) {
1246 if (U != Load && (isa<LoadInst>(U) || isa<StoreInst>(U))) {
1247 auto *I = cast<Instruction>(U);
1248 if (I->getFunction() == Load->getFunction() && DT->dominates(I, Load)) {
1249 // Use the most immediately dominating value.
1250 if (OtherAccess) {
1251 if (DT->dominates(OtherAccess, I))
1252 OtherAccess = I;
1253 else
1254 assert(U == OtherAccess || DT->dominates(I, OtherAccess));
1255 } else
1256 OtherAccess = I;
1257 }
1258 }
1259 }
1260
1261 if (OtherAccess)
1262 return OtherAccess;
1263
1264 // There is no dominating use, check if we can find a closest non-dominating
1265 // use that lies between any other potentially available use and Load.
1266 for (auto *U : PtrOp->users()) {
1267 if (U != Load && (isa<LoadInst>(U) || isa<StoreInst>(U))) {
1268 auto *I = cast<Instruction>(U);
1269 if (I->getFunction() == Load->getFunction() &&
1270 isPotentiallyReachable(I, Load, nullptr, DT)) {
1271 if (OtherAccess) {
1272 if (liesBetween(OtherAccess, I, Load, DT)) {
1273 OtherAccess = I;
1274 } else if (!liesBetween(I, OtherAccess, Load, DT)) {
1275 // These uses are both partially available at Load were it not for
1276 // the clobber, but neither lies strictly after the other.
1277 OtherAccess = nullptr;
1278 break;
1279 } // else: keep current OtherAccess since it lies between U and
1280 // Load.
1281 } else {
1282 OtherAccess = I;
1283 }
1284 }
1285 }
1286 }
1287
1288 return OtherAccess;
1289}
1290
1291/// Try to locate the three instruction involved in a missed
1292/// load-elimination case that is due to an intervening store.
1294 const DominatorTree *DT,
1296 using namespace ore;
1297
1298 OptimizationRemarkMissed R(DEBUG_TYPE, "LoadClobbered", Load);
1299 R << "load of type " << NV("Type", Load->getType()) << " not eliminated"
1300 << setExtraArgs();
1301
1302 const Instruction *OtherAccess = findMayClobberedPtrAccess(Load, DT);
1303 if (OtherAccess)
1304 R << " in favor of " << NV("OtherAccess", OtherAccess);
1305
1306 R << " because it is clobbered by " << NV("ClobberedBy", DepInst);
1307
1308 ORE->emit(R);
1309}
1310
1311// Find a dominating value for Loc memory location in the extended basic block
1312// (chain of basic blocks with single predecessors) starting From instruction.
1313// Returns the value from a matching load or a simple store to the same pointer.
1315 Instruction *From, AAResults *AA) {
1316 uint32_t NumVisitedInsts = 0;
1317 BasicBlock *FromBB = From->getParent();
1318 BatchAAResults BatchAA(*AA);
1319 for (BasicBlock *BB = FromBB; BB; BB = BB->getSinglePredecessor())
1320 for (auto *Inst = BB == FromBB ? From : BB->getTerminator();
1321 Inst != nullptr; Inst = Inst->getPrevNode()) {
1322 // Stop the search if limit is reached.
1323 if (++NumVisitedInsts > MaxNumVisitedInsts)
1324 return nullptr;
1325 if (isModSet(BatchAA.getModRefInfo(Inst, Loc))) {
1326 // A simple store to the exact location can forward its value.
1327 if (auto *SI = dyn_cast<StoreInst>(Inst))
1328 if (SI->isSimple() && SI->getPointerOperand() == Loc.Ptr &&
1329 SI->getValueOperand()->getType() == LoadTy)
1330 return SI->getValueOperand();
1331 return nullptr;
1332 }
1333 if (auto *LI = dyn_cast<LoadInst>(Inst))
1334 if (LI->getPointerOperand() == Loc.Ptr && LI->getType() == LoadTy)
1335 return LI;
1336 }
1337 return nullptr;
1338}
1339
1340std::optional<AvailableValue>
1341GVNPass::analyzeSelectAvailability(LoadInst *Load, Value *Cond, Value *TrueAddr,
1342 Value *FalseAddr, Instruction *From) {
1343 assert(TrueAddr->getType() == Load->getPointerOperandType() &&
1344 "Invalid address type of true side of select dependency");
1345 assert(FalseAddr->getType() == Load->getPointerOperandType() &&
1346 "Invalid address type of false side of select dependency");
1347 // We can convert a load through a select address into a select of the two
1348 // loaded values only if both sides have a dominating, non-clobbered value of
1349 // the right type in the extended basic block ending at From.
1350 auto Loc = MemoryLocation::get(Load);
1351 Value *V1 = findDominatingValue(Loc.getWithNewPtr(TrueAddr), Load->getType(),
1352 From, getAliasAnalysis());
1353 if (!V1)
1354 return std::nullopt;
1355 Value *V2 = findDominatingValue(Loc.getWithNewPtr(FalseAddr), Load->getType(),
1356 From, getAliasAnalysis());
1357 if (!V2)
1358 return std::nullopt;
1359 return AvailableValue::getSelect(Cond, V1, V2);
1360}
1361
1362std::optional<AvailableValue>
1363GVNPass::analyzeLoadAvailability(LoadInst *Load, const ReachingMemVal &Dep,
1364 Value *Address) {
1365 assert(Load->isUnordered() && "rules below are incorrect for ordered access");
1366 assert((Dep.Kind == DepKind::Def || Dep.Kind == DepKind::Clobber) &&
1367 "expected a local dependence");
1368
1369 Instruction *DepInst = Dep.Inst;
1370
1371 const DataLayout &DL = Load->getDataLayout();
1372 if (Dep.Kind == DepKind::Clobber) {
1373 // If the dependence is to a store that writes to a superset of the bits
1374 // read by the load, we can extract the bits we need for the load from the
1375 // stored value.
1376 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
1377 // Can't forward from non-atomic to atomic without violating memory model.
1378 if (Address && Load->isAtomic() <= DepSI->isAtomic()) {
1379 int Offset =
1380 analyzeLoadFromClobberingStore(Load->getType(), Address, DepSI, DL);
1381 if (Offset != -1)
1382 return AvailableValue::get(DepSI->getValueOperand(), Offset);
1383 }
1384 }
1385
1386 // Check to see if we have something like this:
1387 // load i32* P
1388 // load i8* (P+1)
1389 // if we have this, replace the later with an extraction from the former.
1390 if (LoadInst *DepLoad = dyn_cast<LoadInst>(DepInst)) {
1391 // If this is a clobber and L is the first instruction in its block, then
1392 // we have the first instruction in the entry block.
1393 // Can't forward from non-atomic to atomic without violating memory model.
1394 if (DepLoad != Load && Address &&
1395 Load->isAtomic() <= DepLoad->isAtomic()) {
1396 Type *LoadType = Load->getType();
1397 int Offset = Dep.Offset;
1398
1399 if (!isMemorySSAEnabled()) {
1400 // If MD reported clobber, check it was nested.
1401 if (canCoerceMustAliasedValueToLoad(DepLoad, LoadType,
1402 DepLoad->getFunction())) {
1403 const auto ClobberOff = MD->getClobberOffset(DepLoad);
1404 // GVN has no deal with a negative offset.
1405 Offset = (ClobberOff == std::nullopt || *ClobberOff < 0)
1406 ? -1
1407 : *ClobberOff;
1408 }
1409 } else {
1410 if (!canCoerceMustAliasedValueToLoad(DepLoad, LoadType,
1411 DepLoad->getFunction()) ||
1412 Offset < 0)
1413 Offset = -1;
1414 }
1415 if (Offset == -1)
1416 Offset =
1417 analyzeLoadFromClobberingLoad(LoadType, Address, DepLoad, DL);
1418 if (Offset != -1)
1419 return AvailableValue::getLoad(DepLoad, Offset);
1420 }
1421 }
1422
1423 // If the clobbering value is a memset/memcpy/memmove, see if we can
1424 // forward a value on from it.
1425 if (MemIntrinsic *DepMI = dyn_cast<MemIntrinsic>(DepInst)) {
1426 if (Address && !Load->isAtomic()) {
1428 DepMI, DL);
1429 if (Offset != -1)
1430 return AvailableValue::getMI(DepMI, Offset);
1431 }
1432 }
1433
1434 // Nothing known about this clobber, have to be conservative.
1435 LLVM_DEBUG(
1436 // fast print dep, using operator<< on instruction is too slow.
1437 dbgs() << "GVN: load "; Load->printAsOperand(dbgs());
1438 dbgs() << " is clobbered by " << *DepInst << '\n';);
1439 if (ORE->allowExtraAnalysis(DEBUG_TYPE))
1440 reportMayClobberedLoad(Load, DepInst, DT, ORE);
1441
1442 return std::nullopt;
1443 }
1444 assert(Dep.Kind == DepKind::Def && "follows from above");
1445
1446 // Loading the alloca -> undef.
1447 // Loading immediately after lifetime begin -> undef.
1448 if (isa<AllocaInst>(DepInst) || isLifetimeStart(DepInst))
1449 return AvailableValue::get(UndefValue::get(Load->getType()));
1450
1451 if (Constant *InitVal =
1452 getInitialValueOfAllocation(DepInst, TLI, Load->getType()))
1453 return AvailableValue::get(InitVal);
1454
1455 if (StoreInst *S = dyn_cast<StoreInst>(DepInst)) {
1456 // Reject loads and stores that are to the same address but are of
1457 // different types if we have to. If the stored value is convertable to
1458 // the loaded value, we can reuse it.
1459 if (!canCoerceMustAliasedValueToLoad(S->getValueOperand(), Load->getType(),
1460 S->getFunction()))
1461 return std::nullopt;
1462
1463 // Can't forward from non-atomic to atomic without violating memory model.
1464 if (S->isAtomic() < Load->isAtomic())
1465 return std::nullopt;
1466
1467 return AvailableValue::get(S->getValueOperand());
1468 }
1469
1470 if (LoadInst *LD = dyn_cast<LoadInst>(DepInst)) {
1471 // If the types mismatch and we can't handle it, reject reuse of the load.
1472 // If the stored value is larger or equal to the loaded value, we can reuse
1473 // it.
1474 if (!canCoerceMustAliasedValueToLoad(LD, Load->getType(),
1475 LD->getFunction()))
1476 return std::nullopt;
1477
1478 // Can't forward from non-atomic to atomic without violating memory model.
1479 if (LD->isAtomic() < Load->isAtomic())
1480 return std::nullopt;
1481
1482 return AvailableValue::getLoad(LD);
1483 }
1484
1485 // Check if load with Addr dependent from select can be converted to select
1486 // between load values. There must be no instructions between the found
1487 // loads and DepInst that may clobber the loads.
1488 if (auto *Sel = dyn_cast<SelectInst>(DepInst)) {
1489 assert(Sel->getType() == Load->getPointerOperandType());
1490 if (auto AV = analyzeSelectAvailability(Load, Sel->getCondition(),
1491 Sel->getTrueValue(),
1492 Sel->getFalseValue(), DepInst))
1493 return AV;
1494 return std::nullopt;
1495 }
1496
1497 // Unknown def - must be conservative.
1498 LLVM_DEBUG(
1499 // fast print dep, using operator<< on instruction is too slow.
1500 dbgs() << "GVN: load "; Load->printAsOperand(dbgs());
1501 dbgs() << " has unknown def " << *DepInst << '\n';);
1502 return std::nullopt;
1503}
1504
1505void GVNPass::analyzeLoadAvailability(LoadInst *Load,
1506 SmallVectorImpl<ReachingMemVal> &Deps,
1507 AvailValInBlkVect &ValuesPerBlock,
1508 UnavailBlkVect &UnavailableBlocks) {
1509 // Filter out useless results (non-locals, etc). Keep track of the blocks
1510 // where we have a value available in repl, also keep track of whether we see
1511 // dependencies that produce an unknown value for the load (such as a call
1512 // that could potentially clobber the load).
1513 for (const auto &Dep : Deps) {
1514 BasicBlock *DepBB = Dep.Block;
1515
1516 if (DeadBlocks.count(DepBB)) {
1517 // Dead dependent mem-op disguise as a load evaluating the same value
1518 // as the load in question.
1519 ValuesPerBlock.push_back(AvailableValueInBlock::getUndef(DepBB));
1520 continue;
1521 }
1522
1523 if (Dep.Kind == DepKind::Other) {
1524 UnavailableBlocks.push_back(DepBB);
1525 continue;
1526 }
1527
1528 // The load address is a select in this block: try to rematerialize the
1529 // load as a select of the two reaching values (one per side). The values
1530 // are searched for at the end of DepBB.
1531 if (Dep.Kind == DepKind::Select) {
1532 if (auto AV = analyzeSelectAvailability(
1533 Load, const_cast<Value *>(Dep.SelCond),
1534 const_cast<Value *>(Dep.SelTrueAddr),
1535 const_cast<Value *>(Dep.SelFalseAddr), DepBB->getTerminator())) {
1536 ValuesPerBlock.push_back(
1537 AvailableValueInBlock::get(DepBB, std::move(*AV)));
1538 } else {
1539 UnavailableBlocks.push_back(DepBB);
1540 }
1541 continue;
1542 }
1543
1544 // The address being loaded in this non-local block may not be the same as
1545 // the pointer operand of the load if PHI translation occurs. Make sure
1546 // to consider the right address.
1547 if (auto AV =
1548 analyzeLoadAvailability(Load, Dep, const_cast<Value *>(Dep.Addr))) {
1549 // subtlety: because we know this was a non-local dependency, we know
1550 // it's safe to materialize anywhere between the instruction within
1551 // DepInfo and the end of it's block.
1552 ValuesPerBlock.push_back(
1553 AvailableValueInBlock::get(DepBB, std::move(*AV)));
1554 } else {
1555 UnavailableBlocks.push_back(DepBB);
1556 }
1557 }
1558
1559 assert(Deps.size() == ValuesPerBlock.size() + UnavailableBlocks.size() &&
1560 "post condition violation");
1561}
1562
1563/// Given the following code, v1 is partially available on some edges, but not
1564/// available on the edge from PredBB. This function tries to find if there is
1565/// another identical load in the other successor of PredBB.
1566///
1567/// v0 = load %addr
1568/// br %LoadBB
1569///
1570/// LoadBB:
1571/// v1 = load %addr
1572/// ...
1573///
1574/// PredBB:
1575/// ...
1576/// br %cond, label %LoadBB, label %SuccBB
1577///
1578/// SuccBB:
1579/// v2 = load %addr
1580/// ...
1581///
1582LoadInst *GVNPass::findLoadToHoistIntoPred(BasicBlock *Pred, BasicBlock *LoadBB,
1583 LoadInst *Load) {
1584 // For simplicity we handle a Pred has 2 successors only.
1585 auto *Term = Pred->getTerminator();
1586 if (Term->getNumSuccessors() != 2 || Term->isSpecialTerminator())
1587 return nullptr;
1588 auto *SuccBB = Term->getSuccessor(0);
1589 if (SuccBB == LoadBB)
1590 SuccBB = Term->getSuccessor(1);
1591 if (!SuccBB->getSinglePredecessor())
1592 return nullptr;
1593
1594 unsigned int NumInsts = MaxNumInsnsPerBlock;
1595 for (Instruction &Inst : *SuccBB) {
1596 if (Inst.isDebugOrPseudoInst())
1597 continue;
1598 if (--NumInsts == 0)
1599 return nullptr;
1600
1601 if (!Inst.isIdenticalTo(Load))
1602 continue;
1603
1604 bool HasLocalDep = true;
1605 if (!isMemorySSAEnabled()) {
1606 MemDepResult Dep = MD->getDependency(&Inst);
1607 HasLocalDep = !Dep.isNonLocal();
1608 } else {
1609 auto *MSSA = MSSAU->getMemorySSA();
1610 // Do not hoist if the identical load has ordering constraint.
1611 if (auto *MA = MSSA->getMemoryAccess(&Inst); MA && isa<MemoryUse>(MA)) {
1612 auto *Clobber = MSSA->getWalker()->getClobberingMemoryAccess(MA);
1613 HasLocalDep = Clobber->getBlock() == SuccBB;
1614 }
1615 }
1616
1617 // If an identical load doesn't depends on any local instructions, it can
1618 // be safely moved to PredBB.
1619 // Also check for the implicit control flow instructions. See the comments
1620 // in performLoadPRE for details.
1621 if (!HasLocalDep && !ICF->isDominatedByICFIFromSameBlock(&Inst))
1622 return cast<LoadInst>(&Inst);
1623
1624 // Otherwise there is something in the same BB clobbers the memory, we can't
1625 // move this and later load to PredBB.
1626 return nullptr;
1627 }
1628
1629 return nullptr;
1630}
1631
1632void GVNPass::eliminatePartiallyRedundantLoad(
1633 LoadInst *Load, AvailValInBlkVect &ValuesPerBlock,
1634 MapVector<BasicBlock *, Value *> &AvailableLoads,
1635 MapVector<BasicBlock *, LoadInst *> *CriticalEdgePredAndLoad) {
1636 for (const auto &AvailableLoad : AvailableLoads) {
1637 BasicBlock *UnavailableBlock = AvailableLoad.first;
1638 Value *LoadPtr = AvailableLoad.second;
1639
1640 auto *NewLoad =
1641 new LoadInst(Load->getType(), LoadPtr, Load->getName() + ".pre",
1642 Load->getProperties(),
1643 UnavailableBlock->getTerminator()->getIterator());
1644 NewLoad->setDebugLoc(Load->getDebugLoc());
1645 if (MSSAU) {
1646 auto *NewAccess = MSSAU->createMemoryAccessInBB(
1647 NewLoad, nullptr, NewLoad->getParent(), MemorySSA::BeforeTerminator);
1648 if (auto *NewDef = dyn_cast<MemoryDef>(NewAccess))
1649 MSSAU->insertDef(NewDef, /*RenameUses=*/true);
1650 else
1651 MSSAU->insertUse(cast<MemoryUse>(NewAccess), /*RenameUses=*/true);
1652 }
1653
1654 // Transfer the old load's AA tags to the new load.
1655 AAMDNodes Tags = Load->getAAMetadata();
1656 if (Tags)
1657 NewLoad->setAAMetadata(Tags);
1658
1659 if (auto *MD = Load->getMetadata(LLVMContext::MD_invariant_load))
1660 NewLoad->setMetadata(LLVMContext::MD_invariant_load, MD);
1661 if (auto *InvGroupMD = Load->getMetadata(LLVMContext::MD_invariant_group))
1662 NewLoad->setMetadata(LLVMContext::MD_invariant_group, InvGroupMD);
1663 if (auto *RangeMD = Load->getMetadata(LLVMContext::MD_range))
1664 NewLoad->setMetadata(LLVMContext::MD_range, RangeMD);
1665 if (auto *NoFPClassMD = Load->getMetadata(LLVMContext::MD_nofpclass))
1666 NewLoad->setMetadata(LLVMContext::MD_nofpclass, NoFPClassMD);
1667
1668 if (auto *AccessMD = Load->getMetadata(LLVMContext::MD_access_group))
1669 if (LI->getLoopFor(Load->getParent()) == LI->getLoopFor(UnavailableBlock))
1670 NewLoad->setMetadata(LLVMContext::MD_access_group, AccessMD);
1671
1672 // We do not propagate the old load's debug location, because the new
1673 // load now lives in a different BB, and we want to avoid a jumpy line
1674 // table.
1675 // FIXME: How do we retain source locations without causing poor debugging
1676 // behavior?
1677
1678 // Add the newly created load.
1679 ValuesPerBlock.push_back(
1680 AvailableValueInBlock::get(UnavailableBlock, NewLoad));
1681 if (MD)
1682 MD->invalidateCachedPointerInfo(LoadPtr);
1683 LLVM_DEBUG(dbgs() << "GVN INSERTED " << *NewLoad << '\n');
1684
1685 // For PredBB in CriticalEdgePredAndLoad we need to replace the uses of old
1686 // load instruction with the new created load instruction.
1687 if (CriticalEdgePredAndLoad) {
1688 auto It = CriticalEdgePredAndLoad->find(UnavailableBlock);
1689 if (It != CriticalEdgePredAndLoad->end()) {
1690 ++NumPRELoadMoved2CEPred;
1691 ICF->insertInstructionTo(NewLoad, UnavailableBlock);
1692 LoadInst *OldLoad = It->second;
1693 combineMetadataForCSE(NewLoad, OldLoad, /*DoesKMove=*/true);
1694 OldLoad->replaceAllUsesWith(NewLoad);
1695 replaceValuesPerBlockEntry(ValuesPerBlock, OldLoad, NewLoad);
1696 if (uint32_t ValNo = VN.lookup(OldLoad, false))
1697 LeaderTable.erase(ValNo, OldLoad, OldLoad->getParent());
1698 removeInstruction(OldLoad);
1699 }
1700 }
1701 }
1702
1703 // Perform PHI construction.
1704 Value *V = constructSSAForLoadSet(Load, ValuesPerBlock, *this);
1705 // constructSSAForLoadSet is responsible for combining metadata.
1706 ICF->removeUsersOf(Load);
1707 Load->replaceAllUsesWith(V);
1708 if (isa<PHINode>(V))
1709 V->takeName(Load);
1710 if (Instruction *I = dyn_cast<Instruction>(V))
1711 I->setDebugLoc(Load->getDebugLoc());
1712 if (MD && V->getType()->isPtrOrPtrVectorTy())
1713 MD->invalidateCachedPointerInfo(V);
1714 ORE->emit([&]() {
1715 return OptimizationRemark(DEBUG_TYPE, "LoadPRE", Load)
1716 << "load eliminated by PRE";
1717 });
1719}
1720
1721bool GVNPass::performLoadPRE(LoadInst *Load, AvailValInBlkVect &ValuesPerBlock,
1722 UnavailBlkVect &UnavailableBlocks) {
1723 // Okay, we have *some* definitions of the value. This means that the value
1724 // is available in some of our (transitive) predecessors. Lets think about
1725 // doing PRE of this load. This will involve inserting a new load into the
1726 // predecessor when it's not available. We could do this in general, but
1727 // prefer to not increase code size. As such, we only do this when we know
1728 // that we only have to insert *one* load (which means we're basically moving
1729 // the load, not inserting a new one).
1730
1731 SmallPtrSet<BasicBlock *, 4> Blockers(llvm::from_range, UnavailableBlocks);
1732
1733 // Let's find the first basic block with more than one predecessor. Walk
1734 // backwards through predecessors if needed.
1735 BasicBlock *LoadBB = Load->getParent();
1736 BasicBlock *TmpBB = LoadBB;
1737
1738 // Check that there is no implicit control flow instructions above our load in
1739 // its block. If there is an instruction that doesn't always pass the
1740 // execution to the following instruction, then moving through it may become
1741 // invalid. For example:
1742 //
1743 // int arr[LEN];
1744 // int index = ???;
1745 // ...
1746 // guard(0 <= index && index < LEN);
1747 // use(arr[index]);
1748 //
1749 // It is illegal to move the array access to any point above the guard,
1750 // because if the index is out of bounds we should deoptimize rather than
1751 // access the array.
1752 // Check that there is no guard in this block above our instruction.
1753 bool MustEnsureSafetyOfSpeculativeExecution =
1754 ICF->isDominatedByICFIFromSameBlock(Load);
1755
1756 while (TmpBB->getSinglePredecessor()) {
1757 TmpBB = TmpBB->getSinglePredecessor();
1758 if (TmpBB == LoadBB) // Infinite (unreachable) loop.
1759 return false;
1760 if (Blockers.count(TmpBB))
1761 return false;
1762
1763 // If any of these blocks has more than one successor (i.e. if the edge we
1764 // just traversed was critical), then there are other paths through this
1765 // block along which the load may not be anticipated. Hoisting the load
1766 // above this block would be adding the load to execution paths along
1767 // which it was not previously executed.
1768 if (TmpBB->getTerminator()->getNumSuccessors() != 1)
1769 return false;
1770
1771 // Check that there is no implicit control flow in a block above.
1772 MustEnsureSafetyOfSpeculativeExecution =
1773 MustEnsureSafetyOfSpeculativeExecution || ICF->hasICF(TmpBB);
1774 }
1775
1776 assert(TmpBB);
1777 LoadBB = TmpBB;
1778
1779 // Check to see how many predecessors have the loaded value fully
1780 // available.
1781 MapVector<BasicBlock *, Value *> PredLoads;
1782 DenseMap<BasicBlock *, AvailabilityState> FullyAvailableBlocks;
1783 for (const AvailableValueInBlock &AV : ValuesPerBlock)
1784 FullyAvailableBlocks[AV.BB] = AvailabilityState::Available;
1785 for (BasicBlock *UnavailableBB : UnavailableBlocks)
1786 FullyAvailableBlocks[UnavailableBB] = AvailabilityState::Unavailable;
1787
1788 // The edge from Pred to LoadBB is a critical edge will be splitted.
1789 SmallVector<BasicBlock *, 4> CriticalEdgePredSplit;
1790 // The edge from Pred to LoadBB is a critical edge, another successor of Pred
1791 // contains a load can be moved to Pred. This data structure maps the Pred to
1792 // the movable load.
1793 MapVector<BasicBlock *, LoadInst *> CriticalEdgePredAndLoad;
1794 for (BasicBlock *Pred : predecessors(LoadBB)) {
1795 // If any predecessor block is an EH pad that does not allow non-PHI
1796 // instructions before the terminator, we can't PRE the load.
1797 if (Pred->getTerminator()->isEHPad()) {
1798 LLVM_DEBUG(
1799 dbgs() << "COULD NOT PRE LOAD BECAUSE OF AN EH PAD PREDECESSOR '"
1800 << Pred->getName() << "': " << *Load << '\n');
1801 return false;
1802 }
1803
1804 if (isValueFullyAvailableInBlock(Pred, FullyAvailableBlocks)) {
1805 continue;
1806 }
1807
1808 if (Pred->getTerminator()->getNumSuccessors() != 1) {
1809 if (isa<IndirectBrInst>(Pred->getTerminator())) {
1810 LLVM_DEBUG(
1811 dbgs() << "COULD NOT PRE LOAD BECAUSE OF INDBR CRITICAL EDGE '"
1812 << Pred->getName() << "': " << *Load << '\n');
1813 return false;
1814 }
1815
1816 if (LoadBB->isEHPad()) {
1817 LLVM_DEBUG(
1818 dbgs() << "COULD NOT PRE LOAD BECAUSE OF AN EH PAD CRITICAL EDGE '"
1819 << Pred->getName() << "': " << *Load << '\n');
1820 return false;
1821 }
1822
1823 // Do not split backedge as it will break the canonical loop form.
1825 if (DT->dominates(LoadBB, Pred)) {
1826 LLVM_DEBUG(
1827 dbgs()
1828 << "COULD NOT PRE LOAD BECAUSE OF A BACKEDGE CRITICAL EDGE '"
1829 << Pred->getName() << "': " << *Load << '\n');
1830 return false;
1831 }
1832
1833 if (LoadInst *LI = findLoadToHoistIntoPred(Pred, LoadBB, Load))
1834 CriticalEdgePredAndLoad[Pred] = LI;
1835 else
1836 CriticalEdgePredSplit.push_back(Pred);
1837 } else {
1838 // Only add the predecessors that will not be split for now.
1839 PredLoads[Pred] = nullptr;
1840 }
1841 }
1842
1843 // Decide whether PRE is profitable for this load.
1844 unsigned NumInsertPreds = PredLoads.size() + CriticalEdgePredSplit.size();
1845 unsigned NumUnavailablePreds = NumInsertPreds +
1846 CriticalEdgePredAndLoad.size();
1847 assert(NumUnavailablePreds != 0 &&
1848 "Fully available value should already be eliminated!");
1849 (void)NumUnavailablePreds;
1850
1851 // If we need to insert new load in multiple predecessors, reject it.
1852 // FIXME: If we could restructure the CFG, we could make a common pred with
1853 // all the preds that don't have an available Load and insert a new load into
1854 // that one block.
1855 if (NumInsertPreds > 1)
1856 return false;
1857
1858 // Now we know where we will insert load. We must ensure that it is safe
1859 // to speculatively execute the load at that points.
1860 if (MustEnsureSafetyOfSpeculativeExecution) {
1861 if (CriticalEdgePredSplit.size())
1863 DT))
1864 return false;
1865 for (auto &PL : PredLoads)
1866 if (!isSafeToSpeculativelyExecute(Load, PL.first->getTerminator(), AC,
1867 DT))
1868 return false;
1869 for (auto &CEP : CriticalEdgePredAndLoad)
1870 if (!isSafeToSpeculativelyExecute(Load, CEP.first->getTerminator(), AC,
1871 DT))
1872 return false;
1873 }
1874
1875 // Split critical edges, and update the unavailable predecessors accordingly.
1876 for (BasicBlock *OrigPred : CriticalEdgePredSplit) {
1877 BasicBlock *NewPred = splitCriticalEdges(OrigPred, LoadBB);
1878 assert(!PredLoads.count(OrigPred) && "Split edges shouldn't be in map!");
1879 PredLoads[NewPred] = nullptr;
1880 LLVM_DEBUG(dbgs() << "Split critical edge " << OrigPred->getName() << "->"
1881 << LoadBB->getName() << '\n');
1882 }
1883
1884 for (auto &CEP : CriticalEdgePredAndLoad)
1885 PredLoads[CEP.first] = nullptr;
1886
1887 // Check if the load can safely be moved to all the unavailable predecessors.
1888 bool CanDoPRE = true;
1889 const DataLayout &DL = Load->getDataLayout();
1890 SmallVector<Instruction*, 8> NewInsts;
1891 for (auto &PredLoad : PredLoads) {
1892 BasicBlock *UnavailablePred = PredLoad.first;
1893
1894 // Do PHI translation to get its value in the predecessor if necessary. The
1895 // returned pointer (if non-null) is guaranteed to dominate UnavailablePred.
1896 // We do the translation for each edge we skipped by going from Load's block
1897 // to LoadBB, otherwise we might miss pieces needing translation.
1898
1899 // If all preds have a single successor, then we know it is safe to insert
1900 // the load on the pred (?!?), so we can insert code to materialize the
1901 // pointer if it is not available.
1902 Value *LoadPtr = Load->getPointerOperand();
1903 BasicBlock *Cur = Load->getParent();
1904 while (Cur != LoadBB) {
1905 PHITransAddr Address(LoadPtr, DL, AC);
1906 LoadPtr = Address.translateWithInsertion(Cur, Cur->getSinglePredecessor(),
1907 *DT, NewInsts);
1908 if (!LoadPtr) {
1909 CanDoPRE = false;
1910 break;
1911 }
1912 Cur = Cur->getSinglePredecessor();
1913 }
1914
1915 if (LoadPtr) {
1916 PHITransAddr Address(LoadPtr, DL, AC);
1917 LoadPtr = Address.translateWithInsertion(LoadBB, UnavailablePred, *DT,
1918 NewInsts);
1919 }
1920 // If we couldn't find or insert a computation of this phi translated value,
1921 // we fail PRE.
1922 if (!LoadPtr) {
1923 LLVM_DEBUG(dbgs() << "COULDN'T INSERT PHI TRANSLATED VALUE OF: "
1924 << *Load->getPointerOperand() << "\n");
1925 CanDoPRE = false;
1926 break;
1927 }
1928
1929 PredLoad.second = LoadPtr;
1930 }
1931
1932 if (!CanDoPRE) {
1933 while (!NewInsts.empty()) {
1934 // Erase instructions generated by the failed PHI translation before
1935 // trying to number them. PHI translation might insert instructions
1936 // in basic blocks other than the current one, and we delete them
1937 // directly, as salvageAndRemoveInstruction only allows removing from the
1938 // current basic block.
1939 NewInsts.pop_back_val()->eraseFromParent();
1940 }
1941 // HINT: Don't revert the edge-splitting as following transformation may
1942 // also need to split these critical edges.
1943 return !CriticalEdgePredSplit.empty();
1944 }
1945
1946 // Okay, we can eliminate this load by inserting a reload in the predecessor
1947 // and using PHI construction to get the value in the other predecessors, do
1948 // it.
1949 LLVM_DEBUG(dbgs() << "GVN REMOVING PRE LOAD: " << *Load << '\n');
1950 LLVM_DEBUG(if (!NewInsts.empty()) dbgs() << "INSERTED " << NewInsts.size()
1951 << " INSTS: " << *NewInsts.back()
1952 << '\n');
1953
1954 // Assign value numbers to the new instructions.
1955 for (Instruction *I : NewInsts) {
1956 // Instructions that have been inserted in predecessor(s) to materialize
1957 // the load address do not retain their original debug locations. Doing
1958 // so could lead to confusing (but correct) source attributions.
1959 I->updateLocationAfterHoist();
1960
1961 // FIXME: We really _ought_ to insert these value numbers into their
1962 // parent's availability map. However, in doing so, we risk getting into
1963 // ordering issues. If a block hasn't been processed yet, we would be
1964 // marking a value as AVAIL-IN, which isn't what we intend.
1965 VN.lookupOrAdd(I);
1966 }
1967
1968 eliminatePartiallyRedundantLoad(Load, ValuesPerBlock, PredLoads,
1969 &CriticalEdgePredAndLoad);
1970 ++NumPRELoad;
1971 return true;
1972}
1973
1974bool GVNPass::performLoopLoadPRE(LoadInst *Load,
1975 AvailValInBlkVect &ValuesPerBlock,
1976 UnavailBlkVect &UnavailableBlocks) {
1977 const Loop *L = LI->getLoopFor(Load->getParent());
1978 // TODO: Generalize to other loop blocks that dominate the latch.
1979 if (!L || L->getHeader() != Load->getParent())
1980 return false;
1981
1982 BasicBlock *Preheader = L->getLoopPreheader();
1983 BasicBlock *Latch = L->getLoopLatch();
1984 if (!Preheader || !Latch)
1985 return false;
1986
1987 Value *LoadPtr = Load->getPointerOperand();
1988 // Must be available in preheader.
1989 if (!L->isLoopInvariant(LoadPtr))
1990 return false;
1991
1992 // We plan to hoist the load to preheader without introducing a new fault.
1993 // In order to do it, we need to prove that we cannot side-exit the loop
1994 // once loop header is first entered before execution of the load.
1995 if (ICF->isDominatedByICFIFromSameBlock(Load))
1996 return false;
1997
1998 BasicBlock *LoopBlock = nullptr;
1999 for (auto *Blocker : UnavailableBlocks) {
2000 // Blockers from outside the loop are handled in preheader.
2001 if (!L->contains(Blocker))
2002 continue;
2003
2004 // Only allow one loop block. Loop header is not less frequently executed
2005 // than each loop block, and likely it is much more frequently executed. But
2006 // in case of multiple loop blocks, we need extra information (such as block
2007 // frequency info) to understand whether it is profitable to PRE into
2008 // multiple loop blocks.
2009 if (LoopBlock)
2010 return false;
2011
2012 // Do not sink into inner loops. This may be non-profitable.
2013 if (L != LI->getLoopFor(Blocker))
2014 return false;
2015
2016 // Blocks that dominate the latch execute on every single iteration, maybe
2017 // except the last one. So PREing into these blocks doesn't make much sense
2018 // in most cases. But the blocks that do not necessarily execute on each
2019 // iteration are sometimes much colder than the header, and this is when
2020 // PRE is potentially profitable.
2021 if (DT->dominates(Blocker, Latch))
2022 return false;
2023
2024 // Make sure that the terminator itself doesn't clobber.
2025 if (Blocker->getTerminator()->mayWriteToMemory())
2026 return false;
2027
2028 LoopBlock = Blocker;
2029 }
2030
2031 if (!LoopBlock)
2032 return false;
2033
2034 // Make sure the memory at this pointer cannot be freed, therefore we can
2035 // safely reload from it after clobber.
2036 if (LoadPtr->canBeFreed())
2037 return false;
2038
2039 // TODO: Support critical edge splitting if blocker has more than 1 successor.
2040 MapVector<BasicBlock *, Value *> AvailableLoads;
2041 AvailableLoads[LoopBlock] = LoadPtr;
2042 AvailableLoads[Preheader] = LoadPtr;
2043
2044 LLVM_DEBUG(dbgs() << "GVN REMOVING PRE LOOP LOAD: " << *Load << '\n');
2045 eliminatePartiallyRedundantLoad(Load, ValuesPerBlock, AvailableLoads,
2046 /*CriticalEdgePredAndLoad*/ nullptr);
2047 ++NumPRELoopLoad;
2048 return true;
2049}
2050
2053 using namespace ore;
2054
2055 ORE->emit([&]() {
2056 return OptimizationRemark(DEBUG_TYPE, "LoadElim", Load)
2057 << "load of type " << NV("Type", Load->getType()) << " eliminated"
2058 << setExtraArgs() << " in favor of "
2059 << NV("InfavorOfValue", AvailableValue);
2060 });
2061}
2062
2063/// Attempt to eliminate a load whose dependencies are
2064/// non-local by performing PHI construction.
2065bool GVNPass::processNonLocalLoad(LoadInst *Load) {
2066 // Non-local speculations are not allowed under asan.
2067 if (Load->getFunction()->hasFnAttribute(Attribute::SanitizeAddress) ||
2068 Load->getFunction()->hasFnAttribute(Attribute::SanitizeHWAddress))
2069 return false;
2070
2071 // Find the non-local dependencies of the load.
2072 LoadDepVect Deps;
2073 MD->getNonLocalPointerDependency(Load, Deps);
2074
2075 // If we had to process more than one hundred blocks to find the
2076 // dependencies, this load isn't worth worrying about. Optimizing
2077 // it will be too expensive.
2078 unsigned NumDeps = Deps.size();
2079 if (NumDeps > MaxNumDeps)
2080 return false;
2081
2083 MemVals.reserve(Deps.size());
2084
2085 for (const NonLocalDepResult &Dep : Deps) {
2086 const auto &R = Dep.getResult();
2087 SelectAddr SelAddr = Dep.getAddress();
2088 BasicBlock *BB = Dep.getBB();
2089 Instruction *Inst = R.getInst();
2090 if (R.isSelect()) {
2091 auto [Cond, Addrs] = SelAddr.getSelectCondAndAddrs();
2092 MemVals.emplace_back(
2093 ReachingMemVal::getSelect(BB, Cond, Addrs.first, Addrs.second));
2094 continue;
2095 }
2096 Value *Address = SelAddr.getAddr();
2097 if (R.isClobber())
2098 MemVals.emplace_back(ReachingMemVal::getClobber(Address, Inst));
2099 else if (R.isDef())
2100 MemVals.emplace_back(ReachingMemVal::getDef(Address, Inst));
2101 else
2102 MemVals.emplace_back(ReachingMemVal::getUnknown(BB, Address, Inst));
2103 }
2104
2105 return processNonLocalLoad(Load, MemVals);
2106}
2107
2108bool GVNPass::processNonLocalLoad(LoadInst *Load,
2109 SmallVectorImpl<ReachingMemVal> &Deps) {
2110 // If we had a phi translation failure, we'll have a single entry which is a
2111 // clobber in the current block. Reject this early.
2112 if (Deps.size() == 1 && Deps[0].Kind == DepKind::Other) {
2113 LLVM_DEBUG(dbgs() << "GVN: non-local load "; Load->printAsOperand(dbgs());
2114 dbgs() << " has unknown dependencies\n";);
2115 return false;
2116 }
2117
2118 bool Changed = false;
2119 // This is a limited form of scalar PRE for load indices. If this load follows
2120 // a GEP, see if we can PRE the indices before analyzing.
2121 if (isScalarPREEnabled()) {
2122 if (GetElementPtrInst *GEP =
2123 dyn_cast<GetElementPtrInst>(Load->getOperand(0))) {
2124 for (Use &U : GEP->indices())
2125 if (Instruction *I = dyn_cast<Instruction>(U.get()))
2126 Changed |= performScalarPRE(I);
2127 }
2128 }
2129
2130 // Step 1: Analyze the availability of the load.
2131 AvailValInBlkVect ValuesPerBlock;
2132 UnavailBlkVect UnavailableBlocks;
2133 analyzeLoadAvailability(Load, Deps, ValuesPerBlock, UnavailableBlocks);
2134
2135 // If we have no predecessors that produce a known value for this load, exit
2136 // early.
2137 if (ValuesPerBlock.empty())
2138 return Changed;
2139
2140 // Step 2: Eliminate fully redundancy.
2141 //
2142 // If all of the instructions we depend on produce a known value for this
2143 // load, then it is fully redundant and we can use PHI insertion to compute
2144 // its value. Insert PHIs and remove the fully redundant value now.
2145 if (UnavailableBlocks.empty()) {
2146 LLVM_DEBUG(dbgs() << "GVN REMOVING NONLOCAL LOAD: " << *Load << '\n');
2147
2148 // Perform PHI construction.
2149 Value *V = constructSSAForLoadSet(Load, ValuesPerBlock, *this);
2150 // constructSSAForLoadSet is responsible for combining metadata.
2151 ICF->removeUsersOf(Load);
2152 Load->replaceAllUsesWith(V);
2153
2154 if (isa<PHINode>(V))
2155 V->takeName(Load);
2156 if (Instruction *I = dyn_cast<Instruction>(V))
2157 // If instruction I has debug info, then we should not update it.
2158 // Also, if I has a null DebugLoc, then it is still potentially incorrect
2159 // to propagate Load's DebugLoc because Load may not post-dominate I.
2160 if (Load->getDebugLoc() && Load->getParent() == I->getParent())
2161 I->setDebugLoc(Load->getDebugLoc());
2162 if (MD && V->getType()->isPtrOrPtrVectorTy())
2163 MD->invalidateCachedPointerInfo(V);
2164 ++NumGVNLoad;
2165 reportLoadElim(Load, V, ORE);
2167 return true;
2168 }
2169
2170 // Step 3: Eliminate partial redundancy.
2171 if (!isLoadPREEnabled())
2172 return Changed;
2173 if (!isLoadInLoopPREEnabled() && LI->getLoopFor(Load->getParent()))
2174 return Changed;
2175
2176 if (performLoopLoadPRE(Load, ValuesPerBlock, UnavailableBlocks) ||
2177 performLoadPRE(Load, ValuesPerBlock, UnavailableBlocks))
2178 return true;
2179
2180 return Changed;
2181}
2182
2183bool GVNPass::processAssumeIntrinsic(AssumeInst *IntrinsicI) {
2184 Value *V = IntrinsicI->getArgOperand(0);
2185
2186 if (ConstantInt *Cond = dyn_cast<ConstantInt>(V)) {
2187 if (Cond->isZero()) {
2188 Type *Int8Ty = Type::getInt8Ty(V->getContext());
2189 Type *PtrTy = PointerType::get(V->getContext(), 0);
2190 // Insert a new store to null instruction before the load to indicate that
2191 // this code is not reachable. FIXME: We could insert unreachable
2192 // instruction directly because we can modify the CFG.
2193 auto *NewS =
2194 new StoreInst(PoisonValue::get(Int8Ty), Constant::getNullValue(PtrTy),
2195 IntrinsicI->getIterator());
2196 if (MSSAU) {
2197 const MemoryUseOrDef *FirstNonDom = nullptr;
2198 const auto *AL =
2199 MSSAU->getMemorySSA()->getBlockAccesses(IntrinsicI->getParent());
2200
2201 // If there are accesses in the current basic block, find the first one
2202 // that does not come before NewS. The new memory access is inserted
2203 // after the found access or before the terminator if no such access is
2204 // found.
2205 if (AL) {
2206 for (const auto &Acc : *AL) {
2207 if (auto *Current = dyn_cast<MemoryUseOrDef>(&Acc))
2208 if (!Current->getMemoryInst()->comesBefore(NewS)) {
2209 FirstNonDom = Current;
2210 break;
2211 }
2212 }
2213 }
2214
2215 auto *NewDef =
2216 FirstNonDom ? MSSAU->createMemoryAccessBefore(
2217 NewS, nullptr,
2218 const_cast<MemoryUseOrDef *>(FirstNonDom))
2219 : MSSAU->createMemoryAccessInBB(
2220 NewS, nullptr,
2221 NewS->getParent(), MemorySSA::BeforeTerminator);
2222
2223 MSSAU->insertDef(cast<MemoryDef>(NewDef), /*RenameUses=*/false);
2224 }
2225 }
2226 if (isAssumeWithEmptyBundle(*IntrinsicI)) {
2227 salvageAndRemoveInstruction(IntrinsicI);
2228 return true;
2229 }
2230 return false;
2231 }
2232
2233 if (isa<Constant>(V)) {
2234 // If it's not false, and constant, it must evaluate to true. This means our
2235 // assume is assume(true), and thus, pointless, and we don't want to do
2236 // anything more here.
2237 return false;
2238 }
2239
2240 Constant *True = ConstantInt::getTrue(V->getContext());
2241 return propagateEquality(V, True, IntrinsicI);
2242}
2243
2246 I->replaceAllUsesWith(Repl);
2247}
2248
2249/// If a load has !invariant.group, try to find the most-dominating instruction
2250/// with the same metadata and equivalent pointer (modulo bitcasts and zero
2251/// GEPs). If one is found that dominates the load, its value can be reused.
2253 Value *PointerOperand = L->getPointerOperand()->stripPointerCasts();
2254
2255 // It's not safe to walk the use list of a global value because function
2256 // passes aren't allowed to look outside their functions.
2257 // FIXME: this could be fixed by filtering instructions from outside of
2258 // current function.
2259 if (isa<Constant>(PointerOperand))
2260 return nullptr;
2261
2262 // Queue to process all pointers that are equivalent to load operand.
2263 SmallVector<Value *, 8> PointerUsesQueue;
2264 PointerUsesQueue.push_back(PointerOperand);
2265
2266 Instruction *MostDominatingInstruction = L;
2267
2268 // FIXME: This loop is potentially O(n^2) due to repeated dominates checks.
2269 while (!PointerUsesQueue.empty()) {
2270 Value *Ptr = PointerUsesQueue.pop_back_val();
2271 assert(Ptr && !isa<GlobalValue>(Ptr) &&
2272 "Null or GlobalValue should not be inserted");
2273
2274 for (User *U : Ptr->users()) {
2275 auto *I = dyn_cast<Instruction>(U);
2276 if (!I || I == L || !DT.dominates(I, MostDominatingInstruction))
2277 continue;
2278
2279 // Add bitcasts and zero GEPs to queue.
2280 // TODO: Should drop bitcast?
2281 if (isa<BitCastInst>(I) ||
2283 cast<GetElementPtrInst>(I)->hasAllZeroIndices())) {
2284 PointerUsesQueue.push_back(I);
2285 continue;
2286 }
2287
2288 // If we hit a load/store with an invariant.group metadata and the same
2289 // pointer operand, we can assume that value pointed to by the pointer
2290 // operand didn't change.
2291 if (I->hasMetadata(LLVMContext::MD_invariant_group) &&
2292 Ptr == getLoadStorePointerOperand(I) && !I->isVolatile())
2293 MostDominatingInstruction = I;
2294 }
2295 }
2296
2297 return MostDominatingInstruction != L ? MostDominatingInstruction : nullptr;
2298}
2299
2300/// Return the memory location accessed by the (masked) load/store instruction
2301/// `I`, if the instruction could potentially provide a useful value for
2302/// eliminating the load.
2303static std::optional<MemoryLocation>
2305 const TargetLibraryInfo *TLI) {
2306 if (auto *LI = dyn_cast<LoadInst>(I))
2307 return MemoryLocation::get(LI);
2308
2309 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
2310 switch (II->getIntrinsicID()) {
2311 case Intrinsic::masked_load:
2312 return MemoryLocation::getForArgument(II, 0, TLI);
2313 case Intrinsic::masked_store:
2314 if (AllowStores)
2315 return MemoryLocation::getForArgument(II, 1, TLI);
2316 return std::nullopt;
2317 default:
2318 break;
2319 }
2320 }
2321
2322 if (!AllowStores)
2323 return std::nullopt;
2324
2325 if (auto *SI = dyn_cast<StoreInst>(I))
2326 return MemoryLocation::get(SI);
2327 return std::nullopt;
2328}
2329
2330/// Scan the users of each MemoryAccess in `ClobbersList` that belong to `BB`,
2331/// looking for memory reads whose location aliases `Loc` and dominates our
2332/// load.
2333std::optional<GVNPass::ReachingMemVal> GVNPass::scanMemoryAccessesUsers(
2334 const MemoryLocation &Loc, bool IsInvariantLoad, BasicBlock *BB,
2335 const SmallVectorImpl<MemoryAccess *> &ClobbersList, MemorySSA &MSSA,
2336 BatchAAResults &AA, LoadInst *L) {
2337
2338 // Prefer a candidate that is closer to the load within the same block.
2339 auto UpdateChoice = [&](std::optional<ReachingMemVal> &Choice,
2340 AliasResult &AR, Instruction *Candidate) {
2341 if (!Choice) {
2342 if (AR == AliasResult::PartialAlias)
2343 Choice = ReachingMemVal::getClobber(Loc.Ptr, Candidate, AR.getOffset());
2344 else
2345 Choice = ReachingMemVal::getDef(Loc.Ptr, Candidate);
2346 return;
2347 }
2348 if (!MSSA.locallyDominates(MSSA.getMemoryAccess(Choice->Inst),
2349 MSSA.getMemoryAccess(Candidate)))
2350 return;
2351
2352 if (AR == AliasResult::PartialAlias) {
2353 Choice->Kind = DepKind::Clobber;
2354 Choice->Offset = AR.getOffset();
2355 } else {
2356 Choice->Kind = DepKind::Def;
2357 Choice->Offset = -1;
2358 }
2359
2360 Choice->Inst = Candidate;
2361 Choice->Block = Candidate->getParent();
2362 };
2363
2364 std::optional<ReachingMemVal> ReachingVal;
2365 for (MemoryAccess *MA : ClobbersList) {
2366 unsigned Scanned = 0;
2367 for (User *U : MA->users()) {
2368 if (++Scanned >= ScanUsersLimit)
2369 return ReachingMemVal::getUnknown(BB, Loc.Ptr);
2370
2371 auto *UseOrDef = dyn_cast<MemoryUseOrDef>(U);
2372 if (!UseOrDef || UseOrDef->getBlock() != BB)
2373 continue;
2374
2375 Instruction *MemI = UseOrDef->getMemoryInst();
2376 if (MemI == L ||
2377 (L && !MSSA.locallyDominates(UseOrDef, MSSA.getMemoryAccess(L))))
2378 continue;
2379
2380 if (auto MaybeLoc = maybeLoadStoreLocation(MemI, IsInvariantLoad, TLI)) {
2381 AliasResult AR = AA.alias(*MaybeLoc, Loc);
2382 // If the locations do not certainly alias, we cannot possibly infer the
2383 // following load loads the same value.
2385 continue;
2386
2387 // Locations partially overlap, but neither is a subset of the other, or
2388 // the second location is before the first.
2389 if (AR == AliasResult::PartialAlias &&
2390 (!AR.hasOffset() || AR.getOffset() < 0))
2391 continue;
2392
2393 // Found candidate, the new load memory location and the given location
2394 // must alias: precise overlap, or subset with non-negative offset.
2395 UpdateChoice(ReachingVal, AR, MemI);
2396 }
2397 }
2398 if (ReachingVal)
2399 break;
2400 }
2401
2402 return ReachingVal;
2403}
2404
2405/// Check if a given MemoryAccess (usually a MemoryDef) actually modifies a
2406/// given location. Returns a ReachingMemVal describing the dependency.
2407std::optional<GVNPass::ReachingMemVal> GVNPass::accessMayModifyLocation(
2408 MemoryAccess *ClobberMA, const MemoryLocation &Loc, bool IsInvariantLoad,
2409 BasicBlock *BB, MemorySSA &MSSA, BatchAAResults &AA) {
2410 assert(ClobberMA->getBlock() == BB);
2411
2412 // If the clobbering access is the entry memory state, we cannot say anything
2413 // about the content of the memory, except when we are accessing a local
2414 // object, which can be turned later into producing `undef`.
2415 if (MSSA.isLiveOnEntryDef(ClobberMA)) {
2417 if (Alloc->getParent() == BB)
2418 return ReachingMemVal::getDef(Loc.Ptr, const_cast<AllocaInst *>(Alloc));
2419 return ReachingMemVal::getUnknown(BB, Loc.Ptr);
2420 }
2421
2422 // Loads from "constant" memory can't be clobbered.
2423 if (IsInvariantLoad || AA.pointsToConstantMemory(Loc))
2424 return std::nullopt;
2425
2426 auto GetOrdering = [](const Instruction *I) {
2427 if (auto *L = dyn_cast<LoadInst>(I))
2428 return L->getOrdering();
2429 return cast<StoreInst>(I)->getOrdering();
2430 };
2431 Instruction *ClobberI = cast<MemoryDef>(ClobberMA)->getMemoryInst();
2432
2433 // Check if the clobbering access is a load or a store that we can reuse.
2434 if (auto MaybeLoc = maybeLoadStoreLocation(ClobberI, true, TLI)) {
2435 AliasResult AR = AA.alias(*MaybeLoc, Loc);
2436 if (AR == AliasResult::MustAlias)
2437 return ReachingMemVal::getDef(Loc.Ptr, ClobberI);
2438
2439 if (AR == AliasResult::NoAlias) {
2440 // If the locations do not alias we may still be able to skip over the
2441 // clobbering instruction, even if it is atomic.
2442 // The original load is either non-atomic or unordered. We can reorder
2443 // these across non-atomic, unordered or monotonic loads or across any
2444 // store.
2445 if (!ClobberI->isAtomic() ||
2446 !isStrongerThan(GetOrdering(ClobberI), AtomicOrdering::Monotonic) ||
2447 isa<StoreInst>(ClobberI))
2448 return std::nullopt;
2449 return ReachingMemVal::getClobber(Loc.Ptr, ClobberI);
2450 }
2451
2452 // Skip over volatile loads (the original load is non-volatile, non-atomic).
2453 if (!ClobberI->isAtomic() && isa<LoadInst>(ClobberI))
2454 return std::nullopt;
2455
2456 if (AR == AliasResult::MayAlias ||
2458 (!AR.hasOffset() || AR.getOffset() < 0)))
2459 return ReachingMemVal::getClobber(Loc.Ptr, ClobberI);
2460
2461 // The only option left is a store of the superset of the required bits.
2463 AR.getOffset() > 0 &&
2464 "Must be the superset/partial overlap case with positive offset");
2465 return ReachingMemVal::getClobber(Loc.Ptr, ClobberI, AR.getOffset());
2466 }
2467
2468 if (auto *II = dyn_cast<IntrinsicInst>(ClobberI)) {
2470 return std::nullopt;
2471 if (II->getIntrinsicID() == Intrinsic::lifetime_start) {
2472 MemoryLocation IIObjLoc = MemoryLocation::getForArgument(II, 0, TLI);
2473 if (AA.isMustAlias(IIObjLoc, Loc))
2474 return ReachingMemVal::getDef(Loc.Ptr, ClobberI);
2475 return std::nullopt;
2476 }
2477 }
2478
2479 // If we are at a malloc-like function call, we can turn the load into `undef`
2480 // or zero.
2481 if (isNoAliasCall(ClobberI)) {
2482 const Value *Obj = getUnderlyingObject(Loc.Ptr);
2483 if (Obj == ClobberI || AA.isMustAlias(ClobberI, Loc.Ptr))
2484 return ReachingMemVal::getDef(Loc.Ptr, ClobberI);
2485 }
2486
2487 // Can reorder loads across a release fence.
2488 if (auto *FI = dyn_cast<FenceInst>(ClobberI))
2489 if (FI->getOrdering() == AtomicOrdering::Release)
2490 return std::nullopt;
2491
2492 // See if the clobber instruction (e.g., a generic call) may modify the
2493 // location.
2494 ModRefInfo MR = AA.getModRefInfo(ClobberI, Loc);
2495 // If may modify the location, analyze deeper, to exclude accesses to
2496 // non-escaping local allocations.
2497 if (MR == ModRefInfo::NoModRef || MR == ModRefInfo::Ref)
2498 return std::nullopt;
2499
2500 // Conservatively assume the clobbering memory access may overwrite the
2501 // location.
2502 return ReachingMemVal::getClobber(Loc.Ptr, ClobberI);
2503}
2504
2505/// Collect the predecessors of block, while doing phi-translation of the memory
2506/// address and the memory clobber. Return false if the block should be marked
2507/// as clobbering the memory location in an unknown way.
2508bool GVNPass::collectPredecessors(BasicBlock *BB, const PHITransAddr &Addr,
2509 MemoryAccess *ClobberMA,
2510 DependencyBlockSet &Blocks,
2511 SmallVectorImpl<BasicBlock *> &Worklist) {
2512 if (Addr.needsPHITranslationFromBlock(BB) &&
2514 return false;
2515
2516 auto *MPhi =
2517 ClobberMA->getBlock() == BB ? dyn_cast<MemoryPhi>(ClobberMA) : nullptr;
2519 for (BasicBlock *Pred : predecessors(BB)) {
2520 // Skip unreachable predecessors.
2521 if (!DT->isReachableFromEntry(Pred))
2522 continue;
2523
2524 // Skip already visited predecessors.
2525 if (llvm::any_of(Preds, [Pred](const auto &P) { return P.first == Pred; }))
2526 continue;
2527
2528 PHITransAddr TransAddr = Addr;
2529 if (TransAddr.needsPHITranslationFromBlock(BB))
2530 TransAddr.translateValue(BB, Pred, DT, false);
2531
2532 auto It = Blocks.find(Pred);
2533 if (It != Blocks.end()) {
2534 // If we reach a visited block with a different address, set the
2535 // current block as clobbering the memory location in an unknown way
2536 // (by returning false).
2537 if (It->second.Addr.getAddr() != TransAddr.getAddr())
2538 return false;
2539 // Otherwise, just stop the traversal.
2540 continue;
2541 }
2542
2543 Preds.emplace_back(
2544 Pred, DependencyBlockInfo(TransAddr,
2545 MPhi ? MPhi->getIncomingValueForBlock(Pred)
2546 : ClobberMA));
2547 }
2548
2549 // We collected the predecessors and stored them in Preds. Now, populate the
2550 // worklist with the predecessors found, and cache the eventual translated
2551 // address for each block.
2552 for (auto &P : Preds) {
2553 [[maybe_unused]] auto It =
2554 Blocks.try_emplace(P.first, std::move(P.second)).first;
2555 Worklist.push_back(P.first);
2556 }
2557
2558 return true;
2559}
2560
2561/// Build a list of MemoryAccesses whose users could potentially alias the
2562/// memory location being queried. Starts from StartInfo's initial clobber,
2563/// walk the use-def chain to the final clobber. If the chain extends beyond
2564/// `BB`, continue into that block but only if it is in the previously collected
2565/// set.
2566void GVNPass::collectClobberList(SmallVectorImpl<MemoryAccess *> &Clobbers,
2567 BasicBlock *BB,
2568 const DependencyBlockInfo &StartInfo,
2569 const DependencyBlockSet &Blocks,
2570 MemorySSA &MSSA) {
2571 MemoryAccess *MA = StartInfo.InitialClobberMA;
2572 MemoryAccess *LastMA = StartInfo.ClobberMA;
2573
2574 for (;;) {
2575 while (MA != LastMA) {
2576 Clobbers.push_back(MA);
2577 MA = cast<MemoryUseOrDef>(MA)->getDefiningAccess();
2578 }
2579 Clobbers.push_back(MA);
2580
2581 if (MSSA.isLiveOnEntryDef(MA) ||
2582 (MA->getBlock() == BB && !isa<MemoryPhi>(MA)))
2583 break;
2584
2585 // If the final clobber in the current block is a MemoryPhi, go to the
2586 // immediate dominator; otherwise, just get to the block containing the
2587 // final clobber.
2588 if (MA->getBlock() == BB)
2589 BB = DT->getNode(BB)->getIDom()->getBlock();
2590 else
2591 BB = MA->getBlock();
2592
2593 auto It = Blocks.find(BB);
2594 if (It == Blocks.end())
2595 break;
2596
2597 MA = It->second.InitialClobberMA;
2598 LastMA = It->second.ClobberMA;
2599 if (MA == Clobbers.back())
2600 Clobbers.pop_back();
2601 }
2602}
2603
2604/// Entrypoint for the MemorySSA-based redundant load elimination algorithm.
2605/// Given as input a load instruction, the function computes the set of reaching
2606/// memory values, one per predecessor path, that analyzeLoadAvailability can
2607/// later use to establish whether the load may be eliminated. A reaching value
2608/// may be of the following descriptor kind:
2609/// * Def: a precise instruction that produces the exact bits the load would
2610/// read (e.g., an equivalent load or a MustAlias store);
2611/// * Clobber: a write that clobbers a superset of the bits the load would read
2612/// (e.g., a memset over a larger region);
2613/// * Other: we know which block defines the memory location in some way, but
2614/// could not identify a precise instruction (e.g., memory already live at
2615/// function entry).
2616bool GVNPass::findReachingValuesForLoad(LoadInst *L,
2617 SmallVectorImpl<ReachingMemVal> &Values,
2618 MemorySSA &MSSA, AAResults &AAR) {
2619 EarliestEscapeAnalysis EA(*DT, LI);
2620 BatchAAResults AA(AAR, &EA);
2621 BasicBlock *StartBlock = L->getParent();
2622 bool IsInvariantLoad = L->hasMetadata(LLVMContext::MD_invariant_load);
2623 // TODO: Simplify later work by just getClobberingMemoryAccess().
2624 MemoryAccess *ClobberMA = MSSA.getMemoryAccess(L)->getDefiningAccess();
2625 const MemoryLocation Loc = MemoryLocation::get(L);
2626
2627 // Fast path for load tagged with !invariant.group.
2628 if (L->hasMetadata(LLVMContext::MD_invariant_group)) {
2629 if (Instruction *G = findInvariantGroupValue(L, *DT)) {
2630 Values.emplace_back(
2631 ReachingMemVal::getDef(getLoadStorePointerOperand(G), G));
2632 return true;
2633 }
2634 }
2635
2636 // Phase 1. First off, look for a local dependency to avoid having to
2637 // disambiguate between before the load and after the load of the starting
2638 // block (as the load may be visited from a backedge).
2639 do {
2640 // Scan users of the clobbering memory access.
2641 if (auto RMV = scanMemoryAccessesUsers(
2642 Loc, IsInvariantLoad, StartBlock,
2643 SmallVector<MemoryAccess *, 1>{ClobberMA}, MSSA, AA, L)) {
2644 Values.emplace_back(*RMV);
2645 return true;
2646 }
2647
2648 // Exit from here, and proceed visiting predecessors if the clobbering
2649 // access is non-local or is a MemoryPhi.
2650 if (ClobberMA->getBlock() != StartBlock || isa<MemoryPhi>(ClobberMA))
2651 break;
2652
2653 // Check if the clobber actually aliases the load location.
2654 if (auto RMV = accessMayModifyLocation(ClobberMA, Loc, IsInvariantLoad,
2655 StartBlock, MSSA, AA)) {
2656 Values.emplace_back(*RMV);
2657 return true;
2658 }
2659
2660 // It may happen that the clobbering memory access does not actually
2661 // clobber our load location, transition to its defining memory access.
2662 ClobberMA = cast<MemoryUseOrDef>(ClobberMA)->getDefiningAccess();
2663 } while (ClobberMA->getBlock() == StartBlock);
2664
2665 // Non-local speculations are not allowed under ASan.
2666 if (L->getFunction()->hasFnAttribute(Attribute::SanitizeAddress) ||
2667 L->getFunction()->hasFnAttribute(Attribute::SanitizeHWAddress))
2668 return false;
2669
2670 // Phase 2. Walk backwards through the CFG, collecting all the blocks that
2671 // contain an instruction that modifies the load memory location, or that lie
2672 // on a path between a clobbering block and our load. Start off by collecting
2673 // the predecessors of `StartBlock`. All the visited blocks are stored in a
2674 // the set `Blocks`. If possible, the memory address maintained for the block
2675 // visited does get phi-translated.
2676 DependencyBlockSet Blocks;
2677 SmallVector<BasicBlock *, 16> InitialWorklist;
2678 const DataLayout &DL = L->getModule()->getDataLayout();
2679 if (!collectPredecessors(StartBlock,
2680 PHITransAddr(L->getPointerOperand(), DL, AC),
2681 ClobberMA, Blocks, InitialWorklist))
2682 return false;
2683
2684 // Do a bottom-up DFS.
2685 auto Worklist = InitialWorklist;
2686 while (!Worklist.empty()) {
2687 // Match MemDep's cutoff for expensive non-local queries.
2688 if (Blocks.size() > MaxNumReachingBlocks)
2689 return false;
2690 auto *BB = Worklist.pop_back_val();
2691 DependencyBlockInfo &Info = Blocks.find(BB)->second;
2692
2693 // Phi-translation may have failed.
2694 if (!Info.Addr.getAddr())
2695 continue;
2696
2697 // If the clobbering memory access is in the current block and it indeed
2698 // clobbers our load location, record the dependency and do not visit the
2699 // predecessors of this block further, continue with the blocks in the
2700 // worklist.
2701 if (Info.ClobberMA->getBlock() == BB && !isa<MemoryPhi>(Info.ClobberMA)) {
2702 if (auto RMV = accessMayModifyLocation(
2703 Info.ClobberMA, Loc.getWithNewPtr(Info.Addr.getAddr()),
2704 IsInvariantLoad, BB, MSSA, AA)) {
2705 Info.MemVal = RMV;
2706 continue;
2707 }
2708 assert(!MSSA.isLiveOnEntryDef(Info.ClobberMA) &&
2709 "LiveOnEntry aliases everything");
2710
2711 // If, however, the clobbering memory access does not actually clobber
2712 // our load location, transition to its defining memory access, but
2713 // keep examining the same basic block.
2714 Info.ClobberMA =
2715 cast<MemoryUseOrDef>(Info.ClobberMA)->getDefiningAccess();
2716 Worklist.emplace_back(BB);
2717 continue;
2718 }
2719
2720 // At this point we know the current block is "transparent", i.e. the memory
2721 // location is not modified when execution goes through this block.
2722 // Continue to its predecessors, unless a predecessor has already been
2723 // visited with a different address. We currently cannot represent such a
2724 // dependency.
2725 if (BB == StartBlock && Info.Addr.getAddr() != L->getPointerOperand()) {
2726 Info.ForceUnknown = true;
2727 continue;
2728 }
2729 if (BB != StartBlock &&
2730 !collectPredecessors(BB, Info.Addr, Info.ClobberMA, Blocks, Worklist))
2731 Info.ForceUnknown = true;
2732 }
2733
2734 // Phase 3. We have collected all the blocks that either write a value to the
2735 // memory location of the load, or there exists a path to the load, along
2736 // which the memory location is not modified. Perform a second DFS to find
2737 // load-to-load dependencies; namely, look at the dominating memory reads,
2738 // that alias our load. These are the MemoryUses that are users of the
2739 // MemoryDefs we previously identified. If no memory read is encountered,
2740 // either confirm the clobbering write found before or set to unknown.
2741 Worklist = InitialWorklist;
2742 for (BasicBlock *BB : Worklist) {
2743 DependencyBlockInfo &Info = Blocks.find(BB)->second;
2744 Info.Visited = true;
2745 }
2746
2748 while (!Worklist.empty()) {
2749 auto *BB = Worklist.pop_back_val();
2750 DependencyBlockInfo &Info = Blocks.find(BB)->second;
2751
2752 // If phi-translation failed, assume the memory location is modified in
2753 // unknown way.
2754 if (!Info.Addr.getAddr()) {
2755 Values.push_back(ReachingMemVal::getUnknown(BB, nullptr));
2756 continue;
2757 }
2758
2759 Clobbers.clear();
2760 collectClobberList(Clobbers, BB, Info, Blocks, MSSA);
2761 if (auto RMV =
2762 scanMemoryAccessesUsers(Loc.getWithNewPtr(Info.Addr.getAddr()),
2763 IsInvariantLoad, BB, Clobbers, MSSA, AA)) {
2764 Values.push_back(*RMV);
2765 continue;
2766 }
2767
2768 // If no reusable memory use was found, and the current block is not
2769 // transparent, use the already established memory def.
2770 if (Info.MemVal) {
2771 Values.push_back(*Info.MemVal);
2772 continue;
2773 }
2774
2775 if (Info.ForceUnknown) {
2776 Values.push_back(ReachingMemVal::getUnknown(BB, Info.Addr.getAddr()));
2777 continue;
2778 }
2779
2780 // If the current block is transparent, continue to its predecessors.
2781 for (BasicBlock *Pred : predecessors(BB)) {
2782 auto It = Blocks.find(Pred);
2783 if (It == Blocks.end())
2784 continue;
2785 DependencyBlockInfo &PredInfo = It->second;
2786 if (PredInfo.Visited)
2787 continue;
2788 PredInfo.Visited = true;
2789 Worklist.push_back(Pred);
2790 }
2791 }
2792
2793 return true;
2794}
2795
2796/// Attempt to eliminate a load, first by eliminating it
2797/// locally, and then attempting non-local elimination if that fails.
2798bool GVNPass::processLoad(LoadInst *L) {
2799 if (!MD && !isMemorySSAEnabled())
2800 return false;
2801
2802 // This code hasn't been audited for ordered or volatile memory access.
2803 if (!L->isUnordered())
2804 return false;
2805
2806 if (L->getType()->isTokenLikeTy())
2807 return false;
2808
2809 if (L->use_empty()) {
2811 return true;
2812 }
2813
2814 ReachingMemVal MemVal = ReachingMemVal::getUnknown(nullptr, nullptr);
2815 if (!isMemorySSAEnabled()) {
2816 // ... to a pointer that has been loaded from before...
2817 MemDepResult Dep = MD->getDependency(L);
2818
2819 // If it is defined in another block, try harder.
2820 if (Dep.isNonLocal())
2821 return processNonLocalLoad(L);
2822
2823 // Only handle the local case below.
2824 if (Dep.isDef())
2825 MemVal = ReachingMemVal::getDef(L->getPointerOperand(), Dep.getInst());
2826 else if (Dep.isClobber())
2827 MemVal =
2828 ReachingMemVal::getClobber(L->getPointerOperand(), Dep.getInst());
2829 } else {
2831 if (!findReachingValuesForLoad(L, MemVals, *MSSAU->getMemorySSA(), *AA))
2832 return false; // Too many dependencies.
2833 assert(MemVals.size() && "Expected at least an unknown value");
2834 if (MemVals.size() > 1 || MemVals[0].Block != L->getParent())
2835 return processNonLocalLoad(L, MemVals);
2836
2837 MemVal = MemVals[0];
2838 }
2839
2840 if (MemVal.Kind == DepKind::Other) {
2841 // This might be a NonFuncLocal or an Unknown.
2842 LLVM_DEBUG(
2843 // fast print dep, using operator<< on instruction is too slow.
2844 dbgs() << "GVN: load "; L->printAsOperand(dbgs());
2845 dbgs() << " has unknown dependence\n";);
2846 return false;
2847 }
2848
2849 auto AV = analyzeLoadAvailability(L, MemVal, L->getPointerOperand());
2850 if (!AV)
2851 return false;
2852
2854
2855 // MaterializeAdjustedValue is responsible for combining metadata.
2856 ICF->removeUsersOf(L);
2857 L->replaceAllUsesWith(AvailableValue);
2858 if (MSSAU)
2859 MSSAU->removeMemoryAccess(L);
2860 ++NumGVNLoad;
2863 // Tell MDA to reexamine the reused pointer since we might have more
2864 // information after forwarding it.
2865 if (MD && AvailableValue->getType()->isPtrOrPtrVectorTy())
2866 MD->invalidateCachedPointerInfo(AvailableValue);
2867 return true;
2868}
2869
2870// Attempt to process masked loads which have loaded from
2871// masked stores with the same mask
2872bool GVNPass::processMaskedLoad(IntrinsicInst *I) {
2873 if (!MD)
2874 return false;
2875 MemDepResult Dep = MD->getDependency(I);
2876 Instruction *DepInst = Dep.getInst();
2877 if (!DepInst || !Dep.isLocal() || !Dep.isDef())
2878 return false;
2879
2880 Value *Mask = I->getOperand(1);
2881 Value *Passthrough = I->getOperand(2);
2882 Value *StoreVal;
2883 if (!match(DepInst,
2884 m_MaskedStore(m_Value(StoreVal), m_Value(), m_Specific(Mask))) ||
2885 StoreVal->getType() != I->getType())
2886 return false;
2887
2888 // Remove the load but generate a select for the passthrough
2889 Value *OpToForward = llvm::SelectInst::Create(Mask, StoreVal, Passthrough, "",
2890 I->getIterator());
2891
2892 ICF->removeUsersOf(I);
2893 I->replaceAllUsesWith(OpToForward);
2895 ++NumGVNLoad;
2896 return true;
2897}
2898
2899/// Return a pair the first field showing the value number of \p Exp and the
2900/// second field showing whether it is a value number newly created.
2901std::pair<uint32_t, bool>
2902GVNPass::ValueTable::assignExpNewValueNum(Expression &Exp) {
2903 uint32_t &E = ExpressionNumbering[Exp];
2904 bool CreateNewValNum = !E;
2905 if (CreateNewValNum) {
2906 Expressions.push_back(Exp);
2907 if (ExprIdx.size() < NextValueNumber + 1)
2908 ExprIdx.resize(NextValueNumber * 2);
2909 E = NextValueNumber;
2910 ExprIdx[NextValueNumber++] = NextExprNumber++;
2911 }
2912 return {E, CreateNewValNum};
2913}
2914
2915/// Return whether all the values related with the same \p num are
2916/// defined in \p BB.
2917bool GVNPass::ValueTable::areAllValsInBB(uint32_t Num, const BasicBlock *BB,
2918 GVNPass &GVN) {
2919 return all_of(
2920 GVN.LeaderTable.getLeaders(Num),
2921 [=](const LeaderMap::LeaderTableEntry &L) { return L.BB == BB; });
2922}
2923
2924/// Wrap phiTranslateImpl to provide caching functionality.
2925uint32_t GVNPass::ValueTable::phiTranslate(const BasicBlock *Pred,
2926 const BasicBlock *PhiBlock,
2927 uint32_t Num, GVNPass &GVN) {
2928 auto FindRes = PhiTranslateTable.find({Num, Pred});
2929 if (FindRes != PhiTranslateTable.end())
2930 return FindRes->second;
2931 uint32_t NewNum = phiTranslateImpl(Pred, PhiBlock, Num, GVN);
2932 PhiTranslateTable.insert({{Num, Pred}, NewNum});
2933 return NewNum;
2934}
2935
2936// Return true if the value number \p Num and NewNum have equal value.
2937// Return false if the result is unknown.
2938bool GVNPass::ValueTable::areCallValsEqual(uint32_t Num, uint32_t NewNum,
2939 const BasicBlock *Pred,
2940 const BasicBlock *PhiBlock,
2941 GVNPass &GVN) {
2942 CallInst *Call = nullptr;
2943 auto Leaders = GVN.LeaderTable.getLeaders(Num);
2944 for (const auto &Entry : Leaders) {
2945 Call = dyn_cast<CallInst>(&*Entry.Val);
2946 if (Call && Call->getParent() == PhiBlock)
2947 break;
2948 }
2949
2950 if (AA->doesNotAccessMemory(Call))
2951 return true;
2952
2953 if (!MD || !AA->onlyReadsMemory(Call))
2954 return false;
2955
2956 MemDepResult LocalDep = MD->getDependency(Call);
2957 if (!LocalDep.isNonLocal())
2958 return false;
2959
2962
2963 // Check to see if the Call has no function local clobber.
2964 for (const NonLocalDepEntry &D : Deps) {
2965 if (D.getResult().isNonFuncLocal())
2966 return true;
2967 }
2968 return false;
2969}
2970
2971/// Translate value number \p Num using phis, so that it has the values of
2972/// the phis in BB.
2973uint32_t GVNPass::ValueTable::phiTranslateImpl(const BasicBlock *Pred,
2974 const BasicBlock *PhiBlock,
2975 uint32_t Num, GVNPass &GVN) {
2976 // See if we can refine the value number by looking at the PN incoming value
2977 // for the given predecessor.
2978 if (PHINode *PN = NumberingPhi[Num]) {
2979 if (PN->getParent() != PhiBlock)
2980 return Num;
2981 for (unsigned I = 0; I != PN->getNumIncomingValues(); ++I) {
2982 if (PN->getIncomingBlock(I) != Pred)
2983 continue;
2984 if (uint32_t TransVal = lookup(PN->getIncomingValue(I), false))
2985 return TransVal;
2986 }
2987 return Num;
2988 }
2989
2990 if (BasicBlock *BB = NumberingBB[Num]) {
2991 assert(MSSA && "NumberingBB is non-empty only when using MemorySSA");
2992 // Value numbers of basic blocks are used to represent memory state in
2993 // load/store instructions and read-only function calls when said state is
2994 // set by a MemoryPhi.
2995 if (BB != PhiBlock)
2996 return Num;
2997 MemoryPhi *MPhi = MSSA->getMemoryAccess(BB);
2998 for (unsigned i = 0, N = MPhi->getNumIncomingValues(); i != N; ++i) {
2999 if (MPhi->getIncomingBlock(i) != Pred)
3000 continue;
3001 MemoryAccess *MA = MPhi->getIncomingValue(i);
3002 if (auto *PredPhi = dyn_cast<MemoryPhi>(MA))
3003 return lookupOrAdd(PredPhi->getBlock());
3004 if (MSSA->isLiveOnEntryDef(MA))
3005 return lookupOrAdd(&BB->getParent()->getEntryBlock());
3006 return lookupOrAdd(cast<MemoryUseOrDef>(MA)->getMemoryInst());
3007 }
3009 "CFG/MemorySSA mismatch: predecessor not found among incoming blocks");
3010 }
3011
3012 // If there is any value related with Num is defined in a BB other than
3013 // PhiBlock, it cannot depend on a phi in PhiBlock without going through
3014 // a backedge. We can do an early exit in that case to save compile time.
3015 if (!areAllValsInBB(Num, PhiBlock, GVN))
3016 return Num;
3017
3018 if (Num >= ExprIdx.size() || ExprIdx[Num] == 0)
3019 return Num;
3020 Expression Exp = Expressions[ExprIdx[Num]];
3021
3022 for (unsigned I = 0; I < Exp.VarArgs.size(); I++) {
3023 // For InsertValue and ExtractValue, some varargs are index numbers
3024 // instead of value numbers. Those index numbers should not be
3025 // translated.
3026 if ((I > 1 && Exp.Opcode == Instruction::InsertValue) ||
3027 (I > 0 && Exp.Opcode == Instruction::ExtractValue) ||
3028 (I > 1 && Exp.Opcode == Instruction::ShuffleVector))
3029 continue;
3030 Exp.VarArgs[I] = phiTranslate(Pred, PhiBlock, Exp.VarArgs[I], GVN);
3031 }
3032
3033 if (Exp.Commutative) {
3034 assert(Exp.VarArgs.size() >= 2 && "Unsupported commutative instruction!");
3035 if (Exp.VarArgs[0] > Exp.VarArgs[1]) {
3036 std::swap(Exp.VarArgs[0], Exp.VarArgs[1]);
3037 uint32_t Opcode = Exp.Opcode >> 8;
3038 if (Opcode == Instruction::ICmp || Opcode == Instruction::FCmp)
3039 Exp.Opcode = (Opcode << 8) |
3041 static_cast<CmpInst::Predicate>(Exp.Opcode & 255));
3042 }
3043 }
3044
3045 if (uint32_t NewNum = ExpressionNumbering[Exp]) {
3046 if (Exp.Opcode == Instruction::Call && NewNum != Num)
3047 return areCallValsEqual(Num, NewNum, Pred, PhiBlock, GVN) ? NewNum : Num;
3048 return NewNum;
3049 }
3050 return Num;
3051}
3052
3053/// Erase stale entry from phiTranslate cache so phiTranslate can be computed
3054/// again.
3055void GVNPass::ValueTable::eraseTranslateCacheEntry(
3056 uint32_t Num, const BasicBlock &CurrBlock) {
3057 for (const BasicBlock *Pred : predecessors(&CurrBlock))
3058 PhiTranslateTable.erase({Num, Pred});
3059}
3060
3061// In order to find a leader for a given value number at a
3062// specific basic block, we first obtain the list of all Values for that number,
3063// and then scan the list to find one whose block dominates the block in
3064// question. This is fast because dominator tree queries consist of only
3065// a few comparisons of DFS numbers.
3066Value *GVNPass::findLeader(const BasicBlock *BB, uint32_t Num) {
3067 auto Leaders = LeaderTable.getLeaders(Num);
3068 if (Leaders.empty())
3069 return nullptr;
3070
3071 Value *Val = nullptr;
3072 for (const auto &Entry : Leaders) {
3073 if (DT->dominates(Entry.BB, BB)) {
3074 Val = Entry.Val;
3075 if (isa<Constant>(Val))
3076 return Val;
3077 }
3078 }
3079
3080 return Val;
3081}
3082
3083/// There is an edge from 'Src' to 'Dst'. Return
3084/// true if every path from the entry block to 'Dst' passes via this edge. In
3085/// particular 'Dst' must not be reachable via another edge from 'Src'.
3087 DominatorTree *DT) {
3088 // While in theory it is interesting to consider the case in which Dst has
3089 // more than one predecessor, because Dst might be part of a loop which is
3090 // only reachable from Src, in practice it is pointless since at the time
3091 // GVN runs all such loops have preheaders, which means that Dst will have
3092 // been changed to have only one predecessor, namely Src.
3093 const BasicBlock *Pred = E.getEnd()->getSinglePredecessor();
3094 assert((!Pred || Pred == E.getStart()) &&
3095 "No edge between these basic blocks!");
3096 return Pred != nullptr;
3097}
3098
3099void GVNPass::assignBlockRPONumber(Function &F) {
3100 BlockRPONumber.clear();
3101 uint32_t NextBlockNumber = 1;
3102 ReversePostOrderTraversal<Function *> RPOT(&F);
3103 for (BasicBlock *BB : RPOT)
3104 BlockRPONumber[BB] = NextBlockNumber++;
3105 InvalidBlockRPONumbers = false;
3106}
3107
3108/// The given values are known to be equal in every use
3109/// dominated by 'Root'. Exploit this, for example by replacing 'LHS' with
3110/// 'RHS' everywhere in the scope. Returns whether a change was made.
3111/// The Root may either be a basic block edge (for conditions) or an
3112/// instruction (for assumes).
3113bool GVNPass::propagateEquality(
3114 Value *LHS, Value *RHS,
3115 const std::variant<BasicBlockEdge, Instruction *> &Root) {
3117 SmallDenseSet<std::pair<Value *, Value *>, 4> Visited;
3118 Worklist.push_back(std::make_pair(LHS, RHS));
3119 bool Changed = false;
3120 SmallVector<const BasicBlock *> DominatedBlocks;
3121 if (const BasicBlockEdge *Edge = std::get_if<BasicBlockEdge>(&Root)) {
3122 // For speed, compute a conservative fast approximation to
3123 // DT->dominates(Root, Root.getEnd());
3125 DominatedBlocks.push_back(Edge->getEnd());
3126 } else {
3127 Instruction *I = std::get<Instruction *>(Root);
3128 for (const auto *Node : DT->getNode(I->getParent())->children())
3129 DominatedBlocks.push_back(Node->getBlock());
3130 }
3131
3132 while (!Worklist.empty()) {
3133 std::pair<Value*, Value*> Item = Worklist.pop_back_val();
3134 LHS = Item.first; RHS = Item.second;
3135
3136 if (LHS == RHS)
3137 continue;
3138 assert(LHS->getType() == RHS->getType() && "Equality but unequal types!");
3139
3140 // Don't try to propagate equalities between constants.
3142 continue;
3143
3144 // Prefer a constant on the right-hand side, or an Argument if no constants.
3146 std::swap(LHS, RHS);
3147 assert((isa<Argument>(LHS) || isa<Instruction>(LHS)) && "Unexpected value!");
3148 const DataLayout &DL =
3150 ? cast<Argument>(LHS)->getParent()->getDataLayout()
3151 : cast<Instruction>(LHS)->getDataLayout();
3152
3153 // If there is no obvious reason to prefer the left-hand side over the
3154 // right-hand side, ensure the longest lived term is on the right-hand side,
3155 // so the shortest lived term will be replaced by the longest lived.
3156 // This tends to expose more simplifications.
3157 uint32_t LVN = VN.lookupOrAdd(LHS);
3158 if ((isa<Argument>(LHS) && isa<Argument>(RHS)) ||
3160 // Move the 'oldest' value to the right-hand side, using the value number
3161 // as a proxy for age.
3162 uint32_t RVN = VN.lookupOrAdd(RHS);
3163 if (LVN < RVN) {
3164 std::swap(LHS, RHS);
3165 LVN = RVN;
3166 }
3167 }
3168
3169 if (!Visited.insert({LHS, RHS}).second)
3170 continue;
3171
3172 // If value numbering later sees that an instruction in the scope is equal
3173 // to 'LHS' then ensure it will be turned into 'RHS'. In order to preserve
3174 // the invariant that instructions only occur in the leader table for their
3175 // own value number (this is used by removeFromLeaderTable), do not do this
3176 // if RHS is an instruction (if an instruction in the scope is morphed into
3177 // LHS then it will be turned into RHS by the next GVN iteration anyway, so
3178 // using the leader table is about compiling faster, not optimizing better).
3179 // The leader table only tracks basic blocks, not edges. Only add to if we
3180 // have the simple case where the edge dominates the end.
3182 for (const BasicBlock *BB : DominatedBlocks)
3183 LeaderTable.insert(LVN, RHS, BB);
3184
3185 // Replace all occurrences of 'LHS' with 'RHS' everywhere in the scope. As
3186 // LHS always has at least one use that is not dominated by Root, this will
3187 // never do anything if LHS has only one use.
3188 if (!LHS->hasOneUse()) {
3189 // Create a callback that captures the DL.
3190 auto CanReplacePointersCallBack = [&DL](const Use &U, const Value *To) {
3191 return canReplacePointersInUseIfEqual(U, To, DL);
3192 };
3193 unsigned NumReplacements;
3194 if (const BasicBlockEdge *Edge = std::get_if<BasicBlockEdge>(&Root))
3195 NumReplacements = replaceDominatedUsesWithIf(
3196 LHS, RHS, *DT, *Edge, CanReplacePointersCallBack);
3197 else
3198 NumReplacements = replaceDominatedUsesWithIf(
3199 LHS, RHS, *DT, std::get<Instruction *>(Root),
3200 CanReplacePointersCallBack);
3201
3202 if (NumReplacements > 0) {
3203 Changed = true;
3204 NumGVNEqProp += NumReplacements;
3205 // Cached information for anything that uses LHS will be invalid.
3206 if (MD)
3207 MD->invalidateCachedPointerInfo(LHS);
3208 }
3209 }
3210
3211 // Now try to deduce additional equalities from this one. For example, if
3212 // the known equality was "(A != B)" == "false" then it follows that A and B
3213 // are equal in the scope. Only boolean equalities with an explicit true or
3214 // false RHS are currently supported.
3215 if (!RHS->getType()->isIntegerTy(1))
3216 // Not a boolean equality - bail out.
3217 continue;
3218 ConstantInt *CI = dyn_cast<ConstantInt>(RHS);
3219 if (!CI)
3220 // RHS neither 'true' nor 'false' - bail out.
3221 continue;
3222 // Whether RHS equals 'true'. Otherwise it equals 'false'.
3223 bool IsKnownTrue = CI->isMinusOne();
3224 bool IsKnownFalse = !IsKnownTrue;
3225
3226 // If "A && B" is known true then both A and B are known true. If "A || B"
3227 // is known false then both A and B are known false.
3228 Value *A, *B;
3229 if ((IsKnownTrue && match(LHS, m_LogicalAnd(m_Value(A), m_Value(B)))) ||
3230 (IsKnownFalse && match(LHS, m_LogicalOr(m_Value(A), m_Value(B))))) {
3231 Worklist.push_back(std::make_pair(A, RHS));
3232 Worklist.push_back(std::make_pair(B, RHS));
3233 continue;
3234 }
3235
3236 // If we are propagating an equality like "(A == B)" == "true" then also
3237 // propagate the equality A == B. When propagating a comparison such as
3238 // "(A >= B)" == "true", replace all instances of "A < B" with "false".
3239 if (CmpInst *Cmp = dyn_cast<CmpInst>(LHS)) {
3240 Value *Op0 = Cmp->getOperand(0), *Op1 = Cmp->getOperand(1);
3241
3242 // If "A == B" is known true, or "A != B" is known false, then replace
3243 // A with B everywhere in the scope. For floating point operations, we
3244 // have to be careful since equality does not always imply equivalance.
3245 if (Cmp->isEquivalence(IsKnownFalse))
3246 Worklist.push_back(std::make_pair(Op0, Op1));
3247
3248 // If "A >= B" is known true, replace "A < B" with false everywhere.
3249 CmpInst::Predicate NotPred = Cmp->getInversePredicate();
3250 Constant *NotVal = ConstantInt::get(Cmp->getType(), IsKnownFalse);
3251 // Since we don't have the instruction "A < B" immediately to hand, work
3252 // out the value number that it would have and use that to find an
3253 // appropriate instruction (if any).
3254 uint32_t NextNum = VN.getNextUnusedValueNumber();
3255 uint32_t Num = VN.lookupOrAddCmp(Cmp->getOpcode(), NotPred, Op0, Op1);
3256 // If the number we were assigned was brand new then there is no point in
3257 // looking for an instruction realizing it: there cannot be one!
3258 if (Num < NextNum) {
3259 for (const auto &Entry : LeaderTable.getLeaders(Num)) {
3260 // Only look at leaders that either dominate the start of the edge,
3261 // or are dominated by the end. This check is not necessary for
3262 // correctness, it only discards cases for which the following
3263 // use replacement will not work anyway.
3264 if (const BasicBlockEdge *Edge = std::get_if<BasicBlockEdge>(&Root)) {
3265 if (!DT->dominates(Entry.BB, Edge->getStart()) &&
3266 !DT->dominates(Edge->getEnd(), Entry.BB))
3267 continue;
3268 } else {
3269 auto *InstBB = std::get<Instruction *>(Root)->getParent();
3270 if (!DT->dominates(Entry.BB, InstBB) &&
3271 !DT->dominates(InstBB, Entry.BB))
3272 continue;
3273 }
3274
3275 Value *NotCmp = Entry.Val;
3276 if (NotCmp && isa<Instruction>(NotCmp)) {
3277 unsigned NumReplacements;
3278 if (const BasicBlockEdge *Edge = std::get_if<BasicBlockEdge>(&Root))
3279 NumReplacements =
3280 replaceDominatedUsesWith(NotCmp, NotVal, *DT, *Edge);
3281 else
3282 NumReplacements = replaceDominatedUsesWith(
3283 NotCmp, NotVal, *DT, std::get<Instruction *>(Root));
3284 Changed |= NumReplacements > 0;
3285 NumGVNEqProp += NumReplacements;
3286 // Cached information for anything that uses NotCmp will be invalid.
3287 if (MD)
3288 MD->invalidateCachedPointerInfo(NotCmp);
3289 }
3290 }
3291 }
3292 // Ensure that any instruction in scope that gets the "A < B" value number
3293 // is replaced with false.
3294 // The leader table only tracks basic blocks, not edges. Only add to if we
3295 // have the simple case where the edge dominates the end.
3296 for (const BasicBlock *BB : DominatedBlocks)
3297 LeaderTable.insert(Num, NotVal, BB);
3298
3299 continue;
3300 }
3301
3302 // Propagate equalities that results from truncation with no unsigned wrap
3303 // like (trunc nuw i64 %v to i1) == "true" or (trunc nuw i64 %v to i1) ==
3304 // "false"
3305 if (match(LHS, m_NUWTrunc(m_Value(A)))) {
3306 Worklist.emplace_back(A, ConstantInt::get(A->getType(), IsKnownTrue));
3307 continue;
3308 }
3309
3310 if (match(LHS, m_Not(m_Value(A)))) {
3311 Worklist.emplace_back(A, ConstantInt::get(A->getType(), !IsKnownTrue));
3312 continue;
3313 }
3314 }
3315
3316 return Changed;
3317}
3318
3319/// When calculating availability, handle an instruction
3320/// by inserting it into the appropriate sets.
3321bool GVNPass::processInstruction(Instruction *I) {
3322 // If the instruction can be easily simplified then do so now in preference
3323 // to value numbering it. Value numbering often exposes redundancies, for
3324 // example if it determines that %y is equal to %x then the instruction
3325 // "%z = and i32 %x, %y" becomes "%z = and i32 %x, %x" which we now simplify.
3326 const DataLayout &DL = I->getDataLayout();
3327 if (Value *V = simplifyInstruction(I, {DL, TLI, DT, AC})) {
3328 bool Changed = false;
3329 if (!I->use_empty()) {
3330 // Simplification can cause a special instruction to become not special.
3331 // For example, devirtualization to a willreturn function.
3332 ICF->removeUsersOf(I);
3333 I->replaceAllUsesWith(V);
3334 Changed = true;
3335 }
3336 if (isInstructionTriviallyDead(I, TLI)) {
3338 Changed = true;
3339 }
3340 if (Changed) {
3341 if (MD && V->getType()->isPtrOrPtrVectorTy())
3342 MD->invalidateCachedPointerInfo(V);
3343 ++NumGVNSimpl;
3344 return true;
3345 }
3346 }
3347
3348 if (auto *Assume = dyn_cast<AssumeInst>(I))
3349 return processAssumeIntrinsic(Assume);
3350
3351 if (LoadInst *Load = dyn_cast<LoadInst>(I)) {
3352 if (processLoad(Load))
3353 return true;
3354
3355 unsigned Num = VN.lookupOrAdd(Load);
3356 LeaderTable.insert(Num, Load, Load->getParent());
3357 return false;
3358 }
3359
3361 processMaskedLoad(cast<IntrinsicInst>(I)))
3362 return true;
3363
3364 // For conditional branches, we can perform simple conditional propagation on
3365 // the condition value itself.
3366 if (CondBrInst *BI = dyn_cast<CondBrInst>(I)) {
3367 if (isa<Constant>(BI->getCondition()))
3368 return processFoldableCondBr(BI);
3369
3370 Value *BranchCond = BI->getCondition();
3371 BasicBlock *TrueSucc = BI->getSuccessor(0);
3372 BasicBlock *FalseSucc = BI->getSuccessor(1);
3373 // Avoid multiple edges early.
3374 if (TrueSucc == FalseSucc)
3375 return false;
3376
3377 BasicBlock *Parent = BI->getParent();
3378 bool Changed = false;
3379
3381 BasicBlockEdge TrueE(Parent, TrueSucc);
3382 Changed |= propagateEquality(BranchCond, TrueVal, TrueE);
3383
3385 BasicBlockEdge FalseE(Parent, FalseSucc);
3386 Changed |= propagateEquality(BranchCond, FalseVal, FalseE);
3387
3388 return Changed;
3389 }
3390
3391 // For switches, propagate the case values into the case destinations.
3392 if (SwitchInst *SI = dyn_cast<SwitchInst>(I)) {
3393 Value *SwitchCond = SI->getCondition();
3394 BasicBlock *Parent = SI->getParent();
3395 bool Changed = false;
3396
3397 // Remember how many outgoing edges there are to every successor.
3398 SmallDenseMap<BasicBlock *, unsigned, 16> SwitchEdges;
3399 for (BasicBlock *Succ : successors(Parent))
3400 ++SwitchEdges[Succ];
3401
3402 for (const auto &Case : SI->cases()) {
3403 BasicBlock *Dst = Case.getCaseSuccessor();
3404 // If there is only a single edge, propagate the case value into it.
3405 if (SwitchEdges.lookup(Dst) == 1) {
3406 BasicBlockEdge E(Parent, Dst);
3407 Changed |= propagateEquality(SwitchCond, Case.getCaseValue(), E);
3408 }
3409 }
3410 return Changed;
3411 }
3412
3413 // Instructions with void type don't return a value, so there's
3414 // no point in trying to find redundancies in them.
3415 if (I->getType()->isVoidTy())
3416 return false;
3417
3418 uint32_t NextNum = VN.getNextUnusedValueNumber();
3419 unsigned Num = VN.lookupOrAdd(I);
3420
3421 // Allocations are always uniquely numbered, so we can save time and memory
3422 // by fast failing them.
3423 if (isa<AllocaInst>(I) || I->isTerminator() || isa<PHINode>(I)) {
3424 LeaderTable.insert(Num, I, I->getParent());
3425 return false;
3426 }
3427
3428 // A ptrtoaddr and a ptrtoint of the same pointer compute the same value when
3429 // the address width equals the pointer representation width.
3430 if (auto *PTA = dyn_cast<PtrToAddrInst>(I)) {
3431 const DataLayout &DL = I->getDataLayout();
3432 unsigned AS = PTA->getPointerAddressSpace();
3433 if (DL.getAddressSizeInBits(AS) == DL.getPointerSizeInBits(AS) &&
3434 !DL.hasUnstableRepresentation(AS)) {
3435 uint32_t PTINum =
3436 VN.lookupPtrToInt(PTA->getPointerOperand(), PTA->getType());
3437 if (Value *PTI = findLeader(I->getParent(), PTINum)) {
3440 return true;
3441 }
3442 }
3443 }
3444
3445 // If the number we were assigned was a brand new VN, then we don't
3446 // need to do a lookup to see if the number already exists
3447 // somewhere in the domtree: it can't!
3448 if (Num >= NextNum) {
3449 LeaderTable.insert(Num, I, I->getParent());
3450 return false;
3451 }
3452
3453 // Perform fast-path value-number based elimination of values inherited from
3454 // dominators.
3455 Value *Repl = findLeader(I->getParent(), Num);
3456 if (!Repl) {
3457 // Failure, just remember this instance for future use.
3458 LeaderTable.insert(Num, I, I->getParent());
3459 return false;
3460 }
3461
3462 if (Repl == I) {
3463 // If I was the result of a shortcut PRE, it might already be in the table
3464 // and the best replacement for itself. Nothing to do.
3465 return false;
3466 }
3467
3468 // Remove it!
3470 if (MD && Repl->getType()->isPtrOrPtrVectorTy())
3471 MD->invalidateCachedPointerInfo(Repl);
3473 return true;
3474}
3475
3476/// runOnFunction - This is the main transformation entry point for a function.
3477bool GVNPass::runImpl(Function &F, AssumptionCache &RunAC, DominatorTree &RunDT,
3478 const TargetLibraryInfo &RunTLI, AAResults &RunAA,
3479 MemoryDependenceResults *RunMD, LoopInfo &LI,
3480 OptimizationRemarkEmitter *RunORE, MemorySSA *MSSA) {
3481 // MemDep and MemorySSA are mutually exclusive. isMemDepEnabled() silently
3482 // lets MemorySSA win for the common single-flag case, but an explicit
3483 // request for both via -enable-gvn-{memdep,memoryssa} is a contradiction we
3484 // reject rather than resolve arbitrarily.
3487 report_fatal_error("GVN: -enable-gvn-memdep and -enable-gvn-memoryssa are "
3488 "mutually exclusive",
3489 /*gen_crash_diag=*/false);
3490 AC = &RunAC;
3491 DT = &RunDT;
3492 VN.setDomTree(DT);
3493 TLI = &RunTLI;
3494 AA = &RunAA;
3495 VN.setAliasAnalysis(&RunAA);
3496 MD = RunMD;
3497 ImplicitControlFlowTracking ImplicitCFT;
3498 ICF = &ImplicitCFT;
3499 this->LI = &LI;
3500 VN.setMemDep(MD);
3501 // Propagate the MSSA-enabled flag so the value-numbering paths in
3502 // lookupOrAddCall() and computeLoadStoreVN(), which depends on whether
3503 // IsMSSAEnabled is turned on.
3504 VN.setMemorySSA(MSSA, isMemorySSAEnabled());
3505 ORE = RunORE;
3506 InvalidBlockRPONumbers = true;
3507 MemorySSAUpdater Updater(MSSA);
3508 MSSAU = MSSA ? &Updater : nullptr;
3509
3510 bool Changed = false;
3511 bool ShouldContinue = true;
3512
3513 DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy);
3514 // Merge unconditional branches, allowing PRE to catch more
3515 // optimization opportunities.
3516 for (BasicBlock &BB : make_early_inc_range(F)) {
3517 bool RemovedBlock = MergeBlockIntoPredecessor(&BB, &DTU, &LI, MSSAU, MD);
3518 if (RemovedBlock)
3519 ++NumGVNBlocks;
3520
3521 Changed |= RemovedBlock;
3522 }
3523 DTU.flush();
3524
3525 unsigned Iteration = 0;
3526 while (ShouldContinue) {
3527 LLVM_DEBUG(dbgs() << "GVN iteration: " << Iteration << "\n");
3528 (void) Iteration;
3529 ShouldContinue = iterateOnFunction(F);
3530 Changed |= ShouldContinue;
3531 ++Iteration;
3532 }
3533
3534 if (isScalarPREEnabled()) {
3535 // Fabricate val-num for dead-code in order to suppress assertion in
3536 // performPRE().
3537 assignValNumForDeadCode();
3538 bool PREChanged = true;
3539 while (PREChanged) {
3540 PREChanged = performPRE(F);
3541 Changed |= PREChanged;
3542 }
3543 }
3544
3545 // FIXME: Should perform GVN again after PRE does something. PRE can move
3546 // computations into blocks where they become fully redundant. Note that
3547 // we can't do this until PRE's critical edge splitting updates memdep.
3548 // Actually, when this happens, we should just fully integrate PRE into GVN.
3549
3550 cleanupGlobalSets();
3551 // Do not cleanup DeadBlocks in cleanupGlobalSets() as it's called for each
3552 // iteration.
3553 DeadBlocks.clear();
3554
3555 if (MSSA && VerifyMemorySSA)
3556 MSSA->verifyMemorySSA();
3557
3558 return Changed;
3559}
3560
3561bool GVNPass::processBlock(BasicBlock *BB) {
3562 if (DeadBlocks.count(BB))
3563 return false;
3564
3565 bool ChangedFunction = false;
3566
3567 // Since we may not have visited the input blocks of the phis, we can't
3568 // use our normal hash approach for phis. Instead, simply look for
3569 // obvious duplicates. The first pass of GVN will tend to create
3570 // identical phis, and the second or later passes can eliminate them.
3571 SmallPtrSet<PHINode *, 8> PHINodesToRemove;
3572 ChangedFunction |= EliminateDuplicatePHINodes(BB, PHINodesToRemove);
3573 for (PHINode *PN : PHINodesToRemove) {
3574 removeInstruction(PN);
3575 }
3576 for (Instruction &Inst : make_early_inc_range(*BB))
3577 ChangedFunction |= processInstruction(&Inst);
3578 return ChangedFunction;
3579}
3580
3581// Instantiate an expression in a predecessor that lacked it.
3582bool GVNPass::performScalarPREInsertion(Instruction *Instr, BasicBlock *Pred,
3583 BasicBlock *Curr, unsigned int ValNo) {
3584 // Because we are going top-down through the block, all value numbers
3585 // will be available in the predecessor by the time we need them. Any
3586 // that weren't originally present will have been instantiated earlier
3587 // in this loop.
3588 bool Success = true;
3589 for (unsigned I = 0, E = Instr->getNumOperands(); I != E; ++I) {
3590 Value *Op = Instr->getOperand(I);
3592 continue;
3593 // This could be a newly inserted instruction, in which case, we won't
3594 // find a value number, and should give up before we hurt ourselves.
3595 // FIXME: Rewrite the infrastructure to let it easier to value number
3596 // and process newly inserted instructions.
3597 if (!VN.exists(Op)) {
3598 Success = false;
3599 break;
3600 }
3601 uint32_t TValNo =
3602 VN.phiTranslate(Pred, Curr, VN.lookup(Op), *this);
3603 if (Value *V = findLeader(Pred, TValNo)) {
3604 Instr->setOperand(I, V);
3605 } else {
3606 Success = false;
3607 break;
3608 }
3609 }
3610
3611 // Fail out if we encounter an operand that is not available in
3612 // the PRE predecessor. This is typically because of loads which
3613 // are not value numbered precisely.
3614 if (!Success)
3615 return false;
3616
3617 Instr->insertBefore(Pred->getTerminator()->getIterator());
3618 Instr->setName(Instr->getName() + ".pre");
3619 Instr->setDebugLoc(Instr->getDebugLoc());
3620
3621 ICF->insertInstructionTo(Instr, Pred);
3622
3623 unsigned Num = VN.lookupOrAdd(Instr);
3624 VN.add(Instr, Num);
3625
3626 // Update the availability map to include the new instruction.
3627 LeaderTable.insert(Num, Instr, Pred);
3628 return true;
3629}
3630
3631bool GVNPass::performScalarPRE(Instruction *CurInst) {
3632 if (isa<AllocaInst>(CurInst) || CurInst->isTerminator() ||
3633 isa<PHINode>(CurInst) || CurInst->getType()->isVoidTy() ||
3634 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
3635 CurInst->getType()->isTokenLikeTy())
3636 return false;
3637
3638 // Don't do PRE on compares. The PHI would prevent CodeGenPrepare from
3639 // sinking the compare again, and it would force the code generator to
3640 // move the i1 from processor flags or predicate registers into a general
3641 // purpose register.
3642 if (isa<CmpInst>(CurInst))
3643 return false;
3644
3645 // Don't do PRE on GEPs. The inserted PHI would prevent CodeGenPrepare from
3646 // sinking the addressing mode computation back to its uses. Extending the
3647 // GEP's live range increases the register pressure, and therefore it can
3648 // introduce unnecessary spills.
3649 //
3650 // This doesn't prevent Load PRE. PHI translation will make the GEP available
3651 // to the load by moving it to the predecessor block if necessary.
3652 if (isa<GetElementPtrInst>(CurInst))
3653 return false;
3654
3655 if (auto *CallB = dyn_cast<CallBase>(CurInst)) {
3656 // We don't currently value number ANY inline asm calls.
3657 if (CallB->isInlineAsm())
3658 return false;
3659 }
3660
3661 uint32_t ValNo = VN.lookup(CurInst);
3662
3663 // Look for the predecessors for PRE opportunities. We're
3664 // only trying to solve the basic diamond case, where
3665 // a value is computed in the successor and one predecessor,
3666 // but not the other. We also explicitly disallow cases
3667 // where the successor is its own predecessor, because they're
3668 // more complicated to get right.
3669 unsigned NumWith = 0;
3670 unsigned NumWithout = 0;
3671 BasicBlock *PREPred = nullptr;
3672 BasicBlock *CurrentBlock = CurInst->getParent();
3673
3674 // Update the RPO numbers for this function.
3675 if (InvalidBlockRPONumbers)
3676 assignBlockRPONumber(*CurrentBlock->getParent());
3677
3679 for (BasicBlock *P : predecessors(CurrentBlock)) {
3680 // We're not interested in PRE where blocks with predecessors that are
3681 // not reachable.
3682 if (!DT->isReachableFromEntry(P)) {
3683 NumWithout = 2;
3684 break;
3685 }
3686 // It is not safe to do PRE when P->CurrentBlock is a loop backedge.
3687 assert(BlockRPONumber.count(P) && BlockRPONumber.count(CurrentBlock) &&
3688 "Invalid BlockRPONumber map.");
3689 if (BlockRPONumber[P] >= BlockRPONumber[CurrentBlock]) {
3690 NumWithout = 2;
3691 break;
3692 }
3693
3694 uint32_t TValNo = VN.phiTranslate(P, CurrentBlock, ValNo, *this);
3695 Value *PredV = findLeader(P, TValNo);
3696 if (!PredV) {
3697 PredMap.push_back(std::make_pair(static_cast<Value *>(nullptr), P));
3698 PREPred = P;
3699 ++NumWithout;
3700 } else if (PredV == CurInst) {
3701 // CurInst dominates this predecessor.
3702 NumWithout = 2;
3703 break;
3704 } else {
3705 PredMap.push_back(std::make_pair(PredV, P));
3706 ++NumWith;
3707 }
3708 }
3709
3710 // Don't do PRE when it might increase code size, i.e. when
3711 // we would need to insert instructions in more than one pred.
3712 if (NumWithout > 1 || NumWith == 0)
3713 return false;
3714
3715 // We may have a case where all predecessors have the instruction,
3716 // and we just need to insert a phi node. Otherwise, perform
3717 // insertion.
3718 Instruction *PREInstr = nullptr;
3719
3720 if (NumWithout != 0) {
3721 if (!isSafeToSpeculativelyExecute(CurInst)) {
3722 // It is only valid to insert a new instruction if the current instruction
3723 // is always executed. An instruction with implicit control flow could
3724 // prevent us from doing it. If we cannot speculate the execution, then
3725 // PRE should be prohibited.
3726 if (ICF->isDominatedByICFIFromSameBlock(CurInst))
3727 return false;
3728 }
3729
3730 // Don't do PRE across indirect branch.
3731 if (isa<IndirectBrInst>(PREPred->getTerminator()))
3732 return false;
3733
3734 // We can't do PRE safely on a critical edge, so instead we schedule
3735 // the edge to be split and perform the PRE the next time we iterate
3736 // on the function.
3737 unsigned SuccNum = GetSuccessorNumber(PREPred, CurrentBlock);
3738 if (isCriticalEdge(PREPred->getTerminator(), SuccNum)) {
3739 ToSplit.push_back(std::make_pair(PREPred->getTerminator(), SuccNum));
3740 return false;
3741 }
3742 // We need to insert somewhere, so let's give it a shot.
3743 PREInstr = CurInst->clone();
3744 if (!performScalarPREInsertion(PREInstr, PREPred, CurrentBlock, ValNo)) {
3745 // If we failed insertion, make sure we remove the instruction.
3746#ifndef NDEBUG
3747 verifyRemoved(PREInstr);
3748#endif
3749 PREInstr->deleteValue();
3750 return false;
3751 }
3752 }
3753
3754 // Either we should have filled in the PRE instruction, or we should
3755 // not have needed insertions.
3756 assert(PREInstr != nullptr || NumWithout == 0);
3757
3758 ++NumGVNPRE;
3759
3760 // Create a PHI to make the value available in this block.
3761 PHINode *Phi = PHINode::Create(CurInst->getType(), PredMap.size(),
3762 CurInst->getName() + ".pre-phi");
3763 Phi->insertBefore(CurrentBlock->begin());
3764 for (auto &[V, BB] : PredMap) {
3765 if (V) {
3766 // If we use an existing value in this phi, we have to patch the original
3767 // value because the phi will be used to replace a later value.
3768 patchReplacementInstruction(CurInst, V);
3769 Phi->addIncoming(V, BB);
3770 } else
3771 Phi->addIncoming(PREInstr, PREPred);
3772 }
3773
3774 VN.add(Phi, ValNo);
3775 // After creating a new PHI for ValNo, the phi translate result for ValNo will
3776 // be changed, so erase the related stale entries in phi translate cache.
3777 VN.eraseTranslateCacheEntry(ValNo, *CurrentBlock);
3778 LeaderTable.insert(ValNo, Phi, CurrentBlock);
3779 Phi->setDebugLoc(CurInst->getDebugLoc());
3780 CurInst->replaceAllUsesWith(Phi);
3781 if (MD && Phi->getType()->isPtrOrPtrVectorTy())
3782 MD->invalidateCachedPointerInfo(Phi);
3783 LeaderTable.erase(ValNo, CurInst, CurrentBlock);
3784
3785 LLVM_DEBUG(dbgs() << "GVN PRE removed: " << *CurInst << '\n');
3786 removeInstruction(CurInst);
3787
3788 return true;
3789}
3790
3791/// Perform a purely local form of PRE that looks for diamond
3792/// control flow patterns and attempts to perform simple PRE at the join point.
3793bool GVNPass::performPRE(Function &F) {
3794 bool Changed = false;
3795 for (BasicBlock *CurrentBlock : depth_first(&F.getEntryBlock())) {
3796 // Nothing to PRE in the entry block.
3797 if (CurrentBlock == &F.getEntryBlock())
3798 continue;
3799
3800 // Don't perform PRE on an EH pad.
3801 if (CurrentBlock->isEHPad())
3802 continue;
3803
3804 for (BasicBlock::iterator BI = CurrentBlock->begin(),
3805 BE = CurrentBlock->end();
3806 BI != BE;) {
3807 Instruction *CurInst = &*BI++;
3808 Changed |= performScalarPRE(CurInst);
3809 }
3810 }
3811
3812 if (splitCriticalEdges())
3813 Changed = true;
3814
3815 return Changed;
3816}
3817
3818/// Split the critical edge connecting the given two blocks, and return
3819/// the block inserted to the critical edge.
3820BasicBlock *GVNPass::splitCriticalEdges(BasicBlock *Pred, BasicBlock *Succ) {
3821 // GVN does not require loop-simplify, do not try to preserve it if it is not
3822 // possible.
3824 Pred, Succ,
3825 CriticalEdgeSplittingOptions(DT, LI, MSSAU).unsetPreserveLoopSimplify());
3826 if (BB) {
3827 if (MD)
3828 MD->invalidateCachedPredecessors();
3829 InvalidBlockRPONumbers = true;
3830 }
3831 return BB;
3832}
3833
3834/// Split critical edges found during the previous
3835/// iteration that may enable further optimization.
3836bool GVNPass::splitCriticalEdges() {
3837 if (ToSplit.empty())
3838 return false;
3839
3840 bool Changed = false;
3841 do {
3842 std::pair<Instruction *, unsigned> Edge = ToSplit.pop_back_val();
3843 Changed |= SplitCriticalEdge(Edge.first, Edge.second,
3844 CriticalEdgeSplittingOptions(DT, LI, MSSAU)) !=
3845 nullptr;
3846 } while (!ToSplit.empty());
3847 if (Changed) {
3848 if (MD)
3849 MD->invalidateCachedPredecessors();
3850 InvalidBlockRPONumbers = true;
3851 }
3852 return Changed;
3853}
3854
3855/// Executes one iteration of GVN.
3856bool GVNPass::iterateOnFunction(Function &F) {
3857 cleanupGlobalSets();
3858
3859 // Top-down walk of the dominator tree.
3860 bool Changed = false;
3861 // Needed for value numbering with phi construction to work.
3862 // RPOT walks the graph in its constructor and will not be invalidated during
3863 // processBlock.
3864 ReversePostOrderTraversal<Function *> RPOT(&F);
3865
3866 for (BasicBlock *BB : RPOT)
3867 Changed |= processBlock(BB);
3868
3869 return Changed;
3870}
3871
3872void GVNPass::cleanupGlobalSets() {
3873 VN.clear();
3874 LeaderTable.clear();
3875 BlockRPONumber.clear();
3876 ICF->clear();
3877 InvalidBlockRPONumbers = true;
3878}
3879
3880void GVNPass::removeInstruction(Instruction *I) {
3881 VN.erase(I);
3882 if (MD) MD->removeInstruction(I);
3883 if (MSSAU)
3884 MSSAU->removeMemoryAccess(I);
3885#ifndef NDEBUG
3886 verifyRemoved(I);
3887#endif
3888 ICF->removeInstruction(I);
3889 I->eraseFromParent();
3890 ++NumGVNInstr;
3891}
3892
3893/// Verify that the specified instruction does not occur in our
3894/// internal data structures.
3895void GVNPass::verifyRemoved(const Instruction *Inst) const {
3896 VN.verifyRemoved(Inst);
3897}
3898
3899/// BB is declared dead, which implied other blocks become dead as well. This
3900/// function is to add all these blocks to "DeadBlocks". For the dead blocks'
3901/// live successors, update their phi nodes by replacing the operands
3902/// corresponding to dead blocks with UndefVal.
3903void GVNPass::addDeadBlock(BasicBlock *BB) {
3905 SmallSetVector<BasicBlock *, 4> DF;
3906
3907 NewDead.push_back(BB);
3908 while (!NewDead.empty()) {
3909 BasicBlock *D = NewDead.pop_back_val();
3910 if (DeadBlocks.count(D))
3911 continue;
3912
3913 // All blocks dominated by D are dead.
3914 SmallVector<BasicBlock *, 8> Dom;
3915 DT->getDescendants(D, Dom);
3916 DeadBlocks.insert_range(Dom);
3917
3918 // Figure out the dominance-frontier(D).
3919 for (BasicBlock *B : Dom) {
3920 for (BasicBlock *S : successors(B)) {
3921 if (DeadBlocks.count(S))
3922 continue;
3923
3924 bool AllPredDead = true;
3925 for (BasicBlock *P : predecessors(S))
3926 if (!DeadBlocks.count(P)) {
3927 AllPredDead = false;
3928 break;
3929 }
3930
3931 if (!AllPredDead) {
3932 // S could be proved dead later on. That is why we don't update phi
3933 // operands at this moment.
3934 DF.insert(S);
3935 } else {
3936 // While S is not dominated by D, it is dead by now. This could take
3937 // place if S already have a dead predecessor before D is declared
3938 // dead.
3939 NewDead.push_back(S);
3940 }
3941 }
3942 }
3943 }
3944
3945 // For the dead blocks' live successors, update their phi nodes by replacing
3946 // the operands corresponding to dead blocks with UndefVal.
3947 for (BasicBlock *B : DF) {
3948 if (DeadBlocks.count(B))
3949 continue;
3950
3951 // First, split the critical edges. This might also create additional blocks
3952 // to preserve LoopSimplify form and adjust edges accordingly.
3954 for (BasicBlock *P : Preds) {
3955 if (!DeadBlocks.count(P))
3956 continue;
3957
3958 if (is_contained(successors(P), B) &&
3959 isCriticalEdge(P->getTerminator(), B)) {
3960 if (BasicBlock *S = splitCriticalEdges(P, B))
3961 DeadBlocks.insert(P = S);
3962 }
3963 }
3964
3965 // Now poison the incoming values from the dead predecessors.
3966 for (BasicBlock *P : predecessors(B)) {
3967 if (!DeadBlocks.count(P))
3968 continue;
3969 for (PHINode &Phi : B->phis()) {
3970 Phi.setIncomingValueForBlock(P, PoisonValue::get(Phi.getType()));
3971 if (MD)
3972 MD->invalidateCachedPointerInfo(&Phi);
3973 }
3974 }
3975 }
3976}
3977
3978// If the given branch is recognized as a foldable branch (i.e. conditional
3979// branch with constant condition), it will perform following analyses and
3980// transformation.
3981// 1) If the dead out-coming edge is a critical-edge, split it. Let
3982// R be the target of the dead out-coming edge.
3983// 1) Identify the set of dead blocks implied by the branch's dead outcoming
3984// edge. The result of this step will be {X| X is dominated by R}
3985// 2) Identify those blocks which haves at least one dead predecessor. The
3986// result of this step will be dominance-frontier(R).
3987// 3) Update the PHIs in DF(R) by replacing the operands corresponding to
3988// dead blocks with "UndefVal" in an hope these PHIs will optimized away.
3989//
3990// Return true iff *NEW* dead code are found.
3991bool GVNPass::processFoldableCondBr(CondBrInst *BI) {
3992 // If a branch has two identical successors, we cannot declare either dead.
3993 if (BI->getSuccessor(0) == BI->getSuccessor(1))
3994 return false;
3995
3996 ConstantInt *Cond = dyn_cast<ConstantInt>(BI->getCondition());
3997 if (!Cond)
3998 return false;
3999
4000 BasicBlock *DeadRoot =
4001 Cond->getZExtValue() ? BI->getSuccessor(1) : BI->getSuccessor(0);
4002 if (DeadBlocks.count(DeadRoot))
4003 return false;
4004
4005 if (!DeadRoot->getSinglePredecessor())
4006 DeadRoot = splitCriticalEdges(BI->getParent(), DeadRoot);
4007
4008 addDeadBlock(DeadRoot);
4009 return true;
4010}
4011
4012// performPRE() will trigger assert if it comes across an instruction without
4013// associated val-num. As it normally has far more live instructions than dead
4014// instructions, it makes more sense just to "fabricate" a val-number for the
4015// dead code than checking if instruction involved is dead or not.
4016void GVNPass::assignValNumForDeadCode() {
4017 for (BasicBlock *BB : DeadBlocks) {
4018 for (Instruction &Inst : *BB) {
4019 unsigned ValNum = VN.lookupOrAdd(&Inst);
4020 LeaderTable.insert(ValNum, &Inst, BB);
4021 }
4022 }
4023}
4024
4026public:
4027 static char ID; // Pass identification, replacement for typeid.
4028
4029 explicit GVNLegacyPass(bool MemDepAnalysis = GVNEnableMemDep,
4030 bool MemSSAAnalysis = GVNEnableMemorySSA,
4031 bool ScalarPRE = true)
4032 : FunctionPass(ID), Impl(GVNOptions()
4033 .setMemDep(MemDepAnalysis)
4034 .setMemorySSA(MemSSAAnalysis)
4035 .setScalarPRE(ScalarPRE)) {
4037 }
4038
4039 bool runOnFunction(Function &F) override {
4040 if (skipFunction(F))
4041 return false;
4042
4044 if (Impl.isMemorySSAEnabled() && !MSSAWP)
4046
4047 return Impl.runImpl(
4048 F, getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F),
4051 getAnalysis<AAResultsWrapperPass>().getAAResults(),
4052 Impl.isMemDepEnabled()
4054 : nullptr,
4055 getAnalysis<LoopInfoWrapperPass>().getLoopInfo(),
4057 MSSAWP ? &MSSAWP->getMSSA() : nullptr);
4058 }
4059
4077
4078private:
4079 GVNPass Impl;
4080};
4081
4082char GVNLegacyPass::ID = 0;
4083
4084INITIALIZE_PASS_BEGIN(GVNLegacyPass, "gvn", "Global Value Numbering", false, false)
4093INITIALIZE_PASS_END(GVNLegacyPass, "gvn", "Global Value Numbering", false, false)
4094
4095// The public interface to this file...
4098 return new GVNLegacyPass(GVNEnableMemDep, GVNEnableMemorySSA, ScalarPRE);
4099}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static RegisterPass< DebugifyFunctionPass > DF("debugify-function", "Attach debug info to a function")
This file defines the DenseMap class.
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
early cse Early CSE w MemorySSA
static void reportMayClobberedLoad(LoadInst *Load, Instruction *DepInst, const DominatorTree *DT, OptimizationRemarkEmitter *ORE)
Try to locate the three instruction involved in a missed load-elimination case that is due to an inte...
Definition GVN.cpp:1293
static bool isValueFullyAvailableInBlock(BasicBlock *BB, DenseMap< BasicBlock *, AvailabilityState > &FullyAvailableBlocks)
Return true if we can prove that the value we're analyzing is fully available in the specified block.
Definition GVN.cpp:976
static Instruction * findInvariantGroupValue(LoadInst *L, DominatorTree &DT)
If a load has !invariant.group, try to find the most-dominating instruction with the same metadata an...
Definition GVN.cpp:2252
static void reportLoadElim(LoadInst *Load, Value *AvailableValue, OptimizationRemarkEmitter *ORE)
Definition GVN.cpp:2051
GVNPass::AvailableValue AvailableValue
Definition GVN.cpp:88
static cl::opt< uint32_t > MaxNumInsnsPerBlock("gvn-max-num-insns", cl::Hidden, cl::init(100), cl::desc("Max number of instructions to scan in each basic block in GVN " "(default = 100)"))
static cl::opt< bool > GVNEnableMemDep("enable-gvn-memdep", cl::init(true))
static cl::opt< bool > GVNEnableLoadInLoopPRE("enable-load-in-loop-pre", cl::init(true))
static const Instruction * findMayClobberedPtrAccess(LoadInst *Load, const DominatorTree *DT)
Definition GVN.cpp:1237
static cl::opt< uint32_t > MaxNumDeps("gvn-max-num-deps", cl::Hidden, cl::init(100), cl::desc("Max number of dependences to attempt Load PRE (default = 100)"))
static std::optional< MemoryLocation > maybeLoadStoreLocation(Instruction *I, bool AllowStores, const TargetLibraryInfo *TLI)
Return the memory location accessed by the (masked) load/store instruction I, if the instruction coul...
Definition GVN.cpp:2304
static cl::opt< uint32_t > MaxNumReachingBlocks("gvn-max-num-reaching-blocks", cl::Hidden, cl::init(200), cl::desc("Max number of blocks scanned per load in the MemorySSA " "reaching-value analysis (default = 200)"))
static cl::opt< bool > GVNEnableMemorySSA("enable-gvn-memoryssa", cl::init(false))
static bool isOnlyReachableViaThisEdge(const BasicBlockEdge &E, DominatorTree *DT)
There is an edge from 'Src' to 'Dst'.
Definition GVN.cpp:3086
static cl::opt< bool > GVNEnableScalarPRE("enable-scalar-pre", cl::init(true), cl::Hidden)
static Value * findDominatingValue(const MemoryLocation &Loc, Type *LoadTy, Instruction *From, AAResults *AA)
Definition GVN.cpp:1314
static bool liesBetween(const Instruction *From, Instruction *Between, const Instruction *To, const DominatorTree *DT)
Assuming To can be reached from both From and Between, does Between lie on every path from From to To...
Definition GVN.cpp:1228
static bool isLifetimeStart(const Instruction *Inst)
Definition GVN.cpp:1220
static cl::opt< bool > GVNEnableSplitBackedgeInLoadPRE("enable-split-backedge-in-load-pre", cl::init(false))
static void patchAndReplaceAllUsesWith(Instruction *I, Value *Repl)
Definition GVN.cpp:2244
static void replaceValuesPerBlockEntry(SmallVectorImpl< AvailableValueInBlock > &ValuesPerBlock, Value *OldValue, Value *NewValue)
If the specified OldValue exists in ValuesPerBlock, replace its value with NewValue.
Definition GVN.cpp:1092
static cl::opt< unsigned > ScanUsersLimit("gvn-scan-users-limit", cl::Hidden, cl::init(100), cl::desc("The number of memory accesses to scan in a block in reaching " "memory values analysis (default = 100)"))
AvailabilityState
Definition GVN.cpp:956
@ Unavailable
We know the block is not fully available. This is a fixpoint.
Definition GVN.cpp:958
@ Available
We know the block is fully available. This is a fixpoint.
Definition GVN.cpp:960
@ SpeculativelyAvailable
We do not know whether the block is fully available or not, but we are currently speculating that it ...
Definition GVN.cpp:965
static cl::opt< uint32_t > MaxNumVisitedInsts("gvn-max-num-visited-insts", cl::Hidden, cl::init(100), cl::desc("Max number of visited instructions when trying to find " "dominating value of select dependency (default = 100)"))
static cl::opt< uint32_t > MaxBBSpeculations("gvn-max-block-speculations", cl::Hidden, cl::init(600), cl::desc("Max number of blocks we're willing to speculate on (and recurse " "into) when deducing if a value is fully available or not in GVN " "(default = 600)"))
static cl::opt< bool > GVNEnableLoadPRE("enable-load-pre", cl::init(true))
GVNPass::AvailableValueInBlock AvailableValueInBlock
Definition GVN.cpp:89
static Value * constructSSAForLoadSet(LoadInst *Load, SmallVectorImpl< AvailableValueInBlock > &ValuesPerBlock, GVNPass &GVN)
Given a set of loads specified by ValuesPerBlock, construct SSA form, allowing us to eliminate Load.
Definition GVN.cpp:1111
This file provides the interface for LLVM's Global Value Numbering pass which eliminates fully redund...
#define DEBUG_TYPE
This is the interface for a simple mod/ref and alias analysis over globals.
Hexagon Common GEP
#define _
IRTranslator LLVM IR MI
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
This defines the Use class.
static bool lookup(const GsymReader &GR, GsymDataExtractor &Data, uint64_t &Offset, uint64_t BaseAddr, uint64_t Addr, SourceLocations &SrcLocs, llvm::Error &Err)
A Lookup helper functions.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
This file implements a map that provides insertion order iteration.
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.
uint64_t IntrinsicInst * II
#define P(N)
ppc ctr loops PowerPC CTR Loops Verify
#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 builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
const SmallVectorImpl< MachineOperand > & Cond
static DominatorTree getDomTree(Function &F)
std::pair< BasicBlock *, BasicBlock * > Edge
This file contains some templates that are useful if you are working with the STL at all.
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
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
Value * RHS
Value * LHS
static const uint32_t IV[8]
Definition blake3_impl.h:83
A manager for alias analyses.
A wrapper pass to provide the legacy pass manager access to a suitably prepared AAResults object.
@ MayAlias
The two locations may or may not alias.
@ NoAlias
The two locations do not alias at all.
@ PartialAlias
The two locations alias, but only due to a partial overlap.
@ MustAlias
The two locations precisely alias each other.
constexpr int32_t getOffset() const
constexpr bool hasOffset() const
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
iterator end() const
Definition ArrayRef.h:130
iterator begin() const
Definition ArrayRef.h:129
A function analysis which provides an AssumptionCache.
An immutable pass that tracks lazily created AssumptionCache objects.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block lives.
bool isEHPad() const
Return true if this basic block is an exception handling block.
Definition BasicBlock.h:689
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)
LLVM_ABI Instruction::BinaryOps getBinaryOp() const
Returns the binary operation underlying the intrinsic.
Value * getArgOperand(unsigned i) const
unsigned arg_size() const
This class represents a function call, abstracting a target machine's calling convention.
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:890
Value * getCondition() const
BasicBlock * getSuccessor(unsigned i) const
bool isMinusOne() const
This function will return true iff every bit in this constant is set to true.
Definition Constants.h:231
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
Definition DenseMap.h:250
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:223
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:299
iterator end()
Definition DenseMap.h:141
Analysis pass which computes a DominatorTree.
Definition Dominators.h:241
bool properlyDominates(const DomTreeNodeBase< NodeT > *A, const DomTreeNodeBase< NodeT > *B) const
properlyDominates - Returns true iff A dominates B and A != B.
Legacy analysis pass which computes a DominatorTree.
Definition Dominators.h:277
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
Class representing an expression and its matching format.
unsigned getNumIndices() const
iterator_range< idx_iterator > indices() const
idx_iterator idx_begin() const
FunctionPass class - This class is used to implement most global optimizations.
Definition Pass.h:314
FunctionPass(char &pid)
Definition Pass.h:316
bool skipFunction(const Function &F) const
Optional passes call this function to check whether the pass should be skipped.
Definition Pass.cpp:196
const BasicBlock & getEntryBlock() const
Definition Function.h:794
Represents calls to the gc.relocate intrinsic.
bool runOnFunction(Function &F) override
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
Definition GVN.cpp:4039
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
Definition GVN.cpp:4060
GVNLegacyPass(bool MemDepAnalysis=GVNEnableMemDep, bool MemSSAAnalysis=GVNEnableMemorySSA, bool ScalarPRE=true)
Definition GVN.cpp:4029
static char ID
Definition GVN.cpp:4027
This class holds the mapping between values and value numbers.
Definition GVN.h:158
LLVM_ABI uint32_t lookupOrAdd(MemoryAccess *MA)
Definition GVN.cpp:656
The core GVN pass object.
Definition GVN.h:123
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Run the pass over the function.
Definition GVN.cpp:898
LLVM_ABI void salvageAndRemoveInstruction(Instruction *I)
This removes the specified instruction from our various maps and marks it for deletion.
Definition GVN.cpp:950
AAResults * getAliasAnalysis() const
Definition GVN.h:145
LLVM_ABI bool isLoadPREEnabled() const
Definition GVN.cpp:872
GVNPass(GVNOptions Options={})
Definition GVN.h:131
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
Definition GVN.cpp:930
LLVM_ABI bool isMemorySSAEnabled() const
Definition GVN.cpp:894
DominatorTree & getDominatorTree() const
Definition GVN.h:144
LLVM_ABI bool isLoadInLoopPREEnabled() const
Definition GVN.cpp:876
LLVM_ABI bool isScalarPREEnabled() const
Definition GVN.cpp:868
LLVM_ABI bool isLoadPRESplitBackedgeEnabled() const
Definition GVN.cpp:880
friend class GVNLegacyPass
Definition GVN.h:245
LLVM_ABI bool isMemDepEnabled() const
Definition GVN.cpp:885
Legacy wrapper pass to provide the GlobalsAAResult object.
LLVM_ABI Instruction * clone() const
Create a copy of 'this' instruction that is identical in all ways except the following:
LLVM_ABI unsigned getNumSuccessors() const LLVM_READONLY
Return the number of successors that this instruction has.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
bool hasMetadata() const
Return true if this instruction has any metadata attached to it.
LLVM_ABI bool isAtomic() const LLVM_READONLY
Return true if this instruction has an AtomicOrdering of unordered or higher.
bool isEHPad() const
Return true if the instruction is a variety of EH-block.
LLVM_ABI bool mayHaveSideEffects() const LLVM_READONLY
Return true if the instruction may have side effects.
bool isTerminator() const
LLVM_ABI bool mayReadFromMemory() const LLVM_READONLY
Return true if this instruction may read memory.
LLVM_ABI void dropUnknownNonDebugMetadata(ArrayRef< unsigned > KnownIDs={})
Drop all unknown metadata except for debug locations.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
A wrapper class for inspecting calls to intrinsic functions.
An instruction for reading from memory.
Analysis pass that exposes the LoopInfo for a function.
Definition LoopInfo.h:594
The legacy pass manager's analysis pass to compute loop information.
Definition LoopInfo.h:619
iterator find(const KeyT &Key)
Definition MapVector.h:156
iterator end()
Definition MapVector.h:69
size_type size() const
Definition MapVector.h:58
A memory dependence query can return one of three different answers.
bool isClobber() const
Tests if this MemDepResult represents a query that is an instruction clobber dependency.
bool isNonLocal() const
Tests if this MemDepResult represents a query that is transparent to the start of the block,...
bool isDef() const
Tests if this MemDepResult represents a query that is an instruction definition dependency.
bool isLocal() const
Tests if this MemDepResult represents a valid local query (Clobber/Def).
Instruction * getInst() const
If this is a normal dependency, returns the instruction that is depended on.
This is the common base class for memset/memcpy/memmove.
BasicBlock * getBlock() const
Definition MemorySSA.h:162
An analysis that produces MemoryDependenceResults for a function.
std::vector< NonLocalDepEntry > NonLocalDepInfo
LLVM_ABI MemDepResult getDependency(Instruction *QueryInst)
Returns the instruction on which a memory operation depends.
LLVM_ABI const NonLocalDepInfo & getNonLocalCallDependency(CallBase *QueryCall)
Perform a full dependency query for the specified call, returning the set of blocks that the value is...
A wrapper analysis pass for the legacy pass manager that exposes a MemoryDepnedenceResults instance.
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.
MemoryLocation getWithNewPtr(const Value *NewPtr) const
const Value * Ptr
The address of the start of the location.
static LLVM_ABI MemoryLocation getForArgument(const CallBase *Call, unsigned ArgIdx, const TargetLibraryInfo *TLI)
Return a location representing a particular argument of a call.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
Definition MemorySSA.h:529
BasicBlock * getIncomingBlock(unsigned I) const
Return incoming basic block number i.
Definition MemorySSA.h:542
MemoryAccess * getIncomingValue(unsigned I) const
Return incoming value number x.
Definition MemorySSA.h:532
An analysis that produces MemorySSA for a function.
Definition MemorySSA.h:922
Legacy analysis pass which computes MemorySSA.
Definition MemorySSA.h:975
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
MemoryAccess * getDefiningAccess() const
Get the access that produces the memory state used by this Use.
Definition MemorySSA.h:260
This is an entry in the NonLocalDepInfo cache.
OptimizationRemarkEmitter legacy analysis pass.
The optimization diagnostic interface.
LLVM_ABI void emit(DiagnosticInfoOptimizationBase &OptDiag)
Output the remark via the diagnostic handler and to the optimization record file.
Diagnostic information for missed-optimization remarks.
Diagnostic information for applied optimization remarks.
static 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...
LLVM_ABI Value * translateValue(BasicBlock *CurBB, BasicBlock *PredBB, const DominatorTree *DT, bool MustDominate)
translateValue - PHI translate the current address up the CFG from CurBB to Pred, updating our state ...
LLVM_ABI bool isPotentiallyPHITranslatable() const
isPotentiallyPHITranslatable - If this needs PHI translation, return true if we have some hope of doi...
bool needsPHITranslationFromBlock(BasicBlock *BB) const
needsPHITranslationFromBlock - Return true if moving from the specified BasicBlock to its predecessor...
Value * getAddr() const
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
AnalysisType * getAnalysisIfAvailable() const
getAnalysisIfAvailable<AnalysisType>() - Subclasses use this function to get analysis information tha...
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
Definition Type.cpp:911
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalyses & preserve()
Mark an analysis as preserved.
Definition Analysis.h:132
Helper class for SSA formation on a set of values defined in multiple blocks.
Definition SSAUpdater.h:39
LLVM_ABI void Initialize(Type *Ty, StringRef Name)
Reset this object to get ready for a new set of SSA updates with type 'Ty'.
LLVM_ABI Value * GetValueInMiddleOfBlock(BasicBlock *BB)
Construct SSA form, materializing a value that is live in the middle of the specified block.
LLVM_ABI bool HasValueForBlock(BasicBlock *BB) const
Return true if the SSAUpdater already has a value for the specified block.
LLVM_ABI void AddAvailableValue(BasicBlock *BB, Value *V)
Indicate that a rewritten value is available in the specified block with the specified value.
std::pair< Value *, SelectAddrs > getSelectCondAndAddrs() const
Value * getAddr() const
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
bool erase(PtrType Ptr)
Remove pointer from the set.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
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)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
SmallVector & operator=(const SmallVector &RHS)
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM_ABI bool isTokenLikeTy() const
Returns true if this is 'token' or a token-like target type.s.
Definition Type.cpp:1138
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:307
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition Type.h:285
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:257
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
op_range operands()
Definition User.h:267
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:553
iterator_range< user_iterator > users()
Definition Value.h:426
bool hasUseList() const
Check if this Value has a use-list.
Definition Value.h:344
LLVM_ABI bool canBeFreed() const
Return true if the memory object referred to by V can by freed in the scope for which the SSA value d...
Definition Value.cpp:832
LLVM_ABI void deleteValue()
Delete a pointer to a generic Value.
Definition Value.cpp:108
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
int getNumOccurrences() const
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:209
An efficient, type-erasing, non-owning reference to a callable.
An opaque object representing a hash code.
Definition Hashing.h:77
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
CallInst * Call
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Abstract Attribute helper functions.
Definition Attributor.h:165
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
@ Entry
Definition COFF.h:862
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
Predicate
Predicate - These are "(BI << 5) | BO" for various predicates.
bool match(Val *V, const Pattern &P)
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
auto m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
NoWrapTrunc_match< OpTy, TruncInst::NoUnsignedWrap > m_NUWTrunc(const OpTy &Op)
Matches trunc nuw.
auto m_Intrinsic(const Ts &...Ops)
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
auto m_MaskedStore(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
Matches MaskedStore Intrinsic.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
LLVM_ABI int analyzeLoadFromClobberingStore(Type *LoadTy, Value *LoadPtr, StoreInst *DepSI, const DataLayout &DL)
This function determines whether a value for the pointer LoadPtr can be extracted from the store at D...
LLVM_ABI Value * getMemInstValueForLoad(MemIntrinsic *SrcInst, unsigned Offset, Type *LoadTy, Instruction *InsertPt, const DataLayout &DL)
If analyzeLoadFromClobberingMemInst returned an offset, this function can be used to actually perform...
LLVM_ABI int analyzeLoadFromClobberingLoad(Type *LoadTy, Value *LoadPtr, LoadInst *DepLI, const DataLayout &DL)
This function determines whether a value for the pointer LoadPtr can be extracted from the load at De...
LLVM_ABI Value * getValueForLoad(Value *SrcVal, unsigned Offset, Type *LoadTy, Instruction *InsertPt, Function *F)
If analyzeLoadFromClobberingStore/Load returned an offset, this function can be used to actually perf...
LLVM_ABI int analyzeLoadFromClobberingMemInst(Type *LoadTy, Value *LoadPtr, MemIntrinsic *DepMI, const DataLayout &DL)
This function determines whether a value for the pointer LoadPtr can be extracted from the memory int...
LLVM_ABI bool canCoerceMustAliasedValueToLoad(Value *StoredVal, Type *LoadTy, Function *F)
Return true if CoerceAvailableValueToLoadType would succeed if it was called.
initializer< Ty > init(const Ty &Val)
Add a small namespace to avoid name clashes with the classes used in the streaming interface.
NodeAddr< InstrNode * > Instr
Definition RDFGraph.h:389
NodeAddr< PhiNode * > Phi
Definition RDFGraph.h:390
NodeAddr< UseNode * > Use
Definition RDFGraph.h:385
NodeAddr< NodeBase * > Node
Definition RDFGraph.h:381
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
hash_code hash_value(const FixedPointSemantics &Val)
LLVM_ABI Constant * getInitialValueOfAllocation(const Value *V, const TargetLibraryInfo *TLI, Type *Ty)
If this is a call to an allocation function that initializes memory to a fixed value,...
LLVM_ABI unsigned replaceDominatedUsesWithIf(Value *From, Value *To, DominatorTree &DT, const BasicBlockEdge &Edge, function_ref< bool(const Use &U, const Value *To)> ShouldReplace)
Replace each use of 'From' with 'To' if that use is dominated by the given edge and the callback Shou...
Definition Local.cpp:3288
RelativeUniformCounterPtr Values
Definition InstrProf.h:91
LLVM_ABI unsigned GetSuccessorNumber(const BasicBlock *BB, const BasicBlock *Succ)
Search for the specified successor of basic block BB and return its position in the terminator instru...
Definition CFG.cpp:90
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
LLVM_ABI FunctionPass * createGVNPass(bool ScalarPRE)
Create a legacy GVN pass.
Definition GVN.cpp:4097
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:1675
auto successors(const MachineBasicBlock *BB)
const Value * getLoadStorePointerOperand(const Value *V)
A helper function that returns the pointer operand of a load or store instruction.
@ Load
The value being inserted comes from a load (InsertElement only).
constexpr from_range_t from_range
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:633
LLVM_ABI bool isNoAliasCall(const Value *V)
Return true if this pointer is returned by a noalias function.
LLVM_ABI bool isAssumeWithEmptyBundle(const AssumeInst &Assume)
Return true iff the operand bundles of the provided llvm.assume doesn't contain any valuable informat...
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 ...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
LLVM_ABI 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:402
LLVM_ABI bool canReplacePointersInUseIfEqual(const Use &U, const Value *To, const DataLayout &DL)
Definition Loads.cpp:867
LLVM_ABI bool canReplacePointersIfEqual(const Value *From, const Value *To, const DataLayout &DL)
Returns true if a pointer value From can be replaced with another pointer value \To if they are deeme...
Definition Loads.cpp:887
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_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
LLVM_ABI void patchReplacementInstruction(Instruction *I, Value *Repl)
Patch the replacement so that it is not more restrictive than the value being replaced.
Definition Local.cpp:3188
LLVM_ABI void initializeGVNLegacyPassPass(PassRegistry &)
LLVM_ABI unsigned replaceDominatedUsesWith(Value *From, Value *To, DominatorTree &DT, const BasicBlockEdge &Edge)
Replace each use of 'From' with 'To' if that use is dominated by the given edge.
Definition Local.cpp:3267
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
@ Success
The lock was released successfully.
RNSuccIterator< NodeRef, BlockT, RegionT > succ_begin(NodeRef Node)
LLVM_ABI void combineMetadataForCSE(Instruction *K, const Instruction *J, bool DoesKMove)
Combine the metadata of two instructions so that K can replace J.
Definition Local.cpp:3116
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
Definition ModRef.h:28
@ Ref
The access may reference the value stored in memory.
Definition ModRef.h:32
@ NoModRef
The access neither references nor modifies the value stored in memory.
Definition ModRef.h:30
LLVM_ABI bool VerifyMemorySSA
Enables verification of MemorySSA.
Definition MemorySSA.cpp:85
RNSuccIterator< NodeRef, BlockT, RegionT > succ_end(NodeRef Node)
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 MergeBlockIntoPredecessor(BasicBlock *BB, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, MemoryDependenceResults *MemDep=nullptr, bool PredecessorWithTwoSuccessors=false, DominatorTree *DT=nullptr)
Attempts to merge a block into its predecessor, if possible.
LLVM_ABI FunctionPass * createGVNPass()
Definition GVN.cpp:4096
LLVM_ABI bool isPotentiallyReachable(const Instruction *From, const Instruction *To, const SmallPtrSetImpl< BasicBlock * > *ExclusionSet=nullptr, const DominatorTree *DT=nullptr, const LoopInfo *LI=nullptr, const CycleInfo *CI=nullptr)
Determine whether instruction 'To' is reachable from 'From', without passing through any blocks in Ex...
Definition CFG.cpp:335
DWARFExpression::Operation Op
LLVM_ABI BasicBlock * SplitCriticalEdge(Instruction *TI, unsigned SuccNum, const CriticalEdgeSplittingOptions &Options=CriticalEdgeSplittingOptions(), const Twine &BBName="")
If this edge is a critical edge, insert a new node to split the critical edge.
LLVM_ABI bool isCriticalEdge(const Instruction *TI, unsigned SuccNum, bool AllowIdenticalEdges=false)
Return true if the specified edge is a critical edge.
Definition CFG.cpp:106
constexpr unsigned BitWidth
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
auto predecessors(const MachineBasicBlock *BB)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Next
Definition InstrProf.h:147
bool pred_empty(const BasicBlock *BB)
Definition CFG.h:107
iterator_range< df_iterator< T > > depth_first(const T &G)
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
Definition Hashing.h:305
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
LLVM_ABI bool EliminateDuplicatePHINodes(BasicBlock *BB)
Check for and eliminate duplicate PHI nodes in this block.
Definition Local.cpp:1501
bool isStrongerThan(AtomicOrdering AO, AtomicOrdering Other)
Returns true if ao is stronger than other as defined by the AtomicOrdering lattice,...
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
Definition Hashing.h:285
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define N
static bool isEqual(const GVNPass::Expression &LHS, const GVNPass::Expression &RHS)
Definition GVN.cpp:194
static unsigned getHashValue(const GVNPass::Expression &E)
Definition GVN.cpp:188
An information struct used to provide DenseMap with the various necessary components for a given valu...
A set of parameters to control various transforms performed by GVN pass.
Definition GVN.h:73
Represents an AvailableValue which can be rematerialized at the end of the associated BasicBlock.
Definition GVN.cpp:300
Value * MaterializeAdjustedValue(LoadInst *Load) const
Emit code at the end of this block to adjust the value defined here to the specified type.
Definition GVN.cpp:325
static AvailableValueInBlock get(BasicBlock *BB, Value *V, unsigned Offset=0)
Definition GVN.cpp:314
AvailableValue AV
AV - The actual available value.
Definition GVN.cpp:305
static AvailableValueInBlock getUndef(BasicBlock *BB)
Definition GVN.cpp:319
BasicBlock * BB
BB - The basic block in question.
Definition GVN.cpp:302
static AvailableValueInBlock get(BasicBlock *BB, AvailableValue &&AV)
Definition GVN.cpp:307
Represents a particular available value that we know how to materialize.
Definition GVN.cpp:204
static AvailableValue getUndef()
Definition GVN.cpp:249
unsigned Offset
Offset - The byte offset in Val that is interesting for the load query.
Definition GVN.cpp:221
ValType Kind
Kind of the live-out value.
Definition GVN.cpp:218
bool isCoercedLoadValue() const
Definition GVN.cpp:268
Value * getSimpleValue() const
Definition GVN.cpp:273
LoadInst * getCoercedLoadValue() const
Definition GVN.cpp:278
bool isSelectValue() const
Definition GVN.cpp:271
Value * Val
Val - The value that is live out of the block.
Definition GVN.cpp:216
static AvailableValue getSelect(Value *Cond, Value *V1, Value *V2)
Definition GVN.cpp:257
static AvailableValue get(Value *V, unsigned Offset=0)
Definition GVN.cpp:225
static AvailableValue getMI(MemIntrinsic *MI, unsigned Offset=0)
Definition GVN.cpp:233
bool isSimpleValue() const
Definition GVN.cpp:267
bool isUndefValue() const
Definition GVN.cpp:270
Value * getSelectCondition() const
Definition GVN.cpp:288
static AvailableValue getLoad(LoadInst *Load, unsigned Offset=0)
Definition GVN.cpp:241
MemIntrinsic * getMemIntrinValue() const
Definition GVN.cpp:283
Value * MaterializeAdjustedValue(LoadInst *Load, Instruction *InsertPt) const
Emit code at the specified insertion point to adjust the value defined here to the specified type.
Definition GVN.cpp:1154
bool isMemIntrinValue() const
Definition GVN.cpp:269
Value * V1
V1, V2 - The dominating non-clobbered values of SelectVal.
Definition GVN.cpp:223
bool operator==(const Expression &Other) const
Definition GVN.cpp:166
friend hash_code hash_value(const Expression &Value)
Definition GVN.cpp:181
SmallVector< uint32_t, 4 > VarArgs
Definition GVN.cpp:160
AttributeList Attrs
Definition GVN.cpp:162
Expression(uint32_t Op=~2U)
Definition GVN.cpp:164