LLVM 22.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"
77#include <algorithm>
78#include <cassert>
79#include <cstdint>
80#include <optional>
81#include <utility>
82
83using namespace llvm;
84using namespace llvm::gvn;
85using namespace llvm::VNCoercion;
86using namespace PatternMatch;
87
88#define DEBUG_TYPE "gvn"
89
90STATISTIC(NumGVNInstr, "Number of instructions deleted");
91STATISTIC(NumGVNLoad, "Number of loads deleted");
92STATISTIC(NumGVNPRE, "Number of instructions PRE'd");
93STATISTIC(NumGVNBlocks, "Number of blocks merged");
94STATISTIC(NumGVNSimpl, "Number of instructions simplified");
95STATISTIC(NumGVNEqProp, "Number of equalities propagated");
96STATISTIC(NumPRELoad, "Number of loads PRE'd");
97STATISTIC(NumPRELoopLoad, "Number of loop loads PRE'd");
98STATISTIC(NumPRELoadMoved2CEPred,
99 "Number of loads moved to predecessor of a critical edge in PRE");
100
101STATISTIC(IsValueFullyAvailableInBlockNumSpeculationsMax,
102 "Number of blocks speculated as available in "
103 "IsValueFullyAvailableInBlock(), max");
104STATISTIC(MaxBBSpeculationCutoffReachedTimes,
105 "Number of times we we reached gvn-max-block-speculations cut-off "
106 "preventing further exploration");
107
108static cl::opt<bool> GVNEnablePRE("enable-pre", cl::init(true), cl::Hidden);
109static cl::opt<bool> GVNEnableLoadPRE("enable-load-pre", cl::init(true));
110static cl::opt<bool> GVNEnableLoadInLoopPRE("enable-load-in-loop-pre",
111 cl::init(true));
112static cl::opt<bool>
113GVNEnableSplitBackedgeInLoadPRE("enable-split-backedge-in-load-pre",
114 cl::init(false));
115static cl::opt<bool> GVNEnableMemDep("enable-gvn-memdep", cl::init(true));
116static cl::opt<bool> GVNEnableMemorySSA("enable-gvn-memoryssa",
117 cl::init(false));
118
120 "gvn-max-num-deps", cl::Hidden, cl::init(100),
121 cl::desc("Max number of dependences to attempt Load PRE (default = 100)"));
122
123// This is based on IsValueFullyAvailableInBlockNumSpeculationsMax stat.
125 "gvn-max-block-speculations", cl::Hidden, cl::init(600),
126 cl::desc("Max number of blocks we're willing to speculate on (and recurse "
127 "into) when deducing if a value is fully available or not in GVN "
128 "(default = 600)"));
129
131 "gvn-max-num-visited-insts", cl::Hidden, cl::init(100),
132 cl::desc("Max number of visited instructions when trying to find "
133 "dominating value of select dependency (default = 100)"));
134
136 "gvn-max-num-insns", cl::Hidden, cl::init(100),
137 cl::desc("Max number of instructions to scan in each basic block in GVN "
138 "(default = 100)"));
139
142 bool Commutative = false;
143 // The type is not necessarily the result type of the expression, it may be
144 // any additional type needed to disambiguate the expression.
145 Type *Ty = nullptr;
147
148 AttributeList Attrs;
149
151
152 bool operator==(const Expression &Other) const {
153 if (Opcode != Other.Opcode)
154 return false;
155 if (Opcode == ~0U || Opcode == ~1U)
156 return true;
157 if (Ty != Other.Ty)
158 return false;
159 if (VarArgs != Other.VarArgs)
160 return false;
161 if ((!Attrs.isEmpty() || !Other.Attrs.isEmpty()) &&
162 !Attrs.intersectWith(Ty->getContext(), Other.Attrs).has_value())
163 return false;
164 return true;
165 }
166
168 return hash_combine(Value.Opcode, Value.Ty,
169 hash_combine_range(Value.VarArgs));
170 }
171};
172
174 static inline GVNPass::Expression getEmptyKey() { return ~0U; }
175 static inline GVNPass::Expression getTombstoneKey() { return ~1U; }
176
177 static unsigned getHashValue(const GVNPass::Expression &E) {
178 using llvm::hash_value;
179
180 return static_cast<unsigned>(hash_value(E));
181 }
182
183 static bool isEqual(const GVNPass::Expression &LHS,
184 const GVNPass::Expression &RHS) {
185 return LHS == RHS;
186 }
187};
188
189/// Represents a particular available value that we know how to materialize.
190/// Materialization of an AvailableValue never fails. An AvailableValue is
191/// implicitly associated with a rematerialization point which is the
192/// location of the instruction from which it was formed.
194 enum class ValType {
195 SimpleVal, // A simple offsetted value that is accessed.
196 LoadVal, // A value produced by a load.
197 MemIntrin, // A memory intrinsic which is loaded from.
198 UndefVal, // A UndefValue representing a value from dead block (which
199 // is not yet physically removed from the CFG).
200 SelectVal, // A pointer select which is loaded from and for which the load
201 // can be replace by a value select.
202 };
203
204 /// Val - The value that is live out of the block.
206 /// Kind of the live-out value.
208
209 /// Offset - The byte offset in Val that is interesting for the load query.
210 unsigned Offset = 0;
211 /// V1, V2 - The dominating non-clobbered values of SelectVal.
212 Value *V1 = nullptr, *V2 = nullptr;
213
214 static AvailableValue get(Value *V, unsigned Offset = 0) {
215 AvailableValue Res;
216 Res.Val = V;
218 Res.Offset = Offset;
219 return Res;
220 }
221
222 static AvailableValue getMI(MemIntrinsic *MI, unsigned Offset = 0) {
223 AvailableValue Res;
224 Res.Val = MI;
226 Res.Offset = Offset;
227 return Res;
228 }
229
230 static AvailableValue getLoad(LoadInst *Load, unsigned Offset = 0) {
231 AvailableValue Res;
232 Res.Val = Load;
234 Res.Offset = Offset;
235 return Res;
236 }
237
239 AvailableValue Res;
240 Res.Val = nullptr;
242 Res.Offset = 0;
243 return Res;
244 }
245
247 AvailableValue Res;
248 Res.Val = Sel;
250 Res.Offset = 0;
251 Res.V1 = V1;
252 Res.V2 = V2;
253 return Res;
254 }
255
256 bool isSimpleValue() const { return Kind == ValType::SimpleVal; }
257 bool isCoercedLoadValue() const { return Kind == ValType::LoadVal; }
258 bool isMemIntrinValue() const { return Kind == ValType::MemIntrin; }
259 bool isUndefValue() const { return Kind == ValType::UndefVal; }
260 bool isSelectValue() const { return Kind == ValType::SelectVal; }
261
263 assert(isSimpleValue() && "Wrong accessor");
264 return Val;
265 }
266
268 assert(isCoercedLoadValue() && "Wrong accessor");
269 return cast<LoadInst>(Val);
270 }
271
273 assert(isMemIntrinValue() && "Wrong accessor");
274 return cast<MemIntrinsic>(Val);
275 }
276
278 assert(isSelectValue() && "Wrong accessor");
279 return cast<SelectInst>(Val);
280 }
281
282 /// Emit code at the specified insertion point to adjust the value defined
283 /// here to the specified type. This handles various coercion cases.
284 Value *MaterializeAdjustedValue(LoadInst *Load, Instruction *InsertPt) const;
285};
286
287/// Represents an AvailableValue which can be rematerialized at the end of
288/// the associated BasicBlock.
290 /// BB - The basic block in question.
291 BasicBlock *BB = nullptr;
292
293 /// AV - The actual available value.
295
298 Res.BB = BB;
299 Res.AV = std::move(AV);
300 return Res;
301 }
302
304 unsigned Offset = 0) {
305 return get(BB, AvailableValue::get(V, Offset));
306 }
307
311
313 Value *V1, Value *V2) {
314 return get(BB, AvailableValue::getSelect(Sel, V1, V2));
315 }
316
317 /// Emit code at the end of this block to adjust the value defined here to
318 /// the specified type. This handles various coercion cases.
320 return AV.MaterializeAdjustedValue(Load, BB->getTerminator());
321 }
322};
323
324//===----------------------------------------------------------------------===//
325// ValueTable Internal Functions
326//===----------------------------------------------------------------------===//
327
328GVNPass::Expression GVNPass::ValueTable::createExpr(Instruction *I) {
329 Expression E;
330 E.Ty = I->getType();
331 E.Opcode = I->getOpcode();
332 if (const GCRelocateInst *GCR = dyn_cast<GCRelocateInst>(I)) {
333 // gc.relocate is 'special' call: its second and third operands are
334 // not real values, but indices into statepoint's argument list.
335 // Use the refered to values for purposes of identity.
336 E.VarArgs.push_back(lookupOrAdd(GCR->getOperand(0)));
337 E.VarArgs.push_back(lookupOrAdd(GCR->getBasePtr()));
338 E.VarArgs.push_back(lookupOrAdd(GCR->getDerivedPtr()));
339 } else {
340 for (Use &Op : I->operands())
341 E.VarArgs.push_back(lookupOrAdd(Op));
342 }
343 if (I->isCommutative()) {
344 // Ensure that commutative instructions that only differ by a permutation
345 // of their operands get the same value number by sorting the operand value
346 // numbers. Since commutative operands are the 1st two operands it is more
347 // efficient to sort by hand rather than using, say, std::sort.
348 assert(I->getNumOperands() >= 2 && "Unsupported commutative instruction!");
349 if (E.VarArgs[0] > E.VarArgs[1])
350 std::swap(E.VarArgs[0], E.VarArgs[1]);
351 E.Commutative = true;
352 }
353
354 if (auto *C = dyn_cast<CmpInst>(I)) {
355 // Sort the operand value numbers so x<y and y>x get the same value number.
356 CmpInst::Predicate Predicate = C->getPredicate();
357 if (E.VarArgs[0] > E.VarArgs[1]) {
358 std::swap(E.VarArgs[0], E.VarArgs[1]);
360 }
361 E.Opcode = (C->getOpcode() << 8) | Predicate;
362 E.Commutative = true;
363 } else if (auto *IVI = dyn_cast<InsertValueInst>(I)) {
364 E.VarArgs.append(IVI->idx_begin(), IVI->idx_end());
365 } else if (auto *SVI = dyn_cast<ShuffleVectorInst>(I)) {
366 ArrayRef<int> ShuffleMask = SVI->getShuffleMask();
367 E.VarArgs.append(ShuffleMask.begin(), ShuffleMask.end());
368 } else if (auto *CB = dyn_cast<CallBase>(I)) {
369 E.Attrs = CB->getAttributes();
370 }
371
372 return E;
373}
374
375GVNPass::Expression GVNPass::ValueTable::createCmpExpr(
376 unsigned Opcode, CmpInst::Predicate Predicate, Value *LHS, Value *RHS) {
377 assert((Opcode == Instruction::ICmp || Opcode == Instruction::FCmp) &&
378 "Not a comparison!");
381 E.VarArgs.push_back(lookupOrAdd(LHS));
382 E.VarArgs.push_back(lookupOrAdd(RHS));
383
384 // Sort the operand value numbers so x<y and y>x get the same value number.
385 if (E.VarArgs[0] > E.VarArgs[1]) {
386 std::swap(E.VarArgs[0], E.VarArgs[1]);
388 }
389 E.Opcode = (Opcode << 8) | Predicate;
390 E.Commutative = true;
391 return E;
392}
393
394GVNPass::Expression
395GVNPass::ValueTable::createExtractvalueExpr(ExtractValueInst *EI) {
396 assert(EI && "Not an ExtractValueInst?");
398 E.Ty = EI->getType();
399 E.Opcode = 0;
400
401 WithOverflowInst *WO = dyn_cast<WithOverflowInst>(EI->getAggregateOperand());
402 if (WO != nullptr && EI->getNumIndices() == 1 && *EI->idx_begin() == 0) {
403 // EI is an extract from one of our with.overflow intrinsics. Synthesize
404 // a semantically equivalent expression instead of an extract value
405 // expression.
406 E.Opcode = WO->getBinaryOp();
407 E.VarArgs.push_back(lookupOrAdd(WO->getLHS()));
408 E.VarArgs.push_back(lookupOrAdd(WO->getRHS()));
409 return E;
410 }
411
412 // Not a recognised intrinsic. Fall back to producing an extract value
413 // expression.
414 E.Opcode = EI->getOpcode();
415 for (Use &Op : EI->operands())
416 E.VarArgs.push_back(lookupOrAdd(Op));
417
418 append_range(E.VarArgs, EI->indices());
419
420 return E;
421}
422
423GVNPass::Expression GVNPass::ValueTable::createGEPExpr(GetElementPtrInst *GEP) {
425 Type *PtrTy = GEP->getType()->getScalarType();
426 const DataLayout &DL = GEP->getDataLayout();
427 unsigned BitWidth = DL.getIndexTypeSizeInBits(PtrTy);
428 SmallMapVector<Value *, APInt, 4> VariableOffsets;
429 APInt ConstantOffset(BitWidth, 0);
430 if (GEP->collectOffset(DL, BitWidth, VariableOffsets, ConstantOffset)) {
431 // Convert into offset representation, to recognize equivalent address
432 // calculations that use different type encoding.
433 LLVMContext &Context = GEP->getContext();
434 E.Opcode = GEP->getOpcode();
435 E.Ty = nullptr;
436 E.VarArgs.push_back(lookupOrAdd(GEP->getPointerOperand()));
437 for (const auto &[V, Scale] : VariableOffsets) {
438 E.VarArgs.push_back(lookupOrAdd(V));
439 E.VarArgs.push_back(lookupOrAdd(ConstantInt::get(Context, Scale)));
440 }
441 if (!ConstantOffset.isZero())
442 E.VarArgs.push_back(
443 lookupOrAdd(ConstantInt::get(Context, ConstantOffset)));
444 } else {
445 // If converting to offset representation fails (for scalable vectors),
446 // fall back to type-based implementation.
447 E.Opcode = GEP->getOpcode();
448 E.Ty = GEP->getSourceElementType();
449 for (Use &Op : GEP->operands())
450 E.VarArgs.push_back(lookupOrAdd(Op));
451 }
452 return E;
453}
454
455//===----------------------------------------------------------------------===//
456// ValueTable External Functions
457//===----------------------------------------------------------------------===//
458
459GVNPass::ValueTable::ValueTable() = default;
460GVNPass::ValueTable::ValueTable(const ValueTable &) = default;
461GVNPass::ValueTable::ValueTable(ValueTable &&) = default;
462GVNPass::ValueTable::~ValueTable() = default;
463GVNPass::ValueTable &
464GVNPass::ValueTable::operator=(const GVNPass::ValueTable &Arg) = default;
465
466/// add - Insert a value into the table with a specified value number.
467void GVNPass::ValueTable::add(Value *V, uint32_t Num) {
468 ValueNumbering.insert(std::make_pair(V, Num));
469 if (PHINode *PN = dyn_cast<PHINode>(V))
470 NumberingPhi[Num] = PN;
471}
472
473/// Include the incoming memory state into the hash of the expression for the
474/// given instruction. If the incoming memory state is:
475/// * LiveOnEntry, add the value number of the entry block,
476/// * a MemoryPhi, add the value number of the basic block corresponding to that
477/// MemoryPhi,
478/// * a MemoryDef, add the value number of the memory setting instruction.
479void GVNPass::ValueTable::addMemoryStateToExp(Instruction *I, Expression &Exp) {
480 assert(MSSA && "addMemoryStateToExp should not be called without MemorySSA");
481 assert(MSSA->getMemoryAccess(I) && "Instruction does not access memory");
482 MemoryAccess *MA = MSSA->getSkipSelfWalker()->getClobberingMemoryAccess(I);
483 Exp.VarArgs.push_back(lookupOrAdd(MA));
484}
485
486uint32_t GVNPass::ValueTable::lookupOrAddCall(CallInst *C) {
487 // FIXME: Currently the calls which may access the thread id may
488 // be considered as not accessing the memory. But this is
489 // problematic for coroutines, since coroutines may resume in a
490 // different thread. So we disable the optimization here for the
491 // correctness. However, it may block many other correct
492 // optimizations. Revert this one when we detect the memory
493 // accessing kind more precisely.
494 if (C->getFunction()->isPresplitCoroutine()) {
495 ValueNumbering[C] = NextValueNumber;
496 return NextValueNumber++;
497 }
498
499 // Do not combine convergent calls since they implicitly depend on the set of
500 // threads that is currently executing, and they might be in different basic
501 // blocks.
502 if (C->isConvergent()) {
503 ValueNumbering[C] = NextValueNumber;
504 return NextValueNumber++;
505 }
506
507 if (AA->doesNotAccessMemory(C)) {
508 Expression Exp = createExpr(C);
509 uint32_t E = assignExpNewValueNum(Exp).first;
510 ValueNumbering[C] = E;
511 return E;
512 }
513
514 if (MD && AA->onlyReadsMemory(C)) {
515 Expression Exp = createExpr(C);
516 auto [E, IsValNumNew] = assignExpNewValueNum(Exp);
517 if (IsValNumNew) {
518 ValueNumbering[C] = E;
519 return E;
520 }
521
522 MemDepResult LocalDep = MD->getDependency(C);
523
524 if (!LocalDep.isDef() && !LocalDep.isNonLocal()) {
525 ValueNumbering[C] = NextValueNumber;
526 return NextValueNumber++;
527 }
528
529 if (LocalDep.isDef()) {
530 // For masked load/store intrinsics, the local_dep may actually be
531 // a normal load or store instruction.
532 CallInst *LocalDepCall = dyn_cast<CallInst>(LocalDep.getInst());
533
534 if (!LocalDepCall || LocalDepCall->arg_size() != C->arg_size()) {
535 ValueNumbering[C] = NextValueNumber;
536 return NextValueNumber++;
537 }
538
539 for (unsigned I = 0, E = C->arg_size(); I < E; ++I) {
540 uint32_t CVN = lookupOrAdd(C->getArgOperand(I));
541 uint32_t LocalDepCallVN = lookupOrAdd(LocalDepCall->getArgOperand(I));
542 if (CVN != LocalDepCallVN) {
543 ValueNumbering[C] = NextValueNumber;
544 return NextValueNumber++;
545 }
546 }
547
548 uint32_t V = lookupOrAdd(LocalDepCall);
549 ValueNumbering[C] = V;
550 return V;
551 }
552
553 // Non-local case.
555 MD->getNonLocalCallDependency(C);
556 // FIXME: Move the checking logic to MemDep!
557 CallInst *CDep = nullptr;
558
559 // Check to see if we have a single dominating call instruction that is
560 // identical to C.
561 for (const NonLocalDepEntry &I : Deps) {
562 if (I.getResult().isNonLocal())
563 continue;
564
565 // We don't handle non-definitions. If we already have a call, reject
566 // instruction dependencies.
567 if (!I.getResult().isDef() || CDep != nullptr) {
568 CDep = nullptr;
569 break;
570 }
571
572 CallInst *NonLocalDepCall = dyn_cast<CallInst>(I.getResult().getInst());
573 // FIXME: All duplicated with non-local case.
574 if (NonLocalDepCall && DT->properlyDominates(I.getBB(), C->getParent())) {
575 CDep = NonLocalDepCall;
576 continue;
577 }
578
579 CDep = nullptr;
580 break;
581 }
582
583 if (!CDep) {
584 ValueNumbering[C] = NextValueNumber;
585 return NextValueNumber++;
586 }
587
588 if (CDep->arg_size() != C->arg_size()) {
589 ValueNumbering[C] = NextValueNumber;
590 return NextValueNumber++;
591 }
592 for (unsigned I = 0, E = C->arg_size(); I < E; ++I) {
593 uint32_t CVN = lookupOrAdd(C->getArgOperand(I));
594 uint32_t CDepVN = lookupOrAdd(CDep->getArgOperand(I));
595 if (CVN != CDepVN) {
596 ValueNumbering[C] = NextValueNumber;
597 return NextValueNumber++;
598 }
599 }
600
601 uint32_t V = lookupOrAdd(CDep);
602 ValueNumbering[C] = V;
603 return V;
604 }
605
606 if (MSSA && IsMSSAEnabled && AA->onlyReadsMemory(C)) {
607 Expression Exp = createExpr(C);
608 addMemoryStateToExp(C, Exp);
609 auto [V, _] = assignExpNewValueNum(Exp);
610 ValueNumbering[C] = V;
611 return V;
612 }
613
614 ValueNumbering[C] = NextValueNumber;
615 return NextValueNumber++;
616}
617
618/// Returns the value number for the specified load or store instruction.
619uint32_t GVNPass::ValueTable::computeLoadStoreVN(Instruction *I) {
620 if (!MSSA || !IsMSSAEnabled) {
621 ValueNumbering[I] = NextValueNumber;
622 return NextValueNumber++;
623 }
624
626 Exp.Ty = I->getType();
627 Exp.Opcode = I->getOpcode();
628 for (Use &Op : I->operands())
629 Exp.VarArgs.push_back(lookupOrAdd(Op));
630 addMemoryStateToExp(I, Exp);
631
632 auto [V, _] = assignExpNewValueNum(Exp);
633 ValueNumbering[I] = V;
634 return V;
635}
636
637/// Returns true if a value number exists for the specified value.
638bool GVNPass::ValueTable::exists(Value *V) const {
639 return ValueNumbering.contains(V);
640}
641
642uint32_t GVNPass::ValueTable::lookupOrAdd(MemoryAccess *MA) {
643 return MSSA->isLiveOnEntryDef(MA) || isa<MemoryPhi>(MA)
644 ? lookupOrAdd(MA->getBlock())
645 : lookupOrAdd(cast<MemoryUseOrDef>(MA)->getMemoryInst());
646}
647
648/// lookupOrAdd - Returns the value number for the specified value, assigning
649/// it a new number if it did not have one before.
650uint32_t GVNPass::ValueTable::lookupOrAdd(Value *V) {
651 DenseMap<Value *, uint32_t>::iterator VI = ValueNumbering.find(V);
652 if (VI != ValueNumbering.end())
653 return VI->second;
654
655 auto *I = dyn_cast<Instruction>(V);
656 if (!I) {
657 ValueNumbering[V] = NextValueNumber;
658 if (isa<BasicBlock>(V))
659 NumberingBB[NextValueNumber] = cast<BasicBlock>(V);
660 return NextValueNumber++;
661 }
662
663 Expression Exp;
664 switch (I->getOpcode()) {
665 case Instruction::Call:
666 return lookupOrAddCall(cast<CallInst>(I));
667 case Instruction::FNeg:
668 case Instruction::Add:
669 case Instruction::FAdd:
670 case Instruction::Sub:
671 case Instruction::FSub:
672 case Instruction::Mul:
673 case Instruction::FMul:
674 case Instruction::UDiv:
675 case Instruction::SDiv:
676 case Instruction::FDiv:
677 case Instruction::URem:
678 case Instruction::SRem:
679 case Instruction::FRem:
680 case Instruction::Shl:
681 case Instruction::LShr:
682 case Instruction::AShr:
683 case Instruction::And:
684 case Instruction::Or:
685 case Instruction::Xor:
686 case Instruction::ICmp:
687 case Instruction::FCmp:
688 case Instruction::Trunc:
689 case Instruction::ZExt:
690 case Instruction::SExt:
691 case Instruction::FPToUI:
692 case Instruction::FPToSI:
693 case Instruction::UIToFP:
694 case Instruction::SIToFP:
695 case Instruction::FPTrunc:
696 case Instruction::FPExt:
697 case Instruction::PtrToInt:
698 case Instruction::PtrToAddr:
699 case Instruction::IntToPtr:
700 case Instruction::AddrSpaceCast:
701 case Instruction::BitCast:
702 case Instruction::Select:
703 case Instruction::Freeze:
704 case Instruction::ExtractElement:
705 case Instruction::InsertElement:
706 case Instruction::ShuffleVector:
707 case Instruction::InsertValue:
708 Exp = createExpr(I);
709 break;
710 case Instruction::GetElementPtr:
711 Exp = createGEPExpr(cast<GetElementPtrInst>(I));
712 break;
713 case Instruction::ExtractValue:
714 Exp = createExtractvalueExpr(cast<ExtractValueInst>(I));
715 break;
716 case Instruction::PHI:
717 ValueNumbering[V] = NextValueNumber;
718 NumberingPhi[NextValueNumber] = cast<PHINode>(V);
719 return NextValueNumber++;
720 case Instruction::Load:
721 case Instruction::Store:
722 return computeLoadStoreVN(I);
723 default:
724 ValueNumbering[V] = NextValueNumber;
725 return NextValueNumber++;
726 }
727
728 uint32_t E = assignExpNewValueNum(Exp).first;
729 ValueNumbering[V] = E;
730 return E;
731}
732
733/// Returns the value number of the specified value. Fails if
734/// the value has not yet been numbered.
735uint32_t GVNPass::ValueTable::lookup(Value *V, bool Verify) const {
736 DenseMap<Value *, uint32_t>::const_iterator VI = ValueNumbering.find(V);
737 if (Verify) {
738 assert(VI != ValueNumbering.end() && "Value not numbered?");
739 return VI->second;
740 }
741 return (VI != ValueNumbering.end()) ? VI->second : 0;
742}
743
744/// Returns the value number of the given comparison,
745/// assigning it a new number if it did not have one before. Useful when
746/// we deduced the result of a comparison, but don't immediately have an
747/// instruction realizing that comparison to hand.
748uint32_t GVNPass::ValueTable::lookupOrAddCmp(unsigned Opcode,
749 CmpInst::Predicate Predicate,
750 Value *LHS, Value *RHS) {
751 Expression Exp = createCmpExpr(Opcode, Predicate, LHS, RHS);
752 return assignExpNewValueNum(Exp).first;
753}
754
755/// Remove all entries from the ValueTable.
757 ValueNumbering.clear();
758 ExpressionNumbering.clear();
759 NumberingPhi.clear();
760 NumberingBB.clear();
761 PhiTranslateTable.clear();
762 NextValueNumber = 1;
763 Expressions.clear();
764 ExprIdx.clear();
765 NextExprNumber = 0;
766}
767
768/// Remove a value from the value numbering.
770 uint32_t Num = ValueNumbering.lookup(V);
771 ValueNumbering.erase(V);
772 // If V is PHINode, V <--> value number is an one-to-one mapping.
773 if (isa<PHINode>(V))
774 NumberingPhi.erase(Num);
775 else if (isa<BasicBlock>(V))
776 NumberingBB.erase(Num);
777}
778
779/// verifyRemoved - Verify that the value is removed from all internal data
780/// structures.
781void GVNPass::ValueTable::verifyRemoved(const Value *V) const {
782 assert(!ValueNumbering.contains(V) &&
783 "Inst still occurs in value numbering map!");
784}
785
786//===----------------------------------------------------------------------===//
787// LeaderMap External Functions
788//===----------------------------------------------------------------------===//
789
790/// Push a new Value to the LeaderTable onto the list for its value number.
791void GVNPass::LeaderMap::insert(uint32_t N, Value *V, const BasicBlock *BB) {
792 LeaderListNode &Curr = NumToLeaders[N];
793 if (!Curr.Entry.Val) {
794 Curr.Entry.Val = V;
795 Curr.Entry.BB = BB;
796 return;
797 }
798
799 LeaderListNode *Node = TableAllocator.Allocate<LeaderListNode>();
800 Node->Entry.Val = V;
801 Node->Entry.BB = BB;
802 Node->Next = Curr.Next;
803 Curr.Next = Node;
804}
805
806/// Scan the list of values corresponding to a given
807/// value number, and remove the given instruction if encountered.
808void GVNPass::LeaderMap::erase(uint32_t N, Instruction *I,
809 const BasicBlock *BB) {
810 LeaderListNode *Prev = nullptr;
811 LeaderListNode *Curr = &NumToLeaders[N];
812
813 while (Curr && (Curr->Entry.Val != I || Curr->Entry.BB != BB)) {
814 Prev = Curr;
815 Curr = Curr->Next;
816 }
817
818 if (!Curr)
819 return;
820
821 if (Prev) {
822 Prev->Next = Curr->Next;
823 } else {
824 if (!Curr->Next) {
825 Curr->Entry.Val = nullptr;
826 Curr->Entry.BB = nullptr;
827 } else {
828 LeaderListNode *Next = Curr->Next;
829 Curr->Entry.Val = Next->Entry.Val;
830 Curr->Entry.BB = Next->Entry.BB;
831 Curr->Next = Next->Next;
832 }
833 }
834}
835
836void GVNPass::LeaderMap::verifyRemoved(const Value *V) const {
837 // Walk through the value number scope to make sure the instruction isn't
838 // ferreted away in it.
839 for (const auto &I : NumToLeaders) {
840 (void)I;
841 assert(I.second.Entry.Val != V && "Inst still in value numbering scope!");
842 assert(
843 std::none_of(leader_iterator(&I.second), leader_iterator(nullptr),
844 [=](const LeaderTableEntry &E) { return E.Val == V; }) &&
845 "Inst still in value numbering scope!");
846 }
847}
848
849//===----------------------------------------------------------------------===//
850// GVN Pass
851//===----------------------------------------------------------------------===//
852
854 return Options.AllowPRE.value_or(GVNEnablePRE);
855}
856
858 return Options.AllowLoadPRE.value_or(GVNEnableLoadPRE);
859}
860
862 return Options.AllowLoadInLoopPRE.value_or(GVNEnableLoadInLoopPRE);
863}
864
866 return Options.AllowLoadPRESplitBackedge.value_or(
868}
869
871 return Options.AllowMemDep.value_or(GVNEnableMemDep);
872}
873
875 return Options.AllowMemorySSA.value_or(GVNEnableMemorySSA);
876}
877
879 // FIXME: The order of evaluation of these 'getResult' calls is very
880 // significant! Re-ordering these variables will cause GVN when run alone to
881 // be less effective! We should fix memdep and basic-aa to not exhibit this
882 // behavior, but until then don't change the order here.
883 auto &AC = AM.getResult<AssumptionAnalysis>(F);
884 auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
885 auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
886 auto &AA = AM.getResult<AAManager>(F);
887 auto *MemDep =
889 auto &LI = AM.getResult<LoopAnalysis>(F);
890 auto *MSSA = AM.getCachedResult<MemorySSAAnalysis>(F);
891 if (isMemorySSAEnabled() && !MSSA) {
892 assert(!MemDep &&
893 "On-demand computation of MemSSA implies that MemDep is disabled!");
894 MSSA = &AM.getResult<MemorySSAAnalysis>(F);
895 }
897 bool Changed = runImpl(F, AC, DT, TLI, AA, MemDep, LI, &ORE,
898 MSSA ? &MSSA->getMSSA() : nullptr);
899 if (!Changed)
900 return PreservedAnalyses::all();
904 if (MSSA)
907 return PA;
908}
909
911 raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
912 static_cast<PassInfoMixin<GVNPass> *>(this)->printPipeline(
913 OS, MapClassName2PassName);
914
915 OS << '<';
916 if (Options.AllowPRE != std::nullopt)
917 OS << (*Options.AllowPRE ? "" : "no-") << "pre;";
918 if (Options.AllowLoadPRE != std::nullopt)
919 OS << (*Options.AllowLoadPRE ? "" : "no-") << "load-pre;";
920 if (Options.AllowLoadPRESplitBackedge != std::nullopt)
921 OS << (*Options.AllowLoadPRESplitBackedge ? "" : "no-")
922 << "split-backedge-load-pre;";
923 if (Options.AllowMemDep != std::nullopt)
924 OS << (*Options.AllowMemDep ? "" : "no-") << "memdep;";
925 if (Options.AllowMemorySSA != std::nullopt)
926 OS << (*Options.AllowMemorySSA ? "" : "no-") << "memoryssa";
927 OS << '>';
928}
929
931 salvageKnowledge(I, AC);
933 removeInstruction(I);
934}
935
936#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
937LLVM_DUMP_METHOD void GVNPass::dump(DenseMap<uint32_t, Value *> &Map) const {
938 errs() << "{\n";
939 for (const auto &[Num, Exp] : Map) {
940 errs() << Num << "\n";
941 Exp->dump();
942 }
943 errs() << "}\n";
944}
945#endif
946
947enum class AvailabilityState : char {
948 /// We know the block *is not* fully available. This is a fixpoint.
950 /// We know the block *is* fully available. This is a fixpoint.
952 /// We do not know whether the block is fully available or not,
953 /// but we are currently speculating that it will be.
954 /// If it would have turned out that the block was, in fact, not fully
955 /// available, this would have been cleaned up into an Unavailable.
957};
958
959/// Return true if we can prove that the value
960/// we're analyzing is fully available in the specified block. As we go, keep
961/// track of which blocks we know are fully alive in FullyAvailableBlocks. This
962/// map is actually a tri-state map with the following values:
963/// 0) we know the block *is not* fully available.
964/// 1) we know the block *is* fully available.
965/// 2) we do not know whether the block is fully available or not, but we are
966/// currently speculating that it will be.
968 BasicBlock *BB,
969 DenseMap<BasicBlock *, AvailabilityState> &FullyAvailableBlocks) {
971 std::optional<BasicBlock *> UnavailableBB;
972
973 // The number of times we didn't find an entry for a block in a map and
974 // optimistically inserted an entry marking block as speculatively available.
975 unsigned NumNewNewSpeculativelyAvailableBBs = 0;
976
977#ifndef NDEBUG
978 SmallPtrSet<BasicBlock *, 32> NewSpeculativelyAvailableBBs;
980#endif
981
982 Worklist.emplace_back(BB);
983 while (!Worklist.empty()) {
984 BasicBlock *CurrBB = Worklist.pop_back_val(); // LoadFO - depth-first!
985 // Optimistically assume that the block is Speculatively Available and check
986 // to see if we already know about this block in one lookup.
987 std::pair<DenseMap<BasicBlock *, AvailabilityState>::iterator, bool> IV =
988 FullyAvailableBlocks.try_emplace(
990 AvailabilityState &State = IV.first->second;
991
992 // Did the entry already exist for this block?
993 if (!IV.second) {
994 if (State == AvailabilityState::Unavailable) {
995 UnavailableBB = CurrBB;
996 break; // Backpropagate unavailability info.
997 }
998
999#ifndef NDEBUG
1000 AvailableBBs.emplace_back(CurrBB);
1001#endif
1002 continue; // Don't recurse further, but continue processing worklist.
1003 }
1004
1005 // No entry found for block.
1006 ++NumNewNewSpeculativelyAvailableBBs;
1007 bool OutOfBudget = NumNewNewSpeculativelyAvailableBBs > MaxBBSpeculations;
1008
1009 // If we have exhausted our budget, mark this block as unavailable.
1010 // Also, if this block has no predecessors, the value isn't live-in here.
1011 if (OutOfBudget || pred_empty(CurrBB)) {
1012 MaxBBSpeculationCutoffReachedTimes += (int)OutOfBudget;
1014 UnavailableBB = CurrBB;
1015 break; // Backpropagate unavailability info.
1016 }
1017
1018 // Tentatively consider this block as speculatively available.
1019#ifndef NDEBUG
1020 NewSpeculativelyAvailableBBs.insert(CurrBB);
1021#endif
1022 // And further recurse into block's predecessors, in depth-first order!
1023 Worklist.append(pred_begin(CurrBB), pred_end(CurrBB));
1024 }
1025
1026#if LLVM_ENABLE_STATS
1027 IsValueFullyAvailableInBlockNumSpeculationsMax.updateMax(
1028 NumNewNewSpeculativelyAvailableBBs);
1029#endif
1030
1031 // If the block isn't marked as fixpoint yet
1032 // (the Unavailable and Available states are fixpoints).
1033 auto MarkAsFixpointAndEnqueueSuccessors =
1034 [&](BasicBlock *BB, AvailabilityState FixpointState) {
1035 auto It = FullyAvailableBlocks.find(BB);
1036 if (It == FullyAvailableBlocks.end())
1037 return; // Never queried this block, leave as-is.
1038 switch (AvailabilityState &State = It->second) {
1041 return; // Don't backpropagate further, continue processing worklist.
1043 State = FixpointState;
1044#ifndef NDEBUG
1045 assert(NewSpeculativelyAvailableBBs.erase(BB) &&
1046 "Found a speculatively available successor leftover?");
1047#endif
1048 // Queue successors for further processing.
1049 Worklist.append(succ_begin(BB), succ_end(BB));
1050 return;
1051 }
1052 };
1053
1054 if (UnavailableBB) {
1055 // Okay, we have encountered an unavailable block.
1056 // Mark speculatively available blocks reachable from UnavailableBB as
1057 // unavailable as well. Paths are terminated when they reach blocks not in
1058 // FullyAvailableBlocks or they are not marked as speculatively available.
1059 Worklist.clear();
1060 Worklist.append(succ_begin(*UnavailableBB), succ_end(*UnavailableBB));
1061 while (!Worklist.empty())
1062 MarkAsFixpointAndEnqueueSuccessors(Worklist.pop_back_val(),
1064 }
1065
1066#ifndef NDEBUG
1067 Worklist.clear();
1068 for (BasicBlock *AvailableBB : AvailableBBs)
1069 Worklist.append(succ_begin(AvailableBB), succ_end(AvailableBB));
1070 while (!Worklist.empty())
1071 MarkAsFixpointAndEnqueueSuccessors(Worklist.pop_back_val(),
1073
1074 assert(NewSpeculativelyAvailableBBs.empty() &&
1075 "Must have fixed all the new speculatively available blocks.");
1076#endif
1077
1078 return !UnavailableBB;
1079}
1080
1081/// If the specified OldValue exists in ValuesPerBlock, replace its value with
1082/// NewValue.
1084 SmallVectorImpl<AvailableValueInBlock> &ValuesPerBlock, Value *OldValue,
1085 Value *NewValue) {
1086 for (AvailableValueInBlock &V : ValuesPerBlock) {
1087 if (V.AV.Val == OldValue)
1088 V.AV.Val = NewValue;
1089 if (V.AV.isSelectValue()) {
1090 if (V.AV.V1 == OldValue)
1091 V.AV.V1 = NewValue;
1092 if (V.AV.V2 == OldValue)
1093 V.AV.V2 = NewValue;
1094 }
1095 }
1096}
1097
1098/// Given a set of loads specified by ValuesPerBlock,
1099/// construct SSA form, allowing us to eliminate Load. This returns the value
1100/// that should be used at Load's definition site.
1101static Value *
1104 GVNPass &GVN) {
1105 // Check for the fully redundant, dominating load case. In this case, we can
1106 // just use the dominating value directly.
1107 if (ValuesPerBlock.size() == 1 &&
1108 GVN.getDominatorTree().properlyDominates(ValuesPerBlock[0].BB,
1109 Load->getParent())) {
1110 assert(!ValuesPerBlock[0].AV.isUndefValue() &&
1111 "Dead BB dominate this block");
1112 return ValuesPerBlock[0].MaterializeAdjustedValue(Load);
1113 }
1114
1115 // Otherwise, we have to construct SSA form.
1117 SSAUpdater SSAUpdate(&NewPHIs);
1118 SSAUpdate.Initialize(Load->getType(), Load->getName());
1119
1120 for (const AvailableValueInBlock &AV : ValuesPerBlock) {
1121 BasicBlock *BB = AV.BB;
1122
1123 if (AV.AV.isUndefValue())
1124 continue;
1125
1126 if (SSAUpdate.HasValueForBlock(BB))
1127 continue;
1128
1129 // If the value is the load that we will be eliminating, and the block it's
1130 // available in is the block that the load is in, then don't add it as
1131 // SSAUpdater will resolve the value to the relevant phi which may let it
1132 // avoid phi construction entirely if there's actually only one value.
1133 if (BB == Load->getParent() &&
1134 ((AV.AV.isSimpleValue() && AV.AV.getSimpleValue() == Load) ||
1135 (AV.AV.isCoercedLoadValue() && AV.AV.getCoercedLoadValue() == Load)))
1136 continue;
1137
1138 SSAUpdate.AddAvailableValue(BB, AV.MaterializeAdjustedValue(Load));
1139 }
1140
1141 // Perform PHI construction.
1142 return SSAUpdate.GetValueInMiddleOfBlock(Load->getParent());
1143}
1144
1146 Instruction *InsertPt) const {
1147 Value *Res;
1148 Type *LoadTy = Load->getType();
1149 const DataLayout &DL = Load->getDataLayout();
1150 if (isSimpleValue()) {
1151 Res = getSimpleValue();
1152 if (Res->getType() != LoadTy) {
1153 Res = getValueForLoad(Res, Offset, LoadTy, InsertPt, Load->getFunction());
1154
1155 LLVM_DEBUG(dbgs() << "GVN COERCED NONLOCAL VAL:\nOffset: " << Offset
1156 << " " << *getSimpleValue() << '\n'
1157 << *Res << '\n'
1158 << "\n\n\n");
1159 }
1160 } else if (isCoercedLoadValue()) {
1161 LoadInst *CoercedLoad = getCoercedLoadValue();
1162 if (CoercedLoad->getType() == LoadTy && Offset == 0) {
1163 Res = CoercedLoad;
1164 combineMetadataForCSE(CoercedLoad, Load, false);
1165 } else {
1166 Res = getValueForLoad(CoercedLoad, Offset, LoadTy, InsertPt,
1167 Load->getFunction());
1168 // We are adding a new user for this load, for which the original
1169 // metadata may not hold. Additionally, the new load may have a different
1170 // size and type, so their metadata cannot be combined in any
1171 // straightforward way.
1172 // Drop all metadata that is not known to cause immediate UB on violation,
1173 // unless the load has !noundef, in which case all metadata violations
1174 // will be promoted to UB.
1175 // TODO: We can combine noalias/alias.scope metadata here, because it is
1176 // independent of the load type.
1177 if (!CoercedLoad->hasMetadata(LLVMContext::MD_noundef))
1178 CoercedLoad->dropUnknownNonDebugMetadata(
1179 {LLVMContext::MD_dereferenceable,
1180 LLVMContext::MD_dereferenceable_or_null,
1181 LLVMContext::MD_invariant_load, LLVMContext::MD_invariant_group});
1182 LLVM_DEBUG(dbgs() << "GVN COERCED NONLOCAL LOAD:\nOffset: " << Offset
1183 << " " << *getCoercedLoadValue() << '\n'
1184 << *Res << '\n'
1185 << "\n\n\n");
1186 }
1187 } else if (isMemIntrinValue()) {
1189 InsertPt, DL);
1190 LLVM_DEBUG(dbgs() << "GVN COERCED NONLOCAL MEM INTRIN:\nOffset: " << Offset
1191 << " " << *getMemIntrinValue() << '\n'
1192 << *Res << '\n'
1193 << "\n\n\n");
1194 } else if (isSelectValue()) {
1195 // Introduce a new value select for a load from an eligible pointer select.
1196 SelectInst *Sel = getSelectValue();
1197 assert(V1 && V2 && "both value operands of the select must be present");
1198 Res =
1199 SelectInst::Create(Sel->getCondition(), V1, V2, "", Sel->getIterator());
1200 // We use the DebugLoc from the original load here, as this instruction
1201 // materializes the value that would previously have been loaded.
1202 cast<SelectInst>(Res)->setDebugLoc(Load->getDebugLoc());
1203 } else {
1204 llvm_unreachable("Should not materialize value from dead block");
1205 }
1206 assert(Res && "failed to materialize?");
1207 return Res;
1208}
1209
1210static bool isLifetimeStart(const Instruction *Inst) {
1211 if (const IntrinsicInst* II = dyn_cast<IntrinsicInst>(Inst))
1212 return II->getIntrinsicID() == Intrinsic::lifetime_start;
1213 return false;
1214}
1215
1216/// Assuming To can be reached from both From and Between, does Between lie on
1217/// every path from From to To?
1218static bool liesBetween(const Instruction *From, Instruction *Between,
1219 const Instruction *To, const DominatorTree *DT) {
1220 if (From->getParent() == Between->getParent())
1221 return DT->dominates(From, Between);
1223 Exclusion.insert(Between->getParent());
1224 return !isPotentiallyReachable(From, To, &Exclusion, DT);
1225}
1226
1228 const DominatorTree *DT) {
1229 Value *PtrOp = Load->getPointerOperand();
1230 if (!PtrOp->hasUseList())
1231 return nullptr;
1232
1233 Instruction *OtherAccess = nullptr;
1234
1235 for (auto *U : PtrOp->users()) {
1236 if (U != Load && (isa<LoadInst>(U) || isa<StoreInst>(U))) {
1237 auto *I = cast<Instruction>(U);
1238 if (I->getFunction() == Load->getFunction() && DT->dominates(I, Load)) {
1239 // Use the most immediately dominating value.
1240 if (OtherAccess) {
1241 if (DT->dominates(OtherAccess, I))
1242 OtherAccess = I;
1243 else
1244 assert(U == OtherAccess || DT->dominates(I, OtherAccess));
1245 } else
1246 OtherAccess = I;
1247 }
1248 }
1249 }
1250
1251 if (OtherAccess)
1252 return OtherAccess;
1253
1254 // There is no dominating use, check if we can find a closest non-dominating
1255 // use that lies between any other potentially available use and Load.
1256 for (auto *U : PtrOp->users()) {
1257 if (U != Load && (isa<LoadInst>(U) || isa<StoreInst>(U))) {
1258 auto *I = cast<Instruction>(U);
1259 if (I->getFunction() == Load->getFunction() &&
1260 isPotentiallyReachable(I, Load, nullptr, DT)) {
1261 if (OtherAccess) {
1262 if (liesBetween(OtherAccess, I, Load, DT)) {
1263 OtherAccess = I;
1264 } else if (!liesBetween(I, OtherAccess, Load, DT)) {
1265 // These uses are both partially available at Load were it not for
1266 // the clobber, but neither lies strictly after the other.
1267 OtherAccess = nullptr;
1268 break;
1269 } // else: keep current OtherAccess since it lies between U and
1270 // Load.
1271 } else {
1272 OtherAccess = I;
1273 }
1274 }
1275 }
1276 }
1277
1278 return OtherAccess;
1279}
1280
1281/// Try to locate the three instruction involved in a missed
1282/// load-elimination case that is due to an intervening store.
1284 const DominatorTree *DT,
1286 using namespace ore;
1287
1288 OptimizationRemarkMissed R(DEBUG_TYPE, "LoadClobbered", Load);
1289 R << "load of type " << NV("Type", Load->getType()) << " not eliminated"
1290 << setExtraArgs();
1291
1292 const Instruction *OtherAccess = findMayClobberedPtrAccess(Load, DT);
1293 if (OtherAccess)
1294 R << " in favor of " << NV("OtherAccess", OtherAccess);
1295
1296 R << " because it is clobbered by " << NV("ClobberedBy", DepInfo.getInst());
1297
1298 ORE->emit(R);
1299}
1300
1301// Find non-clobbered value for Loc memory location in extended basic block
1302// (chain of basic blocks with single predecessors) starting From instruction.
1304 Instruction *From, AAResults *AA) {
1305 uint32_t NumVisitedInsts = 0;
1306 BasicBlock *FromBB = From->getParent();
1307 BatchAAResults BatchAA(*AA);
1308 for (BasicBlock *BB = FromBB; BB; BB = BB->getSinglePredecessor())
1309 for (auto *Inst = BB == FromBB ? From : BB->getTerminator();
1310 Inst != nullptr; Inst = Inst->getPrevNode()) {
1311 // Stop the search if limit is reached.
1312 if (++NumVisitedInsts > MaxNumVisitedInsts)
1313 return nullptr;
1314 if (isModSet(BatchAA.getModRefInfo(Inst, Loc)))
1315 return nullptr;
1316 if (auto *LI = dyn_cast<LoadInst>(Inst))
1317 if (LI->getPointerOperand() == Loc.Ptr && LI->getType() == LoadTy)
1318 return LI;
1319 }
1320 return nullptr;
1321}
1322
1323std::optional<AvailableValue>
1324GVNPass::AnalyzeLoadAvailability(LoadInst *Load, MemDepResult DepInfo,
1325 Value *Address) {
1326 assert(Load->isUnordered() && "rules below are incorrect for ordered access");
1327 assert(DepInfo.isLocal() && "expected a local dependence");
1328
1329 Instruction *DepInst = DepInfo.getInst();
1330
1331 const DataLayout &DL = Load->getDataLayout();
1332 if (DepInfo.isClobber()) {
1333 // If the dependence is to a store that writes to a superset of the bits
1334 // read by the load, we can extract the bits we need for the load from the
1335 // stored value.
1336 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
1337 // Can't forward from non-atomic to atomic without violating memory model.
1338 if (Address && Load->isAtomic() <= DepSI->isAtomic()) {
1339 int Offset =
1340 analyzeLoadFromClobberingStore(Load->getType(), Address, DepSI, DL);
1341 if (Offset != -1)
1342 return AvailableValue::get(DepSI->getValueOperand(), Offset);
1343 }
1344 }
1345
1346 // Check to see if we have something like this:
1347 // load i32* P
1348 // load i8* (P+1)
1349 // if we have this, replace the later with an extraction from the former.
1350 if (LoadInst *DepLoad = dyn_cast<LoadInst>(DepInst)) {
1351 // If this is a clobber and L is the first instruction in its block, then
1352 // we have the first instruction in the entry block.
1353 // Can't forward from non-atomic to atomic without violating memory model.
1354 if (DepLoad != Load && Address &&
1355 Load->isAtomic() <= DepLoad->isAtomic()) {
1356 Type *LoadType = Load->getType();
1357 int Offset = -1;
1358
1359 // If MD reported clobber, check it was nested.
1360 if (DepInfo.isClobber() &&
1361 canCoerceMustAliasedValueToLoad(DepLoad, LoadType,
1362 DepLoad->getFunction())) {
1363 const auto ClobberOff = MD->getClobberOffset(DepLoad);
1364 // GVN has no deal with a negative offset.
1365 Offset = (ClobberOff == std::nullopt || *ClobberOff < 0)
1366 ? -1
1367 : *ClobberOff;
1368 }
1369 if (Offset == -1)
1370 Offset =
1371 analyzeLoadFromClobberingLoad(LoadType, Address, DepLoad, DL);
1372 if (Offset != -1)
1373 return AvailableValue::getLoad(DepLoad, Offset);
1374 }
1375 }
1376
1377 // If the clobbering value is a memset/memcpy/memmove, see if we can
1378 // forward a value on from it.
1379 if (MemIntrinsic *DepMI = dyn_cast<MemIntrinsic>(DepInst)) {
1380 if (Address && !Load->isAtomic()) {
1382 DepMI, DL);
1383 if (Offset != -1)
1384 return AvailableValue::getMI(DepMI, Offset);
1385 }
1386 }
1387
1388 // Nothing known about this clobber, have to be conservative.
1389 LLVM_DEBUG(
1390 // fast print dep, using operator<< on instruction is too slow.
1391 dbgs() << "GVN: load "; Load->printAsOperand(dbgs());
1392 dbgs() << " is clobbered by " << *DepInst << '\n';);
1393 if (ORE->allowExtraAnalysis(DEBUG_TYPE))
1394 reportMayClobberedLoad(Load, DepInfo, DT, ORE);
1395
1396 return std::nullopt;
1397 }
1398 assert(DepInfo.isDef() && "follows from above");
1399
1400 // Loading the alloca -> undef.
1401 // Loading immediately after lifetime begin -> undef.
1402 if (isa<AllocaInst>(DepInst) || isLifetimeStart(DepInst))
1403 return AvailableValue::get(UndefValue::get(Load->getType()));
1404
1405 if (Constant *InitVal =
1406 getInitialValueOfAllocation(DepInst, TLI, Load->getType()))
1407 return AvailableValue::get(InitVal);
1408
1409 if (StoreInst *S = dyn_cast<StoreInst>(DepInst)) {
1410 // Reject loads and stores that are to the same address but are of
1411 // different types if we have to. If the stored value is convertable to
1412 // the loaded value, we can reuse it.
1413 if (!canCoerceMustAliasedValueToLoad(S->getValueOperand(), Load->getType(),
1414 S->getFunction()))
1415 return std::nullopt;
1416
1417 // Can't forward from non-atomic to atomic without violating memory model.
1418 if (S->isAtomic() < Load->isAtomic())
1419 return std::nullopt;
1420
1421 return AvailableValue::get(S->getValueOperand());
1422 }
1423
1424 if (LoadInst *LD = dyn_cast<LoadInst>(DepInst)) {
1425 // If the types mismatch and we can't handle it, reject reuse of the load.
1426 // If the stored value is larger or equal to the loaded value, we can reuse
1427 // it.
1428 if (!canCoerceMustAliasedValueToLoad(LD, Load->getType(),
1429 LD->getFunction()))
1430 return std::nullopt;
1431
1432 // Can't forward from non-atomic to atomic without violating memory model.
1433 if (LD->isAtomic() < Load->isAtomic())
1434 return std::nullopt;
1435
1436 return AvailableValue::getLoad(LD);
1437 }
1438
1439 // Check if load with Addr dependent from select can be converted to select
1440 // between load values. There must be no instructions between the found
1441 // loads and DepInst that may clobber the loads.
1442 if (auto *Sel = dyn_cast<SelectInst>(DepInst)) {
1443 assert(Sel->getType() == Load->getPointerOperandType());
1444 auto Loc = MemoryLocation::get(Load);
1445 Value *V1 =
1446 findDominatingValue(Loc.getWithNewPtr(Sel->getTrueValue()),
1447 Load->getType(), DepInst, getAliasAnalysis());
1448 if (!V1)
1449 return std::nullopt;
1450 Value *V2 =
1451 findDominatingValue(Loc.getWithNewPtr(Sel->getFalseValue()),
1452 Load->getType(), DepInst, getAliasAnalysis());
1453 if (!V2)
1454 return std::nullopt;
1455 return AvailableValue::getSelect(Sel, V1, V2);
1456 }
1457
1458 // Unknown def - must be conservative.
1459 LLVM_DEBUG(
1460 // fast print dep, using operator<< on instruction is too slow.
1461 dbgs() << "GVN: load "; Load->printAsOperand(dbgs());
1462 dbgs() << " has unknown def " << *DepInst << '\n';);
1463 return std::nullopt;
1464}
1465
1466void GVNPass::AnalyzeLoadAvailability(LoadInst *Load, LoadDepVect &Deps,
1467 AvailValInBlkVect &ValuesPerBlock,
1468 UnavailBlkVect &UnavailableBlocks) {
1469 // Filter out useless results (non-locals, etc). Keep track of the blocks
1470 // where we have a value available in repl, also keep track of whether we see
1471 // dependencies that produce an unknown value for the load (such as a call
1472 // that could potentially clobber the load).
1473 for (const auto &Dep : Deps) {
1474 BasicBlock *DepBB = Dep.getBB();
1475 MemDepResult DepInfo = Dep.getResult();
1476
1477 if (DeadBlocks.count(DepBB)) {
1478 // Dead dependent mem-op disguise as a load evaluating the same value
1479 // as the load in question.
1480 ValuesPerBlock.push_back(AvailableValueInBlock::getUndef(DepBB));
1481 continue;
1482 }
1483
1484 if (!DepInfo.isLocal()) {
1485 UnavailableBlocks.push_back(DepBB);
1486 continue;
1487 }
1488
1489 // The address being loaded in this non-local block may not be the same as
1490 // the pointer operand of the load if PHI translation occurs. Make sure
1491 // to consider the right address.
1492 if (auto AV = AnalyzeLoadAvailability(Load, DepInfo, Dep.getAddress())) {
1493 // subtlety: because we know this was a non-local dependency, we know
1494 // it's safe to materialize anywhere between the instruction within
1495 // DepInfo and the end of it's block.
1496 ValuesPerBlock.push_back(
1497 AvailableValueInBlock::get(DepBB, std::move(*AV)));
1498 } else {
1499 UnavailableBlocks.push_back(DepBB);
1500 }
1501 }
1502
1503 assert(Deps.size() == ValuesPerBlock.size() + UnavailableBlocks.size() &&
1504 "post condition violation");
1505}
1506
1507/// Given the following code, v1 is partially available on some edges, but not
1508/// available on the edge from PredBB. This function tries to find if there is
1509/// another identical load in the other successor of PredBB.
1510///
1511/// v0 = load %addr
1512/// br %LoadBB
1513///
1514/// LoadBB:
1515/// v1 = load %addr
1516/// ...
1517///
1518/// PredBB:
1519/// ...
1520/// br %cond, label %LoadBB, label %SuccBB
1521///
1522/// SuccBB:
1523/// v2 = load %addr
1524/// ...
1525///
1526LoadInst *GVNPass::findLoadToHoistIntoPred(BasicBlock *Pred, BasicBlock *LoadBB,
1527 LoadInst *Load) {
1528 // For simplicity we handle a Pred has 2 successors only.
1529 auto *Term = Pred->getTerminator();
1530 if (Term->getNumSuccessors() != 2 || Term->isSpecialTerminator())
1531 return nullptr;
1532 auto *SuccBB = Term->getSuccessor(0);
1533 if (SuccBB == LoadBB)
1534 SuccBB = Term->getSuccessor(1);
1535 if (!SuccBB->getSinglePredecessor())
1536 return nullptr;
1537
1538 unsigned int NumInsts = MaxNumInsnsPerBlock;
1539 for (Instruction &Inst : *SuccBB) {
1540 if (Inst.isDebugOrPseudoInst())
1541 continue;
1542 if (--NumInsts == 0)
1543 return nullptr;
1544
1545 if (!Inst.isIdenticalTo(Load))
1546 continue;
1547
1548 MemDepResult Dep = MD->getDependency(&Inst);
1549 // If an identical load doesn't depends on any local instructions, it can
1550 // be safely moved to PredBB.
1551 // Also check for the implicit control flow instructions. See the comments
1552 // in PerformLoadPRE for details.
1553 if (Dep.isNonLocal() && !ICF->isDominatedByICFIFromSameBlock(&Inst))
1554 return cast<LoadInst>(&Inst);
1555
1556 // Otherwise there is something in the same BB clobbers the memory, we can't
1557 // move this and later load to PredBB.
1558 return nullptr;
1559 }
1560
1561 return nullptr;
1562}
1563
1564void GVNPass::eliminatePartiallyRedundantLoad(
1565 LoadInst *Load, AvailValInBlkVect &ValuesPerBlock,
1566 MapVector<BasicBlock *, Value *> &AvailableLoads,
1567 MapVector<BasicBlock *, LoadInst *> *CriticalEdgePredAndLoad) {
1568 for (const auto &AvailableLoad : AvailableLoads) {
1569 BasicBlock *UnavailableBlock = AvailableLoad.first;
1570 Value *LoadPtr = AvailableLoad.second;
1571
1572 auto *NewLoad = new LoadInst(
1573 Load->getType(), LoadPtr, Load->getName() + ".pre", Load->isVolatile(),
1574 Load->getAlign(), Load->getOrdering(), Load->getSyncScopeID(),
1575 UnavailableBlock->getTerminator()->getIterator());
1576 NewLoad->setDebugLoc(Load->getDebugLoc());
1577 if (MSSAU) {
1578 auto *NewAccess = MSSAU->createMemoryAccessInBB(
1579 NewLoad, nullptr, NewLoad->getParent(), MemorySSA::BeforeTerminator);
1580 if (auto *NewDef = dyn_cast<MemoryDef>(NewAccess))
1581 MSSAU->insertDef(NewDef, /*RenameUses=*/true);
1582 else
1583 MSSAU->insertUse(cast<MemoryUse>(NewAccess), /*RenameUses=*/true);
1584 }
1585
1586 // Transfer the old load's AA tags to the new load.
1587 AAMDNodes Tags = Load->getAAMetadata();
1588 if (Tags)
1589 NewLoad->setAAMetadata(Tags);
1590
1591 if (auto *MD = Load->getMetadata(LLVMContext::MD_invariant_load))
1592 NewLoad->setMetadata(LLVMContext::MD_invariant_load, MD);
1593 if (auto *InvGroupMD = Load->getMetadata(LLVMContext::MD_invariant_group))
1594 NewLoad->setMetadata(LLVMContext::MD_invariant_group, InvGroupMD);
1595 if (auto *RangeMD = Load->getMetadata(LLVMContext::MD_range))
1596 NewLoad->setMetadata(LLVMContext::MD_range, RangeMD);
1597 if (auto *AccessMD = Load->getMetadata(LLVMContext::MD_access_group))
1598 if (LI->getLoopFor(Load->getParent()) == LI->getLoopFor(UnavailableBlock))
1599 NewLoad->setMetadata(LLVMContext::MD_access_group, AccessMD);
1600
1601 // We do not propagate the old load's debug location, because the new
1602 // load now lives in a different BB, and we want to avoid a jumpy line
1603 // table.
1604 // FIXME: How do we retain source locations without causing poor debugging
1605 // behavior?
1606
1607 // Add the newly created load.
1608 ValuesPerBlock.push_back(
1609 AvailableValueInBlock::get(UnavailableBlock, NewLoad));
1610 MD->invalidateCachedPointerInfo(LoadPtr);
1611 LLVM_DEBUG(dbgs() << "GVN INSERTED " << *NewLoad << '\n');
1612
1613 // For PredBB in CriticalEdgePredAndLoad we need to replace the uses of old
1614 // load instruction with the new created load instruction.
1615 if (CriticalEdgePredAndLoad) {
1616 auto It = CriticalEdgePredAndLoad->find(UnavailableBlock);
1617 if (It != CriticalEdgePredAndLoad->end()) {
1618 ++NumPRELoadMoved2CEPred;
1619 ICF->insertInstructionTo(NewLoad, UnavailableBlock);
1620 LoadInst *OldLoad = It->second;
1621 combineMetadataForCSE(NewLoad, OldLoad, false);
1622 OldLoad->replaceAllUsesWith(NewLoad);
1623 replaceValuesPerBlockEntry(ValuesPerBlock, OldLoad, NewLoad);
1624 if (uint32_t ValNo = VN.lookup(OldLoad, false))
1625 LeaderTable.erase(ValNo, OldLoad, OldLoad->getParent());
1626 removeInstruction(OldLoad);
1627 }
1628 }
1629 }
1630
1631 // Perform PHI construction.
1632 Value *V = ConstructSSAForLoadSet(Load, ValuesPerBlock, *this);
1633 // ConstructSSAForLoadSet is responsible for combining metadata.
1634 ICF->removeUsersOf(Load);
1635 Load->replaceAllUsesWith(V);
1636 if (isa<PHINode>(V))
1637 V->takeName(Load);
1638 if (Instruction *I = dyn_cast<Instruction>(V))
1639 I->setDebugLoc(Load->getDebugLoc());
1640 if (V->getType()->isPtrOrPtrVectorTy())
1641 MD->invalidateCachedPointerInfo(V);
1642 ORE->emit([&]() {
1643 return OptimizationRemark(DEBUG_TYPE, "LoadPRE", Load)
1644 << "load eliminated by PRE";
1645 });
1647}
1648
1649bool GVNPass::PerformLoadPRE(LoadInst *Load, AvailValInBlkVect &ValuesPerBlock,
1650 UnavailBlkVect &UnavailableBlocks) {
1651 // Okay, we have *some* definitions of the value. This means that the value
1652 // is available in some of our (transitive) predecessors. Lets think about
1653 // doing PRE of this load. This will involve inserting a new load into the
1654 // predecessor when it's not available. We could do this in general, but
1655 // prefer to not increase code size. As such, we only do this when we know
1656 // that we only have to insert *one* load (which means we're basically moving
1657 // the load, not inserting a new one).
1658
1659 SmallPtrSet<BasicBlock *, 4> Blockers(llvm::from_range, UnavailableBlocks);
1660
1661 // Let's find the first basic block with more than one predecessor. Walk
1662 // backwards through predecessors if needed.
1663 BasicBlock *LoadBB = Load->getParent();
1664 BasicBlock *TmpBB = LoadBB;
1665
1666 // Check that there is no implicit control flow instructions above our load in
1667 // its block. If there is an instruction that doesn't always pass the
1668 // execution to the following instruction, then moving through it may become
1669 // invalid. For example:
1670 //
1671 // int arr[LEN];
1672 // int index = ???;
1673 // ...
1674 // guard(0 <= index && index < LEN);
1675 // use(arr[index]);
1676 //
1677 // It is illegal to move the array access to any point above the guard,
1678 // because if the index is out of bounds we should deoptimize rather than
1679 // access the array.
1680 // Check that there is no guard in this block above our instruction.
1681 bool MustEnsureSafetyOfSpeculativeExecution =
1682 ICF->isDominatedByICFIFromSameBlock(Load);
1683
1684 while (TmpBB->getSinglePredecessor()) {
1685 TmpBB = TmpBB->getSinglePredecessor();
1686 if (TmpBB == LoadBB) // Infinite (unreachable) loop.
1687 return false;
1688 if (Blockers.count(TmpBB))
1689 return false;
1690
1691 // If any of these blocks has more than one successor (i.e. if the edge we
1692 // just traversed was critical), then there are other paths through this
1693 // block along which the load may not be anticipated. Hoisting the load
1694 // above this block would be adding the load to execution paths along
1695 // which it was not previously executed.
1696 if (TmpBB->getTerminator()->getNumSuccessors() != 1)
1697 return false;
1698
1699 // Check that there is no implicit control flow in a block above.
1700 MustEnsureSafetyOfSpeculativeExecution =
1701 MustEnsureSafetyOfSpeculativeExecution || ICF->hasICF(TmpBB);
1702 }
1703
1704 assert(TmpBB);
1705 LoadBB = TmpBB;
1706
1707 // Check to see how many predecessors have the loaded value fully
1708 // available.
1709 MapVector<BasicBlock *, Value *> PredLoads;
1710 DenseMap<BasicBlock *, AvailabilityState> FullyAvailableBlocks;
1711 for (const AvailableValueInBlock &AV : ValuesPerBlock)
1712 FullyAvailableBlocks[AV.BB] = AvailabilityState::Available;
1713 for (BasicBlock *UnavailableBB : UnavailableBlocks)
1714 FullyAvailableBlocks[UnavailableBB] = AvailabilityState::Unavailable;
1715
1716 // The edge from Pred to LoadBB is a critical edge will be splitted.
1717 SmallVector<BasicBlock *, 4> CriticalEdgePredSplit;
1718 // The edge from Pred to LoadBB is a critical edge, another successor of Pred
1719 // contains a load can be moved to Pred. This data structure maps the Pred to
1720 // the movable load.
1721 MapVector<BasicBlock *, LoadInst *> CriticalEdgePredAndLoad;
1722 for (BasicBlock *Pred : predecessors(LoadBB)) {
1723 // If any predecessor block is an EH pad that does not allow non-PHI
1724 // instructions before the terminator, we can't PRE the load.
1725 if (Pred->getTerminator()->isEHPad()) {
1726 LLVM_DEBUG(
1727 dbgs() << "COULD NOT PRE LOAD BECAUSE OF AN EH PAD PREDECESSOR '"
1728 << Pred->getName() << "': " << *Load << '\n');
1729 return false;
1730 }
1731
1732 if (IsValueFullyAvailableInBlock(Pred, FullyAvailableBlocks)) {
1733 continue;
1734 }
1735
1736 if (Pred->getTerminator()->getNumSuccessors() != 1) {
1737 if (isa<IndirectBrInst>(Pred->getTerminator())) {
1738 LLVM_DEBUG(
1739 dbgs() << "COULD NOT PRE LOAD BECAUSE OF INDBR CRITICAL EDGE '"
1740 << Pred->getName() << "': " << *Load << '\n');
1741 return false;
1742 }
1743
1744 if (LoadBB->isEHPad()) {
1745 LLVM_DEBUG(
1746 dbgs() << "COULD NOT PRE LOAD BECAUSE OF AN EH PAD CRITICAL EDGE '"
1747 << Pred->getName() << "': " << *Load << '\n');
1748 return false;
1749 }
1750
1751 // Do not split backedge as it will break the canonical loop form.
1753 if (DT->dominates(LoadBB, Pred)) {
1754 LLVM_DEBUG(
1755 dbgs()
1756 << "COULD NOT PRE LOAD BECAUSE OF A BACKEDGE CRITICAL EDGE '"
1757 << Pred->getName() << "': " << *Load << '\n');
1758 return false;
1759 }
1760
1761 if (LoadInst *LI = findLoadToHoistIntoPred(Pred, LoadBB, Load))
1762 CriticalEdgePredAndLoad[Pred] = LI;
1763 else
1764 CriticalEdgePredSplit.push_back(Pred);
1765 } else {
1766 // Only add the predecessors that will not be split for now.
1767 PredLoads[Pred] = nullptr;
1768 }
1769 }
1770
1771 // Decide whether PRE is profitable for this load.
1772 unsigned NumInsertPreds = PredLoads.size() + CriticalEdgePredSplit.size();
1773 unsigned NumUnavailablePreds = NumInsertPreds +
1774 CriticalEdgePredAndLoad.size();
1775 assert(NumUnavailablePreds != 0 &&
1776 "Fully available value should already be eliminated!");
1777 (void)NumUnavailablePreds;
1778
1779 // If we need to insert new load in multiple predecessors, reject it.
1780 // FIXME: If we could restructure the CFG, we could make a common pred with
1781 // all the preds that don't have an available Load and insert a new load into
1782 // that one block.
1783 if (NumInsertPreds > 1)
1784 return false;
1785
1786 // Now we know where we will insert load. We must ensure that it is safe
1787 // to speculatively execute the load at that points.
1788 if (MustEnsureSafetyOfSpeculativeExecution) {
1789 if (CriticalEdgePredSplit.size())
1790 if (!isSafeToSpeculativelyExecute(Load, &*LoadBB->getFirstNonPHIIt(), AC,
1791 DT))
1792 return false;
1793 for (auto &PL : PredLoads)
1794 if (!isSafeToSpeculativelyExecute(Load, PL.first->getTerminator(), AC,
1795 DT))
1796 return false;
1797 for (auto &CEP : CriticalEdgePredAndLoad)
1798 if (!isSafeToSpeculativelyExecute(Load, CEP.first->getTerminator(), AC,
1799 DT))
1800 return false;
1801 }
1802
1803 // Split critical edges, and update the unavailable predecessors accordingly.
1804 for (BasicBlock *OrigPred : CriticalEdgePredSplit) {
1805 BasicBlock *NewPred = splitCriticalEdges(OrigPred, LoadBB);
1806 assert(!PredLoads.count(OrigPred) && "Split edges shouldn't be in map!");
1807 PredLoads[NewPred] = nullptr;
1808 LLVM_DEBUG(dbgs() << "Split critical edge " << OrigPred->getName() << "->"
1809 << LoadBB->getName() << '\n');
1810 }
1811
1812 for (auto &CEP : CriticalEdgePredAndLoad)
1813 PredLoads[CEP.first] = nullptr;
1814
1815 // Check if the load can safely be moved to all the unavailable predecessors.
1816 bool CanDoPRE = true;
1817 const DataLayout &DL = Load->getDataLayout();
1818 SmallVector<Instruction*, 8> NewInsts;
1819 for (auto &PredLoad : PredLoads) {
1820 BasicBlock *UnavailablePred = PredLoad.first;
1821
1822 // Do PHI translation to get its value in the predecessor if necessary. The
1823 // returned pointer (if non-null) is guaranteed to dominate UnavailablePred.
1824 // We do the translation for each edge we skipped by going from Load's block
1825 // to LoadBB, otherwise we might miss pieces needing translation.
1826
1827 // If all preds have a single successor, then we know it is safe to insert
1828 // the load on the pred (?!?), so we can insert code to materialize the
1829 // pointer if it is not available.
1830 Value *LoadPtr = Load->getPointerOperand();
1831 BasicBlock *Cur = Load->getParent();
1832 while (Cur != LoadBB) {
1833 PHITransAddr Address(LoadPtr, DL, AC);
1834 LoadPtr = Address.translateWithInsertion(Cur, Cur->getSinglePredecessor(),
1835 *DT, NewInsts);
1836 if (!LoadPtr) {
1837 CanDoPRE = false;
1838 break;
1839 }
1840 Cur = Cur->getSinglePredecessor();
1841 }
1842
1843 if (LoadPtr) {
1844 PHITransAddr Address(LoadPtr, DL, AC);
1845 LoadPtr = Address.translateWithInsertion(LoadBB, UnavailablePred, *DT,
1846 NewInsts);
1847 }
1848 // If we couldn't find or insert a computation of this phi translated value,
1849 // we fail PRE.
1850 if (!LoadPtr) {
1851 LLVM_DEBUG(dbgs() << "COULDN'T INSERT PHI TRANSLATED VALUE OF: "
1852 << *Load->getPointerOperand() << "\n");
1853 CanDoPRE = false;
1854 break;
1855 }
1856
1857 PredLoad.second = LoadPtr;
1858 }
1859
1860 if (!CanDoPRE) {
1861 while (!NewInsts.empty()) {
1862 // Erase instructions generated by the failed PHI translation before
1863 // trying to number them. PHI translation might insert instructions
1864 // in basic blocks other than the current one, and we delete them
1865 // directly, as salvageAndRemoveInstruction only allows removing from the
1866 // current basic block.
1867 NewInsts.pop_back_val()->eraseFromParent();
1868 }
1869 // HINT: Don't revert the edge-splitting as following transformation may
1870 // also need to split these critical edges.
1871 return !CriticalEdgePredSplit.empty();
1872 }
1873
1874 // Okay, we can eliminate this load by inserting a reload in the predecessor
1875 // and using PHI construction to get the value in the other predecessors, do
1876 // it.
1877 LLVM_DEBUG(dbgs() << "GVN REMOVING PRE LOAD: " << *Load << '\n');
1878 LLVM_DEBUG(if (!NewInsts.empty()) dbgs() << "INSERTED " << NewInsts.size()
1879 << " INSTS: " << *NewInsts.back()
1880 << '\n');
1881
1882 // Assign value numbers to the new instructions.
1883 for (Instruction *I : NewInsts) {
1884 // Instructions that have been inserted in predecessor(s) to materialize
1885 // the load address do not retain their original debug locations. Doing
1886 // so could lead to confusing (but correct) source attributions.
1887 I->updateLocationAfterHoist();
1888
1889 // FIXME: We really _ought_ to insert these value numbers into their
1890 // parent's availability map. However, in doing so, we risk getting into
1891 // ordering issues. If a block hasn't been processed yet, we would be
1892 // marking a value as AVAIL-IN, which isn't what we intend.
1893 VN.lookupOrAdd(I);
1894 }
1895
1896 eliminatePartiallyRedundantLoad(Load, ValuesPerBlock, PredLoads,
1897 &CriticalEdgePredAndLoad);
1898 ++NumPRELoad;
1899 return true;
1900}
1901
1902bool GVNPass::performLoopLoadPRE(LoadInst *Load,
1903 AvailValInBlkVect &ValuesPerBlock,
1904 UnavailBlkVect &UnavailableBlocks) {
1905 const Loop *L = LI->getLoopFor(Load->getParent());
1906 // TODO: Generalize to other loop blocks that dominate the latch.
1907 if (!L || L->getHeader() != Load->getParent())
1908 return false;
1909
1910 BasicBlock *Preheader = L->getLoopPreheader();
1911 BasicBlock *Latch = L->getLoopLatch();
1912 if (!Preheader || !Latch)
1913 return false;
1914
1915 Value *LoadPtr = Load->getPointerOperand();
1916 // Must be available in preheader.
1917 if (!L->isLoopInvariant(LoadPtr))
1918 return false;
1919
1920 // We plan to hoist the load to preheader without introducing a new fault.
1921 // In order to do it, we need to prove that we cannot side-exit the loop
1922 // once loop header is first entered before execution of the load.
1923 if (ICF->isDominatedByICFIFromSameBlock(Load))
1924 return false;
1925
1926 BasicBlock *LoopBlock = nullptr;
1927 for (auto *Blocker : UnavailableBlocks) {
1928 // Blockers from outside the loop are handled in preheader.
1929 if (!L->contains(Blocker))
1930 continue;
1931
1932 // Only allow one loop block. Loop header is not less frequently executed
1933 // than each loop block, and likely it is much more frequently executed. But
1934 // in case of multiple loop blocks, we need extra information (such as block
1935 // frequency info) to understand whether it is profitable to PRE into
1936 // multiple loop blocks.
1937 if (LoopBlock)
1938 return false;
1939
1940 // Do not sink into inner loops. This may be non-profitable.
1941 if (L != LI->getLoopFor(Blocker))
1942 return false;
1943
1944 // Blocks that dominate the latch execute on every single iteration, maybe
1945 // except the last one. So PREing into these blocks doesn't make much sense
1946 // in most cases. But the blocks that do not necessarily execute on each
1947 // iteration are sometimes much colder than the header, and this is when
1948 // PRE is potentially profitable.
1949 if (DT->dominates(Blocker, Latch))
1950 return false;
1951
1952 // Make sure that the terminator itself doesn't clobber.
1953 if (Blocker->getTerminator()->mayWriteToMemory())
1954 return false;
1955
1956 LoopBlock = Blocker;
1957 }
1958
1959 if (!LoopBlock)
1960 return false;
1961
1962 // Make sure the memory at this pointer cannot be freed, therefore we can
1963 // safely reload from it after clobber.
1964 if (LoadPtr->canBeFreed())
1965 return false;
1966
1967 // TODO: Support critical edge splitting if blocker has more than 1 successor.
1968 MapVector<BasicBlock *, Value *> AvailableLoads;
1969 AvailableLoads[LoopBlock] = LoadPtr;
1970 AvailableLoads[Preheader] = LoadPtr;
1971
1972 LLVM_DEBUG(dbgs() << "GVN REMOVING PRE LOOP LOAD: " << *Load << '\n');
1973 eliminatePartiallyRedundantLoad(Load, ValuesPerBlock, AvailableLoads,
1974 /*CriticalEdgePredAndLoad*/ nullptr);
1975 ++NumPRELoopLoad;
1976 return true;
1977}
1978
1981 using namespace ore;
1982
1983 ORE->emit([&]() {
1984 return OptimizationRemark(DEBUG_TYPE, "LoadElim", Load)
1985 << "load of type " << NV("Type", Load->getType()) << " eliminated"
1986 << setExtraArgs() << " in favor of "
1987 << NV("InfavorOfValue", AvailableValue);
1988 });
1989}
1990
1991/// Attempt to eliminate a load whose dependencies are
1992/// non-local by performing PHI construction.
1993bool GVNPass::processNonLocalLoad(LoadInst *Load) {
1994 // Non-local speculations are not allowed under asan.
1995 if (Load->getParent()->getParent()->hasFnAttribute(
1996 Attribute::SanitizeAddress) ||
1997 Load->getParent()->getParent()->hasFnAttribute(
1998 Attribute::SanitizeHWAddress))
1999 return false;
2000
2001 // Step 1: Find the non-local dependencies of the load.
2002 LoadDepVect Deps;
2003 MD->getNonLocalPointerDependency(Load, Deps);
2004
2005 // If we had to process more than one hundred blocks to find the
2006 // dependencies, this load isn't worth worrying about. Optimizing
2007 // it will be too expensive.
2008 unsigned NumDeps = Deps.size();
2009 if (NumDeps > MaxNumDeps)
2010 return false;
2011
2012 // If we had a phi translation failure, we'll have a single entry which is a
2013 // clobber in the current block. Reject this early.
2014 if (NumDeps == 1 &&
2015 !Deps[0].getResult().isDef() && !Deps[0].getResult().isClobber()) {
2016 LLVM_DEBUG(dbgs() << "GVN: non-local load "; Load->printAsOperand(dbgs());
2017 dbgs() << " has unknown dependencies\n";);
2018 return false;
2019 }
2020
2021 bool Changed = false;
2022 // If this load follows a GEP, see if we can PRE the indices before analyzing.
2023 if (GetElementPtrInst *GEP =
2024 dyn_cast<GetElementPtrInst>(Load->getOperand(0))) {
2025 for (Use &U : GEP->indices())
2026 if (Instruction *I = dyn_cast<Instruction>(U.get()))
2027 Changed |= performScalarPRE(I);
2028 }
2029
2030 // Step 2: Analyze the availability of the load.
2031 AvailValInBlkVect ValuesPerBlock;
2032 UnavailBlkVect UnavailableBlocks;
2033 AnalyzeLoadAvailability(Load, Deps, ValuesPerBlock, UnavailableBlocks);
2034
2035 // If we have no predecessors that produce a known value for this load, exit
2036 // early.
2037 if (ValuesPerBlock.empty())
2038 return Changed;
2039
2040 // Step 3: Eliminate fully redundancy.
2041 //
2042 // If all of the instructions we depend on produce a known value for this
2043 // load, then it is fully redundant and we can use PHI insertion to compute
2044 // its value. Insert PHIs and remove the fully redundant value now.
2045 if (UnavailableBlocks.empty()) {
2046 LLVM_DEBUG(dbgs() << "GVN REMOVING NONLOCAL LOAD: " << *Load << '\n');
2047
2048 // Perform PHI construction.
2049 Value *V = ConstructSSAForLoadSet(Load, ValuesPerBlock, *this);
2050 // ConstructSSAForLoadSet is responsible for combining metadata.
2051 ICF->removeUsersOf(Load);
2052 Load->replaceAllUsesWith(V);
2053
2054 if (isa<PHINode>(V))
2055 V->takeName(Load);
2056 if (Instruction *I = dyn_cast<Instruction>(V))
2057 // If instruction I has debug info, then we should not update it.
2058 // Also, if I has a null DebugLoc, then it is still potentially incorrect
2059 // to propagate Load's DebugLoc because Load may not post-dominate I.
2060 if (Load->getDebugLoc() && Load->getParent() == I->getParent())
2061 I->setDebugLoc(Load->getDebugLoc());
2062 if (V->getType()->isPtrOrPtrVectorTy())
2063 MD->invalidateCachedPointerInfo(V);
2064 ++NumGVNLoad;
2065 reportLoadElim(Load, V, ORE);
2067 return true;
2068 }
2069
2070 // Step 4: Eliminate partial redundancy.
2071 if (!isPREEnabled() || !isLoadPREEnabled())
2072 return Changed;
2073 if (!isLoadInLoopPREEnabled() && LI->getLoopFor(Load->getParent()))
2074 return Changed;
2075
2076 if (performLoopLoadPRE(Load, ValuesPerBlock, UnavailableBlocks) ||
2077 PerformLoadPRE(Load, ValuesPerBlock, UnavailableBlocks))
2078 return true;
2079
2080 return Changed;
2081}
2082
2083bool GVNPass::processAssumeIntrinsic(AssumeInst *IntrinsicI) {
2084 Value *V = IntrinsicI->getArgOperand(0);
2085
2086 if (ConstantInt *Cond = dyn_cast<ConstantInt>(V)) {
2087 if (Cond->isZero()) {
2088 Type *Int8Ty = Type::getInt8Ty(V->getContext());
2089 Type *PtrTy = PointerType::get(V->getContext(), 0);
2090 // Insert a new store to null instruction before the load to indicate that
2091 // this code is not reachable. FIXME: We could insert unreachable
2092 // instruction directly because we can modify the CFG.
2093 auto *NewS =
2094 new StoreInst(PoisonValue::get(Int8Ty), Constant::getNullValue(PtrTy),
2095 IntrinsicI->getIterator());
2096 if (MSSAU) {
2097 const MemoryUseOrDef *FirstNonDom = nullptr;
2098 const auto *AL =
2099 MSSAU->getMemorySSA()->getBlockAccesses(IntrinsicI->getParent());
2100
2101 // If there are accesses in the current basic block, find the first one
2102 // that does not come before NewS. The new memory access is inserted
2103 // after the found access or before the terminator if no such access is
2104 // found.
2105 if (AL) {
2106 for (const auto &Acc : *AL) {
2107 if (auto *Current = dyn_cast<MemoryUseOrDef>(&Acc))
2108 if (!Current->getMemoryInst()->comesBefore(NewS)) {
2109 FirstNonDom = Current;
2110 break;
2111 }
2112 }
2113 }
2114
2115 auto *NewDef =
2116 FirstNonDom ? MSSAU->createMemoryAccessBefore(
2117 NewS, nullptr,
2118 const_cast<MemoryUseOrDef *>(FirstNonDom))
2119 : MSSAU->createMemoryAccessInBB(
2120 NewS, nullptr,
2121 NewS->getParent(), MemorySSA::BeforeTerminator);
2122
2123 MSSAU->insertDef(cast<MemoryDef>(NewDef), /*RenameUses=*/false);
2124 }
2125 }
2126 if (isAssumeWithEmptyBundle(*IntrinsicI)) {
2127 salvageAndRemoveInstruction(IntrinsicI);
2128 return true;
2129 }
2130 return false;
2131 }
2132
2133 if (isa<Constant>(V)) {
2134 // If it's not false, and constant, it must evaluate to true. This means our
2135 // assume is assume(true), and thus, pointless, and we don't want to do
2136 // anything more here.
2137 return false;
2138 }
2139
2140 Constant *True = ConstantInt::getTrue(V->getContext());
2141 return propagateEquality(V, True, IntrinsicI);
2142}
2143
2146 I->replaceAllUsesWith(Repl);
2147}
2148
2149/// Attempt to eliminate a load, first by eliminating it
2150/// locally, and then attempting non-local elimination if that fails.
2151bool GVNPass::processLoad(LoadInst *L) {
2152 if (!MD)
2153 return false;
2154
2155 // This code hasn't been audited for ordered or volatile memory access.
2156 if (!L->isUnordered())
2157 return false;
2158
2159 if (L->getType()->isTokenLikeTy())
2160 return false;
2161
2162 if (L->use_empty()) {
2164 return true;
2165 }
2166
2167 // ... to a pointer that has been loaded from before...
2168 MemDepResult Dep = MD->getDependency(L);
2169
2170 // If it is defined in another block, try harder.
2171 if (Dep.isNonLocal())
2172 return processNonLocalLoad(L);
2173
2174 // Only handle the local case below.
2175 if (!Dep.isLocal()) {
2176 // This might be a NonFuncLocal or an Unknown.
2177 LLVM_DEBUG(
2178 // fast print dep, using operator<< on instruction is too slow.
2179 dbgs() << "GVN: load "; L->printAsOperand(dbgs());
2180 dbgs() << " has unknown dependence\n";);
2181 return false;
2182 }
2183
2184 auto AV = AnalyzeLoadAvailability(L, Dep, L->getPointerOperand());
2185 if (!AV)
2186 return false;
2187
2188 Value *AvailableValue = AV->MaterializeAdjustedValue(L, L);
2189
2190 // MaterializeAdjustedValue is responsible for combining metadata.
2191 ICF->removeUsersOf(L);
2192 L->replaceAllUsesWith(AvailableValue);
2193 if (MSSAU)
2194 MSSAU->removeMemoryAccess(L);
2195 ++NumGVNLoad;
2196 reportLoadElim(L, AvailableValue, ORE);
2198 // Tell MDA to reexamine the reused pointer since we might have more
2199 // information after forwarding it.
2200 if (MD && AvailableValue->getType()->isPtrOrPtrVectorTy())
2201 MD->invalidateCachedPointerInfo(AvailableValue);
2202 return true;
2203}
2204
2205// Attempt to process masked loads which have loaded from
2206// masked stores with the same mask
2207bool GVNPass::processMaskedLoad(IntrinsicInst *I) {
2208 if (!MD)
2209 return false;
2210 MemDepResult Dep = MD->getDependency(I);
2211 Instruction *DepInst = Dep.getInst();
2212 if (!DepInst || !Dep.isLocal() || !Dep.isDef())
2213 return false;
2214
2215 Value *Mask = I->getOperand(2);
2216 Value *Passthrough = I->getOperand(3);
2217 Value *StoreVal;
2218 if (!match(DepInst, m_MaskedStore(m_Value(StoreVal), m_Value(), m_Value(),
2219 m_Specific(Mask))) ||
2220 StoreVal->getType() != I->getType())
2221 return false;
2222
2223 // Remove the load but generate a select for the passthrough
2224 Value *OpToForward = llvm::SelectInst::Create(Mask, StoreVal, Passthrough, "",
2225 I->getIterator());
2226
2227 ICF->removeUsersOf(I);
2228 I->replaceAllUsesWith(OpToForward);
2230 ++NumGVNLoad;
2231 return true;
2232}
2233
2234/// Return a pair the first field showing the value number of \p Exp and the
2235/// second field showing whether it is a value number newly created.
2236std::pair<uint32_t, bool>
2237GVNPass::ValueTable::assignExpNewValueNum(Expression &Exp) {
2238 uint32_t &E = ExpressionNumbering[Exp];
2239 bool CreateNewValNum = !E;
2240 if (CreateNewValNum) {
2241 Expressions.push_back(Exp);
2242 if (ExprIdx.size() < NextValueNumber + 1)
2243 ExprIdx.resize(NextValueNumber * 2);
2244 E = NextValueNumber;
2245 ExprIdx[NextValueNumber++] = NextExprNumber++;
2246 }
2247 return {E, CreateNewValNum};
2248}
2249
2250/// Return whether all the values related with the same \p num are
2251/// defined in \p BB.
2252bool GVNPass::ValueTable::areAllValsInBB(uint32_t Num, const BasicBlock *BB,
2253 GVNPass &GVN) {
2254 return all_of(
2255 GVN.LeaderTable.getLeaders(Num),
2256 [=](const LeaderMap::LeaderTableEntry &L) { return L.BB == BB; });
2257}
2258
2259/// Wrap phiTranslateImpl to provide caching functionality.
2260uint32_t GVNPass::ValueTable::phiTranslate(const BasicBlock *Pred,
2261 const BasicBlock *PhiBlock,
2262 uint32_t Num, GVNPass &GVN) {
2263 auto FindRes = PhiTranslateTable.find({Num, Pred});
2264 if (FindRes != PhiTranslateTable.end())
2265 return FindRes->second;
2266 uint32_t NewNum = phiTranslateImpl(Pred, PhiBlock, Num, GVN);
2267 PhiTranslateTable.insert({{Num, Pred}, NewNum});
2268 return NewNum;
2269}
2270
2271// Return true if the value number \p Num and NewNum have equal value.
2272// Return false if the result is unknown.
2273bool GVNPass::ValueTable::areCallValsEqual(uint32_t Num, uint32_t NewNum,
2274 const BasicBlock *Pred,
2275 const BasicBlock *PhiBlock,
2276 GVNPass &GVN) {
2277 CallInst *Call = nullptr;
2278 auto Leaders = GVN.LeaderTable.getLeaders(Num);
2279 for (const auto &Entry : Leaders) {
2280 Call = dyn_cast<CallInst>(Entry.Val);
2281 if (Call && Call->getParent() == PhiBlock)
2282 break;
2283 }
2284
2285 if (AA->doesNotAccessMemory(Call))
2286 return true;
2287
2288 if (!MD || !AA->onlyReadsMemory(Call))
2289 return false;
2290
2291 MemDepResult LocalDep = MD->getDependency(Call);
2292 if (!LocalDep.isNonLocal())
2293 return false;
2294
2297
2298 // Check to see if the Call has no function local clobber.
2299 for (const NonLocalDepEntry &D : Deps) {
2300 if (D.getResult().isNonFuncLocal())
2301 return true;
2302 }
2303 return false;
2304}
2305
2306/// Translate value number \p Num using phis, so that it has the values of
2307/// the phis in BB.
2308uint32_t GVNPass::ValueTable::phiTranslateImpl(const BasicBlock *Pred,
2309 const BasicBlock *PhiBlock,
2310 uint32_t Num, GVNPass &GVN) {
2311 // See if we can refine the value number by looking at the PN incoming value
2312 // for the given predecessor.
2313 if (PHINode *PN = NumberingPhi[Num]) {
2314 if (PN->getParent() != PhiBlock)
2315 return Num;
2316 for (unsigned I = 0; I != PN->getNumIncomingValues(); ++I) {
2317 if (PN->getIncomingBlock(I) != Pred)
2318 continue;
2319 if (uint32_t TransVal = lookup(PN->getIncomingValue(I), false))
2320 return TransVal;
2321 }
2322 return Num;
2323 }
2324
2325 if (BasicBlock *BB = NumberingBB[Num]) {
2326 assert(MSSA && "NumberingBB is non-empty only when using MemorySSA");
2327 // Value numbers of basic blocks are used to represent memory state in
2328 // load/store instructions and read-only function calls when said state is
2329 // set by a MemoryPhi.
2330 if (BB != PhiBlock)
2331 return Num;
2332 MemoryPhi *MPhi = MSSA->getMemoryAccess(BB);
2333 for (unsigned i = 0, N = MPhi->getNumIncomingValues(); i != N; ++i) {
2334 if (MPhi->getIncomingBlock(i) != Pred)
2335 continue;
2336 MemoryAccess *MA = MPhi->getIncomingValue(i);
2337 if (auto *PredPhi = dyn_cast<MemoryPhi>(MA))
2338 return lookupOrAdd(PredPhi->getBlock());
2339 if (MSSA->isLiveOnEntryDef(MA))
2340 return lookupOrAdd(&BB->getParent()->getEntryBlock());
2341 return lookupOrAdd(cast<MemoryUseOrDef>(MA)->getMemoryInst());
2342 }
2344 "CFG/MemorySSA mismatch: predecessor not found among incoming blocks");
2345 }
2346
2347 // If there is any value related with Num is defined in a BB other than
2348 // PhiBlock, it cannot depend on a phi in PhiBlock without going through
2349 // a backedge. We can do an early exit in that case to save compile time.
2350 if (!areAllValsInBB(Num, PhiBlock, GVN))
2351 return Num;
2352
2353 if (Num >= ExprIdx.size() || ExprIdx[Num] == 0)
2354 return Num;
2355 Expression Exp = Expressions[ExprIdx[Num]];
2356
2357 for (unsigned I = 0; I < Exp.VarArgs.size(); I++) {
2358 // For InsertValue and ExtractValue, some varargs are index numbers
2359 // instead of value numbers. Those index numbers should not be
2360 // translated.
2361 if ((I > 1 && Exp.Opcode == Instruction::InsertValue) ||
2362 (I > 0 && Exp.Opcode == Instruction::ExtractValue) ||
2363 (I > 1 && Exp.Opcode == Instruction::ShuffleVector))
2364 continue;
2365 Exp.VarArgs[I] = phiTranslate(Pred, PhiBlock, Exp.VarArgs[I], GVN);
2366 }
2367
2368 if (Exp.Commutative) {
2369 assert(Exp.VarArgs.size() >= 2 && "Unsupported commutative instruction!");
2370 if (Exp.VarArgs[0] > Exp.VarArgs[1]) {
2371 std::swap(Exp.VarArgs[0], Exp.VarArgs[1]);
2372 uint32_t Opcode = Exp.Opcode >> 8;
2373 if (Opcode == Instruction::ICmp || Opcode == Instruction::FCmp)
2374 Exp.Opcode = (Opcode << 8) |
2376 static_cast<CmpInst::Predicate>(Exp.Opcode & 255));
2377 }
2378 }
2379
2380 if (uint32_t NewNum = ExpressionNumbering[Exp]) {
2381 if (Exp.Opcode == Instruction::Call && NewNum != Num)
2382 return areCallValsEqual(Num, NewNum, Pred, PhiBlock, GVN) ? NewNum : Num;
2383 return NewNum;
2384 }
2385 return Num;
2386}
2387
2388/// Erase stale entry from phiTranslate cache so phiTranslate can be computed
2389/// again.
2390void GVNPass::ValueTable::eraseTranslateCacheEntry(
2391 uint32_t Num, const BasicBlock &CurrBlock) {
2392 for (const BasicBlock *Pred : predecessors(&CurrBlock))
2393 PhiTranslateTable.erase({Num, Pred});
2394}
2395
2396// In order to find a leader for a given value number at a
2397// specific basic block, we first obtain the list of all Values for that number,
2398// and then scan the list to find one whose block dominates the block in
2399// question. This is fast because dominator tree queries consist of only
2400// a few comparisons of DFS numbers.
2401Value *GVNPass::findLeader(const BasicBlock *BB, uint32_t Num) {
2402 auto Leaders = LeaderTable.getLeaders(Num);
2403 if (Leaders.empty())
2404 return nullptr;
2405
2406 Value *Val = nullptr;
2407 for (const auto &Entry : Leaders) {
2408 if (DT->dominates(Entry.BB, BB)) {
2409 Val = Entry.Val;
2410 if (isa<Constant>(Val))
2411 return Val;
2412 }
2413 }
2414
2415 return Val;
2416}
2417
2418/// There is an edge from 'Src' to 'Dst'. Return
2419/// true if every path from the entry block to 'Dst' passes via this edge. In
2420/// particular 'Dst' must not be reachable via another edge from 'Src'.
2422 DominatorTree *DT) {
2423 // While in theory it is interesting to consider the case in which Dst has
2424 // more than one predecessor, because Dst might be part of a loop which is
2425 // only reachable from Src, in practice it is pointless since at the time
2426 // GVN runs all such loops have preheaders, which means that Dst will have
2427 // been changed to have only one predecessor, namely Src.
2428 const BasicBlock *Pred = E.getEnd()->getSinglePredecessor();
2429 assert((!Pred || Pred == E.getStart()) &&
2430 "No edge between these basic blocks!");
2431 return Pred != nullptr;
2432}
2433
2434void GVNPass::assignBlockRPONumber(Function &F) {
2435 BlockRPONumber.clear();
2436 uint32_t NextBlockNumber = 1;
2437 ReversePostOrderTraversal<Function *> RPOT(&F);
2438 for (BasicBlock *BB : RPOT)
2439 BlockRPONumber[BB] = NextBlockNumber++;
2440 InvalidBlockRPONumbers = false;
2441}
2442
2443/// The given values are known to be equal in every use
2444/// dominated by 'Root'. Exploit this, for example by replacing 'LHS' with
2445/// 'RHS' everywhere in the scope. Returns whether a change was made.
2446/// The Root may either be a basic block edge (for conditions) or an
2447/// instruction (for assumes).
2448bool GVNPass::propagateEquality(
2449 Value *LHS, Value *RHS,
2450 const std::variant<BasicBlockEdge, Instruction *> &Root) {
2452 Worklist.push_back(std::make_pair(LHS, RHS));
2453 bool Changed = false;
2454 SmallVector<const BasicBlock *> DominatedBlocks;
2455 if (const BasicBlockEdge *Edge = std::get_if<BasicBlockEdge>(&Root)) {
2456 // For speed, compute a conservative fast approximation to
2457 // DT->dominates(Root, Root.getEnd());
2459 DominatedBlocks.push_back(Edge->getEnd());
2460 } else {
2461 Instruction *I = std::get<Instruction *>(Root);
2462 for (const auto *Node : DT->getNode(I->getParent())->children())
2463 DominatedBlocks.push_back(Node->getBlock());
2464 }
2465
2466 while (!Worklist.empty()) {
2467 std::pair<Value*, Value*> Item = Worklist.pop_back_val();
2468 LHS = Item.first; RHS = Item.second;
2469
2470 if (LHS == RHS)
2471 continue;
2472 assert(LHS->getType() == RHS->getType() && "Equality but unequal types!");
2473
2474 // Don't try to propagate equalities between constants.
2476 continue;
2477
2478 // Prefer a constant on the right-hand side, or an Argument if no constants.
2480 std::swap(LHS, RHS);
2481 assert((isa<Argument>(LHS) || isa<Instruction>(LHS)) && "Unexpected value!");
2482 const DataLayout &DL =
2484 ? cast<Argument>(LHS)->getParent()->getDataLayout()
2485 : cast<Instruction>(LHS)->getDataLayout();
2486
2487 // If there is no obvious reason to prefer the left-hand side over the
2488 // right-hand side, ensure the longest lived term is on the right-hand side,
2489 // so the shortest lived term will be replaced by the longest lived.
2490 // This tends to expose more simplifications.
2491 uint32_t LVN = VN.lookupOrAdd(LHS);
2492 if ((isa<Argument>(LHS) && isa<Argument>(RHS)) ||
2494 // Move the 'oldest' value to the right-hand side, using the value number
2495 // as a proxy for age.
2496 uint32_t RVN = VN.lookupOrAdd(RHS);
2497 if (LVN < RVN) {
2498 std::swap(LHS, RHS);
2499 LVN = RVN;
2500 }
2501 }
2502
2503 // If value numbering later sees that an instruction in the scope is equal
2504 // to 'LHS' then ensure it will be turned into 'RHS'. In order to preserve
2505 // the invariant that instructions only occur in the leader table for their
2506 // own value number (this is used by removeFromLeaderTable), do not do this
2507 // if RHS is an instruction (if an instruction in the scope is morphed into
2508 // LHS then it will be turned into RHS by the next GVN iteration anyway, so
2509 // using the leader table is about compiling faster, not optimizing better).
2510 // The leader table only tracks basic blocks, not edges. Only add to if we
2511 // have the simple case where the edge dominates the end.
2513 for (const BasicBlock *BB : DominatedBlocks)
2514 LeaderTable.insert(LVN, RHS, BB);
2515
2516 // Replace all occurrences of 'LHS' with 'RHS' everywhere in the scope. As
2517 // LHS always has at least one use that is not dominated by Root, this will
2518 // never do anything if LHS has only one use.
2519 if (!LHS->hasOneUse()) {
2520 // Create a callback that captures the DL.
2521 auto CanReplacePointersCallBack = [&DL](const Use &U, const Value *To) {
2522 return canReplacePointersInUseIfEqual(U, To, DL);
2523 };
2524 unsigned NumReplacements;
2525 if (const BasicBlockEdge *Edge = std::get_if<BasicBlockEdge>(&Root))
2526 NumReplacements = replaceDominatedUsesWithIf(
2527 LHS, RHS, *DT, *Edge, CanReplacePointersCallBack);
2528 else
2529 NumReplacements = replaceDominatedUsesWithIf(
2530 LHS, RHS, *DT, std::get<Instruction *>(Root),
2531 CanReplacePointersCallBack);
2532
2533 if (NumReplacements > 0) {
2534 Changed = true;
2535 NumGVNEqProp += NumReplacements;
2536 // Cached information for anything that uses LHS will be invalid.
2537 if (MD)
2538 MD->invalidateCachedPointerInfo(LHS);
2539 }
2540 }
2541
2542 // Now try to deduce additional equalities from this one. For example, if
2543 // the known equality was "(A != B)" == "false" then it follows that A and B
2544 // are equal in the scope. Only boolean equalities with an explicit true or
2545 // false RHS are currently supported.
2546 if (!RHS->getType()->isIntegerTy(1))
2547 // Not a boolean equality - bail out.
2548 continue;
2549 ConstantInt *CI = dyn_cast<ConstantInt>(RHS);
2550 if (!CI)
2551 // RHS neither 'true' nor 'false' - bail out.
2552 continue;
2553 // Whether RHS equals 'true'. Otherwise it equals 'false'.
2554 bool IsKnownTrue = CI->isMinusOne();
2555 bool IsKnownFalse = !IsKnownTrue;
2556
2557 // If "A && B" is known true then both A and B are known true. If "A || B"
2558 // is known false then both A and B are known false.
2559 Value *A, *B;
2560 if ((IsKnownTrue && match(LHS, m_LogicalAnd(m_Value(A), m_Value(B)))) ||
2561 (IsKnownFalse && match(LHS, m_LogicalOr(m_Value(A), m_Value(B))))) {
2562 Worklist.push_back(std::make_pair(A, RHS));
2563 Worklist.push_back(std::make_pair(B, RHS));
2564 continue;
2565 }
2566
2567 // If we are propagating an equality like "(A == B)" == "true" then also
2568 // propagate the equality A == B. When propagating a comparison such as
2569 // "(A >= B)" == "true", replace all instances of "A < B" with "false".
2570 if (CmpInst *Cmp = dyn_cast<CmpInst>(LHS)) {
2571 Value *Op0 = Cmp->getOperand(0), *Op1 = Cmp->getOperand(1);
2572
2573 // If "A == B" is known true, or "A != B" is known false, then replace
2574 // A with B everywhere in the scope. For floating point operations, we
2575 // have to be careful since equality does not always imply equivalance.
2576 if (Cmp->isEquivalence(IsKnownFalse))
2577 Worklist.push_back(std::make_pair(Op0, Op1));
2578
2579 // If "A >= B" is known true, replace "A < B" with false everywhere.
2580 CmpInst::Predicate NotPred = Cmp->getInversePredicate();
2581 Constant *NotVal = ConstantInt::get(Cmp->getType(), IsKnownFalse);
2582 // Since we don't have the instruction "A < B" immediately to hand, work
2583 // out the value number that it would have and use that to find an
2584 // appropriate instruction (if any).
2585 uint32_t NextNum = VN.getNextUnusedValueNumber();
2586 uint32_t Num = VN.lookupOrAddCmp(Cmp->getOpcode(), NotPred, Op0, Op1);
2587 // If the number we were assigned was brand new then there is no point in
2588 // looking for an instruction realizing it: there cannot be one!
2589 if (Num < NextNum) {
2590 for (const auto &Entry : LeaderTable.getLeaders(Num)) {
2591 // Only look at leaders that either dominate the start of the edge,
2592 // or are dominated by the end. This check is not necessary for
2593 // correctness, it only discards cases for which the following
2594 // use replacement will not work anyway.
2595 if (const BasicBlockEdge *Edge = std::get_if<BasicBlockEdge>(&Root)) {
2596 if (!DT->dominates(Entry.BB, Edge->getStart()) &&
2597 !DT->dominates(Edge->getEnd(), Entry.BB))
2598 continue;
2599 } else {
2600 auto *InstBB = std::get<Instruction *>(Root)->getParent();
2601 if (!DT->dominates(Entry.BB, InstBB) &&
2602 !DT->dominates(InstBB, Entry.BB))
2603 continue;
2604 }
2605
2606 Value *NotCmp = Entry.Val;
2607 if (NotCmp && isa<Instruction>(NotCmp)) {
2608 unsigned NumReplacements;
2609 if (const BasicBlockEdge *Edge = std::get_if<BasicBlockEdge>(&Root))
2610 NumReplacements =
2611 replaceDominatedUsesWith(NotCmp, NotVal, *DT, *Edge);
2612 else
2613 NumReplacements = replaceDominatedUsesWith(
2614 NotCmp, NotVal, *DT, std::get<Instruction *>(Root));
2615 Changed |= NumReplacements > 0;
2616 NumGVNEqProp += NumReplacements;
2617 // Cached information for anything that uses NotCmp will be invalid.
2618 if (MD)
2619 MD->invalidateCachedPointerInfo(NotCmp);
2620 }
2621 }
2622 }
2623 // Ensure that any instruction in scope that gets the "A < B" value number
2624 // is replaced with false.
2625 // The leader table only tracks basic blocks, not edges. Only add to if we
2626 // have the simple case where the edge dominates the end.
2627 for (const BasicBlock *BB : DominatedBlocks)
2628 LeaderTable.insert(Num, NotVal, BB);
2629
2630 continue;
2631 }
2632
2633 // Propagate equalities that results from truncation with no unsigned wrap
2634 // like (trunc nuw i64 %v to i1) == "true" or (trunc nuw i64 %v to i1) ==
2635 // "false"
2636 if (match(LHS, m_NUWTrunc(m_Value(A)))) {
2637 Worklist.emplace_back(A, ConstantInt::get(A->getType(), IsKnownTrue));
2638 continue;
2639 }
2640
2641 if (match(LHS, m_Not(m_Value(A)))) {
2642 Worklist.emplace_back(A, ConstantInt::get(A->getType(), !IsKnownTrue));
2643 continue;
2644 }
2645 }
2646
2647 return Changed;
2648}
2649
2650/// When calculating availability, handle an instruction
2651/// by inserting it into the appropriate sets.
2652bool GVNPass::processInstruction(Instruction *I) {
2653 // If the instruction can be easily simplified then do so now in preference
2654 // to value numbering it. Value numbering often exposes redundancies, for
2655 // example if it determines that %y is equal to %x then the instruction
2656 // "%z = and i32 %x, %y" becomes "%z = and i32 %x, %x" which we now simplify.
2657 const DataLayout &DL = I->getDataLayout();
2658 if (Value *V = simplifyInstruction(I, {DL, TLI, DT, AC})) {
2659 bool Changed = false;
2660 if (!I->use_empty()) {
2661 // Simplification can cause a special instruction to become not special.
2662 // For example, devirtualization to a willreturn function.
2663 ICF->removeUsersOf(I);
2664 I->replaceAllUsesWith(V);
2665 Changed = true;
2666 }
2667 if (isInstructionTriviallyDead(I, TLI)) {
2669 Changed = true;
2670 }
2671 if (Changed) {
2672 if (MD && V->getType()->isPtrOrPtrVectorTy())
2673 MD->invalidateCachedPointerInfo(V);
2674 ++NumGVNSimpl;
2675 return true;
2676 }
2677 }
2678
2679 if (auto *Assume = dyn_cast<AssumeInst>(I))
2680 return processAssumeIntrinsic(Assume);
2681
2682 if (LoadInst *Load = dyn_cast<LoadInst>(I)) {
2683 if (processLoad(Load))
2684 return true;
2685
2686 unsigned Num = VN.lookupOrAdd(Load);
2687 LeaderTable.insert(Num, Load, Load->getParent());
2688 return false;
2689 }
2690
2692 processMaskedLoad(cast<IntrinsicInst>(I)))
2693 return true;
2694
2695 // For conditional branches, we can perform simple conditional propagation on
2696 // the condition value itself.
2697 if (BranchInst *BI = dyn_cast<BranchInst>(I)) {
2698 if (!BI->isConditional())
2699 return false;
2700
2701 if (isa<Constant>(BI->getCondition()))
2702 return processFoldableCondBr(BI);
2703
2704 Value *BranchCond = BI->getCondition();
2705 BasicBlock *TrueSucc = BI->getSuccessor(0);
2706 BasicBlock *FalseSucc = BI->getSuccessor(1);
2707 // Avoid multiple edges early.
2708 if (TrueSucc == FalseSucc)
2709 return false;
2710
2711 BasicBlock *Parent = BI->getParent();
2712 bool Changed = false;
2713
2715 BasicBlockEdge TrueE(Parent, TrueSucc);
2716 Changed |= propagateEquality(BranchCond, TrueVal, TrueE);
2717
2719 BasicBlockEdge FalseE(Parent, FalseSucc);
2720 Changed |= propagateEquality(BranchCond, FalseVal, FalseE);
2721
2722 return Changed;
2723 }
2724
2725 // For switches, propagate the case values into the case destinations.
2726 if (SwitchInst *SI = dyn_cast<SwitchInst>(I)) {
2727 Value *SwitchCond = SI->getCondition();
2728 BasicBlock *Parent = SI->getParent();
2729 bool Changed = false;
2730
2731 // Remember how many outgoing edges there are to every successor.
2732 SmallDenseMap<BasicBlock *, unsigned, 16> SwitchEdges;
2733 for (BasicBlock *Succ : successors(Parent))
2734 ++SwitchEdges[Succ];
2735
2736 for (const auto &Case : SI->cases()) {
2737 BasicBlock *Dst = Case.getCaseSuccessor();
2738 // If there is only a single edge, propagate the case value into it.
2739 if (SwitchEdges.lookup(Dst) == 1) {
2740 BasicBlockEdge E(Parent, Dst);
2741 Changed |= propagateEquality(SwitchCond, Case.getCaseValue(), E);
2742 }
2743 }
2744 return Changed;
2745 }
2746
2747 // Instructions with void type don't return a value, so there's
2748 // no point in trying to find redundancies in them.
2749 if (I->getType()->isVoidTy())
2750 return false;
2751
2752 uint32_t NextNum = VN.getNextUnusedValueNumber();
2753 unsigned Num = VN.lookupOrAdd(I);
2754
2755 // Allocations are always uniquely numbered, so we can save time and memory
2756 // by fast failing them.
2757 if (isa<AllocaInst>(I) || I->isTerminator() || isa<PHINode>(I)) {
2758 LeaderTable.insert(Num, I, I->getParent());
2759 return false;
2760 }
2761
2762 // If the number we were assigned was a brand new VN, then we don't
2763 // need to do a lookup to see if the number already exists
2764 // somewhere in the domtree: it can't!
2765 if (Num >= NextNum) {
2766 LeaderTable.insert(Num, I, I->getParent());
2767 return false;
2768 }
2769
2770 // Perform fast-path value-number based elimination of values inherited from
2771 // dominators.
2772 Value *Repl = findLeader(I->getParent(), Num);
2773 if (!Repl) {
2774 // Failure, just remember this instance for future use.
2775 LeaderTable.insert(Num, I, I->getParent());
2776 return false;
2777 }
2778
2779 if (Repl == I) {
2780 // If I was the result of a shortcut PRE, it might already be in the table
2781 // and the best replacement for itself. Nothing to do.
2782 return false;
2783 }
2784
2785 // Remove it!
2787 if (MD && Repl->getType()->isPtrOrPtrVectorTy())
2788 MD->invalidateCachedPointerInfo(Repl);
2790 return true;
2791}
2792
2793/// runOnFunction - This is the main transformation entry point for a function.
2794bool GVNPass::runImpl(Function &F, AssumptionCache &RunAC, DominatorTree &RunDT,
2795 const TargetLibraryInfo &RunTLI, AAResults &RunAA,
2796 MemoryDependenceResults *RunMD, LoopInfo &LI,
2797 OptimizationRemarkEmitter *RunORE, MemorySSA *MSSA) {
2798 AC = &RunAC;
2799 DT = &RunDT;
2800 VN.setDomTree(DT);
2801 TLI = &RunTLI;
2802 VN.setAliasAnalysis(&RunAA);
2803 MD = RunMD;
2804 ImplicitControlFlowTracking ImplicitCFT;
2805 ICF = &ImplicitCFT;
2806 this->LI = &LI;
2807 VN.setMemDep(MD);
2808 VN.setMemorySSA(MSSA);
2809 ORE = RunORE;
2810 InvalidBlockRPONumbers = true;
2811 MemorySSAUpdater Updater(MSSA);
2812 MSSAU = MSSA ? &Updater : nullptr;
2813
2814 bool Changed = false;
2815 bool ShouldContinue = true;
2816
2817 DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy);
2818 // Merge unconditional branches, allowing PRE to catch more
2819 // optimization opportunities.
2820 for (BasicBlock &BB : make_early_inc_range(F)) {
2821 bool RemovedBlock = MergeBlockIntoPredecessor(&BB, &DTU, &LI, MSSAU, MD);
2822 if (RemovedBlock)
2823 ++NumGVNBlocks;
2824
2825 Changed |= RemovedBlock;
2826 }
2827 DTU.flush();
2828
2829 unsigned Iteration = 0;
2830 while (ShouldContinue) {
2831 LLVM_DEBUG(dbgs() << "GVN iteration: " << Iteration << "\n");
2832 (void) Iteration;
2833 ShouldContinue = iterateOnFunction(F);
2834 Changed |= ShouldContinue;
2835 ++Iteration;
2836 }
2837
2838 if (isPREEnabled()) {
2839 // Fabricate val-num for dead-code in order to suppress assertion in
2840 // performPRE().
2841 assignValNumForDeadCode();
2842 bool PREChanged = true;
2843 while (PREChanged) {
2844 PREChanged = performPRE(F);
2845 Changed |= PREChanged;
2846 }
2847 }
2848
2849 // FIXME: Should perform GVN again after PRE does something. PRE can move
2850 // computations into blocks where they become fully redundant. Note that
2851 // we can't do this until PRE's critical edge splitting updates memdep.
2852 // Actually, when this happens, we should just fully integrate PRE into GVN.
2853
2854 cleanupGlobalSets();
2855 // Do not cleanup DeadBlocks in cleanupGlobalSets() as it's called for each
2856 // iteration.
2857 DeadBlocks.clear();
2858
2859 if (MSSA && VerifyMemorySSA)
2860 MSSA->verifyMemorySSA();
2861
2862 return Changed;
2863}
2864
2865bool GVNPass::processBlock(BasicBlock *BB) {
2866 if (DeadBlocks.count(BB))
2867 return false;
2868
2869 bool ChangedFunction = false;
2870
2871 // Since we may not have visited the input blocks of the phis, we can't
2872 // use our normal hash approach for phis. Instead, simply look for
2873 // obvious duplicates. The first pass of GVN will tend to create
2874 // identical phis, and the second or later passes can eliminate them.
2875 SmallPtrSet<PHINode *, 8> PHINodesToRemove;
2876 ChangedFunction |= EliminateDuplicatePHINodes(BB, PHINodesToRemove);
2877 for (PHINode *PN : PHINodesToRemove) {
2878 removeInstruction(PN);
2879 }
2880 for (Instruction &Inst : make_early_inc_range(*BB))
2881 ChangedFunction |= processInstruction(&Inst);
2882 return ChangedFunction;
2883}
2884
2885// Instantiate an expression in a predecessor that lacked it.
2886bool GVNPass::performScalarPREInsertion(Instruction *Instr, BasicBlock *Pred,
2887 BasicBlock *Curr, unsigned int ValNo) {
2888 // Because we are going top-down through the block, all value numbers
2889 // will be available in the predecessor by the time we need them. Any
2890 // that weren't originally present will have been instantiated earlier
2891 // in this loop.
2892 bool Success = true;
2893 for (unsigned I = 0, E = Instr->getNumOperands(); I != E; ++I) {
2894 Value *Op = Instr->getOperand(I);
2896 continue;
2897 // This could be a newly inserted instruction, in which case, we won't
2898 // find a value number, and should give up before we hurt ourselves.
2899 // FIXME: Rewrite the infrastructure to let it easier to value number
2900 // and process newly inserted instructions.
2901 if (!VN.exists(Op)) {
2902 Success = false;
2903 break;
2904 }
2905 uint32_t TValNo =
2906 VN.phiTranslate(Pred, Curr, VN.lookup(Op), *this);
2907 if (Value *V = findLeader(Pred, TValNo)) {
2908 Instr->setOperand(I, V);
2909 } else {
2910 Success = false;
2911 break;
2912 }
2913 }
2914
2915 // Fail out if we encounter an operand that is not available in
2916 // the PRE predecessor. This is typically because of loads which
2917 // are not value numbered precisely.
2918 if (!Success)
2919 return false;
2920
2921 Instr->insertBefore(Pred->getTerminator()->getIterator());
2922 Instr->setName(Instr->getName() + ".pre");
2923 Instr->setDebugLoc(Instr->getDebugLoc());
2924
2925 ICF->insertInstructionTo(Instr, Pred);
2926
2927 unsigned Num = VN.lookupOrAdd(Instr);
2928 VN.add(Instr, Num);
2929
2930 // Update the availability map to include the new instruction.
2931 LeaderTable.insert(Num, Instr, Pred);
2932 return true;
2933}
2934
2935bool GVNPass::performScalarPRE(Instruction *CurInst) {
2936 if (isa<AllocaInst>(CurInst) || CurInst->isTerminator() ||
2937 isa<PHINode>(CurInst) || CurInst->getType()->isVoidTy() ||
2938 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
2939 CurInst->getType()->isTokenLikeTy())
2940 return false;
2941
2942 // Don't do PRE on compares. The PHI would prevent CodeGenPrepare from
2943 // sinking the compare again, and it would force the code generator to
2944 // move the i1 from processor flags or predicate registers into a general
2945 // purpose register.
2946 if (isa<CmpInst>(CurInst))
2947 return false;
2948
2949 // Don't do PRE on GEPs. The inserted PHI would prevent CodeGenPrepare from
2950 // sinking the addressing mode computation back to its uses. Extending the
2951 // GEP's live range increases the register pressure, and therefore it can
2952 // introduce unnecessary spills.
2953 //
2954 // This doesn't prevent Load PRE. PHI translation will make the GEP available
2955 // to the load by moving it to the predecessor block if necessary.
2956 if (isa<GetElementPtrInst>(CurInst))
2957 return false;
2958
2959 if (auto *CallB = dyn_cast<CallBase>(CurInst)) {
2960 // We don't currently value number ANY inline asm calls.
2961 if (CallB->isInlineAsm())
2962 return false;
2963 }
2964
2965 uint32_t ValNo = VN.lookup(CurInst);
2966
2967 // Look for the predecessors for PRE opportunities. We're
2968 // only trying to solve the basic diamond case, where
2969 // a value is computed in the successor and one predecessor,
2970 // but not the other. We also explicitly disallow cases
2971 // where the successor is its own predecessor, because they're
2972 // more complicated to get right.
2973 unsigned NumWith = 0;
2974 unsigned NumWithout = 0;
2975 BasicBlock *PREPred = nullptr;
2976 BasicBlock *CurrentBlock = CurInst->getParent();
2977
2978 // Update the RPO numbers for this function.
2979 if (InvalidBlockRPONumbers)
2980 assignBlockRPONumber(*CurrentBlock->getParent());
2981
2983 for (BasicBlock *P : predecessors(CurrentBlock)) {
2984 // We're not interested in PRE where blocks with predecessors that are
2985 // not reachable.
2986 if (!DT->isReachableFromEntry(P)) {
2987 NumWithout = 2;
2988 break;
2989 }
2990 // It is not safe to do PRE when P->CurrentBlock is a loop backedge.
2991 assert(BlockRPONumber.count(P) && BlockRPONumber.count(CurrentBlock) &&
2992 "Invalid BlockRPONumber map.");
2993 if (BlockRPONumber[P] >= BlockRPONumber[CurrentBlock]) {
2994 NumWithout = 2;
2995 break;
2996 }
2997
2998 uint32_t TValNo = VN.phiTranslate(P, CurrentBlock, ValNo, *this);
2999 Value *PredV = findLeader(P, TValNo);
3000 if (!PredV) {
3001 PredMap.push_back(std::make_pair(static_cast<Value *>(nullptr), P));
3002 PREPred = P;
3003 ++NumWithout;
3004 } else if (PredV == CurInst) {
3005 // CurInst dominates this predecessor.
3006 NumWithout = 2;
3007 break;
3008 } else {
3009 PredMap.push_back(std::make_pair(PredV, P));
3010 ++NumWith;
3011 }
3012 }
3013
3014 // Don't do PRE when it might increase code size, i.e. when
3015 // we would need to insert instructions in more than one pred.
3016 if (NumWithout > 1 || NumWith == 0)
3017 return false;
3018
3019 // We may have a case where all predecessors have the instruction,
3020 // and we just need to insert a phi node. Otherwise, perform
3021 // insertion.
3022 Instruction *PREInstr = nullptr;
3023
3024 if (NumWithout != 0) {
3025 if (!isSafeToSpeculativelyExecute(CurInst)) {
3026 // It is only valid to insert a new instruction if the current instruction
3027 // is always executed. An instruction with implicit control flow could
3028 // prevent us from doing it. If we cannot speculate the execution, then
3029 // PRE should be prohibited.
3030 if (ICF->isDominatedByICFIFromSameBlock(CurInst))
3031 return false;
3032 }
3033
3034 // Don't do PRE across indirect branch.
3035 if (isa<IndirectBrInst>(PREPred->getTerminator()))
3036 return false;
3037
3038 // We can't do PRE safely on a critical edge, so instead we schedule
3039 // the edge to be split and perform the PRE the next time we iterate
3040 // on the function.
3041 unsigned SuccNum = GetSuccessorNumber(PREPred, CurrentBlock);
3042 if (isCriticalEdge(PREPred->getTerminator(), SuccNum)) {
3043 ToSplit.push_back(std::make_pair(PREPred->getTerminator(), SuccNum));
3044 return false;
3045 }
3046 // We need to insert somewhere, so let's give it a shot.
3047 PREInstr = CurInst->clone();
3048 if (!performScalarPREInsertion(PREInstr, PREPred, CurrentBlock, ValNo)) {
3049 // If we failed insertion, make sure we remove the instruction.
3050#ifndef NDEBUG
3051 verifyRemoved(PREInstr);
3052#endif
3053 PREInstr->deleteValue();
3054 return false;
3055 }
3056 }
3057
3058 // Either we should have filled in the PRE instruction, or we should
3059 // not have needed insertions.
3060 assert(PREInstr != nullptr || NumWithout == 0);
3061
3062 ++NumGVNPRE;
3063
3064 // Create a PHI to make the value available in this block.
3065 PHINode *Phi = PHINode::Create(CurInst->getType(), PredMap.size(),
3066 CurInst->getName() + ".pre-phi");
3067 Phi->insertBefore(CurrentBlock->begin());
3068 for (auto &[V, BB] : PredMap) {
3069 if (V) {
3070 // If we use an existing value in this phi, we have to patch the original
3071 // value because the phi will be used to replace a later value.
3072 patchReplacementInstruction(CurInst, V);
3073 Phi->addIncoming(V, BB);
3074 } else
3075 Phi->addIncoming(PREInstr, PREPred);
3076 }
3077
3078 VN.add(Phi, ValNo);
3079 // After creating a new PHI for ValNo, the phi translate result for ValNo will
3080 // be changed, so erase the related stale entries in phi translate cache.
3081 VN.eraseTranslateCacheEntry(ValNo, *CurrentBlock);
3082 LeaderTable.insert(ValNo, Phi, CurrentBlock);
3083 Phi->setDebugLoc(CurInst->getDebugLoc());
3084 CurInst->replaceAllUsesWith(Phi);
3085 if (MD && Phi->getType()->isPtrOrPtrVectorTy())
3086 MD->invalidateCachedPointerInfo(Phi);
3087 LeaderTable.erase(ValNo, CurInst, CurrentBlock);
3088
3089 LLVM_DEBUG(dbgs() << "GVN PRE removed: " << *CurInst << '\n');
3090 removeInstruction(CurInst);
3091 ++NumGVNInstr;
3092
3093 return true;
3094}
3095
3096/// Perform a purely local form of PRE that looks for diamond
3097/// control flow patterns and attempts to perform simple PRE at the join point.
3098bool GVNPass::performPRE(Function &F) {
3099 bool Changed = false;
3100 for (BasicBlock *CurrentBlock : depth_first(&F.getEntryBlock())) {
3101 // Nothing to PRE in the entry block.
3102 if (CurrentBlock == &F.getEntryBlock())
3103 continue;
3104
3105 // Don't perform PRE on an EH pad.
3106 if (CurrentBlock->isEHPad())
3107 continue;
3108
3109 for (BasicBlock::iterator BI = CurrentBlock->begin(),
3110 BE = CurrentBlock->end();
3111 BI != BE;) {
3112 Instruction *CurInst = &*BI++;
3113 Changed |= performScalarPRE(CurInst);
3114 }
3115 }
3116
3117 if (splitCriticalEdges())
3118 Changed = true;
3119
3120 return Changed;
3121}
3122
3123/// Split the critical edge connecting the given two blocks, and return
3124/// the block inserted to the critical edge.
3125BasicBlock *GVNPass::splitCriticalEdges(BasicBlock *Pred, BasicBlock *Succ) {
3126 // GVN does not require loop-simplify, do not try to preserve it if it is not
3127 // possible.
3129 Pred, Succ,
3130 CriticalEdgeSplittingOptions(DT, LI, MSSAU).unsetPreserveLoopSimplify());
3131 if (BB) {
3132 if (MD)
3133 MD->invalidateCachedPredecessors();
3134 InvalidBlockRPONumbers = true;
3135 }
3136 return BB;
3137}
3138
3139/// Split critical edges found during the previous
3140/// iteration that may enable further optimization.
3141bool GVNPass::splitCriticalEdges() {
3142 if (ToSplit.empty())
3143 return false;
3144
3145 bool Changed = false;
3146 do {
3147 std::pair<Instruction *, unsigned> Edge = ToSplit.pop_back_val();
3148 Changed |= SplitCriticalEdge(Edge.first, Edge.second,
3149 CriticalEdgeSplittingOptions(DT, LI, MSSAU)) !=
3150 nullptr;
3151 } while (!ToSplit.empty());
3152 if (Changed) {
3153 if (MD)
3154 MD->invalidateCachedPredecessors();
3155 InvalidBlockRPONumbers = true;
3156 }
3157 return Changed;
3158}
3159
3160/// Executes one iteration of GVN.
3161bool GVNPass::iterateOnFunction(Function &F) {
3162 cleanupGlobalSets();
3163
3164 // Top-down walk of the dominator tree.
3165 bool Changed = false;
3166 // Needed for value numbering with phi construction to work.
3167 // RPOT walks the graph in its constructor and will not be invalidated during
3168 // processBlock.
3169 ReversePostOrderTraversal<Function *> RPOT(&F);
3170
3171 for (BasicBlock *BB : RPOT)
3172 Changed |= processBlock(BB);
3173
3174 return Changed;
3175}
3176
3177void GVNPass::cleanupGlobalSets() {
3178 VN.clear();
3179 LeaderTable.clear();
3180 BlockRPONumber.clear();
3181 ICF->clear();
3182 InvalidBlockRPONumbers = true;
3183}
3184
3185void GVNPass::removeInstruction(Instruction *I) {
3186 VN.erase(I);
3187 if (MD) MD->removeInstruction(I);
3188 if (MSSAU)
3189 MSSAU->removeMemoryAccess(I);
3190#ifndef NDEBUG
3191 verifyRemoved(I);
3192#endif
3193 ICF->removeInstruction(I);
3194 I->eraseFromParent();
3195}
3196
3197/// Verify that the specified instruction does not occur in our
3198/// internal data structures.
3199void GVNPass::verifyRemoved(const Instruction *Inst) const {
3200 VN.verifyRemoved(Inst);
3201 LeaderTable.verifyRemoved(Inst);
3202}
3203
3204/// BB is declared dead, which implied other blocks become dead as well. This
3205/// function is to add all these blocks to "DeadBlocks". For the dead blocks'
3206/// live successors, update their phi nodes by replacing the operands
3207/// corresponding to dead blocks with UndefVal.
3208void GVNPass::addDeadBlock(BasicBlock *BB) {
3210 SmallSetVector<BasicBlock *, 4> DF;
3211
3212 NewDead.push_back(BB);
3213 while (!NewDead.empty()) {
3214 BasicBlock *D = NewDead.pop_back_val();
3215 if (DeadBlocks.count(D))
3216 continue;
3217
3218 // All blocks dominated by D are dead.
3219 SmallVector<BasicBlock *, 8> Dom;
3220 DT->getDescendants(D, Dom);
3221 DeadBlocks.insert_range(Dom);
3222
3223 // Figure out the dominance-frontier(D).
3224 for (BasicBlock *B : Dom) {
3225 for (BasicBlock *S : successors(B)) {
3226 if (DeadBlocks.count(S))
3227 continue;
3228
3229 bool AllPredDead = true;
3230 for (BasicBlock *P : predecessors(S))
3231 if (!DeadBlocks.count(P)) {
3232 AllPredDead = false;
3233 break;
3234 }
3235
3236 if (!AllPredDead) {
3237 // S could be proved dead later on. That is why we don't update phi
3238 // operands at this moment.
3239 DF.insert(S);
3240 } else {
3241 // While S is not dominated by D, it is dead by now. This could take
3242 // place if S already have a dead predecessor before D is declared
3243 // dead.
3244 NewDead.push_back(S);
3245 }
3246 }
3247 }
3248 }
3249
3250 // For the dead blocks' live successors, update their phi nodes by replacing
3251 // the operands corresponding to dead blocks with UndefVal.
3252 for (BasicBlock *B : DF) {
3253 if (DeadBlocks.count(B))
3254 continue;
3255
3256 // First, split the critical edges. This might also create additional blocks
3257 // to preserve LoopSimplify form and adjust edges accordingly.
3259 for (BasicBlock *P : Preds) {
3260 if (!DeadBlocks.count(P))
3261 continue;
3262
3263 if (is_contained(successors(P), B) &&
3264 isCriticalEdge(P->getTerminator(), B)) {
3265 if (BasicBlock *S = splitCriticalEdges(P, B))
3266 DeadBlocks.insert(P = S);
3267 }
3268 }
3269
3270 // Now poison the incoming values from the dead predecessors.
3271 for (BasicBlock *P : predecessors(B)) {
3272 if (!DeadBlocks.count(P))
3273 continue;
3274 for (PHINode &Phi : B->phis()) {
3275 Phi.setIncomingValueForBlock(P, PoisonValue::get(Phi.getType()));
3276 if (MD)
3277 MD->invalidateCachedPointerInfo(&Phi);
3278 }
3279 }
3280 }
3281}
3282
3283// If the given branch is recognized as a foldable branch (i.e. conditional
3284// branch with constant condition), it will perform following analyses and
3285// transformation.
3286// 1) If the dead out-coming edge is a critical-edge, split it. Let
3287// R be the target of the dead out-coming edge.
3288// 1) Identify the set of dead blocks implied by the branch's dead outcoming
3289// edge. The result of this step will be {X| X is dominated by R}
3290// 2) Identify those blocks which haves at least one dead predecessor. The
3291// result of this step will be dominance-frontier(R).
3292// 3) Update the PHIs in DF(R) by replacing the operands corresponding to
3293// dead blocks with "UndefVal" in an hope these PHIs will optimized away.
3294//
3295// Return true iff *NEW* dead code are found.
3296bool GVNPass::processFoldableCondBr(BranchInst *BI) {
3297 if (!BI || BI->isUnconditional())
3298 return false;
3299
3300 // If a branch has two identical successors, we cannot declare either dead.
3301 if (BI->getSuccessor(0) == BI->getSuccessor(1))
3302 return false;
3303
3304 ConstantInt *Cond = dyn_cast<ConstantInt>(BI->getCondition());
3305 if (!Cond)
3306 return false;
3307
3308 BasicBlock *DeadRoot =
3309 Cond->getZExtValue() ? BI->getSuccessor(1) : BI->getSuccessor(0);
3310 if (DeadBlocks.count(DeadRoot))
3311 return false;
3312
3313 if (!DeadRoot->getSinglePredecessor())
3314 DeadRoot = splitCriticalEdges(BI->getParent(), DeadRoot);
3315
3316 addDeadBlock(DeadRoot);
3317 return true;
3318}
3319
3320// performPRE() will trigger assert if it comes across an instruction without
3321// associated val-num. As it normally has far more live instructions than dead
3322// instructions, it makes more sense just to "fabricate" a val-number for the
3323// dead code than checking if instruction involved is dead or not.
3324void GVNPass::assignValNumForDeadCode() {
3325 for (BasicBlock *BB : DeadBlocks) {
3326 for (Instruction &Inst : *BB) {
3327 unsigned ValNum = VN.lookupOrAdd(&Inst);
3328 LeaderTable.insert(ValNum, &Inst, BB);
3329 }
3330 }
3331}
3332
3334public:
3335 static char ID; // Pass identification, replacement for typeid.
3336
3337 explicit GVNLegacyPass(bool MemDepAnalysis = GVNEnableMemDep,
3338 bool MemSSAAnalysis = GVNEnableMemorySSA)
3339 : FunctionPass(ID), Impl(GVNOptions()
3340 .setMemDep(MemDepAnalysis)
3341 .setMemorySSA(MemSSAAnalysis)) {
3343 }
3344
3345 bool runOnFunction(Function &F) override {
3346 if (skipFunction(F))
3347 return false;
3348
3350 if (Impl.isMemorySSAEnabled() && !MSSAWP)
3352
3353 return Impl.runImpl(
3354 F, getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F),
3357 getAnalysis<AAResultsWrapperPass>().getAAResults(),
3358 Impl.isMemDepEnabled()
3360 : nullptr,
3361 getAnalysis<LoopInfoWrapperPass>().getLoopInfo(),
3363 MSSAWP ? &MSSAWP->getMSSA() : nullptr);
3364 }
3365
3383
3384private:
3385 GVNPass Impl;
3386};
3387
3388char GVNLegacyPass::ID = 0;
3389
3390INITIALIZE_PASS_BEGIN(GVNLegacyPass, "gvn", "Global Value Numbering", false, false)
3399INITIALIZE_PASS_END(GVNLegacyPass, "gvn", "Global Value Numbering", false, false)
3400
3401// The public interface to this file...
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< 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")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition Compiler.h:638
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, MemDepResult DepInfo, 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:1283
static void reportLoadElim(LoadInst *Load, Value *AvailableValue, OptimizationRemarkEmitter *ORE)
Definition GVN.cpp:1979
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:1227
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 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:2421
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:967
static Value * findDominatingValue(const MemoryLocation &Loc, Type *LoadTy, Instruction *From, AAResults *AA)
Definition GVN.cpp:1303
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:1218
static bool isLifetimeStart(const Instruction *Inst)
Definition GVN.cpp:1210
static cl::opt< bool > GVNEnableSplitBackedgeInLoadPRE("enable-split-backedge-in-load-pre", cl::init(false))
static void patchAndReplaceAllUsesWith(Instruction *I, Value *Repl)
Definition GVN.cpp:2144
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:1083
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:1102
AvailabilityState
Definition GVN.cpp:947
@ Unavailable
We know the block is not fully available. This is a fixpoint.
Definition GVN.cpp:949
@ Available
We know the block is fully available. This is a fixpoint.
Definition GVN.cpp:951
@ SpeculativelyAvailable
We do not know whether the block is fully available or not, but we are currently speculating that it ...
Definition GVN.cpp:956
static cl::opt< bool > GVNEnablePRE("enable-pre", cl::init(true), cl::Hidden)
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))
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, DataExtractor &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:55
#define I(x, y, z)
Definition MD5.cpp:58
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
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:114
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.
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:136
iterator begin() const
Definition ArrayRef.h:135
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:707
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition BasicBlock.h:233
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.
BasicBlock * getSuccessor(unsigned i) const
bool isUnconditional() const
Value * getCondition() const
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.
Definition InstrTypes.h:982
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:676
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:827
bool isMinusOne() const
This function will return true iff every bit in this constant is set to true.
Definition Constants.h:226
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:63
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
Definition DenseMap.h:194
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:167
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:237
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
Definition DenseMap.h:74
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT, true > const_iterator
Definition DenseMap.h:75
iterator end()
Definition DenseMap.h:81
Analysis pass which computes a DominatorTree.
Definition Dominators.h:284
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:322
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:165
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:188
const BasicBlock & getEntryBlock() const
Definition Function.h:807
Represents calls to the gc.relocate intrinsic.
This class holds the mapping between values and value numbers.
Definition GVN.h:161
LLVM_ABI uint32_t lookupOrAdd(MemoryAccess *MA)
Definition GVN.cpp:642
The core GVN pass object.
Definition GVN.h:128
friend class gvn::GVNLegacyPass
Definition GVN.h:247
LLVM_ABI bool isPREEnabled() const
Definition GVN.cpp:853
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Run the pass over the function.
Definition GVN.cpp:878
LLVM_ABI void salvageAndRemoveInstruction(Instruction *I)
This removes the specified instruction from our various maps and marks it for deletion.
Definition GVN.cpp:930
AAResults * getAliasAnalysis() const
Definition GVN.h:148
LLVM_ABI bool isLoadPREEnabled() const
Definition GVN.cpp:857
GVNPass(GVNOptions Options={})
Definition GVN.h:134
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
Definition GVN.cpp:910
LLVM_ABI bool isMemorySSAEnabled() const
Definition GVN.cpp:874
DominatorTree & getDominatorTree() const
Definition GVN.h:147
LLVM_ABI bool isLoadInLoopPREEnabled() const
Definition GVN.cpp:861
LLVM_ABI bool isLoadPRESplitBackedgeEnabled() const
Definition GVN.cpp:865
LLVM_ABI bool isMemDepEnabled() const
Definition GVN.cpp:870
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.
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:569
The legacy pass manager's analysis pass to compute loop information.
Definition LoopInfo.h:596
iterator end()
Definition MapVector.h:67
iterator find(const KeyT &Key)
Definition MapVector.h:149
size_type size() const
Definition MapVector.h:56
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
MemDepResult getDependency(Instruction *QueryInst)
Returns the instruction on which a memory operation depends.
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.
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:936
Legacy analysis pass which computes MemorySSA.
Definition MemorySSA.h:993
LLVM_ABI void verifyMemorySSA(VerificationLevel=VerificationLevel::Fast) const
Verify that MemorySSA is self consistent (IE definitions dominate all uses, uses appear in the right ...
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...
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(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
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
void Initialize(Type *Ty, StringRef Name)
Reset this object to get ready for a new set of SSA updates with type 'Ty'.
Value * GetValueInMiddleOfBlock(BasicBlock *BB)
Construct SSA form, materializing a value that is live in the middle of the specified block.
bool HasValueForBlock(BasicBlock *BB) const
Return true if the SSAUpdater already has a value for the specified block.
void AddAvailableValue(BasicBlock *BB, Value *V)
Indicate that a rewritten value is available in the specified block with the specified value.
This class represents the LLVM 'select' instruction.
const Value * getCondition() 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)
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)
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
Analysis pass providing the TargetLibraryInfo.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
bool isTokenLikeTy() const
Returns true if this is 'token' or a token-like target type.s.
Definition Type.cpp:1058
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:295
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition Type.h:270
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:240
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:139
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:292
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
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:546
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:816
LLVM_ABI void deleteValue()
Delete a pointer to a generic Value.
Definition Value.cpp:111
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
An efficient, type-erasing, non-owning reference to a callable.
GVNLegacyPass(bool MemDepAnalysis=GVNEnableMemDep, bool MemSSAAnalysis=GVNEnableMemorySSA)
Definition GVN.cpp:3337
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
Definition GVN.cpp:3366
bool runOnFunction(Function &F) override
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
Definition GVN.cpp:3345
An opaque object representing a hash code.
Definition Hashing.h:76
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
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ 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.
IntrinsicID_match m_Intrinsic()
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
m_Intrinsic_Ty< Opnd0, Opnd1, Opnd2, Opnd3 >::Ty m_MaskedStore(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2, const Opnd3 &Op3)
Matches MaskedStore Intrinsic.
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.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
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...
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...
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...
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...
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...
bool canCoerceMustAliasedValueToLoad(Value *StoredVal, Type *LoadTy, Function *F)
Return true if CoerceAvailableValueToLoadType would succeed if it was called.
initializer< Ty > init(const Ty &Val)
A private "module" namespace for types and utilities used by GVN.
Definition GVN.h:63
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:477
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
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:1727
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:3256
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:80
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:644
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:1725
auto successors(const MachineBasicBlock *BB)
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:2138
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:634
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 ...
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
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:843
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:859
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:207
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:3156
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:3235
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:548
@ Success
The lock was released successfully.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
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:3094
@ Other
Any other memory.
Definition ModRef.h:68
LLVM_ABI bool VerifyMemorySSA
Enables verification of MemorySSA.
Definition MemorySSA.cpp:84
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()
Create a legacy GVN pass.
Definition GVN.cpp:3402
FunctionAddr VTableAddr Next
Definition InstrProf.h:141
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:96
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:560
auto predecessors(const MachineBasicBlock *BB)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1899
bool pred_empty(const BasicBlock *BB)
Definition CFG.h:119
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:592
LLVM_ABI bool EliminateDuplicatePHINodes(BasicBlock *BB)
Check for and eliminate duplicate PHI nodes in this block.
Definition Local.cpp:1509
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
Definition Hashing.h:466
LLVM_ABI bool isPotentiallyReachable(const Instruction *From, const Instruction *To, const SmallPtrSetImpl< BasicBlock * > *ExclusionSet=nullptr, const DominatorTree *DT=nullptr, const LoopInfo *LI=nullptr)
Determine whether instruction 'To' is reachable from 'From', without passing through any blocks in Ex...
Definition CFG.cpp:282
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:869
#define N
static GVNPass::Expression getTombstoneKey()
Definition GVN.cpp:175
static bool isEqual(const GVNPass::Expression &LHS, const GVNPass::Expression &RHS)
Definition GVN.cpp:183
static GVNPass::Expression getEmptyKey()
Definition GVN.cpp:174
static unsigned getHashValue(const GVNPass::Expression &E)
Definition GVN.cpp:177
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:78
bool operator==(const Expression &Other) const
Definition GVN.cpp:152
friend hash_code hash_value(const Expression &Value)
Definition GVN.cpp:167
SmallVector< uint32_t, 4 > VarArgs
Definition GVN.cpp:146
AttributeList Attrs
Definition GVN.cpp:148
Expression(uint32_t Op=~2U)
Definition GVN.cpp:150
A CRTP mix-in to automatically provide informational APIs needed for passes.
Definition PassManager.h:70
Represents an AvailableValue which can be rematerialized at the end of the associated BasicBlock.
Definition GVN.cpp:289
static AvailableValueInBlock get(BasicBlock *BB, Value *V, unsigned Offset=0)
Definition GVN.cpp:303
static AvailableValueInBlock getUndef(BasicBlock *BB)
Definition GVN.cpp:308
static AvailableValueInBlock get(BasicBlock *BB, AvailableValue &&AV)
Definition GVN.cpp:296
AvailableValue AV
AV - The actual available value.
Definition GVN.cpp:294
static AvailableValueInBlock getSelect(BasicBlock *BB, SelectInst *Sel, Value *V1, Value *V2)
Definition GVN.cpp:312
BasicBlock * BB
BB - The basic block in question.
Definition GVN.cpp:291
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:319
Represents a particular available value that we know how to materialize.
Definition GVN.cpp:193
unsigned Offset
Offset - The byte offset in Val that is interesting for the load query.
Definition GVN.cpp:210
bool isSimpleValue() const
Definition GVN.cpp:256
static AvailableValue getSelect(SelectInst *Sel, Value *V1, Value *V2)
Definition GVN.cpp:246
bool isCoercedLoadValue() const
Definition GVN.cpp:257
static AvailableValue get(Value *V, unsigned Offset=0)
Definition GVN.cpp:214
ValType Kind
Kind of the live-out value.
Definition GVN.cpp:207
LoadInst * getCoercedLoadValue() const
Definition GVN.cpp:267
static AvailableValue getLoad(LoadInst *Load, unsigned Offset=0)
Definition GVN.cpp:230
static AvailableValue getMI(MemIntrinsic *MI, unsigned Offset=0)
Definition GVN.cpp:222
bool isUndefValue() const
Definition GVN.cpp:259
bool isSelectValue() const
Definition GVN.cpp:260
Value * Val
Val - The value that is live out of the block.
Definition GVN.cpp:205
Value * V1
V1, V2 - The dominating non-clobbered values of SelectVal.
Definition GVN.cpp:212
static AvailableValue getUndef()
Definition GVN.cpp:238
SelectInst * getSelectValue() const
Definition GVN.cpp:277
Value * getSimpleValue() const
Definition GVN.cpp:262
bool isMemIntrinValue() const
Definition GVN.cpp:258
MemIntrinsic * getMemIntrinValue() const
Definition GVN.cpp:272
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:1145