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 (isa<PseudoProbeInst>(Inst))
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)) {
2764 if (II->getIntrinsicID() == Intrinsic::lifetime_start) {
2765 MemoryLocation IIObjLoc = MemoryLocation::getForArgument(II, 0, TLI);
2766 if (AA.isMustAlias(IIObjLoc, Loc))
2767 return ReachingMemVal::getDef(Loc.Ptr, ClobberI);
2768 return std::nullopt;
2769 }
2770 }
2771
2772 // If we are at a malloc-like function call, we can turn the load into `undef`
2773 // or zero.
2774 if (isNoAliasCall(ClobberI)) {
2775 const Value *Obj = getUnderlyingObject(Loc.Ptr);
2776 if (Obj == ClobberI || AA.isMustAlias(ClobberI, Loc.Ptr))
2777 return ReachingMemVal::getDef(Loc.Ptr, ClobberI);
2778 }
2779
2780 // Can reorder loads across a release fence.
2781 if (auto *FI = dyn_cast<FenceInst>(ClobberI))
2782 if (FI->getOrdering() == AtomicOrdering::Release)
2783 return std::nullopt;
2784
2785 // See if the clobber instruction (e.g., a generic call) may modify the
2786 // location.
2787 ModRefInfo MR = AA.getModRefInfo(ClobberI, Loc);
2788 // If may modify the location, analyze deeper, to exclude accesses to
2789 // non-escaping local allocations.
2790 if (MR == ModRefInfo::NoModRef || MR == ModRefInfo::Ref)
2791 return std::nullopt;
2792
2793 // Conservatively assume the clobbering memory access may overwrite the
2794 // location.
2795 return ReachingMemVal::getClobber(Loc.Ptr, ClobberI);
2796}
2797
2798/// Collect the predecessors of block, while doing phi-translation of the memory
2799/// address and the memory clobber. Return false if the block should be marked
2800/// as clobbering the memory location in an unknown way.
2801bool GVNPassImpl::collectPredecessors(BasicBlock *BB, const PHITransAddr &Addr,
2802 MemoryAccess *ClobberMA,
2803 DependencyBlockSet &Blocks,
2805 if (Addr.needsPHITranslationFromBlock(BB) &&
2807 return false;
2808
2809 auto *MPhi =
2810 ClobberMA->getBlock() == BB ? dyn_cast<MemoryPhi>(ClobberMA) : nullptr;
2812 for (BasicBlock *Pred : predecessors(BB)) {
2813 // Skip unreachable predecessors.
2814 if (!DT->isReachableFromEntry(Pred))
2815 continue;
2816
2817 // Skip already visited predecessors.
2818 if (llvm::any_of(Preds, [Pred](const auto &P) { return P.first == Pred; }))
2819 continue;
2820
2821 PHITransAddr TransAddr = Addr;
2822 if (TransAddr.needsPHITranslationFromBlock(BB))
2823 TransAddr.translateValue(BB, Pred, DT, false);
2824
2825 auto It = Blocks.find(Pred);
2826 if (It != Blocks.end()) {
2827 // If we reach a visited block with a different address, set the
2828 // current block as clobbering the memory location in an unknown way
2829 // (by returning false).
2830 if (It->second.Addr.getAddr() != TransAddr.getAddr())
2831 return false;
2832 // Otherwise, just stop the traversal.
2833 continue;
2834 }
2835
2836 Preds.emplace_back(
2837 Pred, DependencyBlockInfo(TransAddr,
2838 MPhi ? MPhi->getIncomingValueForBlock(Pred)
2839 : ClobberMA));
2840 }
2841
2842 // We collected the predecessors and stored them in Preds. Now, populate the
2843 // worklist with the predecessors found, and cache the eventual translated
2844 // address for each block.
2845 for (auto &P : Preds) {
2846 [[maybe_unused]] auto It =
2847 Blocks.try_emplace(P.first, std::move(P.second)).first;
2848 Worklist.push_back(P.first);
2849 }
2850
2851 return true;
2852}
2853
2854/// Build a list of MemoryAccesses whose users could potentially alias the
2855/// memory location being queried. Starts from StartInfo's initial clobber,
2856/// walk the use-def chain to the final clobber. If the chain extends beyond
2857/// `BB`, continue into that block but only if it is in the previously collected
2858/// set.
2859void GVNPassImpl::collectClobberList(SmallVectorImpl<MemoryAccess *> &Clobbers,
2860 BasicBlock *BB,
2861 const DependencyBlockInfo &StartInfo,
2862 const DependencyBlockSet &Blocks,
2863 MemorySSA &MSSA) {
2864 MemoryAccess *MA = StartInfo.InitialClobberMA;
2865 MemoryAccess *LastMA = StartInfo.ClobberMA;
2866
2867 for (;;) {
2868 while (MA != LastMA) {
2869 Clobbers.push_back(MA);
2870 MA = cast<MemoryUseOrDef>(MA)->getDefiningAccess();
2871 }
2872 Clobbers.push_back(MA);
2873
2874 if (MSSA.isLiveOnEntryDef(MA) ||
2875 (MA->getBlock() == BB && !isa<MemoryPhi>(MA)))
2876 break;
2877
2878 // If the final clobber in the current block is a MemoryPhi, go to the
2879 // immediate dominator; otherwise, just get to the block containing the
2880 // final clobber.
2881 if (MA->getBlock() == BB)
2882 BB = DT->getNode(BB)->getIDom()->getBlock();
2883 else
2884 BB = MA->getBlock();
2885
2886 auto It = Blocks.find(BB);
2887 if (It == Blocks.end())
2888 break;
2889
2890 MA = It->second.InitialClobberMA;
2891 LastMA = It->second.ClobberMA;
2892 if (MA == Clobbers.back())
2893 Clobbers.pop_back();
2894 }
2895}
2896
2897/// Entrypoint for the MemorySSA-based redundant load elimination algorithm.
2898/// Given as input a load instruction, the function computes the set of reaching
2899/// memory values, one per predecessor path, that analyzeLoadAvailability can
2900/// later use to establish whether the load may be eliminated. A reaching value
2901/// may be of the following descriptor kind:
2902/// * Def: a precise instruction that produces the exact bits the load would
2903/// read (e.g., an equivalent load or a MustAlias store);
2904/// * Clobber: a write that clobbers a superset of the bits the load would read
2905/// (e.g., a memset over a larger region);
2906/// * Other: we know which block defines the memory location in some way, but
2907/// could not identify a precise instruction (e.g., memory already live at
2908/// function entry).
2909bool GVNPassImpl::findReachingValuesForLoad(
2911 AAResults &AAR) {
2912 EarliestEscapeAnalysis EA(*DT, LI);
2913 BatchAAResults AA(AAR, &EA);
2914 BasicBlock *StartBlock = L->getParent();
2915 bool IsInvariantLoad = L->hasMetadata(LLVMContext::MD_invariant_load);
2916 // TODO: Simplify later work by just getClobberingMemoryAccess().
2917 MemoryAccess *ClobberMA = MSSA.getMemoryAccess(L)->getDefiningAccess();
2918 const MemoryLocation Loc = MemoryLocation::get(L);
2919
2920 // Fast path for load tagged with !invariant.group.
2921 if (L->hasMetadata(LLVMContext::MD_invariant_group)) {
2922 if (Instruction *G = findInvariantGroupValue(L, *DT)) {
2923 Values.emplace_back(
2924 ReachingMemVal::getDef(getLoadStorePointerOperand(G), G));
2925 return true;
2926 }
2927 }
2928
2929 // Phase 1. First off, look for a local dependency to avoid having to
2930 // disambiguate between before the load and after the load of the starting
2931 // block (as the load may be visited from a backedge).
2932 for (;;) {
2933 // Scan users of the clobbering memory access.
2934 if (auto RMV = scanMemoryAccessesUsers(
2935 Loc, IsInvariantLoad, StartBlock,
2936 SmallVector<MemoryAccess *, 1>{ClobberMA}, MSSA, AA, L)) {
2937 Values.emplace_back(*RMV);
2938 return true;
2939 }
2940
2941 // Exit from here, and proceed visiting predecessors if the clobbering
2942 // access is non-local or is a MemoryPhi.
2943 if (ClobberMA->getBlock() != StartBlock || isa<MemoryPhi>(ClobberMA))
2944 break;
2945
2946 // Check if the clobber actually aliases the load location.
2947 if (auto RMV =
2948 accessMayModifyLocation(ClobberMA, Loc, L->getAlign(),
2949 IsInvariantLoad, StartBlock, MSSA, AA)) {
2950 Values.emplace_back(*RMV);
2951 return true;
2952 }
2953
2954 // It may happen that the clobbering memory access does not actually
2955 // clobber our load location, transition to its defining memory access.
2956 ClobberMA = cast<MemoryUseOrDef>(ClobberMA)->getDefiningAccess();
2957 }
2958
2959 // Non-local speculations are not allowed under ASan.
2960 if (L->getFunction()->hasFnAttribute(Attribute::SanitizeAddress) ||
2961 L->getFunction()->hasFnAttribute(Attribute::SanitizeHWAddress))
2962 return false;
2963
2964 // Phase 2. Walk backwards through the CFG, collecting all the blocks that
2965 // contain an instruction that modifies the load memory location, or that lie
2966 // on a path between a clobbering block and our load. Start off by collecting
2967 // the predecessors of `StartBlock`. All the visited blocks are stored in a
2968 // the set `Blocks`. If possible, the memory address maintained for the block
2969 // visited does get phi-translated.
2970 DependencyBlockSet Blocks;
2971 SmallVector<BasicBlock *, 16> InitialWorklist;
2972 const DataLayout &DL = L->getDataLayout();
2973 if (!collectPredecessors(StartBlock,
2974 PHITransAddr(L->getPointerOperand(), DL, AC),
2975 ClobberMA, Blocks, InitialWorklist))
2976 return false;
2977
2978 // Do a bottom-up DFS.
2979 auto Worklist = InitialWorklist;
2980 while (!Worklist.empty()) {
2981 // Match MemDep's cutoff for expensive non-local queries.
2982 if (Blocks.size() > Opts.gvn_max_num_reaching_blocks)
2983 return false;
2984 auto *BB = Worklist.pop_back_val();
2985 DependencyBlockInfo &Info = Blocks.find(BB)->second;
2986
2987 // Phi-translation may have failed.
2988 if (!Info.Addr.getAddr())
2989 continue;
2990
2991 // If the clobbering memory access is in the current block and it indeed
2992 // clobbers our load location, record the dependency and do not visit the
2993 // predecessors of this block further, continue with the blocks in the
2994 // worklist.
2995 if (Info.ClobberMA->getBlock() == BB && !isa<MemoryPhi>(Info.ClobberMA)) {
2996 const MemoryLocation BBLoc = Loc.getWithNewPtr(Info.Addr.getAddr());
2997 if (auto RMV =
2998 accessMayModifyLocation(Info.ClobberMA, BBLoc, L->getAlign(),
2999 IsInvariantLoad, BB, MSSA, AA)) {
3000 Info.MemVal = RMV;
3001 continue;
3002 }
3003 assert(!MSSA.isLiveOnEntryDef(Info.ClobberMA) &&
3004 "LiveOnEntry aliases everything");
3005
3006 // If, however, the clobbering memory access does not actually clobber
3007 // our load location, transition to its defining memory access, but
3008 // keep examining the same basic block.
3009 Info.ClobberMA =
3010 cast<MemoryUseOrDef>(Info.ClobberMA)->getDefiningAccess();
3011 Worklist.emplace_back(BB);
3012 continue;
3013 }
3014
3015 // At this point we know the current block is "transparent", i.e. the memory
3016 // location is not modified when execution goes through this block.
3017 // Continue to its predecessors, unless a predecessor has already been
3018 // visited with a different address. We currently cannot represent such a
3019 // dependency.
3020 if (BB == StartBlock && Info.Addr.getAddr() != L->getPointerOperand()) {
3021 Info.ForceUnknown = true;
3022 continue;
3023 }
3024 if (BB != StartBlock &&
3025 !collectPredecessors(BB, Info.Addr, Info.ClobberMA, Blocks, Worklist))
3026 Info.ForceUnknown = true;
3027 }
3028
3029 // Phase 3. We have collected all the blocks that either write a value to the
3030 // memory location of the load, or there exists a path to the load, along
3031 // which the memory location is not modified. Perform a second DFS to find
3032 // load-to-load dependencies; namely, look at the dominating memory reads,
3033 // that alias our load. These are the MemoryUses that are users of the
3034 // MemoryDefs we previously identified. If no memory read is encountered,
3035 // either confirm the clobbering write found before or set to unknown.
3036 Worklist = InitialWorklist;
3037 for (BasicBlock *BB : Worklist) {
3038 DependencyBlockInfo &Info = Blocks.find(BB)->second;
3039 Info.Visited = true;
3040 }
3041
3043 while (!Worklist.empty()) {
3044 auto *BB = Worklist.pop_back_val();
3045 DependencyBlockInfo &Info = Blocks.find(BB)->second;
3046
3047 // If phi-translation failed, assume the memory location is modified in
3048 // unknown way.
3049 if (!Info.Addr.getAddr()) {
3050 Values.push_back(ReachingMemVal::getUnknown(BB, nullptr));
3051 continue;
3052 }
3053
3054 Clobbers.clear();
3055 collectClobberList(Clobbers, BB, Info, Blocks, MSSA);
3056 if (auto RMV =
3057 scanMemoryAccessesUsers(Loc.getWithNewPtr(Info.Addr.getAddr()),
3058 IsInvariantLoad, BB, Clobbers, MSSA, AA)) {
3059 Values.push_back(*RMV);
3060 continue;
3061 }
3062
3063 // If no reusable memory use was found, and the current block is not
3064 // transparent, use the already established memory def.
3065 if (Info.MemVal) {
3066 Values.push_back(*Info.MemVal);
3067 continue;
3068 }
3069
3070 if (Info.ForceUnknown) {
3071 Values.push_back(ReachingMemVal::getUnknown(BB, Info.Addr.getAddr()));
3072 continue;
3073 }
3074
3075 // If the current block is transparent, continue to its predecessors.
3076 for (BasicBlock *Pred : predecessors(BB)) {
3077 auto It = Blocks.find(Pred);
3078 if (It == Blocks.end())
3079 continue;
3080 DependencyBlockInfo &PredInfo = It->second;
3081 if (PredInfo.Visited)
3082 continue;
3083 PredInfo.Visited = true;
3084 Worklist.push_back(Pred);
3085 }
3086 }
3087
3088 return true;
3089}
3090
3091/// Attempt to eliminate a load, first by eliminating it
3092/// locally, and then attempting non-local elimination if that fails.
3093bool GVNPassImpl::processLoad(LoadInst *L) {
3094 if (!MD && !isMemorySSAEnabled())
3095 return false;
3096
3097 // This code hasn't been audited for ordered or volatile memory access.
3098 if (!L->isUnordered())
3099 return false;
3100
3101 if (L->getType()->isTokenLikeTy())
3102 return false;
3103
3104 if (L->use_empty()) {
3106 return true;
3107 }
3108
3109 ReachingMemVal MemVal = ReachingMemVal::getUnknown(nullptr, nullptr);
3110 if (!isMemorySSAEnabled()) {
3111 // ... to a pointer that has been loaded from before...
3112 MemDepResult Dep = MD->getDependency(L);
3113
3114 // If it is defined in another block, try harder.
3115 if (Dep.isNonLocal())
3116 return processNonLocalLoad(L);
3117
3118 // Only handle the local case below.
3119 if (Dep.isDef())
3120 MemVal = ReachingMemVal::getDef(L->getPointerOperand(), Dep.getInst());
3121 else if (Dep.isClobber())
3122 MemVal =
3123 ReachingMemVal::getClobber(L->getPointerOperand(), Dep.getInst());
3124 } else {
3126 if (!findReachingValuesForLoad(L, MemVals, *MSSAU->getMemorySSA(), *AA))
3127 return false; // Too many dependencies.
3128 assert(MemVals.size() && "Expected at least an unknown value");
3129 if (MemVals.size() > 1 || MemVals[0].Block != L->getParent())
3130 return processNonLocalLoad(L, MemVals);
3131
3132 MemVal = MemVals[0];
3133 }
3134
3135 if (MemVal.Kind == DepKind::Other) {
3136 // This might be a NonFuncLocal or an Unknown.
3137 LLVM_DEBUG(
3138 // fast print dep, using operator<< on instruction is too slow.
3139 dbgs() << "GVN: load "; L->printAsOperand(dbgs());
3140 dbgs() << " has unknown dependence\n";);
3141 return false;
3142 }
3143
3144 auto AV = analyzeLoadAvailability(L, MemVal, L->getPointerOperand());
3145 if (!AV)
3146 return false;
3147
3149
3150 // MaterializeAdjustedValue is responsible for combining metadata.
3151 ICF->removeUsersOf(L);
3152 L->replaceAllUsesWith(AvailableValue);
3153 if (MSSAU)
3154 MSSAU->removeMemoryAccess(L);
3155 ++NumGVNLoad;
3158 // Tell MDA to reexamine the reused pointer since we might have more
3159 // information after forwarding it.
3160 if (MD && AvailableValue->getType()->isPtrOrPtrVectorTy())
3161 MD->invalidateCachedPointerInfo(AvailableValue);
3162 return true;
3163}
3164
3165// Attempt to process masked loads which have loaded from
3166// masked stores with the same mask
3167bool GVNPassImpl::processMaskedLoad(IntrinsicInst *I) {
3168 if (!MD)
3169 return false;
3170 MemDepResult Dep = MD->getDependency(I);
3171 Instruction *DepInst = Dep.getInst();
3172 if (!DepInst || !Dep.isLocal() || !Dep.isDef())
3173 return false;
3174
3175 Value *Mask = I->getOperand(1);
3176 Value *Passthrough = I->getOperand(2);
3177 Value *StoreVal;
3178 if (!match(DepInst,
3179 m_MaskedStore(m_Value(StoreVal), m_Value(), m_Specific(Mask))) ||
3180 StoreVal->getType() != I->getType())
3181 return false;
3182
3183 // Remove the load but generate a select for the passthrough
3184 Value *OpToForward = llvm::SelectInst::Create(Mask, StoreVal, Passthrough, "",
3185 I->getIterator());
3186
3187 ICF->removeUsersOf(I);
3188 I->replaceAllUsesWith(OpToForward);
3190 ++NumGVNLoad;
3191 return true;
3192}
3193
3194/// Return a pair the first field showing the value number of \p Exp and the
3195/// second field showing whether it is a value number newly created.
3196std::pair<uint32_t, bool> GVNValueTable::assignExpNewValueNum(Expression &Exp) {
3197 uint32_t &E = ExpressionNumbering[Exp];
3198 bool CreateNewValNum = !E;
3199 if (CreateNewValNum) {
3200 Expressions.push_back(Exp);
3201 if (ExprIdx.size() < NextValueNumber + 1)
3202 ExprIdx.resize(NextValueNumber * 2);
3203 E = NextValueNumber;
3204 ExprIdx[NextValueNumber++] = NextExprNumber++;
3205 }
3206 return {E, CreateNewValNum};
3207}
3208
3209/// Return whether all the values related with the same \p num are
3210/// defined in \p BB.
3211bool GVNValueTable::areAllValsInBB(uint32_t Num, const BasicBlock *BB,
3212 GVNLeaderMap &LeaderTable) {
3213 return all_of(
3214 LeaderTable.getLeaders(Num),
3215 [=](const GVNLeaderMap::LeaderTableEntry &L) { return L.BB == BB; });
3216}
3217
3218/// Wrap phiTranslateImpl to provide caching functionality.
3220 const BasicBlock *PhiBlock, uint32_t Num,
3221 GVNLeaderMap &LeaderTable) {
3222 auto FindRes = PhiTranslateTable.find({Num, Pred});
3223 if (FindRes != PhiTranslateTable.end())
3224 return FindRes->second;
3225 uint32_t NewNum = phiTranslateImpl(Pred, PhiBlock, Num, LeaderTable);
3226 PhiTranslateTable.insert({{Num, Pred}, NewNum});
3227 return NewNum;
3228}
3229
3230// Return true if the value number \p Num and NewNum have equal value.
3231// Return false if the result is unknown.
3232bool GVNValueTable::areCallValsEqual(uint32_t Num, uint32_t NewNum,
3233 const BasicBlock *Pred,
3234 const BasicBlock *PhiBlock,
3235 GVNLeaderMap &LeaderTable) {
3236 CallInst *Call = nullptr;
3237 auto Leaders = LeaderTable.getLeaders(Num);
3238 for (const auto &Entry : Leaders) {
3239 Call = dyn_cast<CallInst>(&*Entry.Val);
3240 if (Call && Call->getParent() == PhiBlock)
3241 break;
3242 }
3243
3244 if (AA->doesNotAccessMemory(Call))
3245 return true;
3246
3247 if (!MD || !AA->onlyReadsMemory(Call))
3248 return false;
3249
3250 MemDepResult LocalDep = MD->getDependency(Call);
3251 if (!LocalDep.isNonLocal())
3252 return false;
3253
3256
3257 // Check to see if the Call has no function local clobber.
3258 for (const NonLocalDepEntry &D : Deps) {
3259 if (D.getResult().isNonFuncLocal())
3260 return true;
3261 }
3262 return false;
3263}
3264
3265/// Translate value number \p Num using phis, so that it has the values of
3266/// the phis in BB.
3267uint32_t GVNValueTable::phiTranslateImpl(const BasicBlock *Pred,
3268 const BasicBlock *PhiBlock,
3269 uint32_t Num,
3270 GVNLeaderMap &LeaderTable) {
3271 // See if we can refine the value number by looking at the PN incoming value
3272 // for the given predecessor.
3273 if (PHINode *PN = NumberingPhi[Num]) {
3274 if (PN->getParent() != PhiBlock)
3275 return Num;
3276 for (unsigned I = 0; I != PN->getNumIncomingValues(); ++I) {
3277 if (PN->getIncomingBlock(I) != Pred)
3278 continue;
3279 if (uint32_t TransVal = lookup(PN->getIncomingValue(I), false))
3280 return TransVal;
3281 }
3282 return Num;
3283 }
3284
3285 if (BasicBlock *BB = NumberingBB[Num]) {
3286 assert(MSSA && "NumberingBB is non-empty only when using MemorySSA");
3287 // Value numbers of basic blocks are used to represent memory state in
3288 // load/store instructions and read-only function calls when said state is
3289 // set by a MemoryPhi.
3290 if (BB != PhiBlock)
3291 return Num;
3292 MemoryPhi *MPhi = MSSA->getMemoryAccess(BB);
3293 for (unsigned i = 0, N = MPhi->getNumIncomingValues(); i != N; ++i) {
3294 if (MPhi->getIncomingBlock(i) != Pred)
3295 continue;
3296 MemoryAccess *MA = MPhi->getIncomingValue(i);
3297 if (auto *PredPhi = dyn_cast<MemoryPhi>(MA))
3298 return lookupOrAdd(PredPhi->getBlock());
3299 if (MSSA->isLiveOnEntryDef(MA))
3300 return lookupOrAdd(&BB->getParent()->getEntryBlock());
3301 return lookupOrAdd(cast<MemoryUseOrDef>(MA)->getMemoryInst());
3302 }
3304 "CFG/MemorySSA mismatch: predecessor not found among incoming blocks");
3305 }
3306
3307 // If there is any value related with Num is defined in a BB other than
3308 // PhiBlock, it cannot depend on a phi in PhiBlock without going through
3309 // a backedge. We can do an early exit in that case to save compile time.
3310 if (!areAllValsInBB(Num, PhiBlock, LeaderTable))
3311 return Num;
3312
3313 if (Num >= ExprIdx.size() || ExprIdx[Num] == 0)
3314 return Num;
3315 Expression Exp = Expressions[ExprIdx[Num]];
3316
3317 for (unsigned I = 0; I < Exp.VarArgs.size(); I++) {
3318 // For InsertValue and ExtractValue, some varargs are index numbers
3319 // instead of value numbers. Those index numbers should not be
3320 // translated.
3321 if ((I > 1 && Exp.Opcode == Instruction::InsertValue) ||
3322 (I > 0 && Exp.Opcode == Instruction::ExtractValue) ||
3323 (I > 1 && Exp.Opcode == Instruction::ShuffleVector))
3324 continue;
3325 Exp.VarArgs[I] = phiTranslate(Pred, PhiBlock, Exp.VarArgs[I], LeaderTable);
3326 }
3327
3328 if (Exp.Commutative) {
3329 assert(Exp.VarArgs.size() >= 2 && "Unsupported commutative instruction!");
3330 if (Exp.VarArgs[0] > Exp.VarArgs[1]) {
3331 std::swap(Exp.VarArgs[0], Exp.VarArgs[1]);
3332 uint32_t Opcode = Exp.Opcode >> 8;
3333 if (Opcode == Instruction::ICmp || Opcode == Instruction::FCmp)
3334 Exp.Opcode = (Opcode << 8) |
3336 static_cast<CmpInst::Predicate>(Exp.Opcode & 255));
3337 }
3338 }
3339
3340 if (uint32_t NewNum = ExpressionNumbering[Exp]) {
3341 if (Exp.Opcode == Instruction::Call && NewNum != Num)
3342 return areCallValsEqual(Num, NewNum, Pred, PhiBlock, LeaderTable) ? NewNum
3343 : Num;
3344 return NewNum;
3345 }
3346 return Num;
3347}
3348
3349/// Erase stale entry from phiTranslate cache so phiTranslate can be computed
3350/// again.
3352 const BasicBlock &CurrBlock) {
3353 for (const BasicBlock *Pred : predecessors(&CurrBlock))
3354 PhiTranslateTable.erase({Num, Pred});
3355}
3356
3357// In order to find a leader for a given value number at a
3358// specific basic block, we first obtain the list of all Values for that number,
3359// and then scan the list to find one whose block dominates the block in
3360// question. This is fast because dominator tree queries consist of only
3361// a few comparisons of DFS numbers.
3362Value *GVNPassImpl::findLeader(const BasicBlock *BB, uint32_t Num) {
3363 auto Leaders = LeaderTable.getLeaders(Num);
3364 if (Leaders.empty())
3365 return nullptr;
3366
3367 Value *Val = nullptr;
3368 for (const auto &Entry : Leaders) {
3369 if (DT->dominates(Entry.BB, BB)) {
3370 Val = Entry.Val;
3371 if (isa<Constant>(Val))
3372 return Val;
3373 }
3374 }
3375
3376 return Val;
3377}
3378
3379/// There is an edge from 'Src' to 'Dst'. Return
3380/// true if every path from the entry block to 'Dst' passes via this edge. In
3381/// particular 'Dst' must not be reachable via another edge from 'Src'.
3383 DominatorTree *DT) {
3384 // While in theory it is interesting to consider the case in which Dst has
3385 // more than one predecessor, because Dst might be part of a loop which is
3386 // only reachable from Src, in practice it is pointless since at the time
3387 // GVN runs all such loops have preheaders, which means that Dst will have
3388 // been changed to have only one predecessor, namely Src.
3389 const BasicBlock *Pred = E.getEnd()->getSinglePredecessor();
3390 assert((!Pred || Pred == E.getStart()) &&
3391 "No edge between these basic blocks!");
3392 return Pred != nullptr;
3393}
3394
3395void GVNPassImpl::assignBlockRPONumber(Function &F) {
3396 BlockRPONumber.clear();
3397 uint32_t NextBlockNumber = 1;
3398 ReversePostOrderTraversal<Function *> RPOT(&F);
3399 for (BasicBlock *BB : RPOT)
3400 BlockRPONumber[BB] = NextBlockNumber++;
3401 InvalidBlockRPONumbers = false;
3402}
3403
3404/// The given values are known to be equal in every use
3405/// dominated by 'Root'. Exploit this, for example by replacing 'LHS' with
3406/// 'RHS' everywhere in the scope. Returns whether a change was made.
3407/// The Root may either be a basic block edge (for conditions) or an
3408/// instruction (for assumes).
3409bool GVNPassImpl::propagateEquality(
3410 Value *LHS, Value *RHS,
3411 const std::variant<BasicBlockEdge, Instruction *> &Root) {
3413 SmallDenseSet<std::pair<Value *, Value *>, 4> Visited;
3414 Worklist.push_back(std::make_pair(LHS, RHS));
3415 bool Changed = false;
3416 SmallVector<const BasicBlock *> DominatedBlocks;
3417 if (const BasicBlockEdge *Edge = std::get_if<BasicBlockEdge>(&Root)) {
3418 // For speed, compute a conservative fast approximation to
3419 // DT->dominates(Root, Root.getEnd());
3421 DominatedBlocks.push_back(Edge->getEnd());
3422 } else {
3423 Instruction *I = std::get<Instruction *>(Root);
3424 for (const auto *Node : DT->getNode(I->getParent())->children())
3425 DominatedBlocks.push_back(Node->getBlock());
3426 }
3427
3428 while (!Worklist.empty()) {
3429 std::pair<Value*, Value*> Item = Worklist.pop_back_val();
3430 LHS = Item.first; RHS = Item.second;
3431
3432 if (LHS == RHS)
3433 continue;
3434 assert(LHS->getType() == RHS->getType() && "Equality but unequal types!");
3435
3436 // Don't try to propagate equalities between constants.
3438 continue;
3439
3440 // Prefer a constant on the right-hand side, or an Argument if no constants.
3442 std::swap(LHS, RHS);
3443 assert((isa<Argument>(LHS) || isa<Instruction>(LHS)) && "Unexpected value!");
3444 const DataLayout &DL =
3446 ? cast<Argument>(LHS)->getParent()->getDataLayout()
3447 : cast<Instruction>(LHS)->getDataLayout();
3448
3449 // If there is no obvious reason to prefer the left-hand side over the
3450 // right-hand side, ensure the longest lived term is on the right-hand side,
3451 // so the shortest lived term will be replaced by the longest lived.
3452 // This tends to expose more simplifications.
3453 uint32_t LVN = VN.lookupOrAdd(LHS);
3454 if ((isa<Argument>(LHS) && isa<Argument>(RHS)) ||
3456 // Move the 'oldest' value to the right-hand side, using the value number
3457 // as a proxy for age.
3458 uint32_t RVN = VN.lookupOrAdd(RHS);
3459 if (LVN < RVN) {
3460 std::swap(LHS, RHS);
3461 LVN = RVN;
3462 }
3463 }
3464
3465 if (!Visited.insert({LHS, RHS}).second)
3466 continue;
3467
3468 // If value numbering later sees that an instruction in the scope is equal
3469 // to 'LHS' then ensure it will be turned into 'RHS'. In order to preserve
3470 // the invariant that instructions only occur in the leader table for their
3471 // own value number (this is used by removeFromLeaderTable), do not do this
3472 // if RHS is an instruction (if an instruction in the scope is morphed into
3473 // LHS then it will be turned into RHS by the next GVN iteration anyway, so
3474 // using the leader table is about compiling faster, not optimizing better).
3475 // The leader table only tracks basic blocks, not edges. Only add to if we
3476 // have the simple case where the edge dominates the end.
3478 for (const BasicBlock *BB : DominatedBlocks)
3479 LeaderTable.insert(LVN, RHS, BB);
3480
3481 // Replace all occurrences of 'LHS' with 'RHS' everywhere in the scope. As
3482 // LHS always has at least one use that is not dominated by Root, this will
3483 // never do anything if LHS has only one use.
3484 if (!LHS->hasOneUse()) {
3485 // Create a callback that captures the DL.
3486 auto CanReplacePointersCallBack = [&DL](const Use &U, const Value *To) {
3487 return canReplacePointersInUseIfEqual(U, To, DL);
3488 };
3489 unsigned NumReplacements;
3490 if (const BasicBlockEdge *Edge = std::get_if<BasicBlockEdge>(&Root))
3491 NumReplacements = replaceDominatedUsesWithIf(
3492 LHS, RHS, *DT, *Edge, CanReplacePointersCallBack);
3493 else
3494 NumReplacements = replaceDominatedUsesWithIf(
3495 LHS, RHS, *DT, std::get<Instruction *>(Root),
3496 CanReplacePointersCallBack);
3497
3498 if (NumReplacements > 0) {
3499 Changed = true;
3500 NumGVNEqProp += NumReplacements;
3501 // Cached information for anything that uses LHS will be invalid.
3502 if (MD)
3503 MD->invalidateCachedPointerInfo(LHS);
3504 }
3505 }
3506
3507 // Now try to deduce additional equalities from this one. For example, if
3508 // the known equality was "(A != B)" == "false" then it follows that A and B
3509 // are equal in the scope. Only boolean equalities with an explicit true or
3510 // false RHS are currently supported.
3511 if (!RHS->getType()->isIntegerTy(1))
3512 // Not a boolean equality - bail out.
3513 continue;
3514 ConstantInt *CI = dyn_cast<ConstantInt>(RHS);
3515 if (!CI)
3516 // RHS neither 'true' nor 'false' - bail out.
3517 continue;
3518 // Whether RHS equals 'true'. Otherwise it equals 'false'.
3519 bool IsKnownTrue = CI->isMinusOne();
3520 bool IsKnownFalse = !IsKnownTrue;
3521
3522 // If "A && B" is known true then both A and B are known true. If "A || B"
3523 // is known false then both A and B are known false.
3524 Value *A, *B;
3525 if ((IsKnownTrue && match(LHS, m_LogicalAnd(m_Value(A), m_Value(B)))) ||
3526 (IsKnownFalse && match(LHS, m_LogicalOr(m_Value(A), m_Value(B))))) {
3527 Worklist.push_back(std::make_pair(A, RHS));
3528 Worklist.push_back(std::make_pair(B, RHS));
3529 continue;
3530 }
3531
3532 // If we are propagating an equality like "(A == B)" == "true" then also
3533 // propagate the equality A == B. When propagating a comparison such as
3534 // "(A >= B)" == "true", replace all instances of "A < B" with "false".
3535 if (CmpInst *Cmp = dyn_cast<CmpInst>(LHS)) {
3536 Value *Op0 = Cmp->getOperand(0), *Op1 = Cmp->getOperand(1);
3537
3538 // If "A == B" is known true, or "A != B" is known false, then replace
3539 // A with B everywhere in the scope. For floating point operations, we
3540 // have to be careful since equality does not always imply equivalance.
3541 if (Cmp->isEquivalence(IsKnownFalse))
3542 Worklist.push_back(std::make_pair(Op0, Op1));
3543
3544 // If "A >= B" is known true, replace "A < B" with false everywhere.
3545 CmpInst::Predicate NotPred = Cmp->getInversePredicate();
3546 Constant *NotVal = ConstantInt::get(Cmp->getType(), IsKnownFalse);
3547 // Since we don't have the instruction "A < B" immediately to hand, work
3548 // out the value number that it would have and use that to find an
3549 // appropriate instruction (if any).
3550 uint32_t NextNum = VN.getNextUnusedValueNumber();
3551 uint32_t Num = VN.lookupOrAddCmp(Cmp->getOpcode(), NotPred, Op0, Op1);
3552 // If the number we were assigned was brand new then there is no point in
3553 // looking for an instruction realizing it: there cannot be one!
3554 if (Num < NextNum) {
3555 for (const auto &Entry : LeaderTable.getLeaders(Num)) {
3556 // Only look at leaders that either dominate the start of the edge,
3557 // or are dominated by the end. This check is not necessary for
3558 // correctness, it only discards cases for which the following
3559 // use replacement will not work anyway.
3560 if (const BasicBlockEdge *Edge = std::get_if<BasicBlockEdge>(&Root)) {
3561 if (!DT->dominates(Entry.BB, Edge->getStart()) &&
3562 !DT->dominates(Edge->getEnd(), Entry.BB))
3563 continue;
3564 } else {
3565 auto *InstBB = std::get<Instruction *>(Root)->getParent();
3566 if (!DT->dominates(Entry.BB, InstBB) &&
3567 !DT->dominates(InstBB, Entry.BB))
3568 continue;
3569 }
3570
3571 Value *NotCmp = Entry.Val;
3572 if (NotCmp && isa<Instruction>(NotCmp)) {
3573 unsigned NumReplacements;
3574 if (const BasicBlockEdge *Edge = std::get_if<BasicBlockEdge>(&Root))
3575 NumReplacements =
3576 replaceDominatedUsesWith(NotCmp, NotVal, *DT, *Edge);
3577 else
3578 NumReplacements = replaceDominatedUsesWith(
3579 NotCmp, NotVal, *DT, std::get<Instruction *>(Root));
3580 Changed |= NumReplacements > 0;
3581 NumGVNEqProp += NumReplacements;
3582 // Cached information for anything that uses NotCmp will be invalid.
3583 if (MD)
3584 MD->invalidateCachedPointerInfo(NotCmp);
3585 }
3586 }
3587 }
3588 // Ensure that any instruction in scope that gets the "A < B" value number
3589 // is replaced with false.
3590 // The leader table only tracks basic blocks, not edges. Only add to if we
3591 // have the simple case where the edge dominates the end.
3592 for (const BasicBlock *BB : DominatedBlocks)
3593 LeaderTable.insert(Num, NotVal, BB);
3594
3595 continue;
3596 }
3597
3598 // Propagate equalities that results from truncation with no unsigned wrap
3599 // like (trunc nuw i64 %v to i1) == "true" or (trunc nuw i64 %v to i1) ==
3600 // "false"
3601 if (match(LHS, m_NUWTrunc(m_Value(A)))) {
3602 Worklist.emplace_back(A, ConstantInt::get(A->getType(), IsKnownTrue));
3603 continue;
3604 }
3605
3606 if (match(LHS, m_Not(m_Value(A)))) {
3607 Worklist.emplace_back(A, ConstantInt::get(A->getType(), !IsKnownTrue));
3608 continue;
3609 }
3610 }
3611
3612 return Changed;
3613}
3614
3615bool GVNPassImpl::replaceWithEquivalentCmp(CmpInst *Cmp) {
3616 auto FindCmpLeader = [&](CmpInst::Predicate Pred) -> Value * {
3617 uint32_t Num = VN.lookupCmp(Cmp->getOpcode(), Pred, Cmp->getOperand(0),
3618 Cmp->getOperand(1));
3619 if (Num != 0)
3620 return findLeader(Cmp->getParent(), Num);
3621 return nullptr;
3622 };
3623
3624 // Substitute cmp instruction with not if possible.
3625 if (Value *Repl = FindCmpLeader(Cmp->getInversePredicate())) {
3626 patchReplacementInstruction(Cmp, Repl);
3627 BinaryOperator *Not = BinaryOperator::CreateNot(
3628 Repl, Repl->getName() + ".not", Cmp->getIterator());
3629 Not->setDebugLoc(Cmp->getDebugLoc());
3630 Cmp->replaceAllUsesWith(Not);
3632 return true;
3633 }
3634
3635 // Substitute icmp samesign upred with icmp spred
3636 auto *ICmp = dyn_cast<ICmpInst>(Cmp);
3637 if (ICmp && ICmp->hasSameSign() && !ICmp->isEquality()) {
3638 if (Value *Repl = FindCmpLeader(
3639 ICmpInst::getFlippedSignednessPredicate(ICmp->getPredicate()))) {
3640 patchAndReplaceAllUsesWith(Cmp, Repl);
3642 return true;
3643 }
3644 }
3645 return false;
3646}
3647
3648/// When calculating availability, handle an instruction
3649/// by inserting it into the appropriate sets.
3650bool GVNPassImpl::processInstruction(Instruction *I) {
3651 // If the instruction can be easily simplified then do so now in preference
3652 // to value numbering it. Value numbering often exposes redundancies, for
3653 // example if it determines that %y is equal to %x then the instruction
3654 // "%z = and i32 %x, %y" becomes "%z = and i32 %x, %x" which we now simplify.
3655 const DataLayout &DL = I->getDataLayout();
3656 if (Value *V = simplifyInstruction(I, {DL, TLI, DT, AC})) {
3657 bool Changed = false;
3658 if (!I->use_empty()) {
3659 // Simplification can cause a special instruction to become not special.
3660 // For example, devirtualization to a willreturn function.
3661 ICF->removeUsersOf(I);
3662 I->replaceAllUsesWith(V);
3663 Changed = true;
3664 }
3665 if (isInstructionTriviallyDead(I, TLI)) {
3667 Changed = true;
3668 }
3669 if (Changed) {
3670 if (MD && V->getType()->isPtrOrPtrVectorTy())
3671 MD->invalidateCachedPointerInfo(V);
3672 ++NumGVNSimpl;
3673 return true;
3674 }
3675 }
3676
3677 if (auto *Assume = dyn_cast<AssumeInst>(I))
3678 return processAssumeIntrinsic(Assume);
3679
3680 if (LoadInst *Load = dyn_cast<LoadInst>(I)) {
3681 if (processLoad(Load))
3682 return true;
3683
3684 unsigned Num = VN.lookupOrAdd(Load);
3685 LeaderTable.insert(Num, Load, Load->getParent());
3686 return false;
3687 }
3688
3690 processMaskedLoad(cast<IntrinsicInst>(I)))
3691 return true;
3692
3693 // For conditional branches, we can perform simple conditional propagation on
3694 // the condition value itself.
3695 if (CondBrInst *BI = dyn_cast<CondBrInst>(I)) {
3696 if (isa<Constant>(BI->getCondition()))
3697 return processFoldableCondBr(BI);
3698
3699 Value *BranchCond = BI->getCondition();
3700 BasicBlock *TrueSucc = BI->getSuccessor(0);
3701 BasicBlock *FalseSucc = BI->getSuccessor(1);
3702 // Avoid multiple edges early.
3703 if (TrueSucc == FalseSucc)
3704 return false;
3705
3706 BasicBlock *Parent = BI->getParent();
3707 bool Changed = false;
3708
3710 BasicBlockEdge TrueE(Parent, TrueSucc);
3711 Changed |= propagateEquality(BranchCond, TrueVal, TrueE);
3712
3714 BasicBlockEdge FalseE(Parent, FalseSucc);
3715 Changed |= propagateEquality(BranchCond, FalseVal, FalseE);
3716
3717 return Changed;
3718 }
3719
3720 // For switches, propagate the case values into the case destinations.
3721 if (SwitchInst *SI = dyn_cast<SwitchInst>(I)) {
3722 Value *SwitchCond = SI->getCondition();
3723 BasicBlock *Parent = SI->getParent();
3724 bool Changed = false;
3725
3726 // Remember how many outgoing edges there are to every successor.
3727 SmallDenseMap<BasicBlock *, unsigned, 16> SwitchEdges;
3728 for (BasicBlock *Succ : successors(Parent))
3729 ++SwitchEdges[Succ];
3730
3731 for (const auto &Case : SI->cases()) {
3732 BasicBlock *Dst = Case.getCaseSuccessor();
3733 // If there is only a single edge, propagate the case value into it.
3734 if (SwitchEdges.lookup(Dst) == 1) {
3735 BasicBlockEdge E(Parent, Dst);
3736 Changed |= propagateEquality(SwitchCond, Case.getCaseValue(), E);
3737 }
3738 }
3739 return Changed;
3740 }
3741
3742 // Instructions with void type don't return a value, so there's
3743 // no point in trying to find redundancies in them.
3744 if (I->getType()->isVoidTy())
3745 return false;
3746
3747 uint32_t NextNum = VN.getNextUnusedValueNumber();
3748 unsigned Num = VN.lookupOrAdd(I);
3749
3750 // Allocations are always uniquely numbered, so we can save time and memory
3751 // by fast failing them.
3752 if (isa<AllocaInst>(I) || I->isTerminator() || isa<PHINode>(I)) {
3753 LeaderTable.insert(Num, I, I->getParent());
3754 return false;
3755 }
3756
3757 // A ptrtoaddr and a ptrtoint of the same pointer compute the same value when
3758 // the address width equals the pointer representation width.
3759 if (auto *PTA = dyn_cast<PtrToAddrInst>(I)) {
3760 const DataLayout &DL = I->getDataLayout();
3761 unsigned AS = PTA->getPointerAddressSpace();
3762 if (DL.getAddressSizeInBits(AS) == DL.getPointerSizeInBits(AS) &&
3763 !DL.hasUnstableRepresentation(AS)) {
3764 uint32_t PTINum =
3765 VN.lookupPtrToInt(PTA->getPointerOperand(), PTA->getType());
3766 if (Value *PTI = findLeader(I->getParent(), PTINum)) {
3769 return true;
3770 }
3771 }
3772 }
3773
3774 // Perform fast-path value-number based elimination of values inherited from
3775 // dominators, unless the number we were assigned was a brand new VN, then
3776 // we don't need to do a lookup to see if the number already exists somewhere
3777 // in the domtree: it can't!
3778 Value *Repl = Num < NextNum ? findLeader(I->getParent(), Num) : nullptr;
3779 if (!Repl) {
3780 if (auto *Cmp = dyn_cast<CmpInst>(I); Cmp && replaceWithEquivalentCmp(Cmp))
3781 return true;
3782
3783 // Failure, just remember this instance for future use.
3784 LeaderTable.insert(Num, I, I->getParent());
3785 return false;
3786 }
3787
3788 if (Repl == I) {
3789 // If I was the result of a shortcut PRE, it might already be in the table
3790 // and the best replacement for itself. Nothing to do.
3791 return false;
3792 }
3793
3794 // Remove it!
3796 if (MD && Repl->getType()->isPtrOrPtrVectorTy())
3797 MD->invalidateCachedPointerInfo(Repl);
3799 return true;
3800}
3801
3802/// runOnFunction - This is the main transformation entry point for a function.
3803bool GVNPassImpl::run(Function &F, AssumptionCache &RunAC, DominatorTree &RunDT,
3804 const TargetLibraryInfo &RunTLI, AAResults &RunAA,
3806 OptimizationRemarkEmitter *RunORE, MemorySSA *MSSA) {
3807 // MemDep and MemorySSA are mutually exclusive. isMemDepEnabled() silently
3808 // lets MemorySSA win for the common single-flag case, but an explicit
3809 // request for both via -enable-gvn-{memdep,memoryssa} is a contradiction we
3810 // reject rather than resolve arbitrarily.
3811 if (Opts.enable_gvn_memdep == BoolOrDefault::True &&
3812 Opts.enable_gvn_memoryssa)
3813 report_fatal_error("GVN: -enable-gvn-memdep and -enable-gvn-memoryssa are "
3814 "mutually exclusive",
3815 /*gen_crash_diag=*/false);
3816 AC = &RunAC;
3817 DT = &RunDT;
3818 VN.setDomTree(DT);
3819 TLI = &RunTLI;
3820 AA = &RunAA;
3821 VN.setAliasAnalysis(&RunAA);
3822 MD = RunMD;
3823 ImplicitControlFlowTracking ImplicitCFT;
3824 ICF = &ImplicitCFT;
3825 this->LI = &LI;
3826 VN.setMemDep(MD);
3827 // Propagate the MSSA-enabled flag so the value-numbering paths in
3828 // lookupOrAddCall() and computeLoadStoreVN(), which depends on whether
3829 // IsMSSAEnabled is turned on.
3830 VN.setMemorySSA(MSSA, isMemorySSAEnabled());
3831 ORE = RunORE;
3832 InvalidBlockRPONumbers = true;
3833 MemorySSAUpdater Updater(MSSA);
3834 MSSAU = MSSA ? &Updater : nullptr;
3835
3836 bool Changed = false;
3837 bool ShouldContinue = true;
3838
3839 DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy);
3840 // Merge unconditional branches, allowing PRE to catch more
3841 // optimization opportunities.
3842 for (BasicBlock &BB : make_early_inc_range(F)) {
3843 bool RemovedBlock = MergeBlockIntoPredecessor(&BB, &DTU, &LI, MSSAU, MD);
3844 if (RemovedBlock)
3845 ++NumGVNBlocks;
3846
3847 Changed |= RemovedBlock;
3848 }
3849 DTU.flush();
3850
3851 unsigned Iteration = 0;
3852 while (ShouldContinue) {
3853 LLVM_DEBUG(dbgs() << "GVN iteration: " << Iteration << "\n");
3854 (void) Iteration;
3855 ShouldContinue = iterateOnFunction(F);
3856 Changed |= ShouldContinue;
3857 ++Iteration;
3858 }
3859
3860 if (isScalarPREEnabled()) {
3861 // Fabricate val-num for dead-code in order to suppress assertion in
3862 // performPRE().
3863 assignValNumForDeadCode();
3864 bool PREChanged = true;
3865 while (PREChanged) {
3866 PREChanged = performPRE(F);
3867 Changed |= PREChanged;
3868 }
3869 }
3870
3871 // FIXME: Should perform GVN again after PRE does something. PRE can move
3872 // computations into blocks where they become fully redundant. Note that
3873 // we can't do this until PRE's critical edge splitting updates memdep.
3874 // Actually, when this happens, we should just fully integrate PRE into GVN.
3875
3876 cleanupGlobalSets();
3877 // Do not cleanup DeadBlocks in cleanupGlobalSets() as it's called for each
3878 // iteration.
3879 DeadBlocks.clear();
3880
3881 if (MSSA && VerifyMemorySSA)
3882 MSSA->verifyMemorySSA();
3883
3884 return Changed;
3885}
3886
3887bool GVNPassImpl::processBlock(BasicBlock *BB) {
3888 if (DeadBlocks.count(BB))
3889 return false;
3890
3891 bool ChangedFunction = false;
3892
3893 // Since we may not have visited the input blocks of the phis, we can't
3894 // use our normal hash approach for phis. Instead, simply look for
3895 // obvious duplicates. The first pass of GVN will tend to create
3896 // identical phis, and the second or later passes can eliminate them.
3897 SmallPtrSet<PHINode *, 8> PHINodesToRemove;
3898 ChangedFunction |= EliminateDuplicatePHINodes(BB, PHINodesToRemove);
3899 for (PHINode *PN : PHINodesToRemove) {
3900 removeInstruction(PN);
3901 }
3902 for (Instruction &Inst : make_early_inc_range(*BB))
3903 ChangedFunction |= processInstruction(&Inst);
3904 return ChangedFunction;
3905}
3906
3907// Instantiate an expression in a predecessor that lacked it.
3908bool GVNPassImpl::performScalarPREInsertion(Instruction *Instr,
3909 BasicBlock *Pred, BasicBlock *Curr,
3910 unsigned int ValNo) {
3911 // Because we are going top-down through the block, all value numbers
3912 // will be available in the predecessor by the time we need them. Any
3913 // that weren't originally present will have been instantiated earlier
3914 // in this loop.
3915 bool Success = true;
3916 for (unsigned I = 0, E = Instr->getNumOperands(); I != E; ++I) {
3917 Value *Op = Instr->getOperand(I);
3919 continue;
3920 // This could be a newly inserted instruction, in which case, we won't
3921 // find a value number, and should give up before we hurt ourselves.
3922 // FIXME: Rewrite the infrastructure to let it easier to value number
3923 // and process newly inserted instructions.
3924 if (!VN.exists(Op)) {
3925 Success = false;
3926 break;
3927 }
3928 uint32_t TValNo = VN.phiTranslate(Pred, Curr, VN.lookup(Op), LeaderTable);
3929 if (Value *V = findLeader(Pred, TValNo)) {
3930 Instr->setOperand(I, V);
3931 } else {
3932 Success = false;
3933 break;
3934 }
3935 }
3936
3937 // Fail out if we encounter an operand that is not available in
3938 // the PRE predecessor. This is typically because of loads which
3939 // are not value numbered precisely.
3940 if (!Success)
3941 return false;
3942
3943 Instr->insertBefore(Pred->getTerminator()->getIterator());
3944 Instr->setName(Instr->getName() + ".pre");
3945 Instr->setDebugLoc(Instr->getDebugLoc());
3946
3947 ICF->insertInstructionTo(Instr, Pred);
3948
3949 unsigned Num = VN.lookupOrAdd(Instr);
3950 VN.add(Instr, Num);
3951
3952 // Update the availability map to include the new instruction.
3953 LeaderTable.insert(Num, Instr, Pred);
3954 return true;
3955}
3956
3957bool GVNPassImpl::performScalarPRE(Instruction *CurInst) {
3958 if (isa<AllocaInst>(CurInst) || CurInst->isTerminator() ||
3959 isa<PHINode>(CurInst) || CurInst->getType()->isVoidTy() ||
3960 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
3961 CurInst->getType()->isTokenLikeTy())
3962 return false;
3963
3964 // Don't do PRE on compares. The PHI would prevent CodeGenPrepare from
3965 // sinking the compare again, and it would force the code generator to
3966 // move the i1 from processor flags or predicate registers into a general
3967 // purpose register.
3968 if (isa<CmpInst>(CurInst))
3969 return false;
3970
3971 // Don't do PRE on GEPs. The inserted PHI would prevent CodeGenPrepare from
3972 // sinking the addressing mode computation back to its uses. Extending the
3973 // GEP's live range increases the register pressure, and therefore it can
3974 // introduce unnecessary spills.
3975 //
3976 // This doesn't prevent Load PRE. PHI translation will make the GEP available
3977 // to the load by moving it to the predecessor block if necessary.
3978 if (isa<GetElementPtrInst>(CurInst))
3979 return false;
3980
3981 if (auto *CallB = dyn_cast<CallBase>(CurInst)) {
3982 // We don't currently value number ANY inline asm calls.
3983 if (CallB->isInlineAsm())
3984 return false;
3985 }
3986
3987 uint32_t ValNo = VN.lookup(CurInst);
3988
3989 // Look for the predecessors for PRE opportunities. We're
3990 // only trying to solve the basic diamond case, where
3991 // a value is computed in the successor and one predecessor,
3992 // but not the other. We also explicitly disallow cases
3993 // where the successor is its own predecessor, because they're
3994 // more complicated to get right.
3995 unsigned NumWith = 0;
3996 unsigned NumWithout = 0;
3997 BasicBlock *PREPred = nullptr;
3998 BasicBlock *CurrentBlock = CurInst->getParent();
3999
4000 // Update the RPO numbers for this function.
4001 if (InvalidBlockRPONumbers)
4002 assignBlockRPONumber(*CurrentBlock->getParent());
4003
4005 for (BasicBlock *P : predecessors(CurrentBlock)) {
4006 // We're not interested in PRE where blocks with predecessors that are
4007 // not reachable.
4008 if (!DT->isReachableFromEntry(P)) {
4009 NumWithout = 2;
4010 break;
4011 }
4012 // It is not safe to do PRE when P->CurrentBlock is a loop backedge.
4013 assert(BlockRPONumber.count(P) && BlockRPONumber.count(CurrentBlock) &&
4014 "Invalid BlockRPONumber map.");
4015 if (BlockRPONumber[P] >= BlockRPONumber[CurrentBlock]) {
4016 NumWithout = 2;
4017 break;
4018 }
4019
4020 uint32_t TValNo = VN.phiTranslate(P, CurrentBlock, ValNo, LeaderTable);
4021 Value *PredV = findLeader(P, TValNo);
4022 if (!PredV) {
4023 PredMap.push_back(std::make_pair(static_cast<Value *>(nullptr), P));
4024 PREPred = P;
4025 ++NumWithout;
4026 } else if (PredV == CurInst) {
4027 // CurInst dominates this predecessor.
4028 NumWithout = 2;
4029 break;
4030 } else {
4031 PredMap.push_back(std::make_pair(PredV, P));
4032 ++NumWith;
4033 }
4034 }
4035
4036 // Don't do PRE when it might increase code size, i.e. when
4037 // we would need to insert instructions in more than one pred.
4038 if (NumWithout > 1 || NumWith == 0)
4039 return false;
4040
4041 // We may have a case where all predecessors have the instruction,
4042 // and we just need to insert a phi node. Otherwise, perform
4043 // insertion.
4044 Instruction *PREInstr = nullptr;
4045
4046 if (NumWithout != 0) {
4047 if (!isSafeToSpeculativelyExecute(CurInst)) {
4048 // It is only valid to insert a new instruction if the current instruction
4049 // is always executed. An instruction with implicit control flow could
4050 // prevent us from doing it. If we cannot speculate the execution, then
4051 // PRE should be prohibited.
4052 if (ICF->isDominatedByICFIFromSameBlock(CurInst))
4053 return false;
4054 }
4055
4056 // Don't do PRE across indirect branch.
4057 if (isa<IndirectBrInst>(PREPred->getTerminator()))
4058 return false;
4059
4060 // We can't do PRE safely on a critical edge, so instead we schedule
4061 // the edge to be split and perform the PRE the next time we iterate
4062 // on the function.
4063 unsigned SuccNum = GetSuccessorNumber(PREPred, CurrentBlock);
4064 if (isCriticalEdge(PREPred->getTerminator(), SuccNum)) {
4065 ToSplit.push_back(std::make_pair(PREPred->getTerminator(), SuccNum));
4066 return false;
4067 }
4068 // We need to insert somewhere, so let's give it a shot.
4069 PREInstr = CurInst->clone();
4070 if (!performScalarPREInsertion(PREInstr, PREPred, CurrentBlock, ValNo)) {
4071 // If we failed insertion, make sure we remove the instruction.
4072#ifndef NDEBUG
4073 verifyRemoved(PREInstr);
4074#endif
4075 PREInstr->deleteValue();
4076 return false;
4077 }
4078 }
4079
4080 // Either we should have filled in the PRE instruction, or we should
4081 // not have needed insertions.
4082 assert(PREInstr != nullptr || NumWithout == 0);
4083
4084 ++NumGVNPRE;
4085
4086 // Create a PHI to make the value available in this block.
4087 PHINode *Phi = PHINode::Create(CurInst->getType(), PredMap.size(),
4088 CurInst->getName() + ".pre-phi");
4089 Phi->insertBefore(CurrentBlock->begin());
4090 for (auto &[V, BB] : PredMap) {
4091 if (V) {
4092 // If we use an existing value in this phi, we have to patch the original
4093 // value because the phi will be used to replace a later value.
4094 patchReplacementInstruction(CurInst, V);
4095 Phi->addIncoming(V, BB);
4096 } else
4097 Phi->addIncoming(PREInstr, PREPred);
4098 }
4099
4100 VN.add(Phi, ValNo);
4101 // After creating a new PHI for ValNo, the phi translate result for ValNo will
4102 // be changed, so erase the related stale entries in phi translate cache.
4103 VN.eraseTranslateCacheEntry(ValNo, *CurrentBlock);
4104 LeaderTable.insert(ValNo, Phi, CurrentBlock);
4105 Phi->setDebugLoc(CurInst->getDebugLoc());
4106 CurInst->replaceAllUsesWith(Phi);
4107 if (MD && Phi->getType()->isPtrOrPtrVectorTy())
4108 MD->invalidateCachedPointerInfo(Phi);
4109 LeaderTable.erase(ValNo, CurInst, CurrentBlock);
4110
4111 LLVM_DEBUG(dbgs() << "GVN PRE removed: " << *CurInst << '\n');
4112 removeInstruction(CurInst);
4113
4114 return true;
4115}
4116
4117/// Perform a purely local form of PRE that looks for diamond
4118/// control flow patterns and attempts to perform simple PRE at the join point.
4119bool GVNPassImpl::performPRE(Function &F) {
4120 bool Changed = false;
4121 for (BasicBlock *CurrentBlock : depth_first(&F.getEntryBlock())) {
4122 // Nothing to PRE in the entry block.
4123 if (CurrentBlock == &F.getEntryBlock())
4124 continue;
4125
4126 // Don't perform PRE on an EH pad.
4127 if (CurrentBlock->isEHPad())
4128 continue;
4129
4130 for (BasicBlock::iterator BI = CurrentBlock->begin(),
4131 BE = CurrentBlock->end();
4132 BI != BE;) {
4133 Instruction *CurInst = &*BI++;
4134 Changed |= performScalarPRE(CurInst);
4135 }
4136 }
4137
4138 if (splitCriticalEdges())
4139 Changed = true;
4140
4141 return Changed;
4142}
4143
4144/// Split the critical edge connecting the given two blocks, and return
4145/// the block inserted to the critical edge.
4146BasicBlock *GVNPassImpl::splitCriticalEdges(BasicBlock *Pred,
4147 BasicBlock *Succ) {
4148 // GVN does not require loop-simplify, do not try to preserve it if it is not
4149 // possible.
4151 Pred, Succ,
4152 CriticalEdgeSplittingOptions(DT, LI, MSSAU).unsetPreserveLoopSimplify());
4153 if (BB) {
4154 if (MD)
4155 MD->invalidateCachedPredecessors();
4156 InvalidBlockRPONumbers = true;
4157 }
4158 return BB;
4159}
4160
4161/// Split critical edges found during the previous
4162/// iteration that may enable further optimization.
4163bool GVNPassImpl::splitCriticalEdges() {
4164 if (ToSplit.empty())
4165 return false;
4166
4167 bool Changed = false;
4168 do {
4169 std::pair<Instruction *, unsigned> Edge = ToSplit.pop_back_val();
4170 Changed |= SplitCriticalEdge(Edge.first, Edge.second,
4171 CriticalEdgeSplittingOptions(DT, LI, MSSAU)) !=
4172 nullptr;
4173 } while (!ToSplit.empty());
4174 if (Changed) {
4175 if (MD)
4176 MD->invalidateCachedPredecessors();
4177 InvalidBlockRPONumbers = true;
4178 }
4179 return Changed;
4180}
4181
4182/// Executes one iteration of GVN.
4183bool GVNPassImpl::iterateOnFunction(Function &F) {
4184 cleanupGlobalSets();
4185
4186 // Top-down walk of the dominator tree.
4187 bool Changed = false;
4188 // Needed for value numbering with phi construction to work.
4189 // RPOT walks the graph in its constructor and will not be invalidated during
4190 // processBlock.
4191 ReversePostOrderTraversal<Function *> RPOT(&F);
4192
4193 for (BasicBlock *BB : RPOT)
4194 Changed |= processBlock(BB);
4195
4196 return Changed;
4197}
4198
4199void GVNPassImpl::cleanupGlobalSets() {
4200 VN.clear();
4201 LeaderTable.clear();
4202 BlockRPONumber.clear();
4203 ICF->clear();
4204 InvalidBlockRPONumbers = true;
4205}
4206
4207void GVNPassImpl::removeInstruction(Instruction *I) {
4208 VN.erase(I);
4209 if (MD) MD->removeInstruction(I);
4210 if (MSSAU)
4211 MSSAU->removeMemoryAccess(I);
4212#ifndef NDEBUG
4213 verifyRemoved(I);
4214#endif
4215 ICF->removeInstruction(I);
4216 I->eraseFromParent();
4217 ++NumGVNInstr;
4218}
4219
4220/// Verify that the specified instruction does not occur in our
4221/// internal data structures.
4222void GVNPassImpl::verifyRemoved(const Instruction *Inst) const {
4223 VN.verifyRemoved(Inst);
4224}
4225
4226/// BB is declared dead, which implied other blocks become dead as well. This
4227/// function is to add all these blocks to "DeadBlocks". For the dead blocks'
4228/// live successors, update their phi nodes by replacing the operands
4229/// corresponding to dead blocks with UndefVal.
4230void GVNPassImpl::addDeadBlock(BasicBlock *BB) {
4232 SmallSetVector<BasicBlock *, 4> DF;
4233
4234 NewDead.push_back(BB);
4235 while (!NewDead.empty()) {
4236 BasicBlock *D = NewDead.pop_back_val();
4237 if (DeadBlocks.count(D))
4238 continue;
4239
4240 // All blocks dominated by D are dead.
4241 SmallVector<BasicBlock *, 8> Dom;
4242 DT->getDescendants(D, Dom);
4243 DeadBlocks.insert_range(Dom);
4244
4245 // Figure out the dominance-frontier(D).
4246 for (BasicBlock *B : Dom) {
4247 for (BasicBlock *S : successors(B)) {
4248 if (DeadBlocks.count(S))
4249 continue;
4250
4251 bool AllPredDead = true;
4252 for (BasicBlock *P : predecessors(S))
4253 if (!DeadBlocks.count(P)) {
4254 AllPredDead = false;
4255 break;
4256 }
4257
4258 if (!AllPredDead) {
4259 // S could be proved dead later on. That is why we don't update phi
4260 // operands at this moment.
4261 DF.insert(S);
4262 } else {
4263 // While S is not dominated by D, it is dead by now. This could take
4264 // place if S already have a dead predecessor before D is declared
4265 // dead.
4266 NewDead.push_back(S);
4267 }
4268 }
4269 }
4270 }
4271
4272 // For the dead blocks' live successors, update their phi nodes by replacing
4273 // the operands corresponding to dead blocks with UndefVal.
4274 for (BasicBlock *B : DF) {
4275 if (DeadBlocks.count(B))
4276 continue;
4277
4278 // First, split the critical edges. This might also create additional blocks
4279 // to preserve LoopSimplify form and adjust edges accordingly.
4281 for (BasicBlock *P : Preds) {
4282 if (!DeadBlocks.count(P))
4283 continue;
4284
4285 if (is_contained(successors(P), B) &&
4286 isCriticalEdge(P->getTerminator(), B)) {
4287 if (BasicBlock *S = splitCriticalEdges(P, B))
4288 DeadBlocks.insert(P = S);
4289 }
4290 }
4291
4292 // Now poison the incoming values from the dead predecessors.
4293 for (BasicBlock *P : predecessors(B)) {
4294 if (!DeadBlocks.count(P))
4295 continue;
4296 for (PHINode &Phi : B->phis()) {
4297 Phi.setIncomingValueForBlock(P, PoisonValue::get(Phi.getType()));
4298 if (MD)
4299 MD->invalidateCachedPointerInfo(&Phi);
4300 }
4301 }
4302 }
4303}
4304
4305// If the given branch is recognized as a foldable branch (i.e. conditional
4306// branch with constant condition), it will perform following analyses and
4307// transformation.
4308// 1) If the dead out-coming edge is a critical-edge, split it. Let
4309// R be the target of the dead out-coming edge.
4310// 1) Identify the set of dead blocks implied by the branch's dead outcoming
4311// edge. The result of this step will be {X| X is dominated by R}
4312// 2) Identify those blocks which haves at least one dead predecessor. The
4313// result of this step will be dominance-frontier(R).
4314// 3) Update the PHIs in DF(R) by replacing the operands corresponding to
4315// dead blocks with "UndefVal" in an hope these PHIs will optimized away.
4316//
4317// Return true iff *NEW* dead code are found.
4318bool GVNPassImpl::processFoldableCondBr(CondBrInst *BI) {
4319 // If a branch has two identical successors, we cannot declare either dead.
4320 if (BI->getSuccessor(0) == BI->getSuccessor(1))
4321 return false;
4322
4323 ConstantInt *Cond = dyn_cast<ConstantInt>(BI->getCondition());
4324 if (!Cond)
4325 return false;
4326
4327 BasicBlock *DeadRoot =
4328 Cond->getZExtValue() ? BI->getSuccessor(1) : BI->getSuccessor(0);
4329 if (DeadBlocks.count(DeadRoot))
4330 return false;
4331
4332 if (!DeadRoot->getSinglePredecessor())
4333 DeadRoot = splitCriticalEdges(BI->getParent(), DeadRoot);
4334
4335 addDeadBlock(DeadRoot);
4336 return true;
4337}
4338
4339// performPRE() will trigger assert if it comes across an instruction without
4340// associated val-num. As it normally has far more live instructions than dead
4341// instructions, it makes more sense just to "fabricate" a val-number for the
4342// dead code than checking if instruction involved is dead or not.
4343void GVNPassImpl::assignValNumForDeadCode() {
4344 for (BasicBlock *BB : DeadBlocks) {
4345 for (Instruction &Inst : *BB) {
4346 unsigned ValNum = VN.lookupOrAdd(&Inst);
4347 LeaderTable.insert(ValNum, &Inst, BB);
4348 }
4349 }
4350}
4351
4353public:
4354 static char ID; // Pass identification, replacement for typeid.
4355
4357 bool MemDepAnalysis = valueOr(ScalarOptions::Global.enable_gvn_memdep,
4358 true),
4359 bool MemSSAAnalysis = ScalarOptions::Global.enable_gvn_memoryssa,
4360 bool ScalarPRE = true)
4361 : FunctionPass(ID), Impl(GVNOptions()
4362 .setMemDep(MemDepAnalysis)
4363 .setMemorySSA(MemSSAAnalysis)
4364 .setScalarPRE(ScalarPRE)) {
4366 }
4367
4368 bool runOnFunction(Function &F) override {
4369 if (skipFunction(F))
4370 return false;
4371
4373 if (Impl.isMemorySSAEnabled() && !MSSAWP)
4375
4376 return Impl.run(
4377 F, getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F),
4380 getAnalysis<AAResultsWrapperPass>().getAAResults(),
4381 Impl.isMemDepEnabled()
4383 : nullptr,
4384 getAnalysis<LoopInfoWrapperPass>().getLoopInfo(),
4386 MSSAWP ? &MSSAWP->getMSSA() : nullptr);
4387 }
4388
4406
4407private:
4408 GVNPassImpl Impl;
4409};
4410
4411char GVNLegacyPass::ID = 0;
4412
4413INITIALIZE_PASS_BEGIN(GVNLegacyPass, "gvn", "Global Value Numbering", false, false)
4422INITIALIZE_PASS_END(GVNLegacyPass, "gvn", "Global Value Numbering", false, false)
4423
4424// The public interface to this file...
4427 const ScalarOptions &Opts = ScalarOptions::Global;
4428 return new GVNLegacyPass(valueOr(Opts.enable_gvn_memdep, true),
4429 Opts.enable_gvn_memoryssa, ScalarPRE);
4430}
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:3382
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:4356
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
Definition GVN.cpp:4389
static char ID
Definition GVN.cpp:4354
bool runOnFunction(Function &F) override
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
Definition GVN.cpp:4368
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:3351
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:3219
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 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:3289
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:4426
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:1677
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:841
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:922
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:942
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:3189
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:3268
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:3117
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:4425
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:1499
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