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