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