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