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 = nullptr;
244 llvm::GVNOptions Options;
245
246public:
247 struct AvailableValue;
249
251
252 /// This removes the specified instruction from
253 /// our various maps and marks it for deletion.
255
256 DominatorTree &getDominatorTree() const { return *DT; }
257 AAResults *getAliasAnalysis() const { return VN.getAliasAnalysis(); }
258 MemoryDependenceResults &getMemDep() const { return *MD; }
259
260 bool isScalarPREEnabled() const;
261 bool isLoadPREEnabled() const;
262 bool isLoadInLoopPREEnabled() const;
264 bool isMemDepEnabled() const;
265 bool isMemorySSAEnabled() const;
266
267private:
268 friend class GVNPass;
269 friend class ::GVNLegacyPass;
270
271 MemoryDependenceResults *MD = nullptr;
272 DominatorTree *DT = nullptr;
273 const TargetLibraryInfo *TLI = nullptr;
274 AssumptionCache *AC = nullptr;
275 SetVector<BasicBlock *> DeadBlocks;
276 OptimizationRemarkEmitter *ORE = nullptr;
277 ImplicitControlFlowTracking *ICF = nullptr;
278 LoopInfo *LI = nullptr;
279 AAResults *AA = nullptr;
280 MemorySSAUpdater *MSSAU = nullptr;
281 EarliestEscapeAnalysis *EA = 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 Impl->Opts = &F.getContext().getLibraryOptions().get<ScalarOptions>();
1174 auto &AC = AM.getResult<AssumptionAnalysis>(F);
1175 auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
1176 auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
1177 auto &AA = AM.getResult<AAManager>(F);
1178 auto *MemDep = Impl->isMemDepEnabled()
1179 ? &AM.getResult<MemoryDependenceAnalysis>(F)
1180 : nullptr;
1181 auto &LI = AM.getResult<LoopAnalysis>(F);
1182 auto *MSSA = AM.getCachedResult<MemorySSAAnalysis>(F);
1183 if (Impl->isMemorySSAEnabled() && !MSSA) {
1184 assert(!MemDep &&
1185 "On-demand computation of MemSSA implies that MemDep is disabled!");
1186 MSSA = &AM.getResult<MemorySSAAnalysis>(F);
1187 }
1188 auto &ORE = AM.getResult<OptimizationRemarkEmitterAnalysis>(F);
1189 bool Changed = Impl->run(F, AC, DT, TLI, AA, MemDep, LI, &ORE,
1190 MSSA ? &MSSA->getMSSA() : nullptr);
1191 if (!Changed)
1192 return PreservedAnalyses::all();
1196 if (MSSA)
1198 PA.preserve<LoopAnalysis>();
1199 return PA;
1200}
1201
1203 salvageKnowledge(I, AC);
1205 removeInstruction(I);
1206}
1207
1209 raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
1210 static_cast<PassInfoMixin<GVNPass> *>(this)->printPipeline(
1211 OS, MapClassName2PassName);
1212
1213 const GVNOptions &Options = Impl->Options;
1214 OS << '<';
1215 if (Options.AllowScalarPRE != std::nullopt)
1216 OS << (*Options.AllowScalarPRE ? "" : "no-") << "scalar-pre;";
1217 if (Options.AllowLoadPRE != std::nullopt)
1218 OS << (*Options.AllowLoadPRE ? "" : "no-") << "load-pre;";
1219 if (Options.AllowLoadPRESplitBackedge != std::nullopt)
1220 OS << (*Options.AllowLoadPRESplitBackedge ? "" : "no-")
1221 << "split-backedge-load-pre;";
1222 if (Options.AllowMemDep != std::nullopt)
1223 OS << (*Options.AllowMemDep ? "" : "no-") << "memdep;";
1224 if (Options.AllowMemorySSA != std::nullopt)
1225 OS << (*Options.AllowMemorySSA ? "" : "no-") << "memoryssa";
1226 OS << '>';
1227}
1228
1229enum class AvailabilityState : char {
1230 /// We know the block *is not* fully available. This is a fixpoint.
1232 /// We know the block *is* fully available. This is a fixpoint.
1234 /// We do not know whether the block is fully available or not,
1235 /// but we are currently speculating that it will be.
1236 /// If it would have turned out that the block was, in fact, not fully
1237 /// available, this would have been cleaned up into an Unavailable.
1239};
1240
1241/// Return true if we can prove that the value
1242/// we're analyzing is fully available in the specified block. As we go, keep
1243/// track of which blocks we know are fully alive in FullyAvailableBlocks. This
1244/// map is actually a tri-state map with the following values:
1245/// 0) we know the block *is not* fully available.
1246/// 1) we know the block *is* fully available.
1247/// 2) we do not know whether the block is fully available or not, but we are
1248/// currently speculating that it will be.
1250 const ScalarOptions &Opts, BasicBlock *BB,
1251 DenseMap<BasicBlock *, AvailabilityState> &FullyAvailableBlocks) {
1253 std::optional<BasicBlock *> UnavailableBB;
1254
1255 // The number of times we didn't find an entry for a block in a map and
1256 // optimistically inserted an entry marking block as speculatively available.
1257 unsigned NumNewNewSpeculativelyAvailableBBs = 0;
1258
1259#ifndef NDEBUG
1260 SmallPtrSet<BasicBlock *, 32> NewSpeculativelyAvailableBBs;
1261 SmallVector<BasicBlock *, 32> AvailableBBs;
1262#endif
1263
1264 Worklist.emplace_back(BB);
1265 while (!Worklist.empty()) {
1266 BasicBlock *CurrBB = Worklist.pop_back_val(); // LoadFO - depth-first!
1267 // Optimistically assume that the block is Speculatively Available and check
1268 // to see if we already know about this block in one lookup.
1269 std::pair<DenseMap<BasicBlock *, AvailabilityState>::iterator, bool> IV =
1270 FullyAvailableBlocks.try_emplace(
1272 AvailabilityState &State = IV.first->second;
1273
1274 // Did the entry already exist for this block?
1275 if (!IV.second) {
1276 if (State == AvailabilityState::Unavailable) {
1277 UnavailableBB = CurrBB;
1278 break; // Backpropagate unavailability info.
1279 }
1280
1281#ifndef NDEBUG
1282 AvailableBBs.emplace_back(CurrBB);
1283#endif
1284 continue; // Don't recurse further, but continue processing worklist.
1285 }
1286
1287 // No entry found for block.
1288 ++NumNewNewSpeculativelyAvailableBBs;
1289 bool OutOfBudget =
1290 NumNewNewSpeculativelyAvailableBBs > Opts.gvn_max_block_speculations;
1291
1292 // If we have exhausted our budget, mark this block as unavailable.
1293 // Also, if this block has no predecessors, the value isn't live-in here.
1294 if (OutOfBudget || pred_empty(CurrBB)) {
1295 MaxBBSpeculationCutoffReachedTimes += (int)OutOfBudget;
1297 UnavailableBB = CurrBB;
1298 break; // Backpropagate unavailability info.
1299 }
1300
1301 // Tentatively consider this block as speculatively available.
1302#ifndef NDEBUG
1303 NewSpeculativelyAvailableBBs.insert(CurrBB);
1304#endif
1305 // And further recurse into block's predecessors, in depth-first order!
1306 Worklist.append(pred_begin(CurrBB), pred_end(CurrBB));
1307 }
1308
1309#if LLVM_ENABLE_STATS
1310 IsValueFullyAvailableInBlockNumSpeculationsMax.updateMax(
1311 NumNewNewSpeculativelyAvailableBBs);
1312#endif
1313
1314 // If the block isn't marked as fixpoint yet
1315 // (the Unavailable and Available states are fixpoints).
1316 auto MarkAsFixpointAndEnqueueSuccessors =
1317 [&](BasicBlock *BB, AvailabilityState FixpointState) {
1318 auto It = FullyAvailableBlocks.find(BB);
1319 if (It == FullyAvailableBlocks.end())
1320 return; // Never queried this block, leave as-is.
1321 switch (AvailabilityState &State = It->second) {
1324 return; // Don't backpropagate further, continue processing worklist.
1326 State = FixpointState;
1327#ifndef NDEBUG
1328 assert(NewSpeculativelyAvailableBBs.erase(BB) &&
1329 "Found a speculatively available successor leftover?");
1330#endif
1331 // Queue successors for further processing.
1332 Worklist.append(succ_begin(BB), succ_end(BB));
1333 return;
1334 }
1335 };
1336
1337 if (UnavailableBB) {
1338 // Okay, we have encountered an unavailable block.
1339 // Mark speculatively available blocks reachable from UnavailableBB as
1340 // unavailable as well. Paths are terminated when they reach blocks not in
1341 // FullyAvailableBlocks or they are not marked as speculatively available.
1342 Worklist.clear();
1343 Worklist.append(succ_begin(*UnavailableBB), succ_end(*UnavailableBB));
1344 while (!Worklist.empty())
1345 MarkAsFixpointAndEnqueueSuccessors(Worklist.pop_back_val(),
1347 }
1348
1349#ifndef NDEBUG
1350 Worklist.clear();
1351 for (BasicBlock *AvailableBB : AvailableBBs)
1352 Worklist.append(succ_begin(AvailableBB), succ_end(AvailableBB));
1353 while (!Worklist.empty())
1354 MarkAsFixpointAndEnqueueSuccessors(Worklist.pop_back_val(),
1356
1357 assert(NewSpeculativelyAvailableBBs.empty() &&
1358 "Must have fixed all the new speculatively available blocks.");
1359#endif
1360
1361 return !UnavailableBB;
1362}
1363
1366
1367/// If the specified OldValue exists in ValuesPerBlock, replace its value with
1368/// NewValue.
1370 SmallVectorImpl<AvailableValueInBlock> &ValuesPerBlock, Value *OldValue,
1371 Value *NewValue) {
1372 for (AvailableValueInBlock &V : ValuesPerBlock) {
1373 if (V.AV.Val == OldValue)
1374 V.AV.Val = NewValue;
1375 if (V.AV.isSelectValue()) {
1376 if (V.AV.V1 == OldValue)
1377 V.AV.V1 = NewValue;
1378 if (V.AV.V2 == OldValue)
1379 V.AV.V2 = NewValue;
1380 }
1381 }
1382}
1383
1384/// Given a set of loads specified by ValuesPerBlock,
1385/// construct SSA form, allowing us to eliminate Load. This returns the value
1386/// that should be used at Load's definition site.
1387static Value *
1390 DominatorTree &DT) {
1391 // Check for the fully redundant, dominating load case. In this case, we can
1392 // just use the dominating value directly.
1393 if (ValuesPerBlock.size() == 1 &&
1394 DT.properlyDominates(ValuesPerBlock[0].BB, Load->getParent())) {
1395 assert(!ValuesPerBlock[0].AV.isUndefValue() &&
1396 "Dead BB dominate this block");
1397 return ValuesPerBlock[0].MaterializeAdjustedValue(Load);
1398 }
1399
1400 // Otherwise, we have to construct SSA form.
1402 SSAUpdater SSAUpdate(&NewPHIs);
1403 SSAUpdate.Initialize(Load->getType(), Load->getName());
1404
1405 for (const AvailableValueInBlock &AV : ValuesPerBlock) {
1406 BasicBlock *BB = AV.BB;
1407
1408 if (AV.AV.isUndefValue())
1409 continue;
1410
1411 if (SSAUpdate.HasValueForBlock(BB))
1412 continue;
1413
1414 // If the value is the load that we will be eliminating, and the block it's
1415 // available in is the block that the load is in, then don't add it as
1416 // SSAUpdater will resolve the value to the relevant phi which may let it
1417 // avoid phi construction entirely if there's actually only one value.
1418 if (BB == Load->getParent() &&
1419 ((AV.AV.isSimpleValue() && AV.AV.getSimpleValue() == Load) ||
1420 (AV.AV.isCoercedLoadValue() && AV.AV.getCoercedLoadValue() == Load)))
1421 continue;
1422
1423 SSAUpdate.AddAvailableValue(BB, AV.MaterializeAdjustedValue(Load));
1424 }
1425
1426 // Perform PHI construction.
1427 return SSAUpdate.GetValueInMiddleOfBlock(Load->getParent());
1428}
1429
1431 Instruction *InsertPt) const {
1432 Value *Res;
1433 Type *LoadTy = Load->getType();
1434 const DataLayout &DL = Load->getDataLayout();
1435 if (isSimpleValue()) {
1436 Res = getSimpleValue();
1437 if (Res->getType() != LoadTy) {
1438 Res = getValueForLoad(Res, Offset, LoadTy, InsertPt, Load->getFunction());
1439
1440 LLVM_DEBUG(dbgs() << "GVN COERCED NONLOCAL VAL:\nOffset: " << Offset
1441 << " " << *getSimpleValue() << '\n'
1442 << *Res << '\n'
1443 << "\n\n\n");
1444 }
1445 } else if (isCoercedLoadValue()) {
1446 LoadInst *CoercedLoad = getCoercedLoadValue();
1447 if (CoercedLoad->getType() == LoadTy && Offset == 0) {
1448 Res = CoercedLoad;
1449 combineMetadataForCSE(CoercedLoad, Load, false);
1450 } else {
1451 Res = getValueForLoad(CoercedLoad, Offset, LoadTy, InsertPt,
1452 Load->getFunction());
1453 // We are adding a new user for this load, for which the original
1454 // metadata may not hold. Additionally, the new load may have a different
1455 // size and type, so their metadata cannot be combined in any
1456 // straightforward way.
1457 // Drop all metadata that is not known to cause immediate UB on violation,
1458 // unless the load has !noundef, in which case all metadata violations
1459 // will be promoted to UB.
1460 // !noalias and !alias.scope are kept: the load is not moved and still
1461 // accesses the same memory, and these are independent of the load type
1462 // and offset, so they remain valid for the coerced result.
1463 if (!CoercedLoad->hasMetadata(LLVMContext::MD_noundef))
1464 CoercedLoad->dropUnknownNonDebugMetadata(
1465 {LLVMContext::MD_dereferenceable,
1466 LLVMContext::MD_dereferenceable_or_null,
1467 LLVMContext::MD_invariant_load, LLVMContext::MD_invariant_group,
1468 LLVMContext::MD_alias_scope, LLVMContext::MD_noalias});
1469 LLVM_DEBUG(dbgs() << "GVN COERCED NONLOCAL LOAD:\nOffset: " << Offset
1470 << " " << *getCoercedLoadValue() << '\n'
1471 << *Res << '\n'
1472 << "\n\n\n");
1473 }
1474 } else if (isMemIntrinValue()) {
1476 InsertPt, DL);
1477 LLVM_DEBUG(dbgs() << "GVN COERCED NONLOCAL MEM INTRIN:\nOffset: " << Offset
1478 << " " << *getMemIntrinValue() << '\n'
1479 << *Res << '\n'
1480 << "\n\n\n");
1481 } else if (isSelectValue()) {
1482 // Introduce a new value select for a load from an eligible pointer select.
1483 SelectInst *Sel = getSelectInstr();
1484 assert(V1 && V2 && "both value operands of the select must be present");
1485 Res = SelectInst::Create(Sel->getCondition(), V1, V2, "",
1486 InsertPt->getIterator(),
1487 ProfcheckDisableMetadataFixes ? nullptr : Sel);
1488 // We use the DebugLoc from the original load here, as this instruction
1489 // materializes the value that would previously have been loaded.
1490 cast<SelectInst>(Res)->setDebugLoc(Load->getDebugLoc());
1491 } else {
1492 llvm_unreachable("Should not materialize value from dead block");
1493 }
1494 assert(Res && "failed to materialize?");
1495 return Res;
1496}
1497
1498static bool isLifetimeStart(const Instruction *Inst) {
1499 if (const IntrinsicInst* II = dyn_cast<IntrinsicInst>(Inst))
1500 return II->getIntrinsicID() == Intrinsic::lifetime_start;
1501 return false;
1502}
1503
1504/// Assuming To can be reached from both From and Between, does Between lie on
1505/// every path from From to To?
1506static bool liesBetween(const Instruction *From, Instruction *Between,
1507 const Instruction *To, const DominatorTree *DT) {
1508 if (From->getParent() == Between->getParent())
1509 return DT->dominates(From, Between);
1511 Exclusion.insert(Between->getParent());
1512 return !isPotentiallyReachable(From, To, &Exclusion, DT);
1513}
1514
1516 const DominatorTree *DT) {
1517 Value *PtrOp = Load->getPointerOperand();
1518 if (!PtrOp->hasUseList())
1519 return nullptr;
1520
1521 Instruction *OtherAccess = nullptr;
1522
1523 for (auto *U : PtrOp->users()) {
1524 if (U != Load && (isa<LoadInst>(U) || isa<StoreInst>(U))) {
1525 auto *I = cast<Instruction>(U);
1526 if (I->getFunction() == Load->getFunction() && DT->dominates(I, Load)) {
1527 // Use the most immediately dominating value.
1528 if (OtherAccess) {
1529 if (DT->dominates(OtherAccess, I))
1530 OtherAccess = I;
1531 else
1532 assert(U == OtherAccess || DT->dominates(I, OtherAccess));
1533 } else
1534 OtherAccess = I;
1535 }
1536 }
1537 }
1538
1539 if (OtherAccess)
1540 return OtherAccess;
1541
1542 // There is no dominating use, check if we can find a closest non-dominating
1543 // use that lies between any other potentially available use and Load.
1544 for (auto *U : PtrOp->users()) {
1545 if (U != Load && (isa<LoadInst>(U) || isa<StoreInst>(U))) {
1546 auto *I = cast<Instruction>(U);
1547 if (I->getFunction() == Load->getFunction() &&
1548 isPotentiallyReachable(I, Load, nullptr, DT)) {
1549 if (OtherAccess) {
1550 if (liesBetween(OtherAccess, I, Load, DT)) {
1551 OtherAccess = I;
1552 } else if (!liesBetween(I, OtherAccess, Load, DT)) {
1553 // These uses are both partially available at Load were it not for
1554 // the clobber, but neither lies strictly after the other.
1555 OtherAccess = nullptr;
1556 break;
1557 } // else: keep current OtherAccess since it lies between U and
1558 // Load.
1559 } else {
1560 OtherAccess = I;
1561 }
1562 }
1563 }
1564 }
1565
1566 return OtherAccess;
1567}
1568
1569/// Try to locate the three instruction involved in a missed
1570/// load-elimination case that is due to an intervening store.
1572 const DominatorTree *DT,
1574 using namespace ore;
1575
1576 OptimizationRemarkMissed R(DEBUG_TYPE, "LoadClobbered", Load);
1577 R << "load of type " << NV("Type", Load->getType()) << " not eliminated"
1578 << setExtraArgs();
1579
1580 const Instruction *OtherAccess = findMayClobberedPtrAccess(Load, DT);
1581 if (OtherAccess)
1582 R << " in favor of " << NV("OtherAccess", OtherAccess);
1583
1584 R << " because it is clobbered by " << NV("ClobberedBy", DepInst);
1585
1586 ORE->emit(R);
1587}
1588
1589// Find a dominating value for Loc memory location in the extended basic block
1590// (chain of basic blocks with single predecessors) starting From instruction.
1591// Returns the value from a matching load or a simple store to the same pointer.
1592static Value *findDominatingValue(const ScalarOptions &Opts,
1593 const MemoryLocation &Loc, Type *LoadTy,
1594 Instruction *From, AAResults *AA) {
1595 uint32_t NumVisitedInsts = 0;
1596 BasicBlock *FromBB = From->getParent();
1597 BatchAAResults BatchAA(*AA);
1598 for (BasicBlock *BB = FromBB; BB; BB = BB->getSinglePredecessor())
1599 for (auto *Inst = BB == FromBB ? From : BB->getTerminator();
1600 Inst != nullptr; Inst = Inst->getPrevNode()) {
1601 // Stop the search if limit is reached.
1602 if (++NumVisitedInsts > Opts.gvn_max_num_visited_insts)
1603 return nullptr;
1604 if (isModSet(BatchAA.getModRefInfo(Inst, Loc))) {
1605 // A simple store to the exact location can forward its value.
1606 if (auto *SI = dyn_cast<StoreInst>(Inst))
1607 if (SI->isSimple() && SI->getPointerOperand() == Loc.Ptr &&
1608 SI->getValueOperand()->getType() == LoadTy)
1609 return SI->getValueOperand();
1610 return nullptr;
1611 }
1612 if (auto *LI = dyn_cast<LoadInst>(Inst))
1613 if (LI->getPointerOperand() == Loc.Ptr && LI->getType() == LoadTy)
1614 return LI;
1615 }
1616 return nullptr;
1617}
1618
1619std::optional<AvailableValue>
1620GVNPassImpl::analyzeSelectAvailability(LoadInst *Load, SelectInst *Sel,
1621 Value *TrueAddr, Value *FalseAddr,
1622 Instruction *From) {
1623 assert(TrueAddr->getType() == Load->getPointerOperandType() &&
1624 "Invalid address type of true side of select dependency");
1625 assert(FalseAddr->getType() == Load->getPointerOperandType() &&
1626 "Invalid address type of false side of select dependency");
1627 // We can convert a load through a select address into a select of the two
1628 // loaded values only if both sides have a dominating, non-clobbered value of
1629 // the right type in the extended basic block ending at From.
1630 auto Loc = MemoryLocation::get(Load);
1631 Value *V1 = findDominatingValue(*Opts, Loc.getWithNewPtr(TrueAddr),
1632 Load->getType(), From, getAliasAnalysis());
1633 if (!V1)
1634 return std::nullopt;
1635 Value *V2 = findDominatingValue(*Opts, Loc.getWithNewPtr(FalseAddr),
1636 Load->getType(), From, getAliasAnalysis());
1637 if (!V2)
1638 return std::nullopt;
1639 return AvailableValue::getSelect(Sel, V1, V2);
1640}
1641
1642std::optional<AvailableValue>
1643GVNPassImpl::analyzeLoadAvailability(LoadInst *Load, const ReachingMemVal &Dep,
1644 Value *Address) {
1645 assert(Load->isUnordered() && "rules below are incorrect for ordered access");
1646 assert((Dep.Kind == DepKind::Def || Dep.Kind == DepKind::Clobber) &&
1647 "expected a local dependence");
1648
1649 Instruction *DepInst = Dep.Inst;
1650
1651 const DataLayout &DL = Load->getDataLayout();
1652 if (Dep.Kind == DepKind::Clobber) {
1653 // If the dependence is to a store that writes to a superset of the bits
1654 // read by the load, we can extract the bits we need for the load from the
1655 // stored value.
1656 if (StoreInst *DepSI = dyn_cast<StoreInst>(DepInst)) {
1657 // Can't forward from non-atomic to atomic without violating memory model.
1658 if (Address && Load->isAtomic() <= DepSI->isAtomic()) {
1659 int Offset =
1660 analyzeLoadFromClobberingStore(Load->getType(), Address, DepSI, DL);
1661 if (Offset != -1)
1662 return AvailableValue::get(DepSI->getValueOperand(), Offset);
1663 }
1664 }
1665
1666 // Check to see if we have something like this:
1667 // load i32* P
1668 // load i8* (P+1)
1669 // if we have this, replace the later with an extraction from the former.
1670 if (LoadInst *DepLoad = dyn_cast<LoadInst>(DepInst)) {
1671 // If this is a clobber and L is the first instruction in its block, then
1672 // we have the first instruction in the entry block.
1673 // Can't forward from non-atomic to atomic without violating memory model.
1674 if (DepLoad != Load && Address &&
1675 Load->isAtomic() <= DepLoad->isAtomic()) {
1676 Type *LoadType = Load->getType();
1677 int Offset = Dep.Offset;
1678
1679 if (!isMemorySSAEnabled()) {
1680 // If MD reported clobber, check it was nested.
1681 if (canCoerceMustAliasedValueToLoad(DepLoad, LoadType,
1682 DepLoad->getFunction())) {
1683 const auto ClobberOff = MD->getClobberOffset(DepLoad);
1684 // GVN has no deal with a negative offset.
1685 Offset = (ClobberOff == std::nullopt || *ClobberOff < 0)
1686 ? -1
1687 : *ClobberOff;
1688 }
1689 } else {
1690 if (!canCoerceMustAliasedValueToLoad(DepLoad, LoadType,
1691 DepLoad->getFunction()) ||
1692 Offset < 0)
1693 Offset = -1;
1694 }
1695 if (Offset == -1)
1696 Offset =
1697 analyzeLoadFromClobberingLoad(LoadType, Address, DepLoad, DL);
1698 if (Offset != -1)
1699 return AvailableValue::getLoad(DepLoad, Offset);
1700 }
1701 }
1702
1703 // If the clobbering value is a memset/memcpy/memmove, see if we can
1704 // forward a value on from it.
1705 if (MemIntrinsic *DepMI = dyn_cast<MemIntrinsic>(DepInst)) {
1706 if (Address && !Load->isAtomic()) {
1708 DepMI, DL);
1709 if (Offset != -1)
1710 return AvailableValue::getMI(DepMI, Offset);
1711 }
1712 }
1713
1714 // Nothing known about this clobber, have to be conservative.
1715 LLVM_DEBUG(
1716 // fast print dep, using operator<< on instruction is too slow.
1717 dbgs() << "GVN: load "; Load->printAsOperand(dbgs());
1718 dbgs() << " is clobbered by " << *DepInst << '\n';);
1719 if (ORE->allowExtraAnalysis(DEBUG_TYPE))
1720 reportMayClobberedLoad(Load, DepInst, DT, ORE);
1721
1722 return std::nullopt;
1723 }
1724 assert(Dep.Kind == DepKind::Def && "follows from above");
1725
1726 // Loading the alloca -> undef.
1727 // Loading immediately after lifetime begin -> undef.
1728 if (isa<AllocaInst>(DepInst) || isLifetimeStart(DepInst))
1729 return AvailableValue::get(UndefValue::get(Load->getType()));
1730
1731 if (Constant *InitVal =
1732 getInitialValueOfAllocation(DepInst, TLI, Load->getType()))
1733 return AvailableValue::get(InitVal);
1734
1735 if (StoreInst *S = dyn_cast<StoreInst>(DepInst)) {
1736 // Reject loads and stores that are to the same address but are of
1737 // different types if we have to. If the stored value is convertable to
1738 // the loaded value, we can reuse it.
1739 if (!canCoerceMustAliasedValueToLoad(S->getValueOperand(), Load->getType(),
1740 S->getFunction()))
1741 return std::nullopt;
1742
1743 // Can't forward from non-atomic to atomic without violating memory model.
1744 if (S->isAtomic() < Load->isAtomic())
1745 return std::nullopt;
1746
1747 return AvailableValue::get(S->getValueOperand());
1748 }
1749
1750 if (LoadInst *LD = dyn_cast<LoadInst>(DepInst)) {
1751 // If the types mismatch and we can't handle it, reject reuse of the load.
1752 // If the stored value is larger or equal to the loaded value, we can reuse
1753 // it.
1754 if (!canCoerceMustAliasedValueToLoad(LD, Load->getType(),
1755 LD->getFunction()))
1756 return std::nullopt;
1757
1758 // Can't forward from non-atomic to atomic without violating memory model.
1759 if (LD->isAtomic() < Load->isAtomic())
1760 return std::nullopt;
1761
1762 return AvailableValue::getLoad(LD);
1763 }
1764
1765 // Check if load with Addr dependent from select can be converted to select
1766 // between load values. There must be no instructions between the found
1767 // loads and DepInst that may clobber the loads.
1768 if (auto *Sel = dyn_cast<SelectInst>(DepInst)) {
1769 assert(Sel->getType() == Load->getPointerOperandType());
1770 if (auto AV = analyzeSelectAvailability(Load, Sel, Sel->getTrueValue(),
1771 Sel->getFalseValue(), DepInst))
1772 return AV;
1773 return std::nullopt;
1774 }
1775
1776 // Unknown def - must be conservative.
1777 LLVM_DEBUG(
1778 // fast print dep, using operator<< on instruction is too slow.
1779 dbgs() << "GVN: load "; Load->printAsOperand(dbgs());
1780 dbgs() << " has unknown def " << *DepInst << '\n';);
1781 return std::nullopt;
1782}
1783
1784void GVNPassImpl::analyzeLoadAvailability(LoadInst *Load,
1786 AvailValInBlkVect &ValuesPerBlock,
1787 UnavailBlkVect &UnavailableBlocks) {
1788 // Filter out useless results (non-locals, etc). Keep track of the blocks
1789 // where we have a value available in repl, also keep track of whether we see
1790 // dependencies that produce an unknown value for the load (such as a call
1791 // that could potentially clobber the load).
1792 for (const auto &Dep : Deps) {
1793 BasicBlock *DepBB = Dep.Block;
1794
1795 if (DeadBlocks.count(DepBB)) {
1796 // Dead dependent mem-op disguise as a load evaluating the same value
1797 // as the load in question.
1798 ValuesPerBlock.push_back(AvailableValueInBlock::getUndef(DepBB));
1799 continue;
1800 }
1801
1802 if (Dep.Kind == DepKind::Other) {
1803 UnavailableBlocks.push_back(DepBB);
1804 continue;
1805 }
1806
1807 // The load address is a select in this block: try to rematerialize the
1808 // load as a select of the two reaching values (one per side). The values
1809 // are searched for at the end of DepBB.
1810 if (Dep.Kind == DepKind::Select) {
1811 if (auto AV = analyzeSelectAvailability(
1812 Load, Dep.Sel, const_cast<Value *>(Dep.SelTrueAddr),
1813 const_cast<Value *>(Dep.SelFalseAddr), DepBB->getTerminator())) {
1814 ValuesPerBlock.push_back(
1815 AvailableValueInBlock::get(DepBB, std::move(*AV)));
1816 } else {
1817 UnavailableBlocks.push_back(DepBB);
1818 }
1819 continue;
1820 }
1821
1822 // The address being loaded in this non-local block may not be the same as
1823 // the pointer operand of the load if PHI translation occurs. Make sure
1824 // to consider the right address.
1825 if (auto AV =
1826 analyzeLoadAvailability(Load, Dep, const_cast<Value *>(Dep.Addr))) {
1827 // subtlety: because we know this was a non-local dependency, we know
1828 // it's safe to materialize anywhere between the instruction within
1829 // DepInfo and the end of it's block.
1830 ValuesPerBlock.push_back(
1831 AvailableValueInBlock::get(DepBB, std::move(*AV)));
1832 } else {
1833 UnavailableBlocks.push_back(DepBB);
1834 }
1835 }
1836
1837 assert(Deps.size() == ValuesPerBlock.size() + UnavailableBlocks.size() &&
1838 "post condition violation");
1839}
1840
1841/// Given the following code, v1 is partially available on some edges, but not
1842/// available on the edge from PredBB. This function tries to find if there is
1843/// another identical load in the other successor of PredBB.
1844///
1845/// v0 = load %addr
1846/// br %LoadBB
1847///
1848/// LoadBB:
1849/// v1 = load %addr
1850/// ...
1851///
1852/// PredBB:
1853/// ...
1854/// br %cond, label %LoadBB, label %SuccBB
1855///
1856/// SuccBB:
1857/// v2 = load %addr
1858/// ...
1859///
1860LoadInst *GVNPassImpl::findLoadToHoistIntoPred(BasicBlock *Pred,
1861 BasicBlock *LoadBB,
1862 LoadInst *Load) {
1863 // For simplicity we handle a Pred has 2 successors only.
1864 auto *Term = Pred->getTerminator();
1865 if (Term->getNumSuccessors() != 2 || Term->isSpecialTerminator())
1866 return nullptr;
1867 auto *SuccBB = Term->getSuccessor(0);
1868 if (SuccBB == LoadBB)
1869 SuccBB = Term->getSuccessor(1);
1870 if (!SuccBB->getSinglePredecessor())
1871 return nullptr;
1872
1873 unsigned int NumInsts = Opts->gvn_max_num_insns;
1874 for (Instruction &Inst : *SuccBB) {
1875 if (isa<PseudoProbeInst>(Inst))
1876 continue;
1877 if (--NumInsts == 0)
1878 return nullptr;
1879
1880 if (!Inst.isIdenticalTo(Load))
1881 continue;
1882
1883 bool HasLocalDep = true;
1884 if (!isMemorySSAEnabled()) {
1885 MemDepResult Dep = MD->getDependency(&Inst);
1886 HasLocalDep = !Dep.isNonLocal();
1887 } else {
1888 auto *MSSA = MSSAU->getMemorySSA();
1889 // Do not hoist if the identical load has ordering constraint.
1890 if (auto *MA = MSSA->getMemoryAccess(&Inst); MA && isa<MemoryUse>(MA)) {
1891 auto *Clobber = MSSA->getWalker()->getClobberingMemoryAccess(MA);
1892 HasLocalDep = Clobber->getBlock() == SuccBB;
1893 }
1894 }
1895
1896 // If an identical load doesn't depends on any local instructions, it can
1897 // be safely moved to PredBB.
1898 // Also check for the implicit control flow instructions. See the comments
1899 // in performLoadPRE for details.
1900 if (!HasLocalDep && !ICF->isDominatedByICFIFromSameBlock(&Inst))
1901 return cast<LoadInst>(&Inst);
1902
1903 // Otherwise there is something in the same BB clobbers the memory, we can't
1904 // move this and later load to PredBB.
1905 return nullptr;
1906 }
1907
1908 return nullptr;
1909}
1910
1911void GVNPassImpl::eliminatePartiallyRedundantLoad(
1912 LoadInst *Load, AvailValInBlkVect &ValuesPerBlock,
1913 MapVector<BasicBlock *, Value *> &AvailableLoads,
1914 MapVector<BasicBlock *, LoadInst *> *CriticalEdgePredAndLoad) {
1915 for (const auto &AvailableLoad : AvailableLoads) {
1916 BasicBlock *UnavailableBlock = AvailableLoad.first;
1917 Value *LoadPtr = AvailableLoad.second;
1918
1919 auto *NewLoad =
1920 new LoadInst(Load->getType(), LoadPtr, Load->getName() + ".pre",
1921 Load->getProperties(),
1922 UnavailableBlock->getTerminator()->getIterator());
1923 NewLoad->setDebugLoc(Load->getDebugLoc());
1924 if (MSSAU) {
1925 auto *NewAccess = MSSAU->createMemoryAccessInBB(
1926 NewLoad, nullptr, NewLoad->getParent(), MemorySSA::BeforeTerminator);
1927 if (auto *NewDef = dyn_cast<MemoryDef>(NewAccess))
1928 MSSAU->insertDef(NewDef, /*RenameUses=*/true);
1929 else
1930 MSSAU->insertUse(cast<MemoryUse>(NewAccess), /*RenameUses=*/true);
1931 }
1932
1933 // Transfer the old load's AA tags to the new load.
1934 AAMDNodes Tags = Load->getAAMetadata();
1935 if (Tags)
1936 NewLoad->setAAMetadata(Tags);
1937
1938 if (auto *MD = Load->getMetadata(LLVMContext::MD_invariant_load))
1939 NewLoad->setMetadata(LLVMContext::MD_invariant_load, MD);
1940 if (auto *InvGroupMD = Load->getMetadata(LLVMContext::MD_invariant_group))
1941 NewLoad->setMetadata(LLVMContext::MD_invariant_group, InvGroupMD);
1942 if (auto *RangeMD = Load->getMetadata(LLVMContext::MD_range))
1943 NewLoad->setMetadata(LLVMContext::MD_range, RangeMD);
1944 if (auto *NoFPClassMD = Load->getMetadata(LLVMContext::MD_nofpclass))
1945 NewLoad->setMetadata(LLVMContext::MD_nofpclass, NoFPClassMD);
1946
1947 if (auto *AccessMD = Load->getMetadata(LLVMContext::MD_access_group))
1948 if (LI->getLoopFor(Load->getParent()) == LI->getLoopFor(UnavailableBlock))
1949 NewLoad->setMetadata(LLVMContext::MD_access_group, AccessMD);
1950
1951 // We do not propagate the old load's debug location, because the new
1952 // load now lives in a different BB, and we want to avoid a jumpy line
1953 // table.
1954 // FIXME: How do we retain source locations without causing poor debugging
1955 // behavior?
1956
1957 // Add the newly created load.
1958 ValuesPerBlock.push_back(
1959 AvailableValueInBlock::get(UnavailableBlock, NewLoad));
1960 if (MD)
1961 MD->invalidateCachedPointerInfo(LoadPtr);
1962 LLVM_DEBUG(dbgs() << "GVN INSERTED " << *NewLoad << '\n');
1963
1964 // For PredBB in CriticalEdgePredAndLoad we need to replace the uses of old
1965 // load instruction with the new created load instruction.
1966 if (CriticalEdgePredAndLoad) {
1967 auto It = CriticalEdgePredAndLoad->find(UnavailableBlock);
1968 if (It != CriticalEdgePredAndLoad->end()) {
1969 ++NumPRELoadMoved2CEPred;
1970 ICF->insertInstructionTo(NewLoad, UnavailableBlock);
1971 LoadInst *OldLoad = It->second;
1972 combineMetadataForCSE(NewLoad, OldLoad, /*DoesKMove=*/true);
1973 OldLoad->replaceAllUsesWith(NewLoad);
1974 replaceValuesPerBlockEntry(ValuesPerBlock, OldLoad, NewLoad);
1975 if (uint32_t ValNo = VN.lookup(OldLoad, false))
1976 LeaderTable.erase(ValNo, OldLoad, OldLoad->getParent());
1977 removeInstruction(OldLoad);
1978 }
1979 }
1980 }
1981
1982 // Perform PHI construction.
1983 Value *V = constructSSAForLoadSet(Load, ValuesPerBlock, getDominatorTree());
1984 // constructSSAForLoadSet is responsible for combining metadata.
1985 ICF->removeUsersOf(Load);
1986 Load->replaceAllUsesWith(V);
1987 if (isa<PHINode>(V))
1988 V->takeName(Load);
1989 if (Instruction *I = dyn_cast<Instruction>(V))
1990 I->setDebugLoc(Load->getDebugLoc());
1991 if (MD && V->getType()->isPtrOrPtrVectorTy())
1992 MD->invalidateCachedPointerInfo(V);
1993 ORE->emit([&]() {
1994 return OptimizationRemark(DEBUG_TYPE, "LoadPRE", Load)
1995 << "load eliminated by PRE";
1996 });
1998}
1999
2000bool GVNPassImpl::performLoadPRE(LoadInst *Load,
2001 AvailValInBlkVect &ValuesPerBlock,
2002 UnavailBlkVect &UnavailableBlocks) {
2003 // Okay, we have *some* definitions of the value. This means that the value
2004 // is available in some of our (transitive) predecessors. Lets think about
2005 // doing PRE of this load. This will involve inserting a new load into the
2006 // predecessor when it's not available. We could do this in general, but
2007 // prefer to not increase code size. As such, we only do this when we know
2008 // that we only have to insert *one* load (which means we're basically moving
2009 // the load, not inserting a new one).
2010
2011 SmallPtrSet<BasicBlock *, 4> Blockers(llvm::from_range, UnavailableBlocks);
2012
2013 // Let's find the first basic block with more than one predecessor. Walk
2014 // backwards through predecessors if needed.
2015 BasicBlock *LoadBB = Load->getParent();
2016 BasicBlock *TmpBB = LoadBB;
2017
2018 // Check that there is no implicit control flow instructions above our load in
2019 // its block. If there is an instruction that doesn't always pass the
2020 // execution to the following instruction, then moving through it may become
2021 // invalid. For example:
2022 //
2023 // int arr[LEN];
2024 // int index = ???;
2025 // ...
2026 // guard(0 <= index && index < LEN);
2027 // use(arr[index]);
2028 //
2029 // It is illegal to move the array access to any point above the guard,
2030 // because if the index is out of bounds we should deoptimize rather than
2031 // access the array.
2032 // Check that there is no guard in this block above our instruction.
2033 bool MustEnsureSafetyOfSpeculativeExecution =
2034 ICF->isDominatedByICFIFromSameBlock(Load);
2035
2036 while (TmpBB->getSinglePredecessor()) {
2037 TmpBB = TmpBB->getSinglePredecessor();
2038 if (TmpBB == LoadBB) // Infinite (unreachable) loop.
2039 return false;
2040 if (Blockers.count(TmpBB))
2041 return false;
2042
2043 // If any of these blocks has more than one successor (i.e. if the edge we
2044 // just traversed was critical), then there are other paths through this
2045 // block along which the load may not be anticipated. Hoisting the load
2046 // above this block would be adding the load to execution paths along
2047 // which it was not previously executed.
2048 if (TmpBB->getTerminator()->getNumSuccessors() != 1)
2049 return false;
2050
2051 // Check that there is no implicit control flow in a block above.
2052 MustEnsureSafetyOfSpeculativeExecution =
2053 MustEnsureSafetyOfSpeculativeExecution || ICF->hasICF(TmpBB);
2054 }
2055
2056 assert(TmpBB);
2057 LoadBB = TmpBB;
2058
2059 // Check to see how many predecessors have the loaded value fully
2060 // available.
2061 MapVector<BasicBlock *, Value *> PredLoads;
2062 DenseMap<BasicBlock *, AvailabilityState> FullyAvailableBlocks;
2063 for (const AvailableValueInBlock &AV : ValuesPerBlock)
2064 FullyAvailableBlocks[AV.BB] = AvailabilityState::Available;
2065 for (BasicBlock *UnavailableBB : UnavailableBlocks)
2066 FullyAvailableBlocks[UnavailableBB] = AvailabilityState::Unavailable;
2067
2068 // The edge from Pred to LoadBB is a critical edge will be splitted.
2069 SmallVector<BasicBlock *, 4> CriticalEdgePredSplit;
2070 // The edge from Pred to LoadBB is a critical edge, another successor of Pred
2071 // contains a load can be moved to Pred. This data structure maps the Pred to
2072 // the movable load.
2073 MapVector<BasicBlock *, LoadInst *> CriticalEdgePredAndLoad;
2074 for (BasicBlock *Pred : predecessors(LoadBB)) {
2075 // If any predecessor block is an EH pad that does not allow non-PHI
2076 // instructions before the terminator, we can't PRE the load.
2077 if (Pred->getTerminator()->isEHPad()) {
2078 LLVM_DEBUG(
2079 dbgs() << "COULD NOT PRE LOAD BECAUSE OF AN EH PAD PREDECESSOR '"
2080 << Pred->getName() << "': " << *Load << '\n');
2081 return false;
2082 }
2083
2084 if (isValueFullyAvailableInBlock(*Opts, Pred, FullyAvailableBlocks)) {
2085 continue;
2086 }
2087
2088 if (Pred->getTerminator()->getNumSuccessors() != 1) {
2089 if (isa<IndirectBrInst>(Pred->getTerminator())) {
2090 LLVM_DEBUG(
2091 dbgs() << "COULD NOT PRE LOAD BECAUSE OF INDBR CRITICAL EDGE '"
2092 << Pred->getName() << "': " << *Load << '\n');
2093 return false;
2094 }
2095
2096 if (LoadBB->isEHPad()) {
2097 LLVM_DEBUG(
2098 dbgs() << "COULD NOT PRE LOAD BECAUSE OF AN EH PAD CRITICAL EDGE '"
2099 << Pred->getName() << "': " << *Load << '\n');
2100 return false;
2101 }
2102
2103 // Do not split backedge as it will break the canonical loop form.
2105 if (DT->dominates(LoadBB, Pred)) {
2106 LLVM_DEBUG(
2107 dbgs()
2108 << "COULD NOT PRE LOAD BECAUSE OF A BACKEDGE CRITICAL EDGE '"
2109 << Pred->getName() << "': " << *Load << '\n');
2110 return false;
2111 }
2112
2113 if (LoadInst *LI = findLoadToHoistIntoPred(Pred, LoadBB, Load))
2114 CriticalEdgePredAndLoad[Pred] = LI;
2115 else
2116 CriticalEdgePredSplit.push_back(Pred);
2117 } else {
2118 // Only add the predecessors that will not be split for now.
2119 PredLoads[Pred] = nullptr;
2120 }
2121 }
2122
2123 // Decide whether PRE is profitable for this load.
2124 unsigned NumInsertPreds = PredLoads.size() + CriticalEdgePredSplit.size();
2125 unsigned NumUnavailablePreds = NumInsertPreds +
2126 CriticalEdgePredAndLoad.size();
2127 assert(NumUnavailablePreds != 0 &&
2128 "Fully available value should already be eliminated!");
2129 (void)NumUnavailablePreds;
2130
2131 // If we need to insert new load in multiple predecessors, reject it.
2132 // FIXME: If we could restructure the CFG, we could make a common pred with
2133 // all the preds that don't have an available Load and insert a new load into
2134 // that one block.
2135 if (NumInsertPreds > 1)
2136 return false;
2137
2138 // Now we know where we will insert load. We must ensure that it is safe
2139 // to speculatively execute the load at that points.
2140 if (MustEnsureSafetyOfSpeculativeExecution) {
2141 if (CriticalEdgePredSplit.size())
2143 DT))
2144 return false;
2145 for (auto &PL : PredLoads)
2146 if (!isSafeToSpeculativelyExecute(Load, PL.first->getTerminator(), AC,
2147 DT))
2148 return false;
2149 for (auto &CEP : CriticalEdgePredAndLoad)
2150 if (!isSafeToSpeculativelyExecute(Load, CEP.first->getTerminator(), AC,
2151 DT))
2152 return false;
2153 }
2154
2155 // Split critical edges, and update the unavailable predecessors accordingly.
2156 for (BasicBlock *OrigPred : CriticalEdgePredSplit) {
2157 BasicBlock *NewPred = splitCriticalEdges(OrigPred, LoadBB);
2158 assert(!PredLoads.count(OrigPred) && "Split edges shouldn't be in map!");
2159 PredLoads[NewPred] = nullptr;
2160 LLVM_DEBUG(dbgs() << "Split critical edge " << OrigPred->getName() << "->"
2161 << LoadBB->getName() << '\n');
2162 }
2163
2164 for (auto &CEP : CriticalEdgePredAndLoad)
2165 PredLoads[CEP.first] = nullptr;
2166
2167 // Check if the load can safely be moved to all the unavailable predecessors.
2168 bool CanDoPRE = true;
2169 const DataLayout &DL = Load->getDataLayout();
2170 SmallVector<Instruction*, 8> NewInsts;
2171 for (auto &PredLoad : PredLoads) {
2172 BasicBlock *UnavailablePred = PredLoad.first;
2173
2174 // Do PHI translation to get its value in the predecessor if necessary. The
2175 // returned pointer (if non-null) is guaranteed to dominate UnavailablePred.
2176 // We do the translation for each edge we skipped by going from Load's block
2177 // to LoadBB, otherwise we might miss pieces needing translation.
2178
2179 // If all preds have a single successor, then we know it is safe to insert
2180 // the load on the pred (?!?), so we can insert code to materialize the
2181 // pointer if it is not available.
2182 Value *LoadPtr = Load->getPointerOperand();
2183 BasicBlock *Cur = Load->getParent();
2184 while (Cur != LoadBB) {
2185 PHITransAddr Address(LoadPtr, DL, AC);
2186 LoadPtr = Address.translateWithInsertion(Cur, Cur->getSinglePredecessor(),
2187 *DT, NewInsts);
2188 if (!LoadPtr) {
2189 CanDoPRE = false;
2190 break;
2191 }
2192 Cur = Cur->getSinglePredecessor();
2193 }
2194
2195 if (LoadPtr) {
2196 PHITransAddr Address(LoadPtr, DL, AC);
2197 LoadPtr = Address.translateWithInsertion(LoadBB, UnavailablePred, *DT,
2198 NewInsts);
2199 }
2200 // If we couldn't find or insert a computation of this phi translated value,
2201 // we fail PRE.
2202 if (!LoadPtr) {
2203 LLVM_DEBUG(dbgs() << "COULDN'T INSERT PHI TRANSLATED VALUE OF: "
2204 << *Load->getPointerOperand() << "\n");
2205 CanDoPRE = false;
2206 break;
2207 }
2208
2209 PredLoad.second = LoadPtr;
2210 }
2211
2212 if (!CanDoPRE) {
2213 while (!NewInsts.empty()) {
2214 // Erase instructions generated by the failed PHI translation before
2215 // trying to number them. PHI translation might insert instructions
2216 // in basic blocks other than the current one, and we delete them
2217 // directly, as salvageAndRemoveInstruction only allows removing from the
2218 // current basic block.
2219 NewInsts.pop_back_val()->eraseFromParent();
2220 }
2221 // HINT: Don't revert the edge-splitting as following transformation may
2222 // also need to split these critical edges.
2223 return !CriticalEdgePredSplit.empty();
2224 }
2225
2226 // Okay, we can eliminate this load by inserting a reload in the predecessor
2227 // and using PHI construction to get the value in the other predecessors, do
2228 // it.
2229 LLVM_DEBUG(dbgs() << "GVN REMOVING PRE LOAD: " << *Load << '\n');
2230 LLVM_DEBUG(if (!NewInsts.empty()) dbgs() << "INSERTED " << NewInsts.size()
2231 << " INSTS: " << *NewInsts.back()
2232 << '\n');
2233
2234 // Assign value numbers to the new instructions.
2235 for (Instruction *I : NewInsts) {
2236 // Instructions that have been inserted in predecessor(s) to materialize
2237 // the load address do not retain their original debug locations. Doing
2238 // so could lead to confusing (but correct) source attributions.
2239 I->updateLocationAfterHoist();
2240
2241 // FIXME: We really _ought_ to insert these value numbers into their
2242 // parent's availability map. However, in doing so, we risk getting into
2243 // ordering issues. If a block hasn't been processed yet, we would be
2244 // marking a value as AVAIL-IN, which isn't what we intend.
2245 VN.lookupOrAdd(I);
2246 }
2247
2248 eliminatePartiallyRedundantLoad(Load, ValuesPerBlock, PredLoads,
2249 &CriticalEdgePredAndLoad);
2250 ++NumPRELoad;
2251 return true;
2252}
2253
2254bool GVNPassImpl::performLoopLoadPRE(LoadInst *Load,
2255 AvailValInBlkVect &ValuesPerBlock,
2256 UnavailBlkVect &UnavailableBlocks) {
2257 const Loop *L = LI->getLoopFor(Load->getParent());
2258 // TODO: Generalize to other loop blocks that dominate the latch.
2259 if (!L || L->getHeader() != Load->getParent())
2260 return false;
2261
2262 BasicBlock *Preheader = L->getLoopPreheader();
2263 BasicBlock *Latch = L->getLoopLatch();
2264 if (!Preheader || !Latch)
2265 return false;
2266
2267 Value *LoadPtr = Load->getPointerOperand();
2268 // Must be available in preheader.
2269 if (!L->isLoopInvariant(LoadPtr))
2270 return false;
2271
2272 // We plan to hoist the load to preheader without introducing a new fault.
2273 // In order to do it, we need to prove that we cannot side-exit the loop
2274 // once loop header is first entered before execution of the load.
2275 if (ICF->isDominatedByICFIFromSameBlock(Load))
2276 return false;
2277
2278 BasicBlock *LoopBlock = nullptr;
2279 for (auto *Blocker : UnavailableBlocks) {
2280 // Blockers from outside the loop are handled in preheader.
2281 if (!L->contains(Blocker))
2282 continue;
2283
2284 // Only allow one loop block. Loop header is not less frequently executed
2285 // than each loop block, and likely it is much more frequently executed. But
2286 // in case of multiple loop blocks, we need extra information (such as block
2287 // frequency info) to understand whether it is profitable to PRE into
2288 // multiple loop blocks.
2289 if (LoopBlock)
2290 return false;
2291
2292 // Do not sink into inner loops. This may be non-profitable.
2293 if (L != LI->getLoopFor(Blocker))
2294 return false;
2295
2296 // Blocks that dominate the latch execute on every single iteration, maybe
2297 // except the last one. So PREing into these blocks doesn't make much sense
2298 // in most cases. But the blocks that do not necessarily execute on each
2299 // iteration are sometimes much colder than the header, and this is when
2300 // PRE is potentially profitable.
2301 if (DT->dominates(Blocker, Latch))
2302 return false;
2303
2304 // Make sure that the terminator itself doesn't clobber.
2305 if (Blocker->getTerminator()->mayWriteToMemory())
2306 return false;
2307
2308 LoopBlock = Blocker;
2309 }
2310
2311 if (!LoopBlock)
2312 return false;
2313
2314 // Make sure the memory at this pointer cannot be freed, therefore we can
2315 // safely reload from it after clobber.
2316 //
2317 // The header load has already dereferenced LoadPtr on this iteration, so
2318 // only a deallocation between that load and the reload in LoopBlock can make
2319 // the same address unsafe to read again. Check every path between these two
2320 // points for an instruction that may deallocate the memory.
2321 if (LoadPtr->canBeFreed() &&
2322 !willNotFreeBetween(Load, LoopBlock->getTerminator(), DT))
2323 return false;
2324
2325 // TODO: Support critical edge splitting if blocker has more than 1 successor.
2326 MapVector<BasicBlock *, Value *> AvailableLoads;
2327 AvailableLoads[LoopBlock] = LoadPtr;
2328 AvailableLoads[Preheader] = LoadPtr;
2329
2330 LLVM_DEBUG(dbgs() << "GVN REMOVING PRE LOOP LOAD: " << *Load << '\n');
2331 eliminatePartiallyRedundantLoad(Load, ValuesPerBlock, AvailableLoads,
2332 /*CriticalEdgePredAndLoad*/ nullptr);
2333 ++NumPRELoopLoad;
2334 return true;
2335}
2336
2339 using namespace ore;
2340
2341 ORE->emit([&]() {
2342 return OptimizationRemark(DEBUG_TYPE, "LoadElim", Load)
2343 << "load of type " << NV("Type", Load->getType()) << " eliminated"
2344 << setExtraArgs() << " in favor of "
2345 << NV("InfavorOfValue", AvailableValue);
2346 });
2347}
2348
2349/// Attempt to eliminate a load whose dependencies are
2350/// non-local by performing PHI construction.
2351bool GVNPassImpl::processNonLocalLoad(LoadInst *Load) {
2352 // Non-local speculations are not allowed under asan.
2353 if (Load->getFunction()->hasFnAttribute(Attribute::SanitizeAddress) ||
2354 Load->getFunction()->hasFnAttribute(Attribute::SanitizeHWAddress))
2355 return false;
2356
2357 // Find the non-local dependencies of the load.
2358 LoadDepVect Deps;
2359 MD->getNonLocalPointerDependency(Load, Deps);
2360
2361 // If we had to process more than one hundred blocks to find the
2362 // dependencies, this load isn't worth worrying about. Optimizing
2363 // it will be too expensive.
2364 unsigned NumDeps = Deps.size();
2365 if (NumDeps > Opts->gvn_max_num_deps)
2366 return false;
2367
2369 MemVals.reserve(Deps.size());
2370
2371 for (const NonLocalDepResult &Dep : Deps) {
2372 const auto &R = Dep.getResult();
2373 SelectAddr SelAddr = Dep.getAddress();
2374 BasicBlock *BB = Dep.getBB();
2375 Instruction *Inst = R.getInst();
2376 if (R.isSelect()) {
2377 auto [Sel, Addrs] = SelAddr.getSelectAndAddrs();
2378 MemVals.emplace_back(
2379 ReachingMemVal::getSelect(BB, Sel, Addrs.first, Addrs.second));
2380 continue;
2381 }
2382 Value *Address = SelAddr.getAddr();
2383 if (R.isClobber())
2384 MemVals.emplace_back(ReachingMemVal::getClobber(Address, Inst));
2385 else if (R.isDef())
2386 MemVals.emplace_back(ReachingMemVal::getDef(Address, Inst));
2387 else
2388 MemVals.emplace_back(ReachingMemVal::getUnknown(BB, Address, Inst));
2389 }
2390
2391 return processNonLocalLoad(Load, MemVals);
2392}
2393
2394bool GVNPassImpl::processNonLocalLoad(LoadInst *Load,
2396 // If we had a phi translation failure, we'll have a single entry which is a
2397 // clobber in the current block. Reject this early.
2398 if (Deps.size() == 1 && Deps[0].Kind == DepKind::Other) {
2399 LLVM_DEBUG(dbgs() << "GVN: non-local load "; Load->printAsOperand(dbgs());
2400 dbgs() << " has unknown dependencies\n";);
2401 return false;
2402 }
2403
2404 bool Changed = false;
2405 // This is a limited form of scalar PRE for load indices. If this load follows
2406 // a GEP, see if we can PRE the indices before analyzing.
2407 if (isScalarPREEnabled()) {
2408 if (GetElementPtrInst *GEP =
2409 dyn_cast<GetElementPtrInst>(Load->getOperand(0))) {
2410 for (Use &U : GEP->indices())
2411 // Instructions inserted by GVN during this iteration (e.g. coercion
2412 // casts from MaterializeAdjustedValue) may not have value numbers yet,
2413 // so they are skipped.
2414 if (Instruction *I = dyn_cast<Instruction>(U.get()); I && VN.exists(I))
2415 Changed |= performScalarPRE(I);
2416 }
2417 }
2418
2419 // Step 1: Analyze the availability of the load.
2420 AvailValInBlkVect ValuesPerBlock;
2421 UnavailBlkVect UnavailableBlocks;
2422 analyzeLoadAvailability(Load, Deps, ValuesPerBlock, UnavailableBlocks);
2423
2424 // If we have no predecessors that produce a known value for this load, exit
2425 // early.
2426 if (ValuesPerBlock.empty())
2427 return Changed;
2428
2429 // Step 2: Eliminate fully redundancy.
2430 //
2431 // If all of the instructions we depend on produce a known value for this
2432 // load, then it is fully redundant and we can use PHI insertion to compute
2433 // its value. Insert PHIs and remove the fully redundant value now.
2434 if (UnavailableBlocks.empty()) {
2435 LLVM_DEBUG(dbgs() << "GVN REMOVING NONLOCAL LOAD: " << *Load << '\n');
2436
2437 // Perform PHI construction.
2438 Value *V = constructSSAForLoadSet(Load, ValuesPerBlock, getDominatorTree());
2439 // constructSSAForLoadSet is responsible for combining metadata.
2440 ICF->removeUsersOf(Load);
2441 Load->replaceAllUsesWith(V);
2442
2443 if (isa<PHINode>(V))
2444 V->takeName(Load);
2445 if (Instruction *I = dyn_cast<Instruction>(V))
2446 // If instruction I has debug info, then we should not update it.
2447 // Also, if I has a null DebugLoc, then it is still potentially incorrect
2448 // to propagate Load's DebugLoc because Load may not post-dominate I.
2449 if (Load->getDebugLoc() && Load->getParent() == I->getParent())
2450 I->setDebugLoc(Load->getDebugLoc());
2451 if (MD && V->getType()->isPtrOrPtrVectorTy())
2452 MD->invalidateCachedPointerInfo(V);
2453 ++NumGVNLoad;
2454 reportLoadElim(Load, V, ORE);
2456 return true;
2457 }
2458
2459 // Step 3: Eliminate partial redundancy.
2460 if (!isLoadPREEnabled())
2461 return Changed;
2462 if (!isLoadInLoopPREEnabled() && LI->getLoopFor(Load->getParent()))
2463 return Changed;
2464
2465 if (performLoopLoadPRE(Load, ValuesPerBlock, UnavailableBlocks) ||
2466 performLoadPRE(Load, ValuesPerBlock, UnavailableBlocks))
2467 return true;
2468
2469 return Changed;
2470}
2471
2472bool GVNPassImpl::processAssumeIntrinsic(AssumeInst *IntrinsicI) {
2473 Value *V = IntrinsicI->getArgOperand(0);
2474
2475 if (ConstantInt *Cond = dyn_cast<ConstantInt>(V)) {
2476 if (Cond->isZero()) {
2477 Type *Int8Ty = Type::getInt8Ty(V->getContext());
2478 Type *PtrTy = PointerType::get(V->getContext(), 0);
2479 // Insert a new store to null instruction before the load to indicate that
2480 // this code is not reachable. FIXME: We could insert unreachable
2481 // instruction directly because we can modify the CFG.
2482 auto *NewS =
2483 new StoreInst(PoisonValue::get(Int8Ty), Constant::getNullValue(PtrTy),
2484 IntrinsicI->getIterator());
2485 if (MSSAU) {
2486 const MemoryUseOrDef *FirstNonDom = nullptr;
2487 const auto *AL =
2488 MSSAU->getMemorySSA()->getBlockAccesses(IntrinsicI->getParent());
2489
2490 // If there are accesses in the current basic block, find the first one
2491 // that does not come before NewS. The new memory access is inserted
2492 // after the found access or before the terminator if no such access is
2493 // found.
2494 if (AL) {
2495 for (const auto &Acc : *AL) {
2496 if (auto *Current = dyn_cast<MemoryUseOrDef>(&Acc))
2497 if (!Current->getMemoryInst()->comesBefore(NewS)) {
2498 FirstNonDom = Current;
2499 break;
2500 }
2501 }
2502 }
2503
2504 auto *NewDef =
2505 FirstNonDom ? MSSAU->createMemoryAccessBefore(
2506 NewS, nullptr,
2507 const_cast<MemoryUseOrDef *>(FirstNonDom))
2508 : MSSAU->createMemoryAccessInBB(
2509 NewS, nullptr,
2510 NewS->getParent(), MemorySSA::BeforeTerminator);
2511
2512 MSSAU->insertDef(cast<MemoryDef>(NewDef), /*RenameUses=*/false);
2513 }
2514 }
2515 if (isAssumeWithEmptyBundle(*IntrinsicI)) {
2516 salvageAndRemoveInstruction(IntrinsicI);
2517 return true;
2518 }
2519 return false;
2520 }
2521
2522 if (isa<Constant>(V)) {
2523 // If it's not false, and constant, it must evaluate to true. This means our
2524 // assume is assume(true), and thus, pointless, and we don't want to do
2525 // anything more here.
2526 return false;
2527 }
2528
2529 Constant *True = ConstantInt::getTrue(V->getContext());
2530 return propagateEquality(V, True, IntrinsicI);
2531}
2532
2535 I->replaceAllUsesWith(Repl);
2536}
2537
2538/// If a load has !invariant.group, try to find the most-dominating instruction
2539/// with the same metadata and equivalent pointer (modulo bitcasts and zero
2540/// GEPs). If one is found that dominates the load, its value can be reused.
2542 Value *PointerOperand = L->getPointerOperand()->stripPointerCasts();
2543
2544 // It's not safe to walk the use list of a global value because function
2545 // passes aren't allowed to look outside their functions.
2546 // FIXME: this could be fixed by filtering instructions from outside of
2547 // current function.
2548 if (isa<Constant>(PointerOperand))
2549 return nullptr;
2550
2551 // Queue to process all pointers that are equivalent to load operand.
2552 SmallVector<Value *, 8> PointerUsesQueue;
2553 PointerUsesQueue.push_back(PointerOperand);
2554
2555 Instruction *MostDominatingInstruction = L;
2556
2557 // FIXME: This loop is potentially O(n^2) due to repeated dominates checks.
2558 while (!PointerUsesQueue.empty()) {
2559 Value *Ptr = PointerUsesQueue.pop_back_val();
2560 assert(Ptr && !isa<GlobalValue>(Ptr) &&
2561 "Null or GlobalValue should not be inserted");
2562
2563 for (User *U : Ptr->users()) {
2564 auto *I = dyn_cast<Instruction>(U);
2565 if (!I || I == L || !DT.dominates(I, MostDominatingInstruction))
2566 continue;
2567
2568 // Add bitcasts and zero GEPs to queue.
2569 // TODO: Should drop bitcast?
2570 if (isa<BitCastInst>(I) ||
2572 cast<GetElementPtrInst>(I)->hasAllZeroIndices())) {
2573 PointerUsesQueue.push_back(I);
2574 continue;
2575 }
2576
2577 // If we hit a load/store with an invariant.group metadata and the same
2578 // pointer operand, we can assume that value pointed to by the pointer
2579 // operand didn't change.
2580 if (I->hasMetadata(LLVMContext::MD_invariant_group) &&
2581 Ptr == getLoadStorePointerOperand(I) && !I->isVolatile())
2582 MostDominatingInstruction = I;
2583 }
2584 }
2585
2586 return MostDominatingInstruction != L ? MostDominatingInstruction : nullptr;
2587}
2588
2589/// Return the memory location accessed by the (masked) load/store instruction
2590/// `I`, if the instruction could potentially provide a useful value for
2591/// eliminating the load.
2592static std::optional<MemoryLocation>
2594 const TargetLibraryInfo *TLI) {
2595 if (auto *LI = dyn_cast<LoadInst>(I))
2596 return MemoryLocation::get(LI);
2597
2598 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
2599 switch (II->getIntrinsicID()) {
2600 case Intrinsic::masked_load:
2601 return MemoryLocation::getForArgument(II, 0, TLI);
2602 case Intrinsic::masked_store:
2603 if (AllowStores)
2604 return MemoryLocation::getForArgument(II, 1, TLI);
2605 return std::nullopt;
2606 default:
2607 break;
2608 }
2609 }
2610
2611 if (!AllowStores)
2612 return std::nullopt;
2613
2614 if (auto *SI = dyn_cast<StoreInst>(I))
2615 return MemoryLocation::get(SI);
2616 return std::nullopt;
2617}
2618
2619/// Scan the users of each MemoryAccess in `ClobbersList` that belong to `BB`,
2620/// looking for memory reads whose location aliases `Loc` and dominates our
2621/// load.
2622std::optional<GVNPassImpl::ReachingMemVal> GVNPassImpl::scanMemoryAccessesUsers(
2623 const MemoryLocation &Loc, bool IsInvariantLoad, BasicBlock *BB,
2624 const SmallVectorImpl<MemoryAccess *> &ClobbersList, MemorySSA &MSSA,
2625 BatchAAResults &AA, LoadInst *L) {
2626
2627 // Prefer a candidate that is closer to the load within the same block.
2628 auto UpdateChoice = [&](std::optional<ReachingMemVal> &Choice,
2629 AliasResult &AR, Instruction *Candidate) {
2630 if (!Choice) {
2631 if (AR == AliasResult::PartialAlias)
2632 Choice = ReachingMemVal::getClobber(Loc.Ptr, Candidate, AR.getOffset());
2633 else
2634 Choice = ReachingMemVal::getDef(Loc.Ptr, Candidate);
2635 return;
2636 }
2637 if (!MSSA.locallyDominates(MSSA.getMemoryAccess(Choice->Inst),
2638 MSSA.getMemoryAccess(Candidate)))
2639 return;
2640
2641 if (AR == AliasResult::PartialAlias) {
2642 Choice->Kind = DepKind::Clobber;
2643 Choice->Offset = AR.getOffset();
2644 } else {
2645 Choice->Kind = DepKind::Def;
2646 Choice->Offset = -1;
2647 }
2648
2649 Choice->Inst = Candidate;
2650 Choice->Block = Candidate->getParent();
2651 };
2652
2653 std::optional<ReachingMemVal> ReachingVal;
2654 for (MemoryAccess *MA : ClobbersList) {
2655 unsigned Scanned = 0;
2656 for (User *U : MA->users()) {
2657 if (++Scanned >= Opts->gvn_scan_users_limit)
2658 return ReachingMemVal::getUnknown(BB, Loc.Ptr);
2659
2660 auto *UseOrDef = dyn_cast<MemoryUseOrDef>(U);
2661 if (!UseOrDef || UseOrDef->getBlock() != BB)
2662 continue;
2663
2664 Instruction *MemI = UseOrDef->getMemoryInst();
2665 if (MemI == L ||
2666 (L && !MSSA.locallyDominates(UseOrDef, MSSA.getMemoryAccess(L))))
2667 continue;
2668
2669 if (auto MaybeLoc = maybeLoadStoreLocation(MemI, IsInvariantLoad, TLI)) {
2670 AliasResult AR = AA.alias(*MaybeLoc, Loc);
2671 // If the locations do not certainly alias, we cannot possibly infer the
2672 // following load loads the same value.
2674 continue;
2675
2676 // Locations partially overlap, but neither is a subset of the other, or
2677 // the second location is before the first.
2678 if (AR == AliasResult::PartialAlias &&
2679 (!AR.hasOffset() || AR.getOffset() < 0))
2680 continue;
2681
2682 // Found candidate, the new load memory location and the given location
2683 // must alias: precise overlap, or subset with non-negative offset.
2684 UpdateChoice(ReachingVal, AR, MemI);
2685 }
2686 }
2687 if (ReachingVal)
2688 break;
2689 }
2690
2691 return ReachingVal;
2692}
2693
2694/// Check if a given MemoryAccess (usually a MemoryDef) actually modifies a
2695/// given location. Returns a ReachingMemVal describing the dependency.
2696std::optional<GVNPassImpl::ReachingMemVal> GVNPassImpl::accessMayModifyLocation(
2697 MemoryAccess *ClobberMA, const MemoryLocation &Loc, Align LoadAlign,
2698 bool IsInvariantLoad, BasicBlock *BB, MemorySSA &MSSA, BatchAAResults &AA) {
2699 assert(ClobberMA->getBlock() == BB);
2700
2701 // If the clobbering access is the entry memory state, we cannot say anything
2702 // about the content of the memory, except when we are accessing a local
2703 // object, which can be turned later into producing `undef`.
2704 if (MSSA.isLiveOnEntryDef(ClobberMA)) {
2706 if (Alloc->getParent() == BB)
2707 return ReachingMemVal::getDef(Loc.Ptr, const_cast<AllocaInst *>(Alloc));
2708 return ReachingMemVal::getUnknown(BB, Loc.Ptr);
2709 }
2710
2711 // Loads from "constant" memory can't be clobbered.
2712 if (IsInvariantLoad || AA.pointsToConstantMemory(Loc))
2713 return std::nullopt;
2714
2715 auto GetOrdering = [](const Instruction *I) {
2716 if (auto *L = dyn_cast<LoadInst>(I))
2717 return L->getOrdering();
2718 return cast<StoreInst>(I)->getOrdering();
2719 };
2720 Instruction *ClobberI = cast<MemoryDef>(ClobberMA)->getMemoryInst();
2721
2722 // Check if the clobbering access is a load or a store that we can reuse.
2723 if (auto MaybeLoc = maybeLoadStoreLocation(ClobberI, true, TLI)) {
2724 AliasResult AR = AA.alias(*MaybeLoc, Loc);
2725 if (AR == AliasResult::MustAlias)
2726 return ReachingMemVal::getDef(Loc.Ptr, ClobberI);
2727
2728 if (AR == AliasResult::NoAlias) {
2729 // If the locations do not alias we may still be able to skip over the
2730 // clobbering instruction, even if it is atomic.
2731 // The original load is either non-atomic or unordered. We can reorder
2732 // these across non-atomic, unordered or monotonic loads or across any
2733 // store.
2734 if (!ClobberI->isAtomic() ||
2735 !isStrongerThan(GetOrdering(ClobberI), AtomicOrdering::Monotonic) ||
2736 isa<StoreInst>(ClobberI))
2737 return std::nullopt;
2738 return ReachingMemVal::getClobber(Loc.Ptr, ClobberI);
2739 }
2740
2741 // Skip over volatile loads (the original load is non-volatile, non-atomic).
2742 if (!ClobberI->isAtomic() && isa<LoadInst>(ClobberI))
2743 return std::nullopt;
2744
2745 // A store that writes back a value already at the memory location leaves
2746 // the latter unchanged.
2747 if (auto *SI = dyn_cast<StoreInst>(ClobberI))
2748 if (isStorePreservingMemoryLocation(SI, Loc, LoadAlign, AA,
2749 Opts->gvn_max_num_insns))
2750 return std::nullopt;
2751
2752 if (AR == AliasResult::MayAlias ||
2754 (!AR.hasOffset() || AR.getOffset() < 0)))
2755 return ReachingMemVal::getClobber(Loc.Ptr, ClobberI);
2756
2757 // The only option left is a store of the superset of the required bits.
2759 AR.getOffset() > 0 &&
2760 "Must be the superset/partial overlap case with positive offset");
2761 return ReachingMemVal::getClobber(Loc.Ptr, ClobberI, AR.getOffset());
2762 }
2763
2764 if (auto *II = dyn_cast<IntrinsicInst>(ClobberI)) {
2765 if (II->getIntrinsicID() == Intrinsic::lifetime_start) {
2766 MemoryLocation IIObjLoc = MemoryLocation::getForArgument(II, 0, TLI);
2767 if (AA.isMustAlias(IIObjLoc, Loc))
2768 return ReachingMemVal::getDef(Loc.Ptr, ClobberI);
2769 return std::nullopt;
2770 }
2771 }
2772
2773 // If we are at a malloc-like function call, we can turn the load into `undef`
2774 // or zero.
2775 if (isNoAliasCall(ClobberI)) {
2776 const Value *Obj = getUnderlyingObject(Loc.Ptr);
2777 if (Obj == ClobberI || AA.isMustAlias(ClobberI, Loc.Ptr))
2778 return ReachingMemVal::getDef(Loc.Ptr, ClobberI);
2779 }
2780
2781 // Can reorder loads across a release fence.
2782 if (auto *FI = dyn_cast<FenceInst>(ClobberI))
2783 if (FI->getOrdering() == AtomicOrdering::Release)
2784 return std::nullopt;
2785
2786 // See if the clobber instruction (e.g., a generic call) may modify the
2787 // location.
2788 ModRefInfo MR = AA.getModRefInfo(ClobberI, Loc);
2789 // If may modify the location, analyze deeper, to exclude accesses to
2790 // non-escaping local allocations.
2791 if (MR == ModRefInfo::NoModRef || MR == ModRefInfo::Ref)
2792 return std::nullopt;
2793
2794 // Conservatively assume the clobbering memory access may overwrite the
2795 // location.
2796 return ReachingMemVal::getClobber(Loc.Ptr, ClobberI);
2797}
2798
2799/// Collect the predecessors of block, while doing phi-translation of the memory
2800/// address and the memory clobber. Return false if the block should be marked
2801/// as clobbering the memory location in an unknown way.
2802bool GVNPassImpl::collectPredecessors(BasicBlock *BB, const PHITransAddr &Addr,
2803 MemoryAccess *ClobberMA,
2804 DependencyBlockSet &Blocks,
2806 if (Addr.needsPHITranslationFromBlock(BB) &&
2808 return false;
2809
2810 auto *MPhi =
2811 ClobberMA->getBlock() == BB ? dyn_cast<MemoryPhi>(ClobberMA) : nullptr;
2813 for (BasicBlock *Pred : predecessors(BB)) {
2814 // Skip unreachable predecessors.
2815 if (!DT->isReachableFromEntry(Pred))
2816 continue;
2817
2818 // Skip already visited predecessors.
2819 if (llvm::any_of(Preds, [Pred](const auto &P) { return P.first == Pred; }))
2820 continue;
2821
2822 PHITransAddr TransAddr = Addr;
2823 if (TransAddr.needsPHITranslationFromBlock(BB))
2824 TransAddr.translateValue(BB, Pred, DT, false);
2825
2826 auto It = Blocks.find(Pred);
2827 if (It != Blocks.end()) {
2828 // If we reach a visited block with a different address, set the
2829 // current block as clobbering the memory location in an unknown way
2830 // (by returning false).
2831 if (It->second.Addr.getAddr() != TransAddr.getAddr())
2832 return false;
2833 // Otherwise, just stop the traversal.
2834 continue;
2835 }
2836
2837 Preds.emplace_back(
2838 Pred, DependencyBlockInfo(TransAddr,
2839 MPhi ? MPhi->getIncomingValueForBlock(Pred)
2840 : ClobberMA));
2841 }
2842
2843 // We collected the predecessors and stored them in Preds. Now, populate the
2844 // worklist with the predecessors found, and cache the eventual translated
2845 // address for each block.
2846 for (auto &P : Preds) {
2847 [[maybe_unused]] auto It =
2848 Blocks.try_emplace(P.first, std::move(P.second)).first;
2849 Worklist.push_back(P.first);
2850 }
2851
2852 return true;
2853}
2854
2855/// Build a list of MemoryAccesses whose users could potentially alias the
2856/// memory location being queried. Starts from StartInfo's initial clobber,
2857/// walk the use-def chain to the final clobber. If the chain extends beyond
2858/// `BB`, continue into that block but only if it is in the previously collected
2859/// set.
2860void GVNPassImpl::collectClobberList(SmallVectorImpl<MemoryAccess *> &Clobbers,
2861 BasicBlock *BB,
2862 const DependencyBlockInfo &StartInfo,
2863 const DependencyBlockSet &Blocks,
2864 MemorySSA &MSSA) {
2865 MemoryAccess *MA = StartInfo.InitialClobberMA;
2866 MemoryAccess *LastMA = StartInfo.ClobberMA;
2867
2868 for (;;) {
2869 while (MA != LastMA) {
2870 Clobbers.push_back(MA);
2871 MA = cast<MemoryUseOrDef>(MA)->getDefiningAccess();
2872 }
2873 Clobbers.push_back(MA);
2874
2875 if (MSSA.isLiveOnEntryDef(MA) ||
2876 (MA->getBlock() == BB && !isa<MemoryPhi>(MA)))
2877 break;
2878
2879 // If the final clobber in the current block is a MemoryPhi, go to the
2880 // immediate dominator; otherwise, just get to the block containing the
2881 // final clobber.
2882 if (MA->getBlock() == BB)
2883 BB = DT->getNode(BB)->getIDom()->getBlock();
2884 else
2885 BB = MA->getBlock();
2886
2887 auto It = Blocks.find(BB);
2888 if (It == Blocks.end())
2889 break;
2890
2891 MA = It->second.InitialClobberMA;
2892 LastMA = It->second.ClobberMA;
2893 if (MA == Clobbers.back())
2894 Clobbers.pop_back();
2895 }
2896}
2897
2898/// Entrypoint for the MemorySSA-based redundant load elimination algorithm.
2899/// Given as input a load instruction, the function computes the set of reaching
2900/// memory values, one per predecessor path, that analyzeLoadAvailability can
2901/// later use to establish whether the load may be eliminated. A reaching value
2902/// may be of the following descriptor kind:
2903/// * Def: a precise instruction that produces the exact bits the load would
2904/// read (e.g., an equivalent load or a MustAlias store);
2905/// * Clobber: a write that clobbers a superset of the bits the load would read
2906/// (e.g., a memset over a larger region);
2907/// * Other: we know which block defines the memory location in some way, but
2908/// could not identify a precise instruction (e.g., memory already live at
2909/// function entry).
2910bool GVNPassImpl::findReachingValuesForLoad(
2912 AAResults &AAR) {
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 BatchAAResults BatchAA(*AA);
3169 Instruction *DepInst = nullptr;
3170 MemoryLocation LoadLoc = MemoryLocation::getForArgument(I, 0, TLI);
3171
3172 if (!isMemorySSAEnabled()) {
3173 if (!MD)
3174 return false;
3175 MemDepResult Dep = MD->getDependency(I);
3176 DepInst = Dep.getInst();
3177 if (!DepInst || !Dep.isLocal() || !Dep.isDef())
3178 return false;
3179 } else {
3180 auto *MSSA = MSSAU->getMemorySSA();
3181 auto *Def = dyn_cast<MemoryDef>(
3182 MSSA->getWalker()->getClobberingMemoryAccess(I, BatchAA));
3183 // We may want to extend this to non-local forwarding as well. For now, keep
3184 // parity with MemoryDependenceAnalysis.
3185 if (!Def || MSSA->isLiveOnEntryDef(Def) ||
3186 Def->getBlock() != I->getParent())
3187 return false;
3188 DepInst = Def->getMemoryInst();
3189 }
3190
3191 Value *Mask = I->getOperand(1);
3192 Value *Passthrough = I->getOperand(2);
3193 Value *StoreVal;
3194 if (!match(DepInst,
3195 m_MaskedStore(m_Value(StoreVal), m_Value(), m_Specific(Mask))) ||
3196 StoreVal->getType() != I->getType())
3197 return false;
3198
3199 if (isMemorySSAEnabled()) {
3200 // Ensure the masked store and load access the same exact memory location.
3201 MemoryLocation StoreLoc =
3203 if (!BatchAA.isMustAlias(StoreLoc, LoadLoc))
3204 return false;
3205 }
3206
3207 // Remove the load but generate a select for the passthrough
3208 Value *OpToForward = llvm::SelectInst::Create(Mask, StoreVal, Passthrough, "",
3209 I->getIterator());
3210
3211 ICF->removeUsersOf(I);
3212 I->replaceAllUsesWith(OpToForward);
3214 ++NumGVNLoad;
3215 return true;
3216}
3217
3218/// Return a pair the first field showing the value number of \p Exp and the
3219/// second field showing whether it is a value number newly created.
3220std::pair<uint32_t, bool> GVNValueTable::assignExpNewValueNum(Expression &Exp) {
3221 uint32_t &E = ExpressionNumbering[Exp];
3222 bool CreateNewValNum = !E;
3223 if (CreateNewValNum) {
3224 Expressions.push_back(Exp);
3225 if (ExprIdx.size() < NextValueNumber + 1)
3226 ExprIdx.resize(NextValueNumber * 2);
3227 E = NextValueNumber;
3228 ExprIdx[NextValueNumber++] = NextExprNumber++;
3229 }
3230 return {E, CreateNewValNum};
3231}
3232
3233/// Return whether all the values related with the same \p num are
3234/// defined in \p BB.
3235bool GVNValueTable::areAllValsInBB(uint32_t Num, const BasicBlock *BB,
3236 GVNLeaderMap &LeaderTable) {
3237 return all_of(
3238 LeaderTable.getLeaders(Num),
3239 [=](const GVNLeaderMap::LeaderTableEntry &L) { return L.BB == BB; });
3240}
3241
3242/// Wrap phiTranslateImpl to provide caching functionality.
3244 const BasicBlock *PhiBlock, uint32_t Num,
3245 GVNLeaderMap &LeaderTable) {
3246 auto FindRes = PhiTranslateTable.find({Num, Pred});
3247 if (FindRes != PhiTranslateTable.end())
3248 return FindRes->second;
3249 uint32_t NewNum = phiTranslateImpl(Pred, PhiBlock, Num, LeaderTable);
3250 PhiTranslateTable.insert({{Num, Pred}, NewNum});
3251 return NewNum;
3252}
3253
3254// Return true if the value number \p Num and NewNum have equal value.
3255// Return false if the result is unknown.
3256bool GVNValueTable::areCallValsEqual(uint32_t Num, uint32_t NewNum,
3257 const BasicBlock *Pred,
3258 const BasicBlock *PhiBlock,
3259 GVNLeaderMap &LeaderTable) {
3260 CallInst *Call = nullptr;
3261 auto Leaders = LeaderTable.getLeaders(Num);
3262 for (const auto &Entry : Leaders) {
3263 Call = dyn_cast<CallInst>(&*Entry.Val);
3264 if (Call && Call->getParent() == PhiBlock)
3265 break;
3266 }
3267
3268 if (AA->doesNotAccessMemory(Call))
3269 return true;
3270
3271 if (!MD || !AA->onlyReadsMemory(Call))
3272 return false;
3273
3274 MemDepResult LocalDep = MD->getDependency(Call);
3275 if (!LocalDep.isNonLocal())
3276 return false;
3277
3280
3281 // Check to see if the Call has no function local clobber.
3282 for (const NonLocalDepEntry &D : Deps) {
3283 if (D.getResult().isNonFuncLocal())
3284 return true;
3285 }
3286 return false;
3287}
3288
3289/// Translate value number \p Num using phis, so that it has the values of
3290/// the phis in BB.
3291uint32_t GVNValueTable::phiTranslateImpl(const BasicBlock *Pred,
3292 const BasicBlock *PhiBlock,
3293 uint32_t Num,
3294 GVNLeaderMap &LeaderTable) {
3295 // See if we can refine the value number by looking at the PN incoming value
3296 // for the given predecessor.
3297 if (PHINode *PN = NumberingPhi[Num]) {
3298 if (PN->getParent() != PhiBlock)
3299 return Num;
3300 for (unsigned I = 0; I != PN->getNumIncomingValues(); ++I) {
3301 if (PN->getIncomingBlock(I) != Pred)
3302 continue;
3303 if (uint32_t TransVal = lookup(PN->getIncomingValue(I), false))
3304 return TransVal;
3305 }
3306 return Num;
3307 }
3308
3309 if (BasicBlock *BB = NumberingBB[Num]) {
3310 assert(MSSA && "NumberingBB is non-empty only when using MemorySSA");
3311 // Value numbers of basic blocks are used to represent memory state in
3312 // load/store instructions and read-only function calls when said state is
3313 // set by a MemoryPhi.
3314 if (BB != PhiBlock)
3315 return Num;
3316 MemoryPhi *MPhi = MSSA->getMemoryAccess(BB);
3317 for (unsigned i = 0, N = MPhi->getNumIncomingValues(); i != N; ++i) {
3318 if (MPhi->getIncomingBlock(i) != Pred)
3319 continue;
3320 MemoryAccess *MA = MPhi->getIncomingValue(i);
3321 if (auto *PredPhi = dyn_cast<MemoryPhi>(MA))
3322 return lookupOrAdd(PredPhi->getBlock());
3323 if (MSSA->isLiveOnEntryDef(MA))
3324 return lookupOrAdd(&BB->getParent()->getEntryBlock());
3325 return lookupOrAdd(cast<MemoryUseOrDef>(MA)->getMemoryInst());
3326 }
3328 "CFG/MemorySSA mismatch: predecessor not found among incoming blocks");
3329 }
3330
3331 // If there is any value related with Num is defined in a BB other than
3332 // PhiBlock, it cannot depend on a phi in PhiBlock without going through
3333 // a backedge. We can do an early exit in that case to save compile time.
3334 if (!areAllValsInBB(Num, PhiBlock, LeaderTable))
3335 return Num;
3336
3337 if (Num >= ExprIdx.size() || ExprIdx[Num] == 0)
3338 return Num;
3339 Expression Exp = Expressions[ExprIdx[Num]];
3340
3341 for (unsigned I = 0; I < Exp.VarArgs.size(); I++) {
3342 // For InsertValue and ExtractValue, some varargs are index numbers
3343 // instead of value numbers. Those index numbers should not be
3344 // translated.
3345 if ((I > 1 && Exp.Opcode == Instruction::InsertValue) ||
3346 (I > 0 && Exp.Opcode == Instruction::ExtractValue) ||
3347 (I > 1 && Exp.Opcode == Instruction::ShuffleVector))
3348 continue;
3349 Exp.VarArgs[I] = phiTranslate(Pred, PhiBlock, Exp.VarArgs[I], LeaderTable);
3350 }
3351
3352 if (Exp.Commutative) {
3353 assert(Exp.VarArgs.size() >= 2 && "Unsupported commutative instruction!");
3354 if (Exp.VarArgs[0] > Exp.VarArgs[1]) {
3355 std::swap(Exp.VarArgs[0], Exp.VarArgs[1]);
3356 uint32_t Opcode = Exp.Opcode >> 8;
3357 if (Opcode == Instruction::ICmp || Opcode == Instruction::FCmp)
3358 Exp.Opcode = (Opcode << 8) |
3360 static_cast<CmpInst::Predicate>(Exp.Opcode & 255));
3361 }
3362 }
3363
3364 if (uint32_t NewNum = ExpressionNumbering[Exp]) {
3365 if (Exp.Opcode == Instruction::Call && NewNum != Num)
3366 return areCallValsEqual(Num, NewNum, Pred, PhiBlock, LeaderTable) ? NewNum
3367 : Num;
3368 return NewNum;
3369 }
3370 return Num;
3371}
3372
3373/// Erase stale entry from phiTranslate cache so phiTranslate can be computed
3374/// again.
3376 const BasicBlock &CurrBlock) {
3377 for (const BasicBlock *Pred : predecessors(&CurrBlock))
3378 PhiTranslateTable.erase({Num, Pred});
3379}
3380
3381// In order to find a leader for a given value number at a
3382// specific basic block, we first obtain the list of all Values for that number,
3383// and then scan the list to find one whose block dominates the block in
3384// question. This is fast because dominator tree queries consist of only
3385// a few comparisons of DFS numbers.
3386Value *GVNPassImpl::findLeader(const BasicBlock *BB, uint32_t Num) {
3387 auto Leaders = LeaderTable.getLeaders(Num);
3388 if (Leaders.empty())
3389 return nullptr;
3390
3391 Value *Val = nullptr;
3392 for (const auto &Entry : Leaders) {
3393 if (DT->dominates(Entry.BB, BB)) {
3394 Val = Entry.Val;
3395 if (isa<Constant>(Val))
3396 return Val;
3397 }
3398 }
3399
3400 return Val;
3401}
3402
3403/// There is an edge from 'Src' to 'Dst'. Return
3404/// true if every path from the entry block to 'Dst' passes via this edge. In
3405/// particular 'Dst' must not be reachable via another edge from 'Src'.
3407 DominatorTree *DT) {
3408 // While in theory it is interesting to consider the case in which Dst has
3409 // more than one predecessor, because Dst might be part of a loop which is
3410 // only reachable from Src, in practice it is pointless since at the time
3411 // GVN runs all such loops have preheaders, which means that Dst will have
3412 // been changed to have only one predecessor, namely Src.
3413 const BasicBlock *Pred = E.getEnd()->getSinglePredecessor();
3414 assert((!Pred || Pred == E.getStart()) &&
3415 "No edge between these basic blocks!");
3416 return Pred != nullptr;
3417}
3418
3419void GVNPassImpl::assignBlockRPONumber(Function &F) {
3420 BlockRPONumber.clear();
3421 uint32_t NextBlockNumber = 1;
3422 ReversePostOrderTraversal<Function *> RPOT(&F);
3423 for (BasicBlock *BB : RPOT)
3424 BlockRPONumber[BB] = NextBlockNumber++;
3425 InvalidBlockRPONumbers = false;
3426}
3427
3428/// The given values are known to be equal in every use
3429/// dominated by 'Root'. Exploit this, for example by replacing 'LHS' with
3430/// 'RHS' everywhere in the scope. Returns whether a change was made.
3431/// The Root may either be a basic block edge (for conditions) or an
3432/// instruction (for assumes).
3433bool GVNPassImpl::propagateEquality(
3434 Value *LHS, Value *RHS,
3435 const std::variant<BasicBlockEdge, Instruction *> &Root) {
3437 SmallDenseSet<std::pair<Value *, Value *>, 4> Visited;
3438 Worklist.push_back(std::make_pair(LHS, RHS));
3439 bool Changed = false;
3440 SmallVector<const BasicBlock *> DominatedBlocks;
3441 if (const BasicBlockEdge *Edge = std::get_if<BasicBlockEdge>(&Root)) {
3442 // For speed, compute a conservative fast approximation to
3443 // DT->dominates(Root, Root.getEnd());
3445 DominatedBlocks.push_back(Edge->getEnd());
3446 } else {
3447 Instruction *I = std::get<Instruction *>(Root);
3448 for (const auto *Node : DT->getNode(I->getParent())->children())
3449 DominatedBlocks.push_back(Node->getBlock());
3450 }
3451
3452 while (!Worklist.empty()) {
3453 std::pair<Value*, Value*> Item = Worklist.pop_back_val();
3454 LHS = Item.first; RHS = Item.second;
3455
3456 if (LHS == RHS)
3457 continue;
3458 assert(LHS->getType() == RHS->getType() && "Equality but unequal types!");
3459
3460 // Don't try to propagate equalities between constants.
3462 continue;
3463
3464 // Prefer a constant on the right-hand side, or an Argument if no constants.
3466 std::swap(LHS, RHS);
3467 assert((isa<Argument>(LHS) || isa<Instruction>(LHS)) && "Unexpected value!");
3468 const DataLayout &DL =
3470 ? cast<Argument>(LHS)->getParent()->getDataLayout()
3471 : cast<Instruction>(LHS)->getDataLayout();
3472
3473 // If there is no obvious reason to prefer the left-hand side over the
3474 // right-hand side, ensure the longest lived term is on the right-hand side,
3475 // so the shortest lived term will be replaced by the longest lived.
3476 // This tends to expose more simplifications.
3477 uint32_t LVN = VN.lookupOrAdd(LHS);
3478 if ((isa<Argument>(LHS) && isa<Argument>(RHS)) ||
3480 // Move the 'oldest' value to the right-hand side, using the value number
3481 // as a proxy for age.
3482 uint32_t RVN = VN.lookupOrAdd(RHS);
3483 if (LVN < RVN) {
3484 std::swap(LHS, RHS);
3485 LVN = RVN;
3486 }
3487 }
3488
3489 if (!Visited.insert({LHS, RHS}).second)
3490 continue;
3491
3492 // If value numbering later sees that an instruction in the scope is equal
3493 // to 'LHS' then ensure it will be turned into 'RHS'. In order to preserve
3494 // the invariant that instructions only occur in the leader table for their
3495 // own value number (this is used by removeFromLeaderTable), do not do this
3496 // if RHS is an instruction (if an instruction in the scope is morphed into
3497 // LHS then it will be turned into RHS by the next GVN iteration anyway, so
3498 // using the leader table is about compiling faster, not optimizing better).
3499 // The leader table only tracks basic blocks, not edges. Only add to if we
3500 // have the simple case where the edge dominates the end.
3502 for (const BasicBlock *BB : DominatedBlocks)
3503 LeaderTable.insert(LVN, RHS, BB);
3504
3505 // Replace all occurrences of 'LHS' with 'RHS' everywhere in the scope. As
3506 // LHS always has at least one use that is not dominated by Root, this will
3507 // never do anything if LHS has only one use.
3508 if (!LHS->hasOneUse()) {
3509 // Create a callback that captures the DL.
3510 auto CanReplacePointersCallBack = [&DL](const Use &U, const Value *To) {
3511 return canReplacePointersInUseIfEqual(U, To, DL);
3512 };
3513 unsigned NumReplacements;
3514 if (const BasicBlockEdge *Edge = std::get_if<BasicBlockEdge>(&Root))
3515 NumReplacements = replaceDominatedUsesWithIf(
3516 LHS, RHS, *DT, *Edge, CanReplacePointersCallBack);
3517 else
3518 NumReplacements = replaceDominatedUsesWithIf(
3519 LHS, RHS, *DT, std::get<Instruction *>(Root),
3520 CanReplacePointersCallBack);
3521
3522 if (NumReplacements > 0) {
3523 Changed = true;
3524 NumGVNEqProp += NumReplacements;
3525 // Cached information for anything that uses LHS will be invalid.
3526 if (MD)
3527 MD->invalidateCachedPointerInfo(LHS);
3528 }
3529 }
3530
3531 // Now try to deduce additional equalities from this one. For example, if
3532 // the known equality was "(A != B)" == "false" then it follows that A and B
3533 // are equal in the scope. Only boolean equalities with an explicit true or
3534 // false RHS are currently supported.
3535 if (!RHS->getType()->isIntegerTy(1))
3536 // Not a boolean equality - bail out.
3537 continue;
3538 ConstantInt *CI = dyn_cast<ConstantInt>(RHS);
3539 if (!CI)
3540 // RHS neither 'true' nor 'false' - bail out.
3541 continue;
3542 // Whether RHS equals 'true'. Otherwise it equals 'false'.
3543 bool IsKnownTrue = CI->isMinusOne();
3544 bool IsKnownFalse = !IsKnownTrue;
3545
3546 // If "A && B" is known true then both A and B are known true. If "A || B"
3547 // is known false then both A and B are known false.
3548 Value *A, *B;
3549 if ((IsKnownTrue && match(LHS, m_LogicalAnd(m_Value(A), m_Value(B)))) ||
3550 (IsKnownFalse && match(LHS, m_LogicalOr(m_Value(A), m_Value(B))))) {
3551 Worklist.push_back(std::make_pair(A, RHS));
3552 Worklist.push_back(std::make_pair(B, RHS));
3553 continue;
3554 }
3555
3556 // If we are propagating an equality like "(A == B)" == "true" then also
3557 // propagate the equality A == B. When propagating a comparison such as
3558 // "(A >= B)" == "true", replace all instances of "A < B" with "false".
3559 if (CmpInst *Cmp = dyn_cast<CmpInst>(LHS)) {
3560 Value *Op0 = Cmp->getOperand(0), *Op1 = Cmp->getOperand(1);
3561
3562 // If "A == B" is known true, or "A != B" is known false, then replace
3563 // A with B everywhere in the scope. For floating point operations, we
3564 // have to be careful since equality does not always imply equivalance.
3565 if (Cmp->isEquivalence(IsKnownFalse))
3566 Worklist.push_back(std::make_pair(Op0, Op1));
3567
3568 // If "A >= B" is known true, replace "A < B" with false everywhere.
3569 CmpInst::Predicate NotPred = Cmp->getInversePredicate();
3570 Constant *NotVal = ConstantInt::get(Cmp->getType(), IsKnownFalse);
3571 // Since we don't have the instruction "A < B" immediately to hand, work
3572 // out the value number that it would have and use that to find an
3573 // appropriate instruction (if any).
3574 uint32_t NextNum = VN.getNextUnusedValueNumber();
3575 uint32_t Num = VN.lookupOrAddCmp(Cmp->getOpcode(), NotPred, Op0, Op1);
3576 // If the number we were assigned was brand new then there is no point in
3577 // looking for an instruction realizing it: there cannot be one!
3578 if (Num < NextNum) {
3579 for (const auto &Entry : LeaderTable.getLeaders(Num)) {
3580 // Only look at leaders that either dominate the start of the edge,
3581 // or are dominated by the end. This check is not necessary for
3582 // correctness, it only discards cases for which the following
3583 // use replacement will not work anyway.
3584 if (const BasicBlockEdge *Edge = std::get_if<BasicBlockEdge>(&Root)) {
3585 if (!DT->dominates(Entry.BB, Edge->getStart()) &&
3586 !DT->dominates(Edge->getEnd(), Entry.BB))
3587 continue;
3588 } else {
3589 auto *InstBB = std::get<Instruction *>(Root)->getParent();
3590 if (!DT->dominates(Entry.BB, InstBB) &&
3591 !DT->dominates(InstBB, Entry.BB))
3592 continue;
3593 }
3594
3595 Value *NotCmp = Entry.Val;
3596 if (NotCmp && isa<Instruction>(NotCmp)) {
3597 unsigned NumReplacements;
3598 if (const BasicBlockEdge *Edge = std::get_if<BasicBlockEdge>(&Root))
3599 NumReplacements =
3600 replaceDominatedUsesWith(NotCmp, NotVal, *DT, *Edge);
3601 else
3602 NumReplacements = replaceDominatedUsesWith(
3603 NotCmp, NotVal, *DT, std::get<Instruction *>(Root));
3604 Changed |= NumReplacements > 0;
3605 NumGVNEqProp += NumReplacements;
3606 // Cached information for anything that uses NotCmp will be invalid.
3607 if (MD)
3608 MD->invalidateCachedPointerInfo(NotCmp);
3609 }
3610 }
3611 }
3612 // Ensure that any instruction in scope that gets the "A < B" value number
3613 // is replaced with false.
3614 // The leader table only tracks basic blocks, not edges. Only add to if we
3615 // have the simple case where the edge dominates the end.
3616 for (const BasicBlock *BB : DominatedBlocks)
3617 LeaderTable.insert(Num, NotVal, BB);
3618
3619 continue;
3620 }
3621
3622 // Propagate equalities that results from truncation with no unsigned wrap
3623 // like (trunc nuw i64 %v to i1) == "true" or (trunc nuw i64 %v to i1) ==
3624 // "false"
3625 if (match(LHS, m_NUWTrunc(m_Value(A)))) {
3626 Worklist.emplace_back(A, ConstantInt::get(A->getType(), IsKnownTrue));
3627 continue;
3628 }
3629
3630 if (match(LHS, m_Not(m_Value(A)))) {
3631 Worklist.emplace_back(A, ConstantInt::get(A->getType(), !IsKnownTrue));
3632 continue;
3633 }
3634 }
3635
3636 return Changed;
3637}
3638
3639bool GVNPassImpl::replaceWithEquivalentCmp(CmpInst *Cmp) {
3640 auto FindCmpLeader = [&](CmpInst::Predicate Pred) -> Value * {
3641 uint32_t Num = VN.lookupCmp(Cmp->getOpcode(), Pred, Cmp->getOperand(0),
3642 Cmp->getOperand(1));
3643 if (Num != 0)
3644 return findLeader(Cmp->getParent(), Num);
3645 return nullptr;
3646 };
3647
3648 // Substitute cmp instruction with not if possible.
3649 if (Value *Repl = FindCmpLeader(Cmp->getInversePredicate())) {
3650 patchReplacementInstruction(Cmp, Repl);
3651 BinaryOperator *Not = BinaryOperator::CreateNot(
3652 Repl, Repl->getName() + ".not", Cmp->getIterator());
3653 Not->setDebugLoc(Cmp->getDebugLoc());
3654 Cmp->replaceAllUsesWith(Not);
3656 return true;
3657 }
3658
3659 // Substitute icmp samesign upred with icmp spred
3660 auto *ICmp = dyn_cast<ICmpInst>(Cmp);
3661 if (ICmp && ICmp->hasSameSign() && !ICmp->isEquality()) {
3662 if (Value *Repl = FindCmpLeader(
3663 ICmpInst::getFlippedSignednessPredicate(ICmp->getPredicate()))) {
3664 patchAndReplaceAllUsesWith(Cmp, Repl);
3666 return true;
3667 }
3668 }
3669 return false;
3670}
3671
3672/// When calculating availability, handle an instruction
3673/// by inserting it into the appropriate sets.
3674bool GVNPassImpl::processInstruction(Instruction *I) {
3675 // If the instruction can be easily simplified then do so now in preference
3676 // to value numbering it. Value numbering often exposes redundancies, for
3677 // example if it determines that %y is equal to %x then the instruction
3678 // "%z = and i32 %x, %y" becomes "%z = and i32 %x, %x" which we now simplify.
3679 const DataLayout &DL = I->getDataLayout();
3680 if (Value *V = simplifyInstruction(I, {DL, TLI, DT, AC})) {
3681 bool Changed = false;
3682 if (!I->use_empty()) {
3683 // Simplification can cause a special instruction to become not special.
3684 // For example, devirtualization to a willreturn function.
3685 ICF->removeUsersOf(I);
3686 I->replaceAllUsesWith(V);
3687 Changed = true;
3688 }
3689 if (isInstructionTriviallyDead(I, TLI)) {
3691 Changed = true;
3692 }
3693 if (Changed) {
3694 if (MD && V->getType()->isPtrOrPtrVectorTy())
3695 MD->invalidateCachedPointerInfo(V);
3696 ++NumGVNSimpl;
3697 return true;
3698 }
3699 }
3700
3701 if (auto *Assume = dyn_cast<AssumeInst>(I))
3702 return processAssumeIntrinsic(Assume);
3703
3704 if (LoadInst *Load = dyn_cast<LoadInst>(I)) {
3705 if (processLoad(Load))
3706 return true;
3707
3708 unsigned Num = VN.lookupOrAdd(Load);
3709 LeaderTable.insert(Num, Load, Load->getParent());
3710 return false;
3711 }
3712
3714 processMaskedLoad(cast<IntrinsicInst>(I)))
3715 return true;
3716
3717 // For conditional branches, we can perform simple conditional propagation on
3718 // the condition value itself.
3719 if (CondBrInst *BI = dyn_cast<CondBrInst>(I)) {
3720 if (isa<Constant>(BI->getCondition()))
3721 return processFoldableCondBr(BI);
3722
3723 Value *BranchCond = BI->getCondition();
3724 BasicBlock *TrueSucc = BI->getSuccessor(0);
3725 BasicBlock *FalseSucc = BI->getSuccessor(1);
3726 // Avoid multiple edges early.
3727 if (TrueSucc == FalseSucc)
3728 return false;
3729
3730 BasicBlock *Parent = BI->getParent();
3731 bool Changed = false;
3732
3734 BasicBlockEdge TrueE(Parent, TrueSucc);
3735 Changed |= propagateEquality(BranchCond, TrueVal, TrueE);
3736
3738 BasicBlockEdge FalseE(Parent, FalseSucc);
3739 Changed |= propagateEquality(BranchCond, FalseVal, FalseE);
3740
3741 return Changed;
3742 }
3743
3744 // For switches, propagate the case values into the case destinations.
3745 if (SwitchInst *SI = dyn_cast<SwitchInst>(I)) {
3746 Value *SwitchCond = SI->getCondition();
3747 BasicBlock *Parent = SI->getParent();
3748 bool Changed = false;
3749
3750 // Remember how many outgoing edges there are to every successor.
3751 SmallDenseMap<BasicBlock *, unsigned, 16> SwitchEdges;
3752 for (BasicBlock *Succ : successors(Parent))
3753 ++SwitchEdges[Succ];
3754
3755 for (const auto &Case : SI->cases()) {
3756 BasicBlock *Dst = Case.getCaseSuccessor();
3757 // If there is only a single edge, propagate the case value into it.
3758 if (SwitchEdges.lookup(Dst) == 1) {
3759 BasicBlockEdge E(Parent, Dst);
3760 Changed |= propagateEquality(SwitchCond, Case.getCaseValue(), E);
3761 }
3762 }
3763 return Changed;
3764 }
3765
3766 // Instructions with void type don't return a value, so there's
3767 // no point in trying to find redundancies in them.
3768 if (I->getType()->isVoidTy())
3769 return false;
3770
3771 uint32_t NextNum = VN.getNextUnusedValueNumber();
3772 unsigned Num = VN.lookupOrAdd(I);
3773
3774 // Allocations are always uniquely numbered, so we can save time and memory
3775 // by fast failing them.
3776 if (isa<AllocaInst>(I) || I->isTerminator() || isa<PHINode>(I)) {
3777 LeaderTable.insert(Num, I, I->getParent());
3778 return false;
3779 }
3780
3781 // A ptrtoaddr and a ptrtoint of the same pointer compute the same value when
3782 // the address width equals the pointer representation width.
3783 if (auto *PTA = dyn_cast<PtrToAddrInst>(I)) {
3784 const DataLayout &DL = I->getDataLayout();
3785 unsigned AS = PTA->getPointerAddressSpace();
3786 if (DL.getAddressSizeInBits(AS) == DL.getPointerSizeInBits(AS) &&
3787 !DL.hasUnstableRepresentation(AS)) {
3788 uint32_t PTINum =
3789 VN.lookupPtrToInt(PTA->getPointerOperand(), PTA->getType());
3790 if (Value *PTI = findLeader(I->getParent(), PTINum)) {
3793 return true;
3794 }
3795 }
3796 }
3797
3798 // Perform fast-path value-number based elimination of values inherited from
3799 // dominators, unless the number we were assigned was a brand new VN, then
3800 // we don't need to do a lookup to see if the number already exists somewhere
3801 // in the domtree: it can't!
3802 Value *Repl = Num < NextNum ? findLeader(I->getParent(), Num) : nullptr;
3803 if (!Repl) {
3804 if (auto *Cmp = dyn_cast<CmpInst>(I); Cmp && replaceWithEquivalentCmp(Cmp))
3805 return true;
3806
3807 // Failure, just remember this instance for future use.
3808 LeaderTable.insert(Num, I, I->getParent());
3809 return false;
3810 }
3811
3812 if (Repl == I) {
3813 // If I was the result of a shortcut PRE, it might already be in the table
3814 // and the best replacement for itself. Nothing to do.
3815 return false;
3816 }
3817
3818 // Remove it!
3820 if (MD && Repl->getType()->isPtrOrPtrVectorTy())
3821 MD->invalidateCachedPointerInfo(Repl);
3823 return true;
3824}
3825
3826/// runOnFunction - This is the main transformation entry point for a function.
3827bool GVNPassImpl::run(Function &F, AssumptionCache &RunAC, DominatorTree &RunDT,
3828 const TargetLibraryInfo &RunTLI, AAResults &RunAA,
3830 OptimizationRemarkEmitter *RunORE, MemorySSA *MSSA) {
3831 // MemDep and MemorySSA are mutually exclusive. isMemDepEnabled() silently
3832 // lets MemorySSA win for the common single-flag case, but an explicit
3833 // request for both via -enable-gvn-{memdep,memoryssa} is a contradiction we
3834 // reject rather than resolve arbitrarily.
3835 if (Opts->enable_gvn_memdep == BoolOrDefault::True &&
3836 Opts->enable_gvn_memoryssa)
3837 report_fatal_error("GVN: -enable-gvn-memdep and -enable-gvn-memoryssa are "
3838 "mutually exclusive",
3839 /*gen_crash_diag=*/false);
3840 AC = &RunAC;
3841 DT = &RunDT;
3842 VN.setDomTree(DT);
3843 TLI = &RunTLI;
3844 AA = &RunAA;
3845 VN.setAliasAnalysis(&RunAA);
3846 MD = RunMD;
3847 ImplicitControlFlowTracking ImplicitCFT;
3848 ICF = &ImplicitCFT;
3849 this->LI = &LI;
3850 VN.setMemDep(MD);
3851 // Propagate the MSSA-enabled flag so the value-numbering paths in
3852 // lookupOrAddCall() and computeLoadStoreVN(), which depends on whether
3853 // IsMSSAEnabled is turned on.
3854 VN.setMemorySSA(MSSA, isMemorySSAEnabled());
3855 ORE = RunORE;
3856 InvalidBlockRPONumbers = true;
3857 MemorySSAUpdater Updater(MSSA);
3858 MSSAU = MSSA ? &Updater : nullptr;
3859
3860 bool Changed = false;
3861 bool ShouldContinue = true;
3862
3863 DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy);
3864 // Merge unconditional branches, allowing PRE to catch more
3865 // optimization opportunities.
3866 for (BasicBlock &BB : make_early_inc_range(F)) {
3867 bool RemovedBlock = MergeBlockIntoPredecessor(&BB, &DTU, &LI, MSSAU, MD);
3868 if (RemovedBlock)
3869 ++NumGVNBlocks;
3870
3871 Changed |= RemovedBlock;
3872 }
3873 DTU.flush();
3874
3875 EarliestEscapeAnalysis RunEA(*DT, &LI);
3876 EA = MSSA ? &RunEA : nullptr;
3877
3878 unsigned Iteration = 0;
3879 while (ShouldContinue) {
3880 LLVM_DEBUG(dbgs() << "GVN iteration: " << Iteration << "\n");
3881 (void) Iteration;
3882 ShouldContinue = iterateOnFunction(F);
3883 Changed |= ShouldContinue;
3884 ++Iteration;
3885 }
3886
3887 if (isScalarPREEnabled()) {
3888 // Fabricate val-num for dead-code in order to suppress assertion in
3889 // performPRE().
3890 assignValNumForDeadCode();
3891 bool PREChanged = true;
3892 while (PREChanged) {
3893 PREChanged = performPRE(F);
3894 Changed |= PREChanged;
3895 }
3896 }
3897
3898 // FIXME: Should perform GVN again after PRE does something. PRE can move
3899 // computations into blocks where they become fully redundant. Note that
3900 // we can't do this until PRE's critical edge splitting updates memdep.
3901 // Actually, when this happens, we should just fully integrate PRE into GVN.
3902
3903 cleanupGlobalSets();
3904 // Do not cleanup DeadBlocks in cleanupGlobalSets() as it's called for each
3905 // iteration.
3906 DeadBlocks.clear();
3907
3908 if (MSSA && VerifyMemorySSA)
3909 MSSA->verifyMemorySSA();
3910
3911 return Changed;
3912}
3913
3914bool GVNPassImpl::processBlock(BasicBlock *BB) {
3915 if (DeadBlocks.count(BB))
3916 return false;
3917
3918 bool ChangedFunction = false;
3919
3920 // Since we may not have visited the input blocks of the phis, we can't
3921 // use our normal hash approach for phis. Instead, simply look for
3922 // obvious duplicates. The first pass of GVN will tend to create
3923 // identical phis, and the second or later passes can eliminate them.
3924 SmallPtrSet<PHINode *, 8> PHINodesToRemove;
3925 ChangedFunction |= EliminateDuplicatePHINodes(BB, PHINodesToRemove);
3926 for (PHINode *PN : PHINodesToRemove) {
3927 removeInstruction(PN);
3928 }
3929 for (Instruction &Inst : make_early_inc_range(*BB))
3930 ChangedFunction |= processInstruction(&Inst);
3931 return ChangedFunction;
3932}
3933
3934// Instantiate an expression in a predecessor that lacked it.
3935bool GVNPassImpl::performScalarPREInsertion(Instruction *Instr,
3936 BasicBlock *Pred, BasicBlock *Curr,
3937 unsigned int ValNo) {
3938 // Because we are going top-down through the block, all value numbers
3939 // will be available in the predecessor by the time we need them. Any
3940 // that weren't originally present will have been instantiated earlier
3941 // in this loop.
3942 bool Success = true;
3943 for (unsigned I = 0, E = Instr->getNumOperands(); I != E; ++I) {
3944 Value *Op = Instr->getOperand(I);
3946 continue;
3947 // This could be a newly inserted instruction, in which case, we won't
3948 // find a value number, and should give up before we hurt ourselves.
3949 // FIXME: Rewrite the infrastructure to let it easier to value number
3950 // and process newly inserted instructions.
3951 if (!VN.exists(Op)) {
3952 Success = false;
3953 break;
3954 }
3955 uint32_t TValNo = VN.phiTranslate(Pred, Curr, VN.lookup(Op), LeaderTable);
3956 if (Value *V = findLeader(Pred, TValNo)) {
3957 Instr->setOperand(I, V);
3958 } else {
3959 Success = false;
3960 break;
3961 }
3962 }
3963
3964 // Fail out if we encounter an operand that is not available in
3965 // the PRE predecessor. This is typically because of loads which
3966 // are not value numbered precisely.
3967 if (!Success)
3968 return false;
3969
3970 Instr->insertBefore(Pred->getTerminator()->getIterator());
3971 Instr->setName(Instr->getName() + ".pre");
3972 Instr->setDebugLoc(Instr->getDebugLoc());
3973
3974 ICF->insertInstructionTo(Instr, Pred);
3975
3976 unsigned Num = VN.lookupOrAdd(Instr);
3977 VN.add(Instr, Num);
3978
3979 // Update the availability map to include the new instruction.
3980 LeaderTable.insert(Num, Instr, Pred);
3981 return true;
3982}
3983
3984bool GVNPassImpl::performScalarPRE(Instruction *CurInst) {
3985 if (isa<AllocaInst>(CurInst) || CurInst->isTerminator() ||
3986 isa<PHINode>(CurInst) || CurInst->getType()->isVoidTy() ||
3987 CurInst->mayReadFromMemory() || CurInst->mayHaveSideEffects() ||
3988 CurInst->getType()->isTokenLikeTy())
3989 return false;
3990
3991 // Don't do PRE on compares. The PHI would prevent CodeGenPrepare from
3992 // sinking the compare again, and it would force the code generator to
3993 // move the i1 from processor flags or predicate registers into a general
3994 // purpose register.
3995 if (isa<CmpInst>(CurInst))
3996 return false;
3997
3998 // Don't do PRE on GEPs. The inserted PHI would prevent CodeGenPrepare from
3999 // sinking the addressing mode computation back to its uses. Extending the
4000 // GEP's live range increases the register pressure, and therefore it can
4001 // introduce unnecessary spills.
4002 //
4003 // This doesn't prevent Load PRE. PHI translation will make the GEP available
4004 // to the load by moving it to the predecessor block if necessary.
4005 if (isa<GetElementPtrInst>(CurInst))
4006 return false;
4007
4008 if (auto *CallB = dyn_cast<CallBase>(CurInst)) {
4009 // We don't currently value number ANY inline asm calls.
4010 if (CallB->isInlineAsm())
4011 return false;
4012 }
4013
4014 uint32_t ValNo = VN.lookup(CurInst);
4015
4016 // Look for the predecessors for PRE opportunities. We're
4017 // only trying to solve the basic diamond case, where
4018 // a value is computed in the successor and one predecessor,
4019 // but not the other. We also explicitly disallow cases
4020 // where the successor is its own predecessor, because they're
4021 // more complicated to get right.
4022 unsigned NumWith = 0;
4023 unsigned NumWithout = 0;
4024 BasicBlock *PREPred = nullptr;
4025 BasicBlock *CurrentBlock = CurInst->getParent();
4026
4027 // Update the RPO numbers for this function.
4028 if (InvalidBlockRPONumbers)
4029 assignBlockRPONumber(*CurrentBlock->getParent());
4030
4032 for (BasicBlock *P : predecessors(CurrentBlock)) {
4033 // We're not interested in PRE where blocks with predecessors that are
4034 // not reachable.
4035 if (!DT->isReachableFromEntry(P)) {
4036 NumWithout = 2;
4037 break;
4038 }
4039 // It is not safe to do PRE when P->CurrentBlock is a loop backedge.
4040 assert(BlockRPONumber.count(P) && BlockRPONumber.count(CurrentBlock) &&
4041 "Invalid BlockRPONumber map.");
4042 if (BlockRPONumber[P] >= BlockRPONumber[CurrentBlock]) {
4043 NumWithout = 2;
4044 break;
4045 }
4046
4047 uint32_t TValNo = VN.phiTranslate(P, CurrentBlock, ValNo, LeaderTable);
4048 Value *PredV = findLeader(P, TValNo);
4049 if (!PredV) {
4050 PredMap.push_back(std::make_pair(static_cast<Value *>(nullptr), P));
4051 PREPred = P;
4052 ++NumWithout;
4053 } else if (PredV == CurInst) {
4054 // CurInst dominates this predecessor.
4055 NumWithout = 2;
4056 break;
4057 } else {
4058 PredMap.push_back(std::make_pair(PredV, P));
4059 ++NumWith;
4060 }
4061 }
4062
4063 // Don't do PRE when it might increase code size, i.e. when
4064 // we would need to insert instructions in more than one pred.
4065 if (NumWithout > 1 || NumWith == 0)
4066 return false;
4067
4068 // We may have a case where all predecessors have the instruction,
4069 // and we just need to insert a phi node. Otherwise, perform
4070 // insertion.
4071 Instruction *PREInstr = nullptr;
4072
4073 if (NumWithout != 0) {
4074 if (!isSafeToSpeculativelyExecute(CurInst)) {
4075 // It is only valid to insert a new instruction if the current instruction
4076 // is always executed. An instruction with implicit control flow could
4077 // prevent us from doing it. If we cannot speculate the execution, then
4078 // PRE should be prohibited.
4079 if (ICF->isDominatedByICFIFromSameBlock(CurInst))
4080 return false;
4081 }
4082
4083 // Don't do PRE across indirect branch.
4084 if (isa<IndirectBrInst>(PREPred->getTerminator()))
4085 return false;
4086
4087 // We can't do PRE safely on a critical edge, so instead we schedule
4088 // the edge to be split and perform the PRE the next time we iterate
4089 // on the function.
4090 unsigned SuccNum = GetSuccessorNumber(PREPred, CurrentBlock);
4091 if (isCriticalEdge(PREPred->getTerminator(), SuccNum)) {
4092 ToSplit.push_back(std::make_pair(PREPred->getTerminator(), SuccNum));
4093 return false;
4094 }
4095 // We need to insert somewhere, so let's give it a shot.
4096 PREInstr = CurInst->clone();
4097 if (!performScalarPREInsertion(PREInstr, PREPred, CurrentBlock, ValNo)) {
4098 // If we failed insertion, make sure we remove the instruction.
4099#ifndef NDEBUG
4100 verifyRemoved(PREInstr);
4101#endif
4102 PREInstr->deleteValue();
4103 return false;
4104 }
4105 }
4106
4107 // Either we should have filled in the PRE instruction, or we should
4108 // not have needed insertions.
4109 assert(PREInstr != nullptr || NumWithout == 0);
4110
4111 ++NumGVNPRE;
4112
4113 // Create a PHI to make the value available in this block.
4114 PHINode *Phi = PHINode::Create(CurInst->getType(), PredMap.size(),
4115 CurInst->getName() + ".pre-phi");
4116 Phi->insertBefore(CurrentBlock->begin());
4117 for (auto &[V, BB] : PredMap) {
4118 if (V) {
4119 // If we use an existing value in this phi, we have to patch the original
4120 // value because the phi will be used to replace a later value.
4121 patchReplacementInstruction(CurInst, V);
4122 Phi->addIncoming(V, BB);
4123 } else
4124 Phi->addIncoming(PREInstr, PREPred);
4125 }
4126
4127 VN.add(Phi, ValNo);
4128 // After creating a new PHI for ValNo, the phi translate result for ValNo will
4129 // be changed, so erase the related stale entries in phi translate cache.
4130 VN.eraseTranslateCacheEntry(ValNo, *CurrentBlock);
4131 LeaderTable.insert(ValNo, Phi, CurrentBlock);
4132 Phi->setDebugLoc(CurInst->getDebugLoc());
4133 CurInst->replaceAllUsesWith(Phi);
4134 if (MD && Phi->getType()->isPtrOrPtrVectorTy())
4135 MD->invalidateCachedPointerInfo(Phi);
4136 LeaderTable.erase(ValNo, CurInst, CurrentBlock);
4137
4138 LLVM_DEBUG(dbgs() << "GVN PRE removed: " << *CurInst << '\n');
4139 removeInstruction(CurInst);
4140
4141 return true;
4142}
4143
4144/// Perform a purely local form of PRE that looks for diamond
4145/// control flow patterns and attempts to perform simple PRE at the join point.
4146bool GVNPassImpl::performPRE(Function &F) {
4147 bool Changed = false;
4148 for (BasicBlock *CurrentBlock : depth_first(&F.getEntryBlock())) {
4149 // Nothing to PRE in the entry block.
4150 if (CurrentBlock == &F.getEntryBlock())
4151 continue;
4152
4153 // Don't perform PRE on an EH pad.
4154 if (CurrentBlock->isEHPad())
4155 continue;
4156
4157 for (BasicBlock::iterator BI = CurrentBlock->begin(),
4158 BE = CurrentBlock->end();
4159 BI != BE;) {
4160 Instruction *CurInst = &*BI++;
4161 Changed |= performScalarPRE(CurInst);
4162 }
4163 }
4164
4165 if (splitCriticalEdges())
4166 Changed = true;
4167
4168 return Changed;
4169}
4170
4171/// Split the critical edge connecting the given two blocks, and return
4172/// the block inserted to the critical edge.
4173BasicBlock *GVNPassImpl::splitCriticalEdges(BasicBlock *Pred,
4174 BasicBlock *Succ) {
4175 // GVN does not require loop-simplify, do not try to preserve it if it is not
4176 // possible.
4178 Pred, Succ,
4179 CriticalEdgeSplittingOptions(DT, LI, MSSAU).unsetPreserveLoopSimplify());
4180 if (BB) {
4181 if (MD)
4182 MD->invalidateCachedPredecessors();
4183 InvalidBlockRPONumbers = true;
4184 }
4185 return BB;
4186}
4187
4188/// Split critical edges found during the previous
4189/// iteration that may enable further optimization.
4190bool GVNPassImpl::splitCriticalEdges() {
4191 if (ToSplit.empty())
4192 return false;
4193
4194 bool Changed = false;
4195 do {
4196 std::pair<Instruction *, unsigned> Edge = ToSplit.pop_back_val();
4197 Changed |= SplitCriticalEdge(Edge.first, Edge.second,
4198 CriticalEdgeSplittingOptions(DT, LI, MSSAU)) !=
4199 nullptr;
4200 } while (!ToSplit.empty());
4201 if (Changed) {
4202 if (MD)
4203 MD->invalidateCachedPredecessors();
4204 InvalidBlockRPONumbers = true;
4205 }
4206 return Changed;
4207}
4208
4209/// Executes one iteration of GVN.
4210bool GVNPassImpl::iterateOnFunction(Function &F) {
4211 cleanupGlobalSets();
4212
4213 // Top-down walk of the dominator tree.
4214 bool Changed = false;
4215 // Needed for value numbering with phi construction to work.
4216 // RPOT walks the graph in its constructor and will not be invalidated during
4217 // processBlock.
4218 ReversePostOrderTraversal<Function *> RPOT(&F);
4219
4220 for (BasicBlock *BB : RPOT)
4221 Changed |= processBlock(BB);
4222
4223 return Changed;
4224}
4225
4226void GVNPassImpl::cleanupGlobalSets() {
4227 VN.clear();
4228 LeaderTable.clear();
4229 BlockRPONumber.clear();
4230 ICF->clear();
4231 InvalidBlockRPONumbers = true;
4232}
4233
4234void GVNPassImpl::removeInstruction(Instruction *I) {
4235 VN.erase(I);
4236 if (MD) MD->removeInstruction(I);
4237 if (EA)
4238 EA->removeInstruction(I);
4239 if (MSSAU)
4240 MSSAU->removeMemoryAccess(I);
4241#ifndef NDEBUG
4242 verifyRemoved(I);
4243#endif
4244 ICF->removeInstruction(I);
4245 I->eraseFromParent();
4246 ++NumGVNInstr;
4247}
4248
4249/// Verify that the specified instruction does not occur in our
4250/// internal data structures.
4251void GVNPassImpl::verifyRemoved(const Instruction *Inst) const {
4252 VN.verifyRemoved(Inst);
4253}
4254
4255/// BB is declared dead, which implied other blocks become dead as well. This
4256/// function is to add all these blocks to "DeadBlocks". For the dead blocks'
4257/// live successors, update their phi nodes by replacing the operands
4258/// corresponding to dead blocks with UndefVal.
4259void GVNPassImpl::addDeadBlock(BasicBlock *BB) {
4261 SmallSetVector<BasicBlock *, 4> DF;
4262
4263 NewDead.push_back(BB);
4264 while (!NewDead.empty()) {
4265 BasicBlock *D = NewDead.pop_back_val();
4266 if (DeadBlocks.count(D))
4267 continue;
4268
4269 // All blocks dominated by D are dead.
4270 SmallVector<BasicBlock *, 8> Dom;
4271 DT->getDescendants(D, Dom);
4272 DeadBlocks.insert_range(Dom);
4273
4274 // Figure out the dominance-frontier(D).
4275 for (BasicBlock *B : Dom) {
4276 for (BasicBlock *S : successors(B)) {
4277 if (DeadBlocks.count(S))
4278 continue;
4279
4280 bool AllPredDead = true;
4281 for (BasicBlock *P : predecessors(S))
4282 if (!DeadBlocks.count(P)) {
4283 AllPredDead = false;
4284 break;
4285 }
4286
4287 if (!AllPredDead) {
4288 // S could be proved dead later on. That is why we don't update phi
4289 // operands at this moment.
4290 DF.insert(S);
4291 } else {
4292 // While S is not dominated by D, it is dead by now. This could take
4293 // place if S already have a dead predecessor before D is declared
4294 // dead.
4295 NewDead.push_back(S);
4296 }
4297 }
4298 }
4299 }
4300
4301 // For the dead blocks' live successors, update their phi nodes by replacing
4302 // the operands corresponding to dead blocks with UndefVal.
4303 for (BasicBlock *B : DF) {
4304 if (DeadBlocks.count(B))
4305 continue;
4306
4307 // First, split the critical edges. This might also create additional blocks
4308 // to preserve LoopSimplify form and adjust edges accordingly.
4310 for (BasicBlock *P : Preds) {
4311 if (!DeadBlocks.count(P))
4312 continue;
4313
4314 if (is_contained(successors(P), B) &&
4315 isCriticalEdge(P->getTerminator(), B)) {
4316 if (BasicBlock *S = splitCriticalEdges(P, B))
4317 DeadBlocks.insert(P = S);
4318 }
4319 }
4320
4321 // Now poison the incoming values from the dead predecessors.
4322 for (BasicBlock *P : predecessors(B)) {
4323 if (!DeadBlocks.count(P))
4324 continue;
4325 for (PHINode &Phi : B->phis()) {
4326 Phi.setIncomingValueForBlock(P, PoisonValue::get(Phi.getType()));
4327 if (MD)
4328 MD->invalidateCachedPointerInfo(&Phi);
4329 }
4330 }
4331 }
4332}
4333
4334// If the given branch is recognized as a foldable branch (i.e. conditional
4335// branch with constant condition), it will perform following analyses and
4336// transformation.
4337// 1) If the dead out-coming edge is a critical-edge, split it. Let
4338// R be the target of the dead out-coming edge.
4339// 1) Identify the set of dead blocks implied by the branch's dead outcoming
4340// edge. The result of this step will be {X| X is dominated by R}
4341// 2) Identify those blocks which haves at least one dead predecessor. The
4342// result of this step will be dominance-frontier(R).
4343// 3) Update the PHIs in DF(R) by replacing the operands corresponding to
4344// dead blocks with "UndefVal" in an hope these PHIs will optimized away.
4345//
4346// Return true iff *NEW* dead code are found.
4347bool GVNPassImpl::processFoldableCondBr(CondBrInst *BI) {
4348 // If a branch has two identical successors, we cannot declare either dead.
4349 if (BI->getSuccessor(0) == BI->getSuccessor(1))
4350 return false;
4351
4352 ConstantInt *Cond = dyn_cast<ConstantInt>(BI->getCondition());
4353 if (!Cond)
4354 return false;
4355
4356 BasicBlock *DeadRoot =
4357 Cond->getZExtValue() ? BI->getSuccessor(1) : BI->getSuccessor(0);
4358 if (DeadBlocks.count(DeadRoot))
4359 return false;
4360
4361 if (!DeadRoot->getSinglePredecessor())
4362 DeadRoot = splitCriticalEdges(BI->getParent(), DeadRoot);
4363
4364 addDeadBlock(DeadRoot);
4365 return true;
4366}
4367
4368// performPRE() will trigger assert if it comes across an instruction without
4369// associated val-num. As it normally has far more live instructions than dead
4370// instructions, it makes more sense just to "fabricate" a val-number for the
4371// dead code than checking if instruction involved is dead or not.
4372void GVNPassImpl::assignValNumForDeadCode() {
4373 for (BasicBlock *BB : DeadBlocks) {
4374 for (Instruction &Inst : *BB) {
4375 unsigned ValNum = VN.lookupOrAdd(&Inst);
4376 LeaderTable.insert(ValNum, &Inst, BB);
4377 }
4378 }
4379}
4380
4382public:
4383 static char ID; // Pass identification, replacement for typeid.
4384
4385 // Always uses MemDep, ignoring -enable-gvn-memdep and -enable-gvn-memoryssa.
4386 explicit GVNLegacyPass(bool ScalarPRE = true)
4387 : FunctionPass(ID),
4388 Impl(GVNOptions().setMemDep(true).setMemorySSA(false).setScalarPRE(
4389 ScalarPRE)) {
4391 }
4392
4393 bool runOnFunction(Function &F) override {
4394 if (skipFunction(F))
4395 return false;
4396
4397 Impl.Opts = &F.getContext().getLibraryOptions().get<ScalarOptions>();
4399 return Impl.run(
4400 F, getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F),
4403 getAnalysis<AAResultsWrapperPass>().getAAResults(),
4405 getAnalysis<LoopInfoWrapperPass>().getLoopInfo(),
4407 MSSAWP ? &MSSAWP->getMSSA() : nullptr);
4408 }
4409
4424
4425private:
4426 GVNPassImpl Impl;
4427};
4428
4429char GVNLegacyPass::ID = 0;
4430
4431INITIALIZE_PASS_BEGIN(GVNLegacyPass, "gvn", "Global Value Numbering", false, false)
4439INITIALIZE_PASS_END(GVNLegacyPass, "gvn", "Global Value Numbering", false, false)
4440
4441// The public interface to this file...
4444 return new GVNLegacyPass(ScalarPRE);
4445}
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:211
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:1592
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:1571
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:2541
static void reportLoadElim(LoadInst *Load, Value *AvailableValue, OptimizationRemarkEmitter *ORE)
Definition GVN.cpp:2337
static const Instruction * findMayClobberedPtrAccess(LoadInst *Load, const DominatorTree *DT)
Definition GVN.cpp:1515
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:2593
GVNPassImpl::AvailableValue AvailableValue
Definition GVN.cpp:1364
static bool isOnlyReachableViaThisEdge(const BasicBlockEdge &E, DominatorTree *DT)
There is an edge from 'Src' to 'Dst'.
Definition GVN.cpp:3406
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:1249
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:1506
static bool isLifetimeStart(const Instruction *Inst)
Definition GVN.cpp:1498
static void patchAndReplaceAllUsesWith(Instruction *I, Value *Repl)
Definition GVN.cpp:2533
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:1369
GVNPassImpl::AvailableValueInBlock AvailableValueInBlock
Definition GVN.cpp:1365
AvailabilityState
Definition GVN.cpp:1229
@ Unavailable
We know the block is not fully available. This is a fixpoint.
Definition GVN.cpp:1231
@ Available
We know the block is fully available. This is a fixpoint.
Definition GVN.cpp:1233
@ SpeculativelyAvailable
We do not know whether the block is fully available or not, but we are currently speculating that it ...
Definition GVN.cpp:1238
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:1388
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
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
Definition GVN.cpp:4410
static char ID
Definition GVN.cpp:4383
bool runOnFunction(Function &F) override
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
Definition GVN.cpp:4393
GVNLegacyPass(bool ScalarPRE=true)
Definition GVN.cpp:4386
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:683
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:766
iterator end()
Definition DenseMap.h:686
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:793
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:856
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.
Context-sensitive CaptureAnalysis provider, which computes and caches the earliest common dominator c...
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:312
FunctionPass(char &pid)
Definition Pass.h:314
bool skipFunction(const Function &F) const
Optional passes call this function to check whether the pass should be skipped.
Definition Pass.cpp:197
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:268
bool isLoadPRESplitBackedgeEnabled() const
Definition GVN.cpp:1141
MemoryDependenceResults & getMemDep() const
Definition GVN.cpp:258
AAResults * getAliasAnalysis() const
Definition GVN.cpp:257
void salvageAndRemoveInstruction(Instruction *I)
This removes the specified instruction from our various maps and marks it for deletion.
Definition GVN.cpp:1202
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:256
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:1208
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:3375
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:3243
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 ...
LLVM_ABI MemorySSAWalker * getWalker()
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:549
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:828
LLVM_ABI void deleteValue()
Delete a pointer to a generic Value.
Definition Value.cpp:104
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:315
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:61
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:3296
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:4443
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:1678
auto successors(const MachineBasicBlock *BB)
const Value * getLoadStorePointerOperand(const Value *V)
A helper function that returns the pointer operand of a load or store instruction.
@ Load
The value being inserted comes from a load (InsertElement only).
constexpr from_range_t from_range
LLVM_ABI bool isStorePreservingMemoryLocation(const StoreInst *SI, const MemoryLocation &MemLoc, Align MemLocAlign, BatchAAResults &AA, unsigned ScanLimit)
Check whether SI, which may alias MemLoc, can be safely skipped.
Definition Loads.cpp:843
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2224
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:649
LLVM_ABI bool isNoAliasCall(const Value *V)
Return true if this pointer is returned by a noalias function.
LLVM_ABI bool isAssumeWithEmptyBundle(const AssumeInst &Assume)
Return true iff the operand bundles of the provided llvm.assume doesn't contain any valuable informat...
LLVM_ABI bool isSafeToSpeculativelyExecute(const Instruction *I, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr, bool UseVariableInfo=true, bool IgnoreUBImplyingAttrs=true)
Return true if the instruction does not have any effects besides calculating the result and does not ...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1762
LLVM_ABI bool isInstructionTriviallyDead(Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction is not used, and the instruction will return.
Definition Local.cpp:406
LLVM_ABI bool canReplacePointersInUseIfEqual(const Use &U, const Value *To, const DataLayout &DL)
Definition Loads.cpp:924
LLVM_ABI bool canReplacePointersIfEqual(const Value *From, const Value *To, const DataLayout &DL)
Returns true if a pointer value From can be replaced with another pointer value \To if they are deeme...
Definition Loads.cpp:944
bool isModSet(const ModRefInfo MRI)
Definition ModRef.h:49
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
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:3196
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:3275
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)
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:3124
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:4442
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:1501
bool isStrongerThan(AtomicOrdering AO, AtomicOrdering Other)
Returns true if ao is stronger than other as defined by the AtomicOrdering lattice,...
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
Definition Hashing.h: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:1430
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