LLVM 22.0.0git
NewGVN.cpp
Go to the documentation of this file.
1//===- NewGVN.cpp - Global Value Numbering Pass ---------------------------===//
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/// \file
10/// This file implements the new LLVM's Global Value Numbering pass.
11/// GVN partitions values computed by a function into congruence classes.
12/// Values ending up in the same congruence class are guaranteed to be the same
13/// for every execution of the program. In that respect, congruency is a
14/// compile-time approximation of equivalence of values at runtime.
15/// The algorithm implemented here uses a sparse formulation and it's based
16/// on the ideas described in the paper:
17/// "A Sparse Algorithm for Predicated Global Value Numbering" from
18/// Karthik Gargi.
19///
20/// A brief overview of the algorithm: The algorithm is essentially the same as
21/// the standard RPO value numbering algorithm (a good reference is the paper
22/// "SCC based value numbering" by L. Taylor Simpson) with one major difference:
23/// The RPO algorithm proceeds, on every iteration, to process every reachable
24/// block and every instruction in that block. This is because the standard RPO
25/// algorithm does not track what things have the same value number, it only
26/// tracks what the value number of a given operation is (the mapping is
27/// operation -> value number). Thus, when a value number of an operation
28/// changes, it must reprocess everything to ensure all uses of a value number
29/// get updated properly. In constrast, the sparse algorithm we use *also*
30/// tracks what operations have a given value number (IE it also tracks the
31/// reverse mapping from value number -> operations with that value number), so
32/// that it only needs to reprocess the instructions that are affected when
33/// something's value number changes. The vast majority of complexity and code
34/// in this file is devoted to tracking what value numbers could change for what
35/// instructions when various things happen. The rest of the algorithm is
36/// devoted to performing symbolic evaluation, forward propagation, and
37/// simplification of operations based on the value numbers deduced so far
38///
39/// In order to make the GVN mostly-complete, we use a technique derived from
40/// "Detection of Redundant Expressions: A Complete and Polynomial-time
41/// Algorithm in SSA" by R.R. Pai. The source of incompleteness in most SSA
42/// based GVN algorithms is related to their inability to detect equivalence
43/// between phi of ops (IE phi(a+b, c+d)) and op of phis (phi(a,c) + phi(b, d)).
44/// We resolve this issue by generating the equivalent "phi of ops" form for
45/// each op of phis we see, in a way that only takes polynomial time to resolve.
46///
47/// We also do not perform elimination by using any published algorithm. All
48/// published algorithms are O(Instructions). Instead, we use a technique that
49/// is O(number of operations with the same value number), enabling us to skip
50/// trying to eliminate things that have unique value numbers.
51//
52//===----------------------------------------------------------------------===//
53
55#include "llvm/ADT/ArrayRef.h"
56#include "llvm/ADT/BitVector.h"
57#include "llvm/ADT/DenseMap.h"
59#include "llvm/ADT/DenseSet.h"
62#include "llvm/ADT/Hashing.h"
69#include "llvm/ADT/Statistic.h"
81#include "llvm/IR/Argument.h"
82#include "llvm/IR/BasicBlock.h"
83#include "llvm/IR/Constant.h"
84#include "llvm/IR/Constants.h"
85#include "llvm/IR/DebugInfo.h"
86#include "llvm/IR/Dominators.h"
87#include "llvm/IR/Function.h"
88#include "llvm/IR/InstrTypes.h"
89#include "llvm/IR/Instruction.h"
93#include "llvm/IR/Type.h"
94#include "llvm/IR/Use.h"
95#include "llvm/IR/User.h"
96#include "llvm/IR/Value.h"
101#include "llvm/Support/Debug.h"
111#include <algorithm>
112#include <cassert>
113#include <cstdint>
114#include <iterator>
115#include <map>
116#include <memory>
117#include <set>
118#include <string>
119#include <tuple>
120#include <utility>
121#include <vector>
122
123using namespace llvm;
124using namespace llvm::GVNExpression;
125using namespace llvm::VNCoercion;
126using namespace llvm::PatternMatch;
127
128#define DEBUG_TYPE "newgvn"
129
130STATISTIC(NumGVNInstrDeleted, "Number of instructions deleted");
131STATISTIC(NumGVNBlocksDeleted, "Number of blocks deleted");
132STATISTIC(NumGVNOpsSimplified, "Number of Expressions simplified");
133STATISTIC(NumGVNPhisAllSame, "Number of PHIs whos arguments are all the same");
134STATISTIC(NumGVNMaxIterations,
135 "Maximum Number of iterations it took to converge GVN");
136STATISTIC(NumGVNLeaderChanges, "Number of leader changes");
137STATISTIC(NumGVNSortedLeaderChanges, "Number of sorted leader changes");
138STATISTIC(NumGVNAvoidedSortedLeaderChanges,
139 "Number of avoided sorted leader changes");
140STATISTIC(NumGVNDeadStores, "Number of redundant/dead stores eliminated");
141STATISTIC(NumGVNPHIOfOpsCreated, "Number of PHI of ops created");
142STATISTIC(NumGVNPHIOfOpsEliminations,
143 "Number of things eliminated using PHI of ops");
144DEBUG_COUNTER(VNCounter, "newgvn-vn",
145 "Controls which instructions are value numbered");
146DEBUG_COUNTER(PHIOfOpsCounter, "newgvn-phi",
147 "Controls which instructions we create phi of ops for");
148// Currently store defining access refinement is too slow due to basicaa being
149// egregiously slow. This flag lets us keep it working while we work on this
150// issue.
151static cl::opt<bool> EnableStoreRefinement("enable-store-refinement",
152 cl::init(false), cl::Hidden);
153
154/// Currently, the generation "phi of ops" can result in correctness issues.
155static cl::opt<bool> EnablePhiOfOps("enable-phi-of-ops", cl::init(true),
156 cl::Hidden);
157
158//===----------------------------------------------------------------------===//
159// GVN Pass
160//===----------------------------------------------------------------------===//
161
162// Anchor methods.
163namespace llvm {
164namespace GVNExpression {
165
166Expression::~Expression() = default;
173
174} // end namespace GVNExpression
175} // end namespace llvm
176
177namespace {
178
179// Tarjan's SCC finding algorithm with Nuutila's improvements
180// SCCIterator is actually fairly complex for the simple thing we want.
181// It also wants to hand us SCC's that are unrelated to the phi node we ask
182// about, and have us process them there or risk redoing work.
183// Graph traits over a filter iterator also doesn't work that well here.
184// This SCC finder is specialized to walk use-def chains, and only follows
185// instructions,
186// not generic values (arguments, etc).
187struct TarjanSCC {
188 TarjanSCC() : Components(1) {}
189
190 void Start(const Instruction *Start) {
191 if (Root.lookup(Start) == 0)
192 FindSCC(Start);
193 }
194
195 const SmallPtrSetImpl<const Value *> &getComponentFor(const Value *V) const {
196 unsigned ComponentID = ValueToComponent.lookup(V);
197
198 assert(ComponentID > 0 &&
199 "Asking for a component for a value we never processed");
200 return Components[ComponentID];
201 }
202
203private:
204 void FindSCC(const Instruction *I) {
205 Root[I] = ++DFSNum;
206 // Store the DFS Number we had before it possibly gets incremented.
207 unsigned int OurDFS = DFSNum;
208 for (const auto &Op : I->operands()) {
209 if (auto *InstOp = dyn_cast<Instruction>(Op)) {
210 if (Root.lookup(Op) == 0)
211 FindSCC(InstOp);
212 if (!InComponent.count(Op))
213 Root[I] = std::min(Root.lookup(I), Root.lookup(Op));
214 }
215 }
216 // See if we really were the root of a component, by seeing if we still have
217 // our DFSNumber. If we do, we are the root of the component, and we have
218 // completed a component. If we do not, we are not the root of a component,
219 // and belong on the component stack.
220 if (Root.lookup(I) == OurDFS) {
221 unsigned ComponentID = Components.size();
222 Components.resize(Components.size() + 1);
223 auto &Component = Components.back();
224 Component.insert(I);
225 LLVM_DEBUG(dbgs() << "Component root is " << *I << "\n");
226 InComponent.insert(I);
227 ValueToComponent[I] = ComponentID;
228 // Pop a component off the stack and label it.
229 while (!Stack.empty() && Root.lookup(Stack.back()) >= OurDFS) {
230 auto *Member = Stack.back();
231 LLVM_DEBUG(dbgs() << "Component member is " << *Member << "\n");
232 Component.insert(Member);
233 InComponent.insert(Member);
234 ValueToComponent[Member] = ComponentID;
235 Stack.pop_back();
236 }
237 } else {
238 // Part of a component, push to stack
239 Stack.push_back(I);
240 }
241 }
242
243 unsigned int DFSNum = 1;
247
248 // Store the components as vector of ptr sets, because we need the topo order
249 // of SCC's, but not individual member order
251
252 DenseMap<const Value *, unsigned> ValueToComponent;
253};
254
255// Congruence classes represent the set of expressions/instructions
256// that are all the same *during some scope in the function*.
257// That is, because of the way we perform equality propagation, and
258// because of memory value numbering, it is not correct to assume
259// you can willy-nilly replace any member with any other at any
260// point in the function.
261//
262// For any Value in the Member set, it is valid to replace any dominated member
263// with that Value.
264//
265// Every congruence class has a leader, and the leader is used to symbolize
266// instructions in a canonical way (IE every operand of an instruction that is a
267// member of the same congruence class will always be replaced with leader
268// during symbolization). To simplify symbolization, we keep the leader as a
269// constant if class can be proved to be a constant value. Otherwise, the
270// leader is the member of the value set with the smallest DFS number. Each
271// congruence class also has a defining expression, though the expression may be
272// null. If it exists, it can be used for forward propagation and reassociation
273// of values.
274
275// For memory, we also track a representative MemoryAccess, and a set of memory
276// members for MemoryPhis (which have no real instructions). Note that for
277// memory, it seems tempting to try to split the memory members into a
278// MemoryCongruenceClass or something. Unfortunately, this does not work
279// easily. The value numbering of a given memory expression depends on the
280// leader of the memory congruence class, and the leader of memory congruence
281// class depends on the value numbering of a given memory expression. This
282// leads to wasted propagation, and in some cases, missed optimization. For
283// example: If we had value numbered two stores together before, but now do not,
284// we move them to a new value congruence class. This in turn will move at one
285// of the memorydefs to a new memory congruence class. Which in turn, affects
286// the value numbering of the stores we just value numbered (because the memory
287// congruence class is part of the value number). So while theoretically
288// possible to split them up, it turns out to be *incredibly* complicated to get
289// it to work right, because of the interdependency. While structurally
290// slightly messier, it is algorithmically much simpler and faster to do what we
291// do here, and track them both at once in the same class.
292// Note: The default iterators for this class iterate over values
293class CongruenceClass {
294public:
295 using MemberType = Value;
296 using MemberSet = SmallPtrSet<MemberType *, 4>;
297 using MemoryMemberType = MemoryPhi;
298 using MemoryMemberSet = SmallPtrSet<const MemoryMemberType *, 2>;
299
300 explicit CongruenceClass(unsigned ID) : ID(ID) {}
301 CongruenceClass(unsigned ID, std::pair<Value *, unsigned int> Leader,
302 const Expression *E)
303 : ID(ID), RepLeader(Leader), DefiningExpr(E) {}
304
305 unsigned getID() const { return ID; }
306
307 // True if this class has no members left. This is mainly used for assertion
308 // purposes, and for skipping empty classes.
309 bool isDead() const {
310 // If it's both dead from a value perspective, and dead from a memory
311 // perspective, it's really dead.
312 return empty() && memory_empty();
313 }
314
315 // Leader functions
316 Value *getLeader() const { return RepLeader.first; }
317 void setLeader(std::pair<Value *, unsigned int> Leader) {
318 RepLeader = Leader;
319 }
320 const std::pair<Value *, unsigned int> &getNextLeader() const {
321 return NextLeader;
322 }
323 void resetNextLeader() { NextLeader = {nullptr, ~0}; }
324 bool addPossibleLeader(std::pair<Value *, unsigned int> LeaderPair) {
325 if (LeaderPair.second < RepLeader.second) {
326 NextLeader = RepLeader;
327 RepLeader = LeaderPair;
328 return true;
329 } else if (LeaderPair.second < NextLeader.second) {
330 NextLeader = LeaderPair;
331 }
332 return false;
333 }
334
335 Value *getStoredValue() const { return RepStoredValue; }
336 void setStoredValue(Value *Leader) { RepStoredValue = Leader; }
337 const MemoryAccess *getMemoryLeader() const { return RepMemoryAccess; }
338 void setMemoryLeader(const MemoryAccess *Leader) { RepMemoryAccess = Leader; }
339
340 // Forward propagation info
341 const Expression *getDefiningExpr() const { return DefiningExpr; }
342
343 // Value member set
344 bool empty() const { return Members.empty(); }
345 unsigned size() const { return Members.size(); }
346 MemberSet::const_iterator begin() const { return Members.begin(); }
347 MemberSet::const_iterator end() const { return Members.end(); }
348 void insert(MemberType *M) { Members.insert(M); }
349 void erase(MemberType *M) { Members.erase(M); }
350 void swap(MemberSet &Other) { Members.swap(Other); }
351
352 // Memory member set
353 bool memory_empty() const { return MemoryMembers.empty(); }
354 unsigned memory_size() const { return MemoryMembers.size(); }
355 MemoryMemberSet::const_iterator memory_begin() const {
356 return MemoryMembers.begin();
357 }
358 MemoryMemberSet::const_iterator memory_end() const {
359 return MemoryMembers.end();
360 }
362 return make_range(memory_begin(), memory_end());
363 }
364
365 void memory_insert(const MemoryMemberType *M) { MemoryMembers.insert(M); }
366 void memory_erase(const MemoryMemberType *M) { MemoryMembers.erase(M); }
367
368 // Store count
369 unsigned getStoreCount() const { return StoreCount; }
370 void incStoreCount() { ++StoreCount; }
371 void decStoreCount() {
372 assert(StoreCount != 0 && "Store count went negative");
373 --StoreCount;
374 }
375
376 // True if this class has no memory members.
377 bool definesNoMemory() const { return StoreCount == 0 && memory_empty(); }
378
379 // Return true if two congruence classes are equivalent to each other. This
380 // means that every field but the ID number and the dead field are equivalent.
381 bool isEquivalentTo(const CongruenceClass *Other) const {
382 if (!Other)
383 return false;
384 if (this == Other)
385 return true;
386
387 if (std::tie(StoreCount, RepLeader, RepStoredValue, RepMemoryAccess) !=
388 std::tie(Other->StoreCount, Other->RepLeader, Other->RepStoredValue,
389 Other->RepMemoryAccess))
390 return false;
391 if (DefiningExpr != Other->DefiningExpr)
392 if (!DefiningExpr || !Other->DefiningExpr ||
393 *DefiningExpr != *Other->DefiningExpr)
394 return false;
395
396 if (Members.size() != Other->Members.size())
397 return false;
398
399 return llvm::set_is_subset(Members, Other->Members);
400 }
401
402private:
403 unsigned ID;
404
405 // Representative leader and its corresponding RPO number.
406 // The leader must have the lowest RPO number.
407 std::pair<Value *, unsigned int> RepLeader = {nullptr, ~0U};
408
409 // The most dominating leader after our current leader (given by the RPO
410 // number), because the member set is not sorted and is expensive to keep
411 // sorted all the time.
412 std::pair<Value *, unsigned int> NextLeader = {nullptr, ~0U};
413
414 // If this is represented by a store, the value of the store.
415 Value *RepStoredValue = nullptr;
416
417 // If this class contains MemoryDefs or MemoryPhis, this is the leading memory
418 // access.
419 const MemoryAccess *RepMemoryAccess = nullptr;
420
421 // Defining Expression.
422 const Expression *DefiningExpr = nullptr;
423
424 // Actual members of this class.
425 MemberSet Members;
426
427 // This is the set of MemoryPhis that exist in the class. MemoryDefs and
428 // MemoryUses have real instructions representing them, so we only need to
429 // track MemoryPhis here.
430 MemoryMemberSet MemoryMembers;
431
432 // Number of stores in this congruence class.
433 // This is used so we can detect store equivalence changes properly.
434 int StoreCount = 0;
435};
436
437} // end anonymous namespace
438
439namespace llvm {
440
442 const Expression &E;
443
444 explicit ExactEqualsExpression(const Expression &E) : E(E) {}
445
446 hash_code getComputedHash() const { return E.getComputedHash(); }
447
448 bool operator==(const Expression &Other) const {
449 return E.exactlyEquals(Other);
450 }
451};
452
453template <> struct DenseMapInfo<const Expression *> {
454 static const Expression *getEmptyKey() {
455 auto Val = static_cast<uintptr_t>(-1);
456 Val <<= PointerLikeTypeTraits<const Expression *>::NumLowBitsAvailable;
457 return reinterpret_cast<const Expression *>(Val);
458 }
459
460 static const Expression *getTombstoneKey() {
461 auto Val = static_cast<uintptr_t>(~1U);
462 Val <<= PointerLikeTypeTraits<const Expression *>::NumLowBitsAvailable;
463 return reinterpret_cast<const Expression *>(Val);
464 }
465
466 static unsigned getHashValue(const Expression *E) {
467 return E->getComputedHash();
468 }
469
470 static unsigned getHashValue(const ExactEqualsExpression &E) {
471 return E.getComputedHash();
472 }
473
474 static bool isEqual(const ExactEqualsExpression &LHS, const Expression *RHS) {
475 if (RHS == getTombstoneKey() || RHS == getEmptyKey())
476 return false;
477 return LHS == *RHS;
478 }
479
480 static bool isEqual(const Expression *LHS, const Expression *RHS) {
481 if (LHS == RHS)
482 return true;
483 if (LHS == getTombstoneKey() || RHS == getTombstoneKey() ||
484 LHS == getEmptyKey() || RHS == getEmptyKey())
485 return false;
486 // Compare hashes before equality. This is *not* what the hashtable does,
487 // since it is computing it modulo the number of buckets, whereas we are
488 // using the full hash keyspace. Since the hashes are precomputed, this
489 // check is *much* faster than equality.
490 if (LHS->getComputedHash() != RHS->getComputedHash())
491 return false;
492 return *LHS == *RHS;
493 }
494};
495
496} // end namespace llvm
497
498namespace {
499
500class NewGVN {
501 Function &F;
502 DominatorTree *DT = nullptr;
503 const TargetLibraryInfo *TLI = nullptr;
504 AliasAnalysis *AA = nullptr;
505 MemorySSA *MSSA = nullptr;
506 MemorySSAWalker *MSSAWalker = nullptr;
507 AssumptionCache *AC = nullptr;
508 const DataLayout &DL;
509
510 // These are the only two things the create* functions should have
511 // side-effects on due to allocating memory.
512 mutable BumpPtrAllocator ExpressionAllocator;
513 mutable ArrayRecycler<Value *> ArgRecycler;
514 mutable TarjanSCC SCCFinder;
515
516 std::unique_ptr<PredicateInfo> PredInfo;
517 const SimplifyQuery SQ;
518
519 // Number of function arguments, used by ranking
520 unsigned int NumFuncArgs = 0;
521
522 // RPOOrdering of basic blocks
524
525 // Congruence class info.
526
527 // This class is called INITIAL in the paper. It is the class everything
528 // startsout in, and represents any value. Being an optimistic analysis,
529 // anything in the TOP class has the value TOP, which is indeterminate and
530 // equivalent to everything.
531 CongruenceClass *TOPClass = nullptr;
532 std::vector<CongruenceClass *> CongruenceClasses;
533 unsigned NextCongruenceNum = 0;
534
535 // Value Mappings.
538
539 // Value PHI handling, used to make equivalence between phi(op, op) and
540 // op(phi, phi).
541 // These mappings just store various data that would normally be part of the
542 // IR.
544
545 // The cached results, in general, are only valid for the specific block where
546 // they were computed. The unsigned part of the key is a unique block
547 // identifier
548 DenseMap<std::pair<const Value *, unsigned>, bool> OpSafeForPHIOfOps;
549 unsigned CacheIdx;
550
551 // Map a temporary instruction we created to a parent block.
553
554 // Map between the already in-program instructions and the temporary phis we
555 // created that they are known equivalent to.
557
558 // In order to know when we should re-process instructions that have
559 // phi-of-ops, we track the set of expressions that they needed as
560 // leaders. When we discover new leaders for those expressions, we process the
561 // associated phi-of-op instructions again in case they have changed. The
562 // other way they may change is if they had leaders, and those leaders
563 // disappear. However, at the point they have leaders, there are uses of the
564 // relevant operands in the created phi node, and so they will get reprocessed
565 // through the normal user marking we perform.
568 ExpressionToPhiOfOps;
569
570 // Map from temporary operation to MemoryAccess.
572
573 // Set of all temporary instructions we created.
574 // Note: This will include instructions that were just created during value
575 // numbering. The way to test if something is using them is to check
576 // RealToTemp.
577 DenseSet<Instruction *> AllTempInstructions;
578
579 // This is the set of instructions to revisit on a reachability change. At
580 // the end of the main iteration loop it will contain at least all the phi of
581 // ops instructions that will be changed to phis, as well as regular phis.
582 // During the iteration loop, it may contain other things, such as phi of ops
583 // instructions that used edge reachability to reach a result, and so need to
584 // be revisited when the edge changes, independent of whether the phi they
585 // depended on changes.
586 DenseMap<BasicBlock *, SparseBitVector<>> RevisitOnReachabilityChange;
587
588 // Mapping from predicate info we used to the instructions we used it with.
589 // In order to correctly ensure propagation, we must keep track of what
590 // comparisons we used, so that when the values of the comparisons change, we
591 // propagate the information to the places we used the comparison.
593 PredicateToUsers;
594
595 // the same reasoning as PredicateToUsers. When we skip MemoryAccesses for
596 // stores, we no longer can rely solely on the def-use chains of MemorySSA.
598 MemoryToUsers;
599
600 // A table storing which memorydefs/phis represent a memory state provably
601 // equivalent to another memory state.
602 // We could use the congruence class machinery, but the MemoryAccess's are
603 // abstract memory states, so they can only ever be equivalent to each other,
604 // and not to constants, etc.
606
607 // We could, if we wanted, build MemoryPhiExpressions and
608 // MemoryVariableExpressions, etc, and value number them the same way we value
609 // number phi expressions. For the moment, this seems like overkill. They
610 // can only exist in one of three states: they can be TOP (equal to
611 // everything), Equivalent to something else, or unique. Because we do not
612 // create expressions for them, we need to simulate leader change not just
613 // when they change class, but when they change state. Note: We can do the
614 // same thing for phis, and avoid having phi expressions if we wanted, We
615 // should eventually unify in one direction or the other, so this is a little
616 // bit of an experiment in which turns out easier to maintain.
617 enum MemoryPhiState { MPS_Invalid, MPS_TOP, MPS_Equivalent, MPS_Unique };
619
620 enum InstCycleState { ICS_Unknown, ICS_CycleFree, ICS_Cycle };
622
623 // Expression to class mapping.
624 using ExpressionClassMap = DenseMap<const Expression *, CongruenceClass *>;
625 ExpressionClassMap ExpressionToClass;
626
627 // We have a single expression that represents currently DeadExpressions.
628 // For dead expressions we can prove will stay dead, we mark them with
629 // DFS number zero. However, it's possible in the case of phi nodes
630 // for us to assume/prove all arguments are dead during fixpointing.
631 // We use DeadExpression for that case.
632 DeadExpression *SingletonDeadExpression = nullptr;
633
634 // Which values have changed as a result of leader changes.
635 SmallPtrSet<Value *, 8> LeaderChanges;
636
637 // Reachability info.
638 using BlockEdge = BasicBlockEdge;
639 DenseSet<BlockEdge> ReachableEdges;
641
642 // This is a bitvector because, on larger functions, we may have
643 // thousands of touched instructions at once (entire blocks,
644 // instructions with hundreds of uses, etc). Even with optimization
645 // for when we mark whole blocks as touched, when this was a
646 // SmallPtrSet or DenseSet, for some functions, we spent >20% of all
647 // the time in GVN just managing this list. The bitvector, on the
648 // other hand, efficiently supports test/set/clear of both
649 // individual and ranges, as well as "find next element" This
650 // enables us to use it as a worklist with essentially 0 cost.
651 BitVector TouchedInstructions;
652
654 mutable DenseMap<const BitCastInst *, const Value *> PredicateSwapChoice;
655
656#ifndef NDEBUG
657 // Debugging for how many times each block and instruction got processed.
659#endif
660
661 // DFS info.
662 // This contains a mapping from Instructions to DFS numbers.
663 // The numbering starts at 1. An instruction with DFS number zero
664 // means that the instruction is dead.
666
667 // This contains the mapping DFS numbers to instructions.
668 SmallVector<Value *, 32> DFSToInstr;
669
670 // Deletion info.
671 SmallPtrSet<Instruction *, 8> InstructionsToErase;
672
673public:
674 NewGVN(Function &F, DominatorTree *DT, AssumptionCache *AC,
676 const DataLayout &DL)
677 : F(F), DT(DT), TLI(TLI), AA(AA), MSSA(MSSA), AC(AC), DL(DL),
678 // Reuse ExpressionAllocator for PredicateInfo as well.
679 PredInfo(
680 std::make_unique<PredicateInfo>(F, *DT, *AC, ExpressionAllocator)),
681 SQ(DL, TLI, DT, AC, /*CtxI=*/nullptr, /*UseInstrInfo=*/false,
682 /*CanUseUndef=*/false) {}
683
684 bool runGVN();
685
686private:
687 /// Helper struct return a Expression with an optional extra dependency.
688 struct ExprResult {
689 const Expression *Expr;
690 Value *ExtraDep;
691 const PredicateBase *PredDep;
692
693 ExprResult(const Expression *Expr, Value *ExtraDep = nullptr,
694 const PredicateBase *PredDep = nullptr)
695 : Expr(Expr), ExtraDep(ExtraDep), PredDep(PredDep) {}
696 ExprResult(const ExprResult &) = delete;
697 ExprResult(ExprResult &&Other)
698 : Expr(Other.Expr), ExtraDep(Other.ExtraDep), PredDep(Other.PredDep) {
699 Other.Expr = nullptr;
700 Other.ExtraDep = nullptr;
701 Other.PredDep = nullptr;
702 }
703 ExprResult &operator=(const ExprResult &Other) = delete;
704 ExprResult &operator=(ExprResult &&Other) = delete;
705
706 ~ExprResult() { assert(!ExtraDep && "unhandled ExtraDep"); }
707
708 operator bool() const { return Expr; }
709
710 static ExprResult none() { return {nullptr, nullptr, nullptr}; }
711 static ExprResult some(const Expression *Expr, Value *ExtraDep = nullptr) {
712 return {Expr, ExtraDep, nullptr};
713 }
714 static ExprResult some(const Expression *Expr,
715 const PredicateBase *PredDep) {
716 return {Expr, nullptr, PredDep};
717 }
718 static ExprResult some(const Expression *Expr, Value *ExtraDep,
719 const PredicateBase *PredDep) {
720 return {Expr, ExtraDep, PredDep};
721 }
722 };
723
724 // Expression handling.
725 ExprResult createExpression(Instruction *) const;
726 const Expression *createBinaryExpression(unsigned, Type *, Value *, Value *,
727 Instruction *) const;
728
729 // Our canonical form for phi arguments is a pair of incoming value, incoming
730 // basic block.
731 using ValPair = std::pair<Value *, BasicBlock *>;
732
733 PHIExpression *createPHIExpression(ArrayRef<ValPair>, const Instruction *,
734 BasicBlock *, bool &HasBackEdge,
735 bool &OriginalOpsConstant) const;
736 const DeadExpression *createDeadExpression() const;
737 const VariableExpression *createVariableExpression(Value *) const;
738 const ConstantExpression *createConstantExpression(Constant *) const;
739 const Expression *createVariableOrConstant(Value *V) const;
740 const UnknownExpression *createUnknownExpression(Instruction *) const;
741 const StoreExpression *createStoreExpression(StoreInst *,
742 const MemoryAccess *) const;
743 LoadExpression *createLoadExpression(Type *, Value *, LoadInst *,
744 const MemoryAccess *) const;
745 const CallExpression *createCallExpression(CallInst *,
746 const MemoryAccess *) const;
748 createAggregateValueExpression(Instruction *) const;
749 bool setBasicExpressionInfo(Instruction *, BasicExpression *) const;
750
751 // Congruence class handling.
752 CongruenceClass *createCongruenceClass(Value *Leader, const Expression *E) {
753 // Set RPO to 0 for values that are always available (constants and function
754 // args). These should always be made leader.
755 unsigned LeaderDFS = 0;
756
757 // If Leader is not specified, either we have a memory class or the leader
758 // will be set later. Otherwise, if Leader is an Instruction, set LeaderDFS
759 // to its RPO number.
760 if (!Leader)
761 LeaderDFS = ~0;
762 else if (auto *I = dyn_cast<Instruction>(Leader))
763 LeaderDFS = InstrToDFSNum(I);
764 auto *result =
765 new CongruenceClass(NextCongruenceNum++, {Leader, LeaderDFS}, E);
766 CongruenceClasses.emplace_back(result);
767 return result;
768 }
769
770 CongruenceClass *createMemoryClass(MemoryAccess *MA) {
771 auto *CC = createCongruenceClass(nullptr, nullptr);
772 CC->setMemoryLeader(MA);
773 return CC;
774 }
775
776 CongruenceClass *ensureLeaderOfMemoryClass(MemoryAccess *MA) {
777 auto *CC = getMemoryClass(MA);
778 if (CC->getMemoryLeader() != MA)
779 CC = createMemoryClass(MA);
780 return CC;
781 }
782
783 CongruenceClass *createSingletonCongruenceClass(Value *Member) {
784 CongruenceClass *CClass = createCongruenceClass(Member, nullptr);
785 CClass->insert(Member);
786 ValueToClass[Member] = CClass;
787 return CClass;
788 }
789
790 void initializeCongruenceClasses(Function &F);
791 const Expression *makePossiblePHIOfOps(Instruction *,
793 Value *findLeaderForInst(Instruction *ValueOp,
795 MemoryAccess *MemAccess, Instruction *OrigInst,
796 BasicBlock *PredBB);
797 bool OpIsSafeForPHIOfOps(Value *Op, const BasicBlock *PHIBlock,
799 void addPhiOfOps(PHINode *Op, BasicBlock *BB, Instruction *ExistingValue);
800 void removePhiOfOps(Instruction *I, PHINode *PHITemp);
801
802 // Value number an Instruction or MemoryPhi.
803 void valueNumberMemoryPhi(MemoryPhi *);
804 void valueNumberInstruction(Instruction *);
805
806 // Symbolic evaluation.
807 ExprResult checkExprResults(Expression *, Instruction *, Value *) const;
808 ExprResult performSymbolicEvaluation(Instruction *,
810 const Expression *performSymbolicLoadCoercion(Type *, Value *, LoadInst *,
811 Instruction *,
812 MemoryAccess *) const;
813 const Expression *performSymbolicLoadEvaluation(Instruction *) const;
814 const Expression *performSymbolicStoreEvaluation(Instruction *) const;
815 ExprResult performSymbolicCallEvaluation(Instruction *) const;
816 void sortPHIOps(MutableArrayRef<ValPair> Ops) const;
817 const Expression *performSymbolicPHIEvaluation(ArrayRef<ValPair>,
818 Instruction *I,
819 BasicBlock *PHIBlock) const;
820 const Expression *performSymbolicAggrValueEvaluation(Instruction *) const;
821 ExprResult performSymbolicCmpEvaluation(Instruction *) const;
822 ExprResult performSymbolicPredicateInfoEvaluation(BitCastInst *) const;
823
824 // Congruence finding.
825 bool someEquivalentDominates(const Instruction *, const Instruction *) const;
826 Value *lookupOperandLeader(Value *) const;
827 CongruenceClass *getClassForExpression(const Expression *E) const;
828 void performCongruenceFinding(Instruction *, const Expression *);
829 void moveValueToNewCongruenceClass(Instruction *, const Expression *,
830 CongruenceClass *, CongruenceClass *);
831 void moveMemoryToNewCongruenceClass(Instruction *, MemoryAccess *,
832 CongruenceClass *, CongruenceClass *);
833 Value *getNextValueLeader(CongruenceClass *) const;
834 const MemoryAccess *getNextMemoryLeader(CongruenceClass *) const;
835 bool setMemoryClass(const MemoryAccess *From, CongruenceClass *To);
836 CongruenceClass *getMemoryClass(const MemoryAccess *MA) const;
837 const MemoryAccess *lookupMemoryLeader(const MemoryAccess *) const;
838 bool isMemoryAccessTOP(const MemoryAccess *) const;
839
840 // Ranking
841 unsigned int getRank(const Value *) const;
842 bool shouldSwapOperands(const Value *, const Value *) const;
843 bool shouldSwapOperandsForPredicate(const Value *, const Value *,
844 const BitCastInst *I) const;
845
846 // Reachability handling.
847 void updateReachableEdge(BasicBlock *, BasicBlock *);
848 void processOutgoingEdges(Instruction *, BasicBlock *);
849 Value *findConditionEquivalence(Value *) const;
850
851 // Elimination.
852 struct ValueDFS;
853 void convertClassToDFSOrdered(const CongruenceClass &,
857 void convertClassToLoadsAndStores(const CongruenceClass &,
859
860 bool eliminateInstructions(Function &);
861 void replaceInstruction(Instruction *, Value *);
862 void markInstructionForDeletion(Instruction *);
863 void deleteInstructionsInBlock(BasicBlock *);
864 Value *findPHIOfOpsLeader(const Expression *, const Instruction *,
865 const BasicBlock *) const;
866
867 // Various instruction touch utilities
868 template <typename Map, typename KeyType>
869 void touchAndErase(Map &, const KeyType &);
870 void markUsersTouched(Value *);
871 void markMemoryUsersTouched(const MemoryAccess *);
872 void markMemoryDefTouched(const MemoryAccess *);
873 void markPredicateUsersTouched(Instruction *);
874 void markValueLeaderChangeTouched(CongruenceClass *CC);
875 void markMemoryLeaderChangeTouched(CongruenceClass *CC);
876 void markPhiOfOpsChanged(const Expression *E);
877 void addMemoryUsers(const MemoryAccess *To, MemoryAccess *U) const;
878 void addAdditionalUsers(Value *To, Value *User) const;
879 void addAdditionalUsers(ExprResult &Res, Instruction *User) const;
880
881 // Main loop of value numbering
882 void iterateTouchedInstructions();
883
884 // Utilities.
885 void cleanupTables();
886 std::pair<unsigned, unsigned> assignDFSNumbers(BasicBlock *, unsigned);
887 void updateProcessedCount(const Value *V);
888 void verifyMemoryCongruency() const;
889 void verifyIterationSettled(Function &F);
890 void verifyStoreExpressions() const;
891 bool singleReachablePHIPath(SmallPtrSet<const MemoryAccess *, 8> &,
892 const MemoryAccess *, const MemoryAccess *) const;
893 BasicBlock *getBlockForValue(Value *V) const;
894 void deleteExpression(const Expression *E) const;
895 MemoryUseOrDef *getMemoryAccess(const Instruction *) const;
896 MemoryPhi *getMemoryAccess(const BasicBlock *) const;
897 template <class T, class Range> T *getMinDFSOfRange(const Range &) const;
898
899 unsigned InstrToDFSNum(const Value *V) const {
900 assert(isa<Instruction>(V) && "This should not be used for MemoryAccesses");
901 return InstrDFS.lookup(V);
902 }
903
904 unsigned InstrToDFSNum(const MemoryAccess *MA) const {
905 return MemoryToDFSNum(MA);
906 }
907
908 Value *InstrFromDFSNum(unsigned DFSNum) { return DFSToInstr[DFSNum]; }
909
910 // Given a MemoryAccess, return the relevant instruction DFS number. Note:
911 // This deliberately takes a value so it can be used with Use's, which will
912 // auto-convert to Value's but not to MemoryAccess's.
913 unsigned MemoryToDFSNum(const Value *MA) const {
914 assert(isa<MemoryAccess>(MA) &&
915 "This should not be used with instructions");
916 return isa<MemoryUseOrDef>(MA)
917 ? InstrToDFSNum(cast<MemoryUseOrDef>(MA)->getMemoryInst())
918 : InstrDFS.lookup(MA);
919 }
920
921 bool isCycleFree(const Instruction *) const;
922 bool isBackedge(BasicBlock *From, BasicBlock *To) const;
923
924 // Debug counter info. When verifying, we have to reset the value numbering
925 // debug counter to the same state it started in to get the same results.
926 DebugCounter::CounterState StartingVNCounter;
927};
928
929} // end anonymous namespace
930
931template <typename T>
932static bool equalsLoadStoreHelper(const T &LHS, const Expression &RHS) {
933 if (!isa<LoadExpression>(RHS) && !isa<StoreExpression>(RHS))
934 return false;
935 return LHS.MemoryExpression::equals(RHS);
936}
937
939 return equalsLoadStoreHelper(*this, Other);
940}
941
943 if (!equalsLoadStoreHelper(*this, Other))
944 return false;
945 // Make sure that store vs store includes the value operand.
946 if (const auto *S = dyn_cast<StoreExpression>(&Other))
947 if (getStoredValue() != S->getStoredValue())
948 return false;
949 return true;
950}
951
954 return false;
955
956 if (auto *RHS = dyn_cast<CallExpression>(&Other))
957 return Call->getAttributes()
958 .intersectWith(Call->getContext(), RHS->Call->getAttributes())
959 .has_value();
960
961 return false;
962}
963
964// Determine if the edge From->To is a backedge
965bool NewGVN::isBackedge(BasicBlock *From, BasicBlock *To) const {
966 return From == To ||
967 RPOOrdering.lookup(DT->getNode(From)) >=
968 RPOOrdering.lookup(DT->getNode(To));
969}
970
971#ifndef NDEBUG
972static std::string getBlockName(const BasicBlock *B) {
974}
975#endif
976
977// Get a MemoryAccess for an instruction, fake or real.
978MemoryUseOrDef *NewGVN::getMemoryAccess(const Instruction *I) const {
979 auto *Result = MSSA->getMemoryAccess(I);
980 return Result ? Result : TempToMemory.lookup(I);
981}
982
983// Get a MemoryPhi for a basic block. These are all real.
984MemoryPhi *NewGVN::getMemoryAccess(const BasicBlock *BB) const {
985 return MSSA->getMemoryAccess(BB);
986}
987
988// Get the basic block from an instruction/memory value.
989BasicBlock *NewGVN::getBlockForValue(Value *V) const {
990 if (auto *I = dyn_cast<Instruction>(V)) {
991 auto *Parent = I->getParent();
992 if (Parent)
993 return Parent;
994 Parent = TempToBlock.lookup(V);
995 assert(Parent && "Every fake instruction should have a block");
996 return Parent;
997 }
998
999 auto *MP = dyn_cast<MemoryPhi>(V);
1000 assert(MP && "Should have been an instruction or a MemoryPhi");
1001 return MP->getBlock();
1002}
1003
1004// Delete a definitely dead expression, so it can be reused by the expression
1005// allocator. Some of these are not in creation functions, so we have to accept
1006// const versions.
1007void NewGVN::deleteExpression(const Expression *E) const {
1008 assert(isa<BasicExpression>(E));
1009 auto *BE = cast<BasicExpression>(E);
1010 const_cast<BasicExpression *>(BE)->deallocateOperands(ArgRecycler);
1011 ExpressionAllocator.Deallocate(E);
1012}
1013
1014// If V is a predicateinfo copy, get the thing it is a copy of.
1015static Value *getCopyOf(const Value *V) {
1016 if (auto *BC = dyn_cast<BitCastInst>(V))
1017 if (BC->getType() == BC->getOperand(0)->getType())
1018 return BC->getOperand(0);
1019 return nullptr;
1020}
1021
1022// Return true if V is really PN, even accounting for predicateinfo copies.
1023static bool isCopyOfPHI(const Value *V, const PHINode *PN) {
1024 return V == PN || getCopyOf(V) == PN;
1025}
1026
1027static bool isCopyOfAPHI(const Value *V) {
1028 auto *CO = getCopyOf(V);
1029 return CO && isa<PHINode>(CO);
1030}
1031
1032// Sort PHI Operands into a canonical order. What we use here is an RPO
1033// order. The BlockInstRange numbers are generated in an RPO walk of the basic
1034// blocks.
1035void NewGVN::sortPHIOps(MutableArrayRef<ValPair> Ops) const {
1036 llvm::sort(Ops, [&](const ValPair &P1, const ValPair &P2) {
1037 return BlockInstRange.lookup(P1.second).first <
1038 BlockInstRange.lookup(P2.second).first;
1039 });
1040}
1041
1042// Return true if V is a value that will always be available (IE can
1043// be placed anywhere) in the function. We don't do globals here
1044// because they are often worse to put in place.
1045static bool alwaysAvailable(Value *V) {
1046 return isa<Constant>(V) || isa<Argument>(V);
1047}
1048
1049// Create a PHIExpression from an array of {incoming edge, value} pairs. I is
1050// the original instruction we are creating a PHIExpression for (but may not be
1051// a phi node). We require, as an invariant, that all the PHIOperands in the
1052// same block are sorted the same way. sortPHIOps will sort them into a
1053// canonical order.
1054PHIExpression *NewGVN::createPHIExpression(ArrayRef<ValPair> PHIOperands,
1055 const Instruction *I,
1056 BasicBlock *PHIBlock,
1057 bool &HasBackedge,
1058 bool &OriginalOpsConstant) const {
1059 unsigned NumOps = PHIOperands.size();
1060 auto *E = new (ExpressionAllocator) PHIExpression(NumOps, PHIBlock);
1061
1062 E->allocateOperands(ArgRecycler, ExpressionAllocator);
1063 E->setType(PHIOperands.begin()->first->getType());
1064 E->setOpcode(Instruction::PHI);
1065
1066 // Filter out unreachable phi operands.
1067 auto Filtered = make_filter_range(PHIOperands, [&](const ValPair &P) {
1068 auto *BB = P.second;
1069 if (auto *PHIOp = dyn_cast<PHINode>(I))
1070 if (isCopyOfPHI(P.first, PHIOp))
1071 return false;
1072 if (!ReachableEdges.count({BB, PHIBlock}))
1073 return false;
1074 // Things in TOPClass are equivalent to everything.
1075 if (ValueToClass.lookup(P.first) == TOPClass)
1076 return false;
1077 OriginalOpsConstant = OriginalOpsConstant && isa<Constant>(P.first);
1078 HasBackedge = HasBackedge || isBackedge(BB, PHIBlock);
1079 return lookupOperandLeader(P.first) != I;
1080 });
1081 llvm::transform(Filtered, op_inserter(E), [&](const ValPair &P) -> Value * {
1082 return lookupOperandLeader(P.first);
1083 });
1084 return E;
1085}
1086
1087// Set basic expression info (Arguments, type, opcode) for Expression
1088// E from Instruction I in block B.
1089bool NewGVN::setBasicExpressionInfo(Instruction *I, BasicExpression *E) const {
1090 bool AllConstant = true;
1091 if (auto *GEP = dyn_cast<GetElementPtrInst>(I))
1092 E->setType(GEP->getSourceElementType());
1093 else
1094 E->setType(I->getType());
1095 E->setOpcode(I->getOpcode());
1096 E->allocateOperands(ArgRecycler, ExpressionAllocator);
1097
1098 // Transform the operand array into an operand leader array, and keep track of
1099 // whether all members are constant.
1100 std::transform(I->op_begin(), I->op_end(), op_inserter(E), [&](Value *O) {
1101 auto Operand = lookupOperandLeader(O);
1102 AllConstant = AllConstant && isa<Constant>(Operand);
1103 return Operand;
1104 });
1105
1106 return AllConstant;
1107}
1108
1109const Expression *NewGVN::createBinaryExpression(unsigned Opcode, Type *T,
1110 Value *Arg1, Value *Arg2,
1111 Instruction *I) const {
1112 auto *E = new (ExpressionAllocator) BasicExpression(2);
1113 // TODO: we need to remove context instruction after Value Tracking
1114 // can run without context instruction
1115 const SimplifyQuery Q = SQ.getWithInstruction(I);
1116
1117 E->setType(T);
1118 E->setOpcode(Opcode);
1119 E->allocateOperands(ArgRecycler, ExpressionAllocator);
1120 if (Instruction::isCommutative(Opcode)) {
1121 // Ensure that commutative instructions that only differ by a permutation
1122 // of their operands get the same value number by sorting the operand value
1123 // numbers. Since all commutative instructions have two operands it is more
1124 // efficient to sort by hand rather than using, say, std::sort.
1125 if (shouldSwapOperands(Arg1, Arg2))
1126 std::swap(Arg1, Arg2);
1127 }
1128 E->op_push_back(lookupOperandLeader(Arg1));
1129 E->op_push_back(lookupOperandLeader(Arg2));
1130
1131 Value *V = simplifyBinOp(Opcode, E->getOperand(0), E->getOperand(1), Q);
1132 if (auto Simplified = checkExprResults(E, I, V)) {
1133 addAdditionalUsers(Simplified, I);
1134 return Simplified.Expr;
1135 }
1136 return E;
1137}
1138
1139// Take a Value returned by simplification of Expression E/Instruction
1140// I, and see if it resulted in a simpler expression. If so, return
1141// that expression.
1142NewGVN::ExprResult NewGVN::checkExprResults(Expression *E, Instruction *I,
1143 Value *V) const {
1144 if (!V)
1145 return ExprResult::none();
1146
1147 if (auto *C = dyn_cast<Constant>(V)) {
1148 if (I)
1149 LLVM_DEBUG(dbgs() << "Simplified " << *I << " to "
1150 << " constant " << *C << "\n");
1151 NumGVNOpsSimplified++;
1152 assert(isa<BasicExpression>(E) &&
1153 "We should always have had a basic expression here");
1154 deleteExpression(E);
1155 return ExprResult::some(createConstantExpression(C));
1156 } else if (isa<Argument>(V) || isa<GlobalVariable>(V)) {
1157 if (I)
1158 LLVM_DEBUG(dbgs() << "Simplified " << *I << " to "
1159 << " variable " << *V << "\n");
1160 deleteExpression(E);
1161 return ExprResult::some(createVariableExpression(V));
1162 }
1163
1164 CongruenceClass *CC = ValueToClass.lookup(V);
1165 if (CC) {
1166 if (CC->getLeader() && CC->getLeader() != I) {
1167 return ExprResult::some(createVariableOrConstant(CC->getLeader()), V);
1168 }
1169 if (CC->getDefiningExpr()) {
1170 if (I)
1171 LLVM_DEBUG(dbgs() << "Simplified " << *I << " to "
1172 << " expression " << *CC->getDefiningExpr() << "\n");
1173 NumGVNOpsSimplified++;
1174 deleteExpression(E);
1175 return ExprResult::some(CC->getDefiningExpr(), V);
1176 }
1177 }
1178
1179 return ExprResult::none();
1180}
1181
1182// Create a value expression from the instruction I, replacing operands with
1183// their leaders.
1184
1185NewGVN::ExprResult NewGVN::createExpression(Instruction *I) const {
1186 auto *E = new (ExpressionAllocator) BasicExpression(I->getNumOperands());
1187 // TODO: we need to remove context instruction after Value Tracking
1188 // can run without context instruction
1189 const SimplifyQuery Q = SQ.getWithInstruction(I);
1190
1191 bool AllConstant = setBasicExpressionInfo(I, E);
1192
1193 if (I->isCommutative()) {
1194 // Ensure that commutative instructions that only differ by a permutation
1195 // of their operands get the same value number by sorting the operand value
1196 // numbers. Since all commutative instructions have two operands it is more
1197 // efficient to sort by hand rather than using, say, std::sort.
1198 assert(I->getNumOperands() == 2 && "Unsupported commutative instruction!");
1199 if (shouldSwapOperands(E->getOperand(0), E->getOperand(1)))
1200 E->swapOperands(0, 1);
1201 }
1202 // Perform simplification.
1203 if (auto *CI = dyn_cast<CmpInst>(I)) {
1204 // Sort the operand value numbers so x<y and y>x get the same value
1205 // number.
1206 CmpInst::Predicate Predicate = CI->getPredicate();
1207 if (shouldSwapOperands(E->getOperand(0), E->getOperand(1))) {
1208 E->swapOperands(0, 1);
1210 }
1211 E->setOpcode((CI->getOpcode() << 8) | Predicate);
1212 // TODO: 25% of our time is spent in simplifyCmpInst with pointer operands
1213 assert(I->getOperand(0)->getType() == I->getOperand(1)->getType() &&
1214 "Wrong types on cmp instruction");
1215 assert((E->getOperand(0)->getType() == I->getOperand(0)->getType() &&
1216 E->getOperand(1)->getType() == I->getOperand(1)->getType()));
1217 Value *V =
1218 simplifyCmpInst(Predicate, E->getOperand(0), E->getOperand(1), Q);
1219 if (auto Simplified = checkExprResults(E, I, V))
1220 return Simplified;
1221 } else if (isa<SelectInst>(I)) {
1222 if (isa<Constant>(E->getOperand(0)) ||
1223 E->getOperand(1) == E->getOperand(2)) {
1224 assert(E->getOperand(1)->getType() == I->getOperand(1)->getType() &&
1225 E->getOperand(2)->getType() == I->getOperand(2)->getType());
1226 Value *V = simplifySelectInst(E->getOperand(0), E->getOperand(1),
1227 E->getOperand(2), Q);
1228 if (auto Simplified = checkExprResults(E, I, V))
1229 return Simplified;
1230 }
1231 } else if (I->isBinaryOp()) {
1232 Value *V =
1233 simplifyBinOp(E->getOpcode(), E->getOperand(0), E->getOperand(1), Q);
1234 if (auto Simplified = checkExprResults(E, I, V))
1235 return Simplified;
1236 } else if (auto *CI = dyn_cast<CastInst>(I)) {
1237 Value *V =
1238 simplifyCastInst(CI->getOpcode(), E->getOperand(0), CI->getType(), Q);
1239 if (auto Simplified = checkExprResults(E, I, V))
1240 return Simplified;
1241 } else if (auto *GEPI = dyn_cast<GetElementPtrInst>(I)) {
1242 Value *V = simplifyGEPInst(GEPI->getSourceElementType(), *E->op_begin(),
1243 ArrayRef(std::next(E->op_begin()), E->op_end()),
1244 GEPI->getNoWrapFlags(), Q);
1245 if (auto Simplified = checkExprResults(E, I, V))
1246 return Simplified;
1247 } else if (AllConstant) {
1248 // We don't bother trying to simplify unless all of the operands
1249 // were constant.
1250 // TODO: There are a lot of Simplify*'s we could call here, if we
1251 // wanted to. The original motivating case for this code was a
1252 // zext i1 false to i8, which we don't have an interface to
1253 // simplify (IE there is no SimplifyZExt).
1254
1256 for (Value *Arg : E->operands())
1257 C.emplace_back(cast<Constant>(Arg));
1258
1259 if (Value *V = ConstantFoldInstOperands(I, C, DL, TLI))
1260 if (auto Simplified = checkExprResults(E, I, V))
1261 return Simplified;
1262 }
1263 return ExprResult::some(E);
1264}
1265
1267NewGVN::createAggregateValueExpression(Instruction *I) const {
1268 if (auto *II = dyn_cast<InsertValueInst>(I)) {
1269 auto *E = new (ExpressionAllocator)
1270 AggregateValueExpression(I->getNumOperands(), II->getNumIndices());
1271 setBasicExpressionInfo(I, E);
1272 E->allocateIntOperands(ExpressionAllocator);
1273 llvm::copy(II->indices(), int_op_inserter(E));
1274 return E;
1275 } else if (auto *EI = dyn_cast<ExtractValueInst>(I)) {
1276 auto *E = new (ExpressionAllocator)
1277 AggregateValueExpression(I->getNumOperands(), EI->getNumIndices());
1278 setBasicExpressionInfo(EI, E);
1279 E->allocateIntOperands(ExpressionAllocator);
1280 llvm::copy(EI->indices(), int_op_inserter(E));
1281 return E;
1282 }
1283 llvm_unreachable("Unhandled type of aggregate value operation");
1284}
1285
1286const DeadExpression *NewGVN::createDeadExpression() const {
1287 // DeadExpression has no arguments and all DeadExpression's are the same,
1288 // so we only need one of them.
1289 return SingletonDeadExpression;
1290}
1291
1292const VariableExpression *NewGVN::createVariableExpression(Value *V) const {
1293 auto *E = new (ExpressionAllocator) VariableExpression(V);
1294 E->setOpcode(V->getValueID());
1295 return E;
1296}
1297
1298const Expression *NewGVN::createVariableOrConstant(Value *V) const {
1299 if (auto *C = dyn_cast<Constant>(V))
1300 return createConstantExpression(C);
1301 return createVariableExpression(V);
1302}
1303
1304const ConstantExpression *NewGVN::createConstantExpression(Constant *C) const {
1305 auto *E = new (ExpressionAllocator) ConstantExpression(C);
1306 E->setOpcode(C->getValueID());
1307 return E;
1308}
1309
1310const UnknownExpression *NewGVN::createUnknownExpression(Instruction *I) const {
1311 auto *E = new (ExpressionAllocator) UnknownExpression(I);
1312 E->setOpcode(I->getOpcode());
1313 return E;
1314}
1315
1316const CallExpression *
1317NewGVN::createCallExpression(CallInst *CI, const MemoryAccess *MA) const {
1318 // FIXME: Add operand bundles for calls.
1319 auto *E =
1320 new (ExpressionAllocator) CallExpression(CI->getNumOperands(), CI, MA);
1321 setBasicExpressionInfo(CI, E);
1322 if (CI->isCommutative()) {
1323 // Ensure that commutative intrinsics that only differ by a permutation
1324 // of their operands get the same value number by sorting the operand value
1325 // numbers.
1326 assert(CI->getNumOperands() >= 2 && "Unsupported commutative intrinsic!");
1327 if (shouldSwapOperands(E->getOperand(0), E->getOperand(1)))
1328 E->swapOperands(0, 1);
1329 }
1330 return E;
1331}
1332
1333// Return true if some equivalent of instruction Inst dominates instruction U.
1334bool NewGVN::someEquivalentDominates(const Instruction *Inst,
1335 const Instruction *U) const {
1336 auto *CC = ValueToClass.lookup(Inst);
1337 // This must be an instruction because we are only called from phi nodes
1338 // in the case that the value it needs to check against is an instruction.
1339
1340 // The most likely candidates for dominance are the leader and the next leader.
1341 // The leader or nextleader will dominate in all cases where there is an
1342 // equivalent that is higher up in the dom tree.
1343 // We can't *only* check them, however, because the
1344 // dominator tree could have an infinite number of non-dominating siblings
1345 // with instructions that are in the right congruence class.
1346 // A
1347 // B C D E F G
1348 // |
1349 // H
1350 // Instruction U could be in H, with equivalents in every other sibling.
1351 // Depending on the rpo order picked, the leader could be the equivalent in
1352 // any of these siblings.
1353 if (!CC)
1354 return false;
1355 if (alwaysAvailable(CC->getLeader()))
1356 return true;
1357 if (DT->dominates(cast<Instruction>(CC->getLeader()), U))
1358 return true;
1359 if (CC->getNextLeader().first &&
1360 DT->dominates(cast<Instruction>(CC->getNextLeader().first), U))
1361 return true;
1362 return llvm::any_of(*CC, [&](const Value *Member) {
1363 return Member != CC->getLeader() &&
1364 DT->dominates(cast<Instruction>(Member), U);
1365 });
1366}
1367
1368// See if we have a congruence class and leader for this operand, and if so,
1369// return it. Otherwise, return the operand itself.
1370Value *NewGVN::lookupOperandLeader(Value *V) const {
1371 CongruenceClass *CC = ValueToClass.lookup(V);
1372 if (CC) {
1373 // Everything in TOP is represented by poison, as it can be any value.
1374 // We do have to make sure we get the type right though, so we can't set the
1375 // RepLeader to poison.
1376 if (CC == TOPClass)
1377 return PoisonValue::get(V->getType());
1378 return CC->getStoredValue() ? CC->getStoredValue() : CC->getLeader();
1379 }
1380
1381 return V;
1382}
1383
1384const MemoryAccess *NewGVN::lookupMemoryLeader(const MemoryAccess *MA) const {
1385 auto *CC = getMemoryClass(MA);
1386 assert(CC->getMemoryLeader() &&
1387 "Every MemoryAccess should be mapped to a congruence class with a "
1388 "representative memory access");
1389 return CC->getMemoryLeader();
1390}
1391
1392// Return true if the MemoryAccess is really equivalent to everything. This is
1393// equivalent to the lattice value "TOP" in most lattices. This is the initial
1394// state of all MemoryAccesses.
1395bool NewGVN::isMemoryAccessTOP(const MemoryAccess *MA) const {
1396 return getMemoryClass(MA) == TOPClass;
1397}
1398
1399LoadExpression *NewGVN::createLoadExpression(Type *LoadType, Value *PointerOp,
1400 LoadInst *LI,
1401 const MemoryAccess *MA) const {
1402 auto *E =
1403 new (ExpressionAllocator) LoadExpression(1, LI, lookupMemoryLeader(MA));
1404 E->allocateOperands(ArgRecycler, ExpressionAllocator);
1405 E->setType(LoadType);
1406
1407 // Give store and loads same opcode so they value number together.
1408 E->setOpcode(0);
1409 E->op_push_back(PointerOp);
1410
1411 // TODO: Value number heap versions. We may be able to discover
1412 // things alias analysis can't on it's own (IE that a store and a
1413 // load have the same value, and thus, it isn't clobbering the load).
1414 return E;
1415}
1416
1417const StoreExpression *
1418NewGVN::createStoreExpression(StoreInst *SI, const MemoryAccess *MA) const {
1419 auto *StoredValueLeader = lookupOperandLeader(SI->getValueOperand());
1420 auto *E = new (ExpressionAllocator)
1421 StoreExpression(SI->getNumOperands(), SI, StoredValueLeader, MA);
1422 E->allocateOperands(ArgRecycler, ExpressionAllocator);
1423 E->setType(SI->getValueOperand()->getType());
1424
1425 // Give store and loads same opcode so they value number together.
1426 E->setOpcode(0);
1427 E->op_push_back(lookupOperandLeader(SI->getPointerOperand()));
1428
1429 // TODO: Value number heap versions. We may be able to discover
1430 // things alias analysis can't on it's own (IE that a store and a
1431 // load have the same value, and thus, it isn't clobbering the load).
1432 return E;
1433}
1434
1435const Expression *NewGVN::performSymbolicStoreEvaluation(Instruction *I) const {
1436 // Unlike loads, we never try to eliminate stores, so we do not check if they
1437 // are simple and avoid value numbering them.
1438 auto *SI = cast<StoreInst>(I);
1439 auto *StoreAccess = getMemoryAccess(SI);
1440 // Get the expression, if any, for the RHS of the MemoryDef.
1441 const MemoryAccess *StoreRHS = StoreAccess->getDefiningAccess();
1443 StoreRHS = MSSAWalker->getClobberingMemoryAccess(StoreAccess);
1444 // If we bypassed the use-def chains, make sure we add a use.
1445 StoreRHS = lookupMemoryLeader(StoreRHS);
1446 if (StoreRHS != StoreAccess->getDefiningAccess())
1447 addMemoryUsers(StoreRHS, StoreAccess);
1448 // If we are defined by ourselves, use the live on entry def.
1449 if (StoreRHS == StoreAccess)
1450 StoreRHS = MSSA->getLiveOnEntryDef();
1451
1452 if (SI->isSimple()) {
1453 // See if we are defined by a previous store expression, it already has a
1454 // value, and it's the same value as our current store. FIXME: Right now, we
1455 // only do this for simple stores, we should expand to cover memcpys, etc.
1456 const auto *LastStore = createStoreExpression(SI, StoreRHS);
1457 const auto *LastCC = ExpressionToClass.lookup(LastStore);
1458 // We really want to check whether the expression we matched was a store. No
1459 // easy way to do that. However, we can check that the class we found has a
1460 // store, which, assuming the value numbering state is not corrupt, is
1461 // sufficient, because we must also be equivalent to that store's expression
1462 // for it to be in the same class as the load.
1463 if (LastCC && LastCC->getStoredValue() == LastStore->getStoredValue())
1464 return LastStore;
1465 // Also check if our value operand is defined by a load of the same memory
1466 // location, and the memory state is the same as it was then (otherwise, it
1467 // could have been overwritten later. See test32 in
1468 // transforms/DeadStoreElimination/simple.ll).
1469 if (auto *LI = dyn_cast<LoadInst>(LastStore->getStoredValue()))
1470 if ((lookupOperandLeader(LI->getPointerOperand()) ==
1471 LastStore->getOperand(0)) &&
1472 (lookupMemoryLeader(getMemoryAccess(LI)->getDefiningAccess()) ==
1473 StoreRHS))
1474 return LastStore;
1475 deleteExpression(LastStore);
1476 }
1477
1478 // If the store is not equivalent to anything, value number it as a store that
1479 // produces a unique memory state (instead of using it's MemoryUse, we use
1480 // it's MemoryDef).
1481 return createStoreExpression(SI, StoreAccess);
1482}
1483
1484// See if we can extract the value of a loaded pointer from a load, a store, or
1485// a memory instruction.
1486const Expression *
1487NewGVN::performSymbolicLoadCoercion(Type *LoadType, Value *LoadPtr,
1488 LoadInst *LI, Instruction *DepInst,
1489 MemoryAccess *DefiningAccess) const {
1490 assert((!LI || LI->isSimple()) && "Not a simple load");
1491 if (auto *DepSI = dyn_cast<StoreInst>(DepInst)) {
1492 // Can't forward from non-atomic to atomic without violating memory model.
1493 // Also don't need to coerce if they are the same type, we will just
1494 // propagate.
1495 if (LI->isAtomic() > DepSI->isAtomic() ||
1496 LoadType == DepSI->getValueOperand()->getType())
1497 return nullptr;
1498 int Offset = analyzeLoadFromClobberingStore(LoadType, LoadPtr, DepSI, DL);
1499 if (Offset >= 0) {
1500 if (auto *C = dyn_cast<Constant>(
1501 lookupOperandLeader(DepSI->getValueOperand()))) {
1502 if (Constant *Res = getConstantValueForLoad(C, Offset, LoadType, DL)) {
1503 LLVM_DEBUG(dbgs() << "Coercing load from store " << *DepSI
1504 << " to constant " << *Res << "\n");
1505 return createConstantExpression(Res);
1506 }
1507 }
1508 }
1509 } else if (auto *DepLI = dyn_cast<LoadInst>(DepInst)) {
1510 // Can't forward from non-atomic to atomic without violating memory model.
1511 if (LI->isAtomic() > DepLI->isAtomic())
1512 return nullptr;
1513 int Offset = analyzeLoadFromClobberingLoad(LoadType, LoadPtr, DepLI, DL);
1514 if (Offset >= 0) {
1515 // We can coerce a constant load into a load.
1516 if (auto *C = dyn_cast<Constant>(lookupOperandLeader(DepLI)))
1517 if (auto *PossibleConstant =
1518 getConstantValueForLoad(C, Offset, LoadType, DL)) {
1519 LLVM_DEBUG(dbgs() << "Coercing load from load " << *LI
1520 << " to constant " << *PossibleConstant << "\n");
1521 return createConstantExpression(PossibleConstant);
1522 }
1523 }
1524 } else if (auto *DepMI = dyn_cast<MemIntrinsic>(DepInst)) {
1525 int Offset = analyzeLoadFromClobberingMemInst(LoadType, LoadPtr, DepMI, DL);
1526 if (Offset >= 0) {
1527 if (auto *PossibleConstant =
1528 getConstantMemInstValueForLoad(DepMI, Offset, LoadType, DL)) {
1529 LLVM_DEBUG(dbgs() << "Coercing load from meminst " << *DepMI
1530 << " to constant " << *PossibleConstant << "\n");
1531 return createConstantExpression(PossibleConstant);
1532 }
1533 }
1534 }
1535
1536 if (auto *II = dyn_cast<IntrinsicInst>(DepInst)) {
1537 if (II->getIntrinsicID() == Intrinsic::lifetime_start) {
1538 auto *LifetimePtr = II->getOperand(0);
1539 if (LoadPtr == lookupOperandLeader(LifetimePtr) ||
1540 AA->isMustAlias(LoadPtr, LifetimePtr))
1541 return createConstantExpression(UndefValue::get(LoadType));
1542 }
1543 }
1544
1545 // All of the below are only true if the loaded pointer is produced
1546 // by the dependent instruction.
1547 if (!DepInst->getType()->isPointerTy() ||
1548 (LoadPtr != lookupOperandLeader(DepInst) &&
1549 !AA->isMustAlias(LoadPtr, DepInst)))
1550 return nullptr;
1551 // If this load really doesn't depend on anything, then we must be loading an
1552 // undef value. This can happen when loading for a fresh allocation with no
1553 // intervening stores, for example. Note that this is only true in the case
1554 // that the result of the allocation is pointer equal to the load ptr.
1555 if (isa<AllocaInst>(DepInst)) {
1556 return createConstantExpression(UndefValue::get(LoadType));
1557 } else if (auto *InitVal =
1558 getInitialValueOfAllocation(DepInst, TLI, LoadType))
1559 return createConstantExpression(InitVal);
1560
1561 return nullptr;
1562}
1563
1564const Expression *NewGVN::performSymbolicLoadEvaluation(Instruction *I) const {
1565 auto *LI = cast<LoadInst>(I);
1566
1567 // We can eliminate in favor of non-simple loads, but we won't be able to
1568 // eliminate the loads themselves.
1569 if (!LI->isSimple())
1570 return nullptr;
1571
1572 Value *LoadAddressLeader = lookupOperandLeader(LI->getPointerOperand());
1573 // Load of undef is UB.
1574 if (isa<UndefValue>(LoadAddressLeader))
1575 return createConstantExpression(PoisonValue::get(LI->getType()));
1576 MemoryAccess *OriginalAccess = getMemoryAccess(I);
1577 MemoryAccess *DefiningAccess =
1578 MSSAWalker->getClobberingMemoryAccess(OriginalAccess);
1579
1580 if (!MSSA->isLiveOnEntryDef(DefiningAccess)) {
1581 if (auto *MD = dyn_cast<MemoryDef>(DefiningAccess)) {
1582 Instruction *DefiningInst = MD->getMemoryInst();
1583 // If the defining instruction is not reachable, replace with poison.
1584 if (!ReachableBlocks.count(DefiningInst->getParent()))
1585 return createConstantExpression(PoisonValue::get(LI->getType()));
1586 // This will handle stores and memory insts. We only do if it the
1587 // defining access has a different type, or it is a pointer produced by
1588 // certain memory operations that cause the memory to have a fixed value
1589 // (IE things like calloc).
1590 if (const auto *CoercionResult =
1591 performSymbolicLoadCoercion(LI->getType(), LoadAddressLeader, LI,
1592 DefiningInst, DefiningAccess))
1593 return CoercionResult;
1594 }
1595 }
1596
1597 const auto *LE = createLoadExpression(LI->getType(), LoadAddressLeader, LI,
1598 DefiningAccess);
1599 // If our MemoryLeader is not our defining access, add a use to the
1600 // MemoryLeader, so that we get reprocessed when it changes.
1601 if (LE->getMemoryLeader() != DefiningAccess)
1602 addMemoryUsers(LE->getMemoryLeader(), OriginalAccess);
1603 return LE;
1604}
1605
1606NewGVN::ExprResult
1607NewGVN::performSymbolicPredicateInfoEvaluation(BitCastInst *I) const {
1608 auto *PI = PredInfo->getPredicateInfoFor(I);
1609 if (!PI)
1610 return ExprResult::none();
1611
1612 LLVM_DEBUG(dbgs() << "Found predicate info from instruction !\n");
1613
1614 const std::optional<PredicateConstraint> &Constraint = PI->getConstraint();
1615 if (!Constraint)
1616 return ExprResult::none();
1617
1618 CmpInst::Predicate Predicate = Constraint->Predicate;
1619 Value *CmpOp0 = I->getOperand(0);
1620 Value *CmpOp1 = Constraint->OtherOp;
1621
1622 Value *FirstOp = lookupOperandLeader(CmpOp0);
1623 Value *SecondOp = lookupOperandLeader(CmpOp1);
1624 Value *AdditionallyUsedValue = CmpOp0;
1625
1626 // Sort the ops.
1627 if (shouldSwapOperandsForPredicate(FirstOp, SecondOp, I)) {
1628 std::swap(FirstOp, SecondOp);
1630 AdditionallyUsedValue = CmpOp1;
1631 }
1632
1634 return ExprResult::some(createVariableOrConstant(FirstOp),
1635 AdditionallyUsedValue, PI);
1636
1637 // Handle the special case of floating point.
1638 if (Predicate == CmpInst::FCMP_OEQ && isa<ConstantFP>(FirstOp) &&
1639 !cast<ConstantFP>(FirstOp)->isZero())
1640 return ExprResult::some(createConstantExpression(cast<Constant>(FirstOp)),
1641 AdditionallyUsedValue, PI);
1642
1643 return ExprResult::none();
1644}
1645
1646// Evaluate read only and pure calls, and create an expression result.
1647NewGVN::ExprResult NewGVN::performSymbolicCallEvaluation(Instruction *I) const {
1648 auto *CI = cast<CallInst>(I);
1649 if (auto *II = dyn_cast<IntrinsicInst>(I)) {
1650 if (auto *ReturnedValue = II->getReturnedArgOperand())
1651 return ExprResult::some(createVariableOrConstant(ReturnedValue));
1652 }
1653
1654 // FIXME: Currently the calls which may access the thread id may
1655 // be considered as not accessing the memory. But this is
1656 // problematic for coroutines, since coroutines may resume in a
1657 // different thread. So we disable the optimization here for the
1658 // correctness. However, it may block many other correct
1659 // optimizations. Revert this one when we detect the memory
1660 // accessing kind more precisely.
1661 if (CI->getFunction()->isPresplitCoroutine())
1662 return ExprResult::none();
1663
1664 // Do not combine convergent calls since they implicitly depend on the set of
1665 // threads that is currently executing, and they might be in different basic
1666 // blocks.
1667 if (CI->isConvergent())
1668 return ExprResult::none();
1669
1670 if (AA->doesNotAccessMemory(CI)) {
1671 return ExprResult::some(
1672 createCallExpression(CI, TOPClass->getMemoryLeader()));
1673 } else if (AA->onlyReadsMemory(CI)) {
1674 if (auto *MA = MSSA->getMemoryAccess(CI)) {
1675 auto *DefiningAccess = MSSAWalker->getClobberingMemoryAccess(MA);
1676 return ExprResult::some(createCallExpression(CI, DefiningAccess));
1677 } else // MSSA determined that CI does not access memory.
1678 return ExprResult::some(
1679 createCallExpression(CI, TOPClass->getMemoryLeader()));
1680 }
1681 return ExprResult::none();
1682}
1683
1684// Retrieve the memory class for a given MemoryAccess.
1685CongruenceClass *NewGVN::getMemoryClass(const MemoryAccess *MA) const {
1686 auto *Result = MemoryAccessToClass.lookup(MA);
1687 assert(Result && "Should have found memory class");
1688 return Result;
1689}
1690
1691// Update the MemoryAccess equivalence table to say that From is equal to To,
1692// and return true if this is different from what already existed in the table.
1693bool NewGVN::setMemoryClass(const MemoryAccess *From,
1694 CongruenceClass *NewClass) {
1695 assert(NewClass &&
1696 "Every MemoryAccess should be getting mapped to a non-null class");
1697 LLVM_DEBUG(dbgs() << "Setting " << *From);
1698 LLVM_DEBUG(dbgs() << " equivalent to congruence class ");
1699 LLVM_DEBUG(dbgs() << NewClass->getID()
1700 << " with current MemoryAccess leader ");
1701 LLVM_DEBUG(dbgs() << *NewClass->getMemoryLeader() << "\n");
1702
1703 auto LookupResult = MemoryAccessToClass.find(From);
1704 bool Changed = false;
1705 // If it's already in the table, see if the value changed.
1706 if (LookupResult != MemoryAccessToClass.end()) {
1707 auto *OldClass = LookupResult->second;
1708 if (OldClass != NewClass) {
1709 // If this is a phi, we have to handle memory member updates.
1710 if (auto *MP = dyn_cast<MemoryPhi>(From)) {
1711 OldClass->memory_erase(MP);
1712 NewClass->memory_insert(MP);
1713 // This may have killed the class if it had no non-memory members
1714 if (OldClass->getMemoryLeader() == From) {
1715 if (OldClass->definesNoMemory()) {
1716 OldClass->setMemoryLeader(nullptr);
1717 } else {
1718 OldClass->setMemoryLeader(getNextMemoryLeader(OldClass));
1719 LLVM_DEBUG(dbgs() << "Memory class leader change for class "
1720 << OldClass->getID() << " to "
1721 << *OldClass->getMemoryLeader()
1722 << " due to removal of a memory member " << *From
1723 << "\n");
1724 markMemoryLeaderChangeTouched(OldClass);
1725 }
1726 }
1727 }
1728 // It wasn't equivalent before, and now it is.
1729 LookupResult->second = NewClass;
1730 Changed = true;
1731 }
1732 }
1733
1734 return Changed;
1735}
1736
1737// Determine if a instruction is cycle-free. That means the values in the
1738// instruction don't depend on any expressions that can change value as a result
1739// of the instruction. For example, a non-cycle free instruction would be v =
1740// phi(0, v+1).
1741bool NewGVN::isCycleFree(const Instruction *I) const {
1742 // In order to compute cycle-freeness, we do SCC finding on the instruction,
1743 // and see what kind of SCC it ends up in. If it is a singleton, it is
1744 // cycle-free. If it is not in a singleton, it is only cycle free if the
1745 // other members are all phi nodes (as they do not compute anything, they are
1746 // copies).
1747 auto ICS = InstCycleState.lookup(I);
1748 if (ICS == ICS_Unknown) {
1749 SCCFinder.Start(I);
1750 auto &SCC = SCCFinder.getComponentFor(I);
1751 // It's cycle free if it's size 1 or the SCC is *only* phi nodes.
1752 if (SCC.size() == 1)
1753 InstCycleState.insert({I, ICS_CycleFree});
1754 else {
1755 bool AllPhis = llvm::all_of(SCC, [](const Value *V) {
1756 return isa<PHINode>(V) || isCopyOfAPHI(V);
1757 });
1758 ICS = AllPhis ? ICS_CycleFree : ICS_Cycle;
1759 for (const auto *Member : SCC)
1760 if (auto *MemberPhi = dyn_cast<PHINode>(Member))
1761 InstCycleState.insert({MemberPhi, ICS});
1762 }
1763 }
1764 if (ICS == ICS_Cycle)
1765 return false;
1766 return true;
1767}
1768
1769// Evaluate PHI nodes symbolically and create an expression result.
1770const Expression *
1771NewGVN::performSymbolicPHIEvaluation(ArrayRef<ValPair> PHIOps,
1772 Instruction *I,
1773 BasicBlock *PHIBlock) const {
1774 // True if one of the incoming phi edges is a backedge.
1775 bool HasBackedge = false;
1776 // All constant tracks the state of whether all the *original* phi operands
1777 // This is really shorthand for "this phi cannot cycle due to forward
1778 // change in value of the phi is guaranteed not to later change the value of
1779 // the phi. IE it can't be v = phi(undef, v+1)
1780 bool OriginalOpsConstant = true;
1781 auto *E = cast<PHIExpression>(createPHIExpression(
1782 PHIOps, I, PHIBlock, HasBackedge, OriginalOpsConstant));
1783 // We match the semantics of SimplifyPhiNode from InstructionSimplify here.
1784 // See if all arguments are the same.
1785 // We track if any were undef because they need special handling.
1786 bool HasUndef = false, HasPoison = false;
1787 auto Filtered = make_filter_range(E->operands(), [&](Value *Arg) {
1788 if (isa<PoisonValue>(Arg)) {
1789 HasPoison = true;
1790 return false;
1791 }
1792 if (isa<UndefValue>(Arg)) {
1793 HasUndef = true;
1794 return false;
1795 }
1796 return true;
1797 });
1798 // If we are left with no operands, it's dead.
1799 if (Filtered.empty()) {
1800 // If it has undef or poison at this point, it means there are no-non-undef
1801 // arguments, and thus, the value of the phi node must be undef.
1802 if (HasUndef) {
1803 LLVM_DEBUG(
1804 dbgs() << "PHI Node " << *I
1805 << " has no non-undef arguments, valuing it as undef\n");
1806 return createConstantExpression(UndefValue::get(I->getType()));
1807 }
1808 if (HasPoison) {
1809 LLVM_DEBUG(
1810 dbgs() << "PHI Node " << *I
1811 << " has no non-poison arguments, valuing it as poison\n");
1812 return createConstantExpression(PoisonValue::get(I->getType()));
1813 }
1814
1815 LLVM_DEBUG(dbgs() << "No arguments of PHI node " << *I << " are live\n");
1816 deleteExpression(E);
1817 return createDeadExpression();
1818 }
1819 Value *AllSameValue = *(Filtered.begin());
1820 ++Filtered.begin();
1821 // Can't use std::equal here, sadly, because filter.begin moves.
1822 if (llvm::all_of(Filtered, [&](Value *Arg) { return Arg == AllSameValue; })) {
1823 // Can't fold phi(undef, X) -> X unless X can't be poison (thus X is undef
1824 // in the worst case).
1825 if (HasUndef && !isGuaranteedNotToBePoison(AllSameValue, AC, nullptr, DT))
1826 return E;
1827
1828 // In LLVM's non-standard representation of phi nodes, it's possible to have
1829 // phi nodes with cycles (IE dependent on other phis that are .... dependent
1830 // on the original phi node), especially in weird CFG's where some arguments
1831 // are unreachable, or uninitialized along certain paths. This can cause
1832 // infinite loops during evaluation. We work around this by not trying to
1833 // really evaluate them independently, but instead using a variable
1834 // expression to say if one is equivalent to the other.
1835 // We also special case undef/poison, so that if we have an undef, we can't
1836 // use the common value unless it dominates the phi block.
1837 if (HasPoison || HasUndef) {
1838 // If we have undef and at least one other value, this is really a
1839 // multivalued phi, and we need to know if it's cycle free in order to
1840 // evaluate whether we can ignore the undef. The other parts of this are
1841 // just shortcuts. If there is no backedge, or all operands are
1842 // constants, it also must be cycle free.
1843 if (HasBackedge && !OriginalOpsConstant &&
1844 !isa<UndefValue>(AllSameValue) && !isCycleFree(I))
1845 return E;
1846
1847 // Only have to check for instructions
1848 if (auto *AllSameInst = dyn_cast<Instruction>(AllSameValue))
1849 if (!someEquivalentDominates(AllSameInst, I))
1850 return E;
1851 }
1852 // Can't simplify to something that comes later in the iteration.
1853 // Otherwise, when and if it changes congruence class, we will never catch
1854 // up. We will always be a class behind it.
1855 if (isa<Instruction>(AllSameValue) &&
1856 InstrToDFSNum(AllSameValue) > InstrToDFSNum(I))
1857 return E;
1858 NumGVNPhisAllSame++;
1859 LLVM_DEBUG(dbgs() << "Simplified PHI node " << *I << " to " << *AllSameValue
1860 << "\n");
1861 deleteExpression(E);
1862 return createVariableOrConstant(AllSameValue);
1863 }
1864 return E;
1865}
1866
1867const Expression *
1868NewGVN::performSymbolicAggrValueEvaluation(Instruction *I) const {
1869 if (auto *EI = dyn_cast<ExtractValueInst>(I)) {
1870 auto *WO = dyn_cast<WithOverflowInst>(EI->getAggregateOperand());
1871 if (WO && EI->getNumIndices() == 1 && *EI->idx_begin() == 0)
1872 // EI is an extract from one of our with.overflow intrinsics. Synthesize
1873 // a semantically equivalent expression instead of an extract value
1874 // expression.
1875 return createBinaryExpression(WO->getBinaryOp(), EI->getType(),
1876 WO->getLHS(), WO->getRHS(), I);
1877 }
1878
1879 return createAggregateValueExpression(I);
1880}
1881
1882NewGVN::ExprResult NewGVN::performSymbolicCmpEvaluation(Instruction *I) const {
1883 assert(isa<CmpInst>(I) && "Expected a cmp instruction.");
1884
1885 auto *CI = cast<CmpInst>(I);
1886 // See if our operands are equal to those of a previous predicate, and if so,
1887 // if it implies true or false.
1888 auto Op0 = lookupOperandLeader(CI->getOperand(0));
1889 auto Op1 = lookupOperandLeader(CI->getOperand(1));
1890 auto OurPredicate = CI->getPredicate();
1891 if (shouldSwapOperands(Op0, Op1)) {
1892 std::swap(Op0, Op1);
1893 OurPredicate = CI->getSwappedPredicate();
1894 }
1895
1896 // Avoid processing the same info twice.
1897 const PredicateBase *LastPredInfo = nullptr;
1898 // See if we know something about the comparison itself, like it is the target
1899 // of an assume.
1900 auto *CmpPI = PredInfo->getPredicateInfoFor(I);
1901 if (isa_and_nonnull<PredicateAssume>(CmpPI))
1902 return ExprResult::some(
1903 createConstantExpression(ConstantInt::getTrue(CI->getType())));
1904
1905 if (Op0 == Op1) {
1906 // This condition does not depend on predicates, no need to add users
1907 if (CI->isTrueWhenEqual())
1908 return ExprResult::some(
1909 createConstantExpression(ConstantInt::getTrue(CI->getType())));
1910 else if (CI->isFalseWhenEqual())
1911 return ExprResult::some(
1912 createConstantExpression(ConstantInt::getFalse(CI->getType())));
1913 }
1914
1915 // NOTE: Because we are comparing both operands here and below, and using
1916 // previous comparisons, we rely on fact that predicateinfo knows to mark
1917 // comparisons that use renamed operands as users of the earlier comparisons.
1918 // It is *not* enough to just mark predicateinfo renamed operands as users of
1919 // the earlier comparisons, because the *other* operand may have changed in a
1920 // previous iteration.
1921 // Example:
1922 // icmp slt %a, %b
1923 // %b.0 = ssa.copy(%b)
1924 // false branch:
1925 // icmp slt %c, %b.0
1926
1927 // %c and %a may start out equal, and thus, the code below will say the second
1928 // %icmp is false. c may become equal to something else, and in that case the
1929 // %second icmp *must* be reexamined, but would not if only the renamed
1930 // %operands are considered users of the icmp.
1931
1932 // *Currently* we only check one level of comparisons back, and only mark one
1933 // level back as touched when changes happen. If you modify this code to look
1934 // back farther through comparisons, you *must* mark the appropriate
1935 // comparisons as users in PredicateInfo.cpp, or you will cause bugs. See if
1936 // we know something just from the operands themselves
1937
1938 // See if our operands have predicate info, so that we may be able to derive
1939 // something from a previous comparison.
1940 for (const auto &Op : CI->operands()) {
1941 auto *PI = PredInfo->getPredicateInfoFor(Op);
1942 if (const auto *PBranch = dyn_cast_or_null<PredicateBranch>(PI)) {
1943 if (PI == LastPredInfo)
1944 continue;
1945 LastPredInfo = PI;
1946 // In phi of ops cases, we may have predicate info that we are evaluating
1947 // in a different context.
1948 if (!DT->dominates(PBranch->To, I->getParent()))
1949 continue;
1950 // TODO: Along the false edge, we may know more things too, like
1951 // icmp of
1952 // same operands is false.
1953 // TODO: We only handle actual comparison conditions below, not
1954 // and/or.
1955 auto *BranchCond = dyn_cast<CmpInst>(PBranch->Condition);
1956 if (!BranchCond)
1957 continue;
1958 auto *BranchOp0 = lookupOperandLeader(BranchCond->getOperand(0));
1959 auto *BranchOp1 = lookupOperandLeader(BranchCond->getOperand(1));
1960 auto BranchPredicate = BranchCond->getPredicate();
1961 if (shouldSwapOperands(BranchOp0, BranchOp1)) {
1962 std::swap(BranchOp0, BranchOp1);
1963 BranchPredicate = BranchCond->getSwappedPredicate();
1964 }
1965 if (BranchOp0 == Op0 && BranchOp1 == Op1) {
1966 if (PBranch->TrueEdge) {
1967 // If we know the previous predicate is true and we are in the true
1968 // edge then we may be implied true or false.
1969 if (auto R = ICmpInst::isImpliedByMatchingCmp(BranchPredicate,
1970 OurPredicate)) {
1971 auto *C = ConstantInt::getBool(CI->getType(), *R);
1972 return ExprResult::some(createConstantExpression(C), PI);
1973 }
1974 } else {
1975 // Just handle the ne and eq cases, where if we have the same
1976 // operands, we may know something.
1977 if (BranchPredicate == OurPredicate) {
1978 // Same predicate, same ops,we know it was false, so this is false.
1979 return ExprResult::some(
1980 createConstantExpression(ConstantInt::getFalse(CI->getType())),
1981 PI);
1982 } else if (BranchPredicate ==
1983 CmpInst::getInversePredicate(OurPredicate)) {
1984 // Inverse predicate, we know the other was false, so this is true.
1985 return ExprResult::some(
1986 createConstantExpression(ConstantInt::getTrue(CI->getType())),
1987 PI);
1988 }
1989 }
1990 }
1991 }
1992 }
1993 // Create expression will take care of simplifyCmpInst
1994 return createExpression(I);
1995}
1996
1997// Substitute and symbolize the instruction before value numbering.
1998NewGVN::ExprResult
1999NewGVN::performSymbolicEvaluation(Instruction *I,
2000 SmallPtrSetImpl<Value *> &Visited) const {
2001
2002 const Expression *E = nullptr;
2003 // TODO: memory intrinsics.
2004 // TODO: Some day, we should do the forward propagation and reassociation
2005 // parts of the algorithm.
2006 switch (I->getOpcode()) {
2007 case Instruction::ExtractValue:
2008 case Instruction::InsertValue:
2009 E = performSymbolicAggrValueEvaluation(I);
2010 break;
2011 case Instruction::PHI: {
2013 auto *PN = cast<PHINode>(I);
2014 for (unsigned i = 0; i < PN->getNumOperands(); ++i)
2015 Ops.push_back({PN->getIncomingValue(i), PN->getIncomingBlock(i)});
2016 // Sort to ensure the invariant createPHIExpression requires is met.
2017 sortPHIOps(Ops);
2018 E = performSymbolicPHIEvaluation(Ops, I, getBlockForValue(I));
2019 } break;
2020 case Instruction::Call:
2021 return performSymbolicCallEvaluation(I);
2022 break;
2023 case Instruction::Store:
2024 E = performSymbolicStoreEvaluation(I);
2025 break;
2026 case Instruction::Load:
2027 E = performSymbolicLoadEvaluation(I);
2028 break;
2029 case Instruction::BitCast:
2030 // Intrinsics with the returned attribute are copies of arguments.
2031 if (I->getType() == I->getOperand(0)->getType())
2032 if (auto Res =
2033 performSymbolicPredicateInfoEvaluation(cast<BitCastInst>(I)))
2034 return Res;
2035 [[fallthrough]];
2036 case Instruction::AddrSpaceCast:
2037 case Instruction::Freeze:
2038 return createExpression(I);
2039 break;
2040 case Instruction::ICmp:
2041 case Instruction::FCmp:
2042 return performSymbolicCmpEvaluation(I);
2043 break;
2044 case Instruction::FNeg:
2045 case Instruction::Add:
2046 case Instruction::FAdd:
2047 case Instruction::Sub:
2048 case Instruction::FSub:
2049 case Instruction::Mul:
2050 case Instruction::FMul:
2051 case Instruction::UDiv:
2052 case Instruction::SDiv:
2053 case Instruction::FDiv:
2054 case Instruction::URem:
2055 case Instruction::SRem:
2056 case Instruction::FRem:
2057 case Instruction::Shl:
2058 case Instruction::LShr:
2059 case Instruction::AShr:
2060 case Instruction::And:
2061 case Instruction::Or:
2062 case Instruction::Xor:
2063 case Instruction::Trunc:
2064 case Instruction::ZExt:
2065 case Instruction::SExt:
2066 case Instruction::FPToUI:
2067 case Instruction::FPToSI:
2068 case Instruction::UIToFP:
2069 case Instruction::SIToFP:
2070 case Instruction::FPTrunc:
2071 case Instruction::FPExt:
2072 case Instruction::PtrToInt:
2073 case Instruction::IntToPtr:
2074 case Instruction::Select:
2075 case Instruction::ExtractElement:
2076 case Instruction::InsertElement:
2077 case Instruction::GetElementPtr:
2078 return createExpression(I);
2079 break;
2080 case Instruction::ShuffleVector:
2081 // FIXME: Add support for shufflevector to createExpression.
2082 return ExprResult::none();
2083 default:
2084 return ExprResult::none();
2085 }
2086 return ExprResult::some(E);
2087}
2088
2089// Look up a container of values/instructions in a map, and touch all the
2090// instructions in the container. Then erase value from the map.
2091template <typename Map, typename KeyType>
2092void NewGVN::touchAndErase(Map &M, const KeyType &Key) {
2093 const auto Result = M.find_as(Key);
2094 if (Result != M.end()) {
2095 for (const typename Map::mapped_type::value_type Mapped : Result->second)
2096 TouchedInstructions.set(InstrToDFSNum(Mapped));
2097 M.erase(Result);
2098 }
2099}
2100
2101void NewGVN::addAdditionalUsers(Value *To, Value *User) const {
2102 assert(User && To != User);
2103 if (isa<Instruction>(To))
2104 AdditionalUsers[To].insert(User);
2105}
2106
2107void NewGVN::addAdditionalUsers(ExprResult &Res, Instruction *User) const {
2108 if (Res.ExtraDep && Res.ExtraDep != User)
2109 addAdditionalUsers(Res.ExtraDep, User);
2110 Res.ExtraDep = nullptr;
2111
2112 if (Res.PredDep) {
2113 if (const auto *PBranch = dyn_cast<PredicateBranch>(Res.PredDep))
2114 PredicateToUsers[PBranch->Condition].insert(User);
2115 else if (const auto *PAssume = dyn_cast<PredicateAssume>(Res.PredDep))
2116 PredicateToUsers[PAssume->Condition].insert(User);
2117 }
2118 Res.PredDep = nullptr;
2119}
2120
2121void NewGVN::markUsersTouched(Value *V) {
2122 // Now mark the users as touched.
2123 for (auto *User : V->users()) {
2124 assert(isa<Instruction>(User) && "Use of value not within an instruction?");
2125 TouchedInstructions.set(InstrToDFSNum(User));
2126 }
2127 touchAndErase(AdditionalUsers, V);
2128}
2129
2130void NewGVN::addMemoryUsers(const MemoryAccess *To, MemoryAccess *U) const {
2131 LLVM_DEBUG(dbgs() << "Adding memory user " << *U << " to " << *To << "\n");
2132 MemoryToUsers[To].insert(U);
2133}
2134
2135void NewGVN::markMemoryDefTouched(const MemoryAccess *MA) {
2136 TouchedInstructions.set(MemoryToDFSNum(MA));
2137}
2138
2139void NewGVN::markMemoryUsersTouched(const MemoryAccess *MA) {
2140 if (isa<MemoryUse>(MA))
2141 return;
2142 for (const auto *U : MA->users())
2143 TouchedInstructions.set(MemoryToDFSNum(U));
2144 touchAndErase(MemoryToUsers, MA);
2145}
2146
2147// Touch all the predicates that depend on this instruction.
2148void NewGVN::markPredicateUsersTouched(Instruction *I) {
2149 touchAndErase(PredicateToUsers, I);
2150}
2151
2152// Mark users affected by a memory leader change.
2153void NewGVN::markMemoryLeaderChangeTouched(CongruenceClass *CC) {
2154 for (const auto *M : CC->memory())
2155 markMemoryDefTouched(M);
2156}
2157
2158// Touch the instructions that need to be updated after a congruence class has a
2159// leader change, and mark changed values.
2160void NewGVN::markValueLeaderChangeTouched(CongruenceClass *CC) {
2161 for (auto *M : *CC) {
2162 if (auto *I = dyn_cast<Instruction>(M))
2163 TouchedInstructions.set(InstrToDFSNum(I));
2164 LeaderChanges.insert(M);
2165 }
2166}
2167
2168// Give a range of things that have instruction DFS numbers, this will return
2169// the member of the range with the smallest dfs number.
2170template <class T, class Range>
2171T *NewGVN::getMinDFSOfRange(const Range &R) const {
2172 std::pair<T *, unsigned> MinDFS = {nullptr, ~0U};
2173 for (const auto X : R) {
2174 auto DFSNum = InstrToDFSNum(X);
2175 if (DFSNum < MinDFS.second)
2176 MinDFS = {X, DFSNum};
2177 }
2178 return MinDFS.first;
2179}
2180
2181// This function returns the MemoryAccess that should be the next leader of
2182// congruence class CC, under the assumption that the current leader is going to
2183// disappear.
2184const MemoryAccess *NewGVN::getNextMemoryLeader(CongruenceClass *CC) const {
2185 // TODO: If this ends up to slow, we can maintain a next memory leader like we
2186 // do for regular leaders.
2187 // Make sure there will be a leader to find.
2188 assert(!CC->definesNoMemory() && "Can't get next leader if there is none");
2189 if (CC->getStoreCount() > 0) {
2190 if (auto *NL = dyn_cast_or_null<StoreInst>(CC->getNextLeader().first))
2191 return getMemoryAccess(NL);
2192 // Find the store with the minimum DFS number.
2193 auto *V = getMinDFSOfRange<Value>(make_filter_range(
2194 *CC, [&](const Value *V) { return isa<StoreInst>(V); }));
2195 return getMemoryAccess(cast<StoreInst>(V));
2196 }
2197 assert(CC->getStoreCount() == 0);
2198
2199 // Given our assertion, hitting this part must mean
2200 // !OldClass->memory_empty()
2201 if (CC->memory_size() == 1)
2202 return *CC->memory_begin();
2203 return getMinDFSOfRange<const MemoryPhi>(CC->memory());
2204}
2205
2206// This function returns the next value leader of a congruence class, under the
2207// assumption that the current leader is going away. This should end up being
2208// the next most dominating member.
2209Value *NewGVN::getNextValueLeader(CongruenceClass *CC) const {
2210 // We don't need to sort members if there is only 1, and we don't care about
2211 // sorting the TOP class because everything either gets out of it or is
2212 // unreachable.
2213
2214 if (CC->size() == 1 || CC == TOPClass) {
2215 return *(CC->begin());
2216 } else if (CC->getNextLeader().first) {
2217 ++NumGVNAvoidedSortedLeaderChanges;
2218 return CC->getNextLeader().first;
2219 } else {
2220 ++NumGVNSortedLeaderChanges;
2221 // NOTE: If this ends up to slow, we can maintain a dual structure for
2222 // member testing/insertion, or keep things mostly sorted, and sort only
2223 // here, or use SparseBitVector or ....
2224 return getMinDFSOfRange<Value>(*CC);
2225 }
2226}
2227
2228// Move a MemoryAccess, currently in OldClass, to NewClass, including updates to
2229// the memory members, etc for the move.
2230//
2231// The invariants of this function are:
2232//
2233// - I must be moving to NewClass from OldClass
2234// - The StoreCount of OldClass and NewClass is expected to have been updated
2235// for I already if it is a store.
2236// - The OldClass memory leader has not been updated yet if I was the leader.
2237void NewGVN::moveMemoryToNewCongruenceClass(Instruction *I,
2238 MemoryAccess *InstMA,
2239 CongruenceClass *OldClass,
2240 CongruenceClass *NewClass) {
2241 // If the leader is I, and we had a representative MemoryAccess, it should
2242 // be the MemoryAccess of OldClass.
2243 assert((!InstMA || !OldClass->getMemoryLeader() ||
2244 OldClass->getLeader() != I ||
2245 MemoryAccessToClass.lookup(OldClass->getMemoryLeader()) ==
2246 MemoryAccessToClass.lookup(InstMA)) &&
2247 "Representative MemoryAccess mismatch");
2248 // First, see what happens to the new class
2249 if (!NewClass->getMemoryLeader()) {
2250 // Should be a new class, or a store becoming a leader of a new class.
2251 assert(NewClass->size() == 1 ||
2252 (isa<StoreInst>(I) && NewClass->getStoreCount() == 1));
2253 NewClass->setMemoryLeader(InstMA);
2254 // Mark it touched if we didn't just create a singleton
2255 LLVM_DEBUG(dbgs() << "Memory class leader change for class "
2256 << NewClass->getID()
2257 << " due to new memory instruction becoming leader\n");
2258 markMemoryLeaderChangeTouched(NewClass);
2259 }
2260 setMemoryClass(InstMA, NewClass);
2261 // Now, fixup the old class if necessary
2262 if (OldClass->getMemoryLeader() == InstMA) {
2263 if (!OldClass->definesNoMemory()) {
2264 OldClass->setMemoryLeader(getNextMemoryLeader(OldClass));
2265 LLVM_DEBUG(dbgs() << "Memory class leader change for class "
2266 << OldClass->getID() << " to "
2267 << *OldClass->getMemoryLeader()
2268 << " due to removal of old leader " << *InstMA << "\n");
2269 markMemoryLeaderChangeTouched(OldClass);
2270 } else
2271 OldClass->setMemoryLeader(nullptr);
2272 }
2273}
2274
2275// Move a value, currently in OldClass, to be part of NewClass
2276// Update OldClass and NewClass for the move (including changing leaders, etc).
2277void NewGVN::moveValueToNewCongruenceClass(Instruction *I, const Expression *E,
2278 CongruenceClass *OldClass,
2279 CongruenceClass *NewClass) {
2280 if (I == OldClass->getNextLeader().first)
2281 OldClass->resetNextLeader();
2282
2283 OldClass->erase(I);
2284 NewClass->insert(I);
2285
2286 // Ensure that the leader has the lowest RPO. If the leader changed notify all
2287 // members of the class.
2288 if (NewClass->getLeader() != I &&
2289 NewClass->addPossibleLeader({I, InstrToDFSNum(I)})) {
2290 markValueLeaderChangeTouched(NewClass);
2291 }
2292
2293 // Handle our special casing of stores.
2294 if (auto *SI = dyn_cast<StoreInst>(I)) {
2295 OldClass->decStoreCount();
2296 // Okay, so when do we want to make a store a leader of a class?
2297 // If we have a store defined by an earlier load, we want the earlier load
2298 // to lead the class.
2299 // If we have a store defined by something else, we want the store to lead
2300 // the class so everything else gets the "something else" as a value.
2301 // If we have a store as the single member of the class, we want the store
2302 // as the leader
2303 if (NewClass->getStoreCount() == 0 && !NewClass->getStoredValue()) {
2304 // If it's a store expression we are using, it means we are not equivalent
2305 // to something earlier.
2306 if (auto *SE = dyn_cast<StoreExpression>(E)) {
2307 NewClass->setStoredValue(SE->getStoredValue());
2308 markValueLeaderChangeTouched(NewClass);
2309 // Shift the new class leader to be the store
2310 LLVM_DEBUG(dbgs() << "Changing leader of congruence class "
2311 << NewClass->getID() << " from "
2312 << *NewClass->getLeader() << " to " << *SI
2313 << " because store joined class\n");
2314 // If we changed the leader, we have to mark it changed because we don't
2315 // know what it will do to symbolic evaluation.
2316 NewClass->setLeader({SI, InstrToDFSNum(SI)});
2317 }
2318 // We rely on the code below handling the MemoryAccess change.
2319 }
2320 NewClass->incStoreCount();
2321 }
2322 // True if there is no memory instructions left in a class that had memory
2323 // instructions before.
2324
2325 // If it's not a memory use, set the MemoryAccess equivalence
2326 auto *InstMA = dyn_cast_or_null<MemoryDef>(getMemoryAccess(I));
2327 if (InstMA)
2328 moveMemoryToNewCongruenceClass(I, InstMA, OldClass, NewClass);
2329 ValueToClass[I] = NewClass;
2330 // See if we destroyed the class or need to swap leaders.
2331 if (OldClass->empty() && OldClass != TOPClass) {
2332 if (OldClass->getDefiningExpr()) {
2333 LLVM_DEBUG(dbgs() << "Erasing expression " << *OldClass->getDefiningExpr()
2334 << " from table\n");
2335 // We erase it as an exact expression to make sure we don't just erase an
2336 // equivalent one.
2337 auto Iter = ExpressionToClass.find_as(
2338 ExactEqualsExpression(*OldClass->getDefiningExpr()));
2339 if (Iter != ExpressionToClass.end())
2340 ExpressionToClass.erase(Iter);
2341#ifdef EXPENSIVE_CHECKS
2342 assert(
2343 (*OldClass->getDefiningExpr() != *E || ExpressionToClass.lookup(E)) &&
2344 "We erased the expression we just inserted, which should not happen");
2345#endif
2346 }
2347 } else if (OldClass->getLeader() == I) {
2348 // When the leader changes, the value numbering of
2349 // everything may change due to symbolization changes, so we need to
2350 // reprocess.
2351 LLVM_DEBUG(dbgs() << "Value class leader change for class "
2352 << OldClass->getID() << "\n");
2353 ++NumGVNLeaderChanges;
2354 // Destroy the stored value if there are no more stores to represent it.
2355 // Note that this is basically clean up for the expression removal that
2356 // happens below. If we remove stores from a class, we may leave it as a
2357 // class of equivalent memory phis.
2358 if (OldClass->getStoreCount() == 0) {
2359 if (OldClass->getStoredValue())
2360 OldClass->setStoredValue(nullptr);
2361 }
2362 OldClass->setLeader({getNextValueLeader(OldClass),
2363 InstrToDFSNum(getNextValueLeader(OldClass))});
2364 OldClass->resetNextLeader();
2365 markValueLeaderChangeTouched(OldClass);
2366 }
2367}
2368
2369// For a given expression, mark the phi of ops instructions that could have
2370// changed as a result.
2371void NewGVN::markPhiOfOpsChanged(const Expression *E) {
2372 touchAndErase(ExpressionToPhiOfOps, E);
2373}
2374
2375// Perform congruence finding on a given value numbering expression.
2376void NewGVN::performCongruenceFinding(Instruction *I, const Expression *E) {
2377 // This is guaranteed to return something, since it will at least find
2378 // TOP.
2379
2380 CongruenceClass *IClass = ValueToClass.lookup(I);
2381 assert(IClass && "Should have found a IClass");
2382 // Dead classes should have been eliminated from the mapping.
2383 assert(!IClass->isDead() && "Found a dead class");
2384
2385 CongruenceClass *EClass = nullptr;
2386 if (const auto *VE = dyn_cast<VariableExpression>(E)) {
2387 EClass = ValueToClass.lookup(VE->getVariableValue());
2388 } else if (isa<DeadExpression>(E)) {
2389 EClass = TOPClass;
2390 }
2391 if (!EClass) {
2392 auto lookupResult = ExpressionToClass.try_emplace(E);
2393
2394 // If it's not in the value table, create a new congruence class.
2395 if (lookupResult.second) {
2396 CongruenceClass *NewClass = createCongruenceClass(nullptr, E);
2397 auto place = lookupResult.first;
2398 place->second = NewClass;
2399
2400 // Constants and variables should always be made the leader.
2401 if (const auto *CE = dyn_cast<ConstantExpression>(E)) {
2402 NewClass->setLeader({CE->getConstantValue(), 0});
2403 } else if (const auto *SE = dyn_cast<StoreExpression>(E)) {
2404 StoreInst *SI = SE->getStoreInst();
2405 NewClass->setLeader({SI, InstrToDFSNum(SI)});
2406 NewClass->setStoredValue(SE->getStoredValue());
2407 // The RepMemoryAccess field will be filled in properly by the
2408 // moveValueToNewCongruenceClass call.
2409 } else {
2410 NewClass->setLeader({I, InstrToDFSNum(I)});
2411 }
2412 assert(!isa<VariableExpression>(E) &&
2413 "VariableExpression should have been handled already");
2414
2415 EClass = NewClass;
2416 LLVM_DEBUG(dbgs() << "Created new congruence class for " << *I
2417 << " using expression " << *E << " at "
2418 << NewClass->getID() << " and leader "
2419 << *(NewClass->getLeader()));
2420 if (NewClass->getStoredValue())
2421 LLVM_DEBUG(dbgs() << " and stored value "
2422 << *(NewClass->getStoredValue()));
2423 LLVM_DEBUG(dbgs() << "\n");
2424 } else {
2425 EClass = lookupResult.first->second;
2426 if (isa<ConstantExpression>(E))
2427 assert((isa<Constant>(EClass->getLeader()) ||
2428 (EClass->getStoredValue() &&
2429 isa<Constant>(EClass->getStoredValue()))) &&
2430 "Any class with a constant expression should have a "
2431 "constant leader");
2432
2433 assert(EClass && "Somehow don't have an eclass");
2434
2435 assert(!EClass->isDead() && "We accidentally looked up a dead class");
2436 }
2437 }
2438 bool ClassChanged = IClass != EClass;
2439 bool LeaderChanged = LeaderChanges.erase(I);
2440 if (ClassChanged || LeaderChanged) {
2441 LLVM_DEBUG(dbgs() << "New class " << EClass->getID() << " for expression "
2442 << *E << "\n");
2443 if (ClassChanged) {
2444 moveValueToNewCongruenceClass(I, E, IClass, EClass);
2445 markPhiOfOpsChanged(E);
2446 }
2447
2448 markUsersTouched(I);
2449 if (MemoryAccess *MA = getMemoryAccess(I))
2450 markMemoryUsersTouched(MA);
2451 if (auto *CI = dyn_cast<CmpInst>(I))
2452 markPredicateUsersTouched(CI);
2453 }
2454 // If we changed the class of the store, we want to ensure nothing finds the
2455 // old store expression. In particular, loads do not compare against stored
2456 // value, so they will find old store expressions (and associated class
2457 // mappings) if we leave them in the table.
2458 if (ClassChanged && isa<StoreInst>(I)) {
2459 auto *OldE = ValueToExpression.lookup(I);
2460 // It could just be that the old class died. We don't want to erase it if we
2461 // just moved classes.
2462 if (OldE && isa<StoreExpression>(OldE) && *E != *OldE) {
2463 // Erase this as an exact expression to ensure we don't erase expressions
2464 // equivalent to it.
2465 auto Iter = ExpressionToClass.find_as(ExactEqualsExpression(*OldE));
2466 if (Iter != ExpressionToClass.end())
2467 ExpressionToClass.erase(Iter);
2468 }
2469 }
2470 ValueToExpression[I] = E;
2471}
2472
2473// Process the fact that Edge (from, to) is reachable, including marking
2474// any newly reachable blocks and instructions for processing.
2475void NewGVN::updateReachableEdge(BasicBlock *From, BasicBlock *To) {
2476 // Check if the Edge was reachable before.
2477 if (ReachableEdges.insert({From, To}).second) {
2478 // If this block wasn't reachable before, all instructions are touched.
2479 if (ReachableBlocks.insert(To).second) {
2480 LLVM_DEBUG(dbgs() << "Block " << getBlockName(To)
2481 << " marked reachable\n");
2482 const auto &InstRange = BlockInstRange.lookup(To);
2483 TouchedInstructions.set(InstRange.first, InstRange.second);
2484 } else {
2485 LLVM_DEBUG(dbgs() << "Block " << getBlockName(To)
2486 << " was reachable, but new edge {"
2487 << getBlockName(From) << "," << getBlockName(To)
2488 << "} to it found\n");
2489
2490 // We've made an edge reachable to an existing block, which may
2491 // impact predicates. Otherwise, only mark the phi nodes as touched, as
2492 // they are the only thing that depend on new edges. Anything using their
2493 // values will get propagated to if necessary.
2494 if (MemoryAccess *MemPhi = getMemoryAccess(To))
2495 TouchedInstructions.set(InstrToDFSNum(MemPhi));
2496
2497 // FIXME: We should just add a union op on a Bitvector and
2498 // SparseBitVector. We can do it word by word faster than we are doing it
2499 // here.
2500 for (auto InstNum : RevisitOnReachabilityChange[To])
2501 TouchedInstructions.set(InstNum);
2502 }
2503 }
2504}
2505
2506// Given a predicate condition (from a switch, cmp, or whatever) and a block,
2507// see if we know some constant value for it already.
2508Value *NewGVN::findConditionEquivalence(Value *Cond) const {
2509 auto Result = lookupOperandLeader(Cond);
2510 return isa<Constant>(Result) ? Result : nullptr;
2511}
2512
2513// Process the outgoing edges of a block for reachability.
2514void NewGVN::processOutgoingEdges(Instruction *TI, BasicBlock *B) {
2515 // Evaluate reachability of terminator instruction.
2516 Value *Cond;
2517 BasicBlock *TrueSucc, *FalseSucc;
2518 if (match(TI, m_Br(m_Value(Cond), TrueSucc, FalseSucc))) {
2519 Value *CondEvaluated = findConditionEquivalence(Cond);
2520 if (!CondEvaluated) {
2521 if (auto *I = dyn_cast<Instruction>(Cond)) {
2523 auto Res = performSymbolicEvaluation(I, Visited);
2524 if (const auto *CE = dyn_cast_or_null<ConstantExpression>(Res.Expr)) {
2525 CondEvaluated = CE->getConstantValue();
2526 addAdditionalUsers(Res, I);
2527 } else {
2528 // Did not use simplification result, no need to add the extra
2529 // dependency.
2530 Res.ExtraDep = nullptr;
2531 }
2532 } else if (isa<ConstantInt>(Cond)) {
2533 CondEvaluated = Cond;
2534 }
2535 }
2536 ConstantInt *CI;
2537 if (CondEvaluated && (CI = dyn_cast<ConstantInt>(CondEvaluated))) {
2538 if (CI->isOne()) {
2539 LLVM_DEBUG(dbgs() << "Condition for Terminator " << *TI
2540 << " evaluated to true\n");
2541 updateReachableEdge(B, TrueSucc);
2542 } else if (CI->isZero()) {
2543 LLVM_DEBUG(dbgs() << "Condition for Terminator " << *TI
2544 << " evaluated to false\n");
2545 updateReachableEdge(B, FalseSucc);
2546 }
2547 } else {
2548 updateReachableEdge(B, TrueSucc);
2549 updateReachableEdge(B, FalseSucc);
2550 }
2551 } else if (auto *SI = dyn_cast<SwitchInst>(TI)) {
2552 // For switches, propagate the case values into the case
2553 // destinations.
2554
2555 Value *SwitchCond = SI->getCondition();
2556 Value *CondEvaluated = findConditionEquivalence(SwitchCond);
2557 // See if we were able to turn this switch statement into a constant.
2558 if (CondEvaluated && isa<ConstantInt>(CondEvaluated)) {
2559 auto *CondVal = cast<ConstantInt>(CondEvaluated);
2560 // We should be able to get case value for this.
2561 auto Case = *SI->findCaseValue(CondVal);
2562 if (Case.getCaseSuccessor() == SI->getDefaultDest()) {
2563 // We proved the value is outside of the range of the case.
2564 // We can't do anything other than mark the default dest as reachable,
2565 // and go home.
2566 updateReachableEdge(B, SI->getDefaultDest());
2567 return;
2568 }
2569 // Now get where it goes and mark it reachable.
2570 BasicBlock *TargetBlock = Case.getCaseSuccessor();
2571 updateReachableEdge(B, TargetBlock);
2572 } else {
2573 for (BasicBlock *TargetBlock : successors(SI->getParent()))
2574 updateReachableEdge(B, TargetBlock);
2575 }
2576 } else {
2577 // Otherwise this is either unconditional, or a type we have no
2578 // idea about. Just mark successors as reachable.
2579 for (BasicBlock *TargetBlock : successors(TI->getParent()))
2580 updateReachableEdge(B, TargetBlock);
2581
2582 // This also may be a memory defining terminator, in which case, set it
2583 // equivalent only to itself.
2584 //
2585 auto *MA = getMemoryAccess(TI);
2586 if (MA && !isa<MemoryUse>(MA)) {
2587 auto *CC = ensureLeaderOfMemoryClass(MA);
2588 if (setMemoryClass(MA, CC))
2589 markMemoryUsersTouched(MA);
2590 }
2591 }
2592}
2593
2594// Remove the PHI of Ops PHI for I
2595void NewGVN::removePhiOfOps(Instruction *I, PHINode *PHITemp) {
2596 InstrDFS.erase(PHITemp);
2597 // It's still a temp instruction. We keep it in the array so it gets erased.
2598 // However, it's no longer used by I, or in the block
2599 TempToBlock.erase(PHITemp);
2600 RealToTemp.erase(I);
2601 // We don't remove the users from the phi node uses. This wastes a little
2602 // time, but such is life. We could use two sets to track which were there
2603 // are the start of NewGVN, and which were added, but right nowt he cost of
2604 // tracking is more than the cost of checking for more phi of ops.
2605}
2606
2607// Add PHI Op in BB as a PHI of operations version of ExistingValue.
2608void NewGVN::addPhiOfOps(PHINode *Op, BasicBlock *BB,
2609 Instruction *ExistingValue) {
2610 InstrDFS[Op] = InstrToDFSNum(ExistingValue);
2611 AllTempInstructions.insert(Op);
2612 TempToBlock[Op] = BB;
2613 RealToTemp[ExistingValue] = Op;
2614 // Add all users to phi node use, as they are now uses of the phi of ops phis
2615 // and may themselves be phi of ops.
2616 for (auto *U : ExistingValue->users())
2617 if (auto *UI = dyn_cast<Instruction>(U))
2618 PHINodeUses.insert(UI);
2619}
2620
2621static bool okayForPHIOfOps(const Instruction *I) {
2622 if (!EnablePhiOfOps)
2623 return false;
2624 return isa<BinaryOperator>(I) || isa<SelectInst>(I) || isa<CmpInst>(I) ||
2625 isa<LoadInst>(I);
2626}
2627
2628// Return true if this operand will be safe to use for phi of ops.
2629//
2630// The reason some operands are unsafe is that we are not trying to recursively
2631// translate everything back through phi nodes. We actually expect some lookups
2632// of expressions to fail. In particular, a lookup where the expression cannot
2633// exist in the predecessor. This is true even if the expression, as shown, can
2634// be determined to be constant.
2635bool NewGVN::OpIsSafeForPHIOfOps(Value *V, const BasicBlock *PHIBlock,
2637 SmallVector<Value *, 4> Worklist;
2638 Worklist.push_back(V);
2639 while (!Worklist.empty()) {
2640 auto *I = Worklist.pop_back_val();
2641 if (!isa<Instruction>(I))
2642 continue;
2643
2644 auto OISIt = OpSafeForPHIOfOps.find({I, CacheIdx});
2645 if (OISIt != OpSafeForPHIOfOps.end())
2646 return OISIt->second;
2647
2648 // Keep walking until we either dominate the phi block, or hit a phi, or run
2649 // out of things to check.
2650 if (DT->properlyDominates(getBlockForValue(I), PHIBlock)) {
2651 OpSafeForPHIOfOps.insert({{I, CacheIdx}, true});
2652 continue;
2653 }
2654 // PHI in the same block.
2655 if (isa<PHINode>(I) && getBlockForValue(I) == PHIBlock) {
2656 OpSafeForPHIOfOps.insert({{I, CacheIdx}, false});
2657 return false;
2658 }
2659
2660 auto *OrigI = cast<Instruction>(I);
2661 // When we hit an instruction that reads memory (load, call, etc), we must
2662 // consider any store that may happen in the loop. For now, we assume the
2663 // worst: there is a store in the loop that alias with this read.
2664 // The case where the load is outside the loop is already covered by the
2665 // dominator check above.
2666 // TODO: relax this condition
2667 if (OrigI->mayReadFromMemory())
2668 return false;
2669
2670 // Check the operands of the current instruction.
2671 for (auto *Op : OrigI->operand_values()) {
2672 if (!isa<Instruction>(Op))
2673 continue;
2674 // Stop now if we find an unsafe operand.
2675 auto OISIt = OpSafeForPHIOfOps.find({OrigI, CacheIdx});
2676 if (OISIt != OpSafeForPHIOfOps.end()) {
2677 if (!OISIt->second) {
2678 OpSafeForPHIOfOps.insert({{I, CacheIdx}, false});
2679 return false;
2680 }
2681 continue;
2682 }
2683 if (!Visited.insert(Op).second)
2684 continue;
2685 Worklist.push_back(cast<Instruction>(Op));
2686 }
2687 }
2688 OpSafeForPHIOfOps.insert({{V, CacheIdx}, true});
2689 return true;
2690}
2691
2692// Try to find a leader for instruction TransInst, which is a phi translated
2693// version of something in our original program. Visited is used to ensure we
2694// don't infinite loop during translations of cycles. OrigInst is the
2695// instruction in the original program, and PredBB is the predecessor we
2696// translated it through.
2697Value *NewGVN::findLeaderForInst(Instruction *TransInst,
2698 SmallPtrSetImpl<Value *> &Visited,
2699 MemoryAccess *MemAccess, Instruction *OrigInst,
2700 BasicBlock *PredBB) {
2701 unsigned IDFSNum = InstrToDFSNum(OrigInst);
2702 // Make sure it's marked as a temporary instruction.
2703 AllTempInstructions.insert(TransInst);
2704 // and make sure anything that tries to add it's DFS number is
2705 // redirected to the instruction we are making a phi of ops
2706 // for.
2707 TempToBlock.insert({TransInst, PredBB});
2708 InstrDFS.insert({TransInst, IDFSNum});
2709
2710 auto Res = performSymbolicEvaluation(TransInst, Visited);
2711 const Expression *E = Res.Expr;
2712 addAdditionalUsers(Res, OrigInst);
2713 InstrDFS.erase(TransInst);
2714 AllTempInstructions.erase(TransInst);
2715 TempToBlock.erase(TransInst);
2716 if (MemAccess)
2717 TempToMemory.erase(TransInst);
2718 if (!E)
2719 return nullptr;
2720 auto *FoundVal = findPHIOfOpsLeader(E, OrigInst, PredBB);
2721 if (!FoundVal) {
2722 ExpressionToPhiOfOps[E].insert(OrigInst);
2723 LLVM_DEBUG(dbgs() << "Cannot find phi of ops operand for " << *TransInst
2724 << " in block " << getBlockName(PredBB) << "\n");
2725 return nullptr;
2726 }
2727 if (auto *SI = dyn_cast<StoreInst>(FoundVal))
2728 FoundVal = SI->getValueOperand();
2729 return FoundVal;
2730}
2731
2732// When we see an instruction that is an op of phis, generate the equivalent phi
2733// of ops form.
2734const Expression *
2735NewGVN::makePossiblePHIOfOps(Instruction *I,
2736 SmallPtrSetImpl<Value *> &Visited) {
2737 if (!okayForPHIOfOps(I))
2738 return nullptr;
2739
2740 if (!Visited.insert(I).second)
2741 return nullptr;
2742 // For now, we require the instruction be cycle free because we don't
2743 // *always* create a phi of ops for instructions that could be done as phi
2744 // of ops, we only do it if we think it is useful. If we did do it all the
2745 // time, we could remove the cycle free check.
2746 if (!isCycleFree(I))
2747 return nullptr;
2748
2749 // TODO: We don't do phi translation on memory accesses because it's
2750 // complicated. For a load, we'd need to be able to simulate a new memoryuse,
2751 // which we don't have a good way of doing ATM.
2752 auto *MemAccess = getMemoryAccess(I);
2753 // If the memory operation is defined by a memory operation this block that
2754 // isn't a MemoryPhi, transforming the pointer backwards through a scalar phi
2755 // can't help, as it would still be killed by that memory operation.
2756 if (MemAccess && !isa<MemoryPhi>(MemAccess->getDefiningAccess()) &&
2757 MemAccess->getDefiningAccess()->getBlock() == I->getParent())
2758 return nullptr;
2759
2760 // Convert op of phis to phi of ops
2762 SmallVector<Value *, 4> Ops(I->operand_values());
2763 BasicBlock *SamePHIBlock = nullptr;
2764 PHINode *OpPHI = nullptr;
2765 if (!DebugCounter::shouldExecute(PHIOfOpsCounter))
2766 return nullptr;
2767 for (auto *Op : Ops) {
2768 if (!isa<PHINode>(Op)) {
2769 auto *ValuePHI = RealToTemp.lookup(Op);
2770 if (!ValuePHI)
2771 continue;
2772 LLVM_DEBUG(dbgs() << "Found possible dependent phi of ops\n");
2773 Op = ValuePHI;
2774 }
2775 OpPHI = cast<PHINode>(Op);
2776 if (!SamePHIBlock) {
2777 SamePHIBlock = getBlockForValue(OpPHI);
2778 } else if (SamePHIBlock != getBlockForValue(OpPHI)) {
2779 LLVM_DEBUG(
2780 dbgs()
2781 << "PHIs for operands are not all in the same block, aborting\n");
2782 return nullptr;
2783 }
2784 // No point in doing this for one-operand phis.
2785 // Since all PHIs for operands must be in the same block, then they must
2786 // have the same number of operands so we can just abort.
2787 if (OpPHI->getNumOperands() == 1)
2788 return nullptr;
2789 }
2790
2791 if (!OpPHI)
2792 return nullptr;
2793
2796 auto *PHIBlock = getBlockForValue(OpPHI);
2797 RevisitOnReachabilityChange[PHIBlock].reset(InstrToDFSNum(I));
2798 for (unsigned PredNum = 0; PredNum < OpPHI->getNumOperands(); ++PredNum) {
2799 auto *PredBB = OpPHI->getIncomingBlock(PredNum);
2800 Value *FoundVal = nullptr;
2801 SmallPtrSet<Value *, 4> CurrentDeps;
2802 // We could just skip unreachable edges entirely but it's tricky to do
2803 // with rewriting existing phi nodes.
2804 if (ReachableEdges.count({PredBB, PHIBlock})) {
2805 // Clone the instruction, create an expression from it that is
2806 // translated back into the predecessor, and see if we have a leader.
2807 Instruction *ValueOp = I->clone();
2808 // Emit the temporal instruction in the predecessor basic block where the
2809 // corresponding value is defined.
2810 ValueOp->insertBefore(PredBB->getTerminator()->getIterator());
2811 if (MemAccess)
2812 TempToMemory.insert({ValueOp, MemAccess});
2813 bool SafeForPHIOfOps = true;
2814 VisitedOps.clear();
2815 for (auto &Op : ValueOp->operands()) {
2816 auto *OrigOp = &*Op;
2817 // When these operand changes, it could change whether there is a
2818 // leader for us or not, so we have to add additional users.
2819 if (isa<PHINode>(Op)) {
2820 Op = Op->DoPHITranslation(PHIBlock, PredBB);
2821 if (Op != OrigOp && Op != I)
2822 CurrentDeps.insert(Op);
2823 } else if (auto *ValuePHI = RealToTemp.lookup(Op)) {
2824 if (getBlockForValue(ValuePHI) == PHIBlock)
2825 Op = ValuePHI->getIncomingValueForBlock(PredBB);
2826 }
2827 // If we phi-translated the op, it must be safe.
2828 SafeForPHIOfOps =
2829 SafeForPHIOfOps &&
2830 (Op != OrigOp || OpIsSafeForPHIOfOps(Op, PHIBlock, VisitedOps));
2831 }
2832 // FIXME: For those things that are not safe we could generate
2833 // expressions all the way down, and see if this comes out to a
2834 // constant. For anything where that is true, and unsafe, we should
2835 // have made a phi-of-ops (or value numbered it equivalent to something)
2836 // for the pieces already.
2837 FoundVal = !SafeForPHIOfOps ? nullptr
2838 : findLeaderForInst(ValueOp, Visited,
2839 MemAccess, I, PredBB);
2840 ValueOp->eraseFromParent();
2841 if (!FoundVal) {
2842 // We failed to find a leader for the current ValueOp, but this might
2843 // change in case of the translated operands change.
2844 if (SafeForPHIOfOps)
2845 for (auto *Dep : CurrentDeps)
2846 addAdditionalUsers(Dep, I);
2847
2848 return nullptr;
2849 }
2850 Deps.insert_range(CurrentDeps);
2851 } else {
2852 LLVM_DEBUG(dbgs() << "Skipping phi of ops operand for incoming block "
2853 << getBlockName(PredBB)
2854 << " because the block is unreachable\n");
2855 FoundVal = PoisonValue::get(I->getType());
2856 RevisitOnReachabilityChange[PHIBlock].set(InstrToDFSNum(I));
2857 }
2858
2859 PHIOps.push_back({FoundVal, PredBB});
2860 LLVM_DEBUG(dbgs() << "Found phi of ops operand " << *FoundVal << " in "
2861 << getBlockName(PredBB) << "\n");
2862 }
2863 for (auto *Dep : Deps)
2864 addAdditionalUsers(Dep, I);
2865 sortPHIOps(PHIOps);
2866 auto *E = performSymbolicPHIEvaluation(PHIOps, I, PHIBlock);
2867 if (isa<ConstantExpression>(E) || isa<VariableExpression>(E)) {
2868 LLVM_DEBUG(
2869 dbgs()
2870 << "Not creating real PHI of ops because it simplified to existing "
2871 "value or constant\n");
2872 // We have leaders for all operands, but do not create a real PHI node with
2873 // those leaders as operands, so the link between the operands and the
2874 // PHI-of-ops is not materialized in the IR. If any of those leaders
2875 // changes, the PHI-of-op may change also, so we need to add the operands as
2876 // additional users.
2877 for (auto &O : PHIOps)
2878 addAdditionalUsers(O.first, I);
2879
2880 return E;
2881 }
2882 auto *ValuePHI = RealToTemp.lookup(I);
2883 bool NewPHI = false;
2884 if (!ValuePHI) {
2885 ValuePHI =
2886 PHINode::Create(I->getType(), OpPHI->getNumOperands(), "phiofops");
2887 addPhiOfOps(ValuePHI, PHIBlock, I);
2888 NewPHI = true;
2889 NumGVNPHIOfOpsCreated++;
2890 }
2891 if (NewPHI) {
2892 for (auto PHIOp : PHIOps)
2893 ValuePHI->addIncoming(PHIOp.first, PHIOp.second);
2894 } else {
2895 TempToBlock[ValuePHI] = PHIBlock;
2896 unsigned int i = 0;
2897 for (auto PHIOp : PHIOps) {
2898 ValuePHI->setIncomingValue(i, PHIOp.first);
2899 ValuePHI->setIncomingBlock(i, PHIOp.second);
2900 ++i;
2901 }
2902 }
2903 RevisitOnReachabilityChange[PHIBlock].set(InstrToDFSNum(I));
2904 LLVM_DEBUG(dbgs() << "Created phi of ops " << *ValuePHI << " for " << *I
2905 << "\n");
2906
2907 return E;
2908}
2909
2910// The algorithm initially places the values of the routine in the TOP
2911// congruence class. The leader of TOP is the undetermined value `poison`.
2912// When the algorithm has finished, values still in TOP are unreachable.
2913void NewGVN::initializeCongruenceClasses(Function &F) {
2914 NextCongruenceNum = 0;
2915
2916 // Note that even though we use the live on entry def as a representative
2917 // MemoryAccess, it is *not* the same as the actual live on entry def. We
2918 // have no real equivalent to poison for MemoryAccesses, and so we really
2919 // should be checking whether the MemoryAccess is top if we want to know if it
2920 // is equivalent to everything. Otherwise, what this really signifies is that
2921 // the access "it reaches all the way back to the beginning of the function"
2922
2923 // Initialize all other instructions to be in TOP class.
2924 TOPClass = createCongruenceClass(nullptr, nullptr);
2925 TOPClass->setMemoryLeader(MSSA->getLiveOnEntryDef());
2926 // The live on entry def gets put into it's own class
2927 MemoryAccessToClass[MSSA->getLiveOnEntryDef()] =
2928 createMemoryClass(MSSA->getLiveOnEntryDef());
2929
2930 for (auto *DTN : nodes(DT)) {
2931 BasicBlock *BB = DTN->getBlock();
2932 // All MemoryAccesses are equivalent to live on entry to start. They must
2933 // be initialized to something so that initial changes are noticed. For
2934 // the maximal answer, we initialize them all to be the same as
2935 // liveOnEntry.
2936 auto *MemoryBlockDefs = MSSA->getBlockDefs(BB);
2937 if (MemoryBlockDefs)
2938 for (const auto &Def : *MemoryBlockDefs) {
2939 MemoryAccessToClass[&Def] = TOPClass;
2940 auto *MD = dyn_cast<MemoryDef>(&Def);
2941 // Insert the memory phis into the member list.
2942 if (!MD) {
2943 const MemoryPhi *MP = cast<MemoryPhi>(&Def);
2944 TOPClass->memory_insert(MP);
2945 MemoryPhiState.insert({MP, MPS_TOP});
2946 }
2947
2948 if (MD && isa<StoreInst>(MD->getMemoryInst()))
2949 TOPClass->incStoreCount();
2950 }
2951
2952 // FIXME: This is trying to discover which instructions are uses of phi
2953 // nodes. We should move this into one of the myriad of places that walk
2954 // all the operands already.
2955 for (auto &I : *BB) {
2956 if (isa<PHINode>(&I))
2957 for (auto *U : I.users())
2958 if (auto *UInst = dyn_cast<Instruction>(U))
2959 if (InstrToDFSNum(UInst) != 0 && okayForPHIOfOps(UInst))
2960 PHINodeUses.insert(UInst);
2961 // Don't insert void terminators into the class. We don't value number
2962 // them, and they just end up sitting in TOP.
2963 if (I.isTerminator() && I.getType()->isVoidTy())
2964 continue;
2965 TOPClass->insert(&I);
2966 ValueToClass[&I] = TOPClass;
2967 }
2968 }
2969
2970 // Initialize arguments to be in their own unique congruence classes
2971 for (auto &FA : F.args())
2972 createSingletonCongruenceClass(&FA);
2973}
2974
2975void NewGVN::cleanupTables() {
2976 for (CongruenceClass *&CC : CongruenceClasses) {
2977 LLVM_DEBUG(dbgs() << "Congruence class " << CC->getID() << " has "
2978 << CC->size() << " members\n");
2979 // Make sure we delete the congruence class (probably worth switching to
2980 // a unique_ptr at some point.
2981 delete CC;
2982 CC = nullptr;
2983 }
2984
2985 // Destroy the value expressions
2986 SmallVector<Instruction *, 8> TempInst(AllTempInstructions.begin(),
2987 AllTempInstructions.end());
2988 AllTempInstructions.clear();
2989
2990 // We have to drop all references for everything first, so there are no uses
2991 // left as we delete them.
2992 for (auto *I : TempInst) {
2993 I->dropAllReferences();
2994 }
2995
2996 while (!TempInst.empty()) {
2997 auto *I = TempInst.pop_back_val();
2998 I->deleteValue();
2999 }
3000
3001 ValueToClass.clear();
3002 ArgRecycler.clear(ExpressionAllocator);
3003 ExpressionAllocator.Reset();
3004 CongruenceClasses.clear();
3005 ExpressionToClass.clear();
3006 ValueToExpression.clear();
3007 RealToTemp.clear();
3008 AdditionalUsers.clear();
3009 ExpressionToPhiOfOps.clear();
3010 TempToBlock.clear();
3011 TempToMemory.clear();
3012 PHINodeUses.clear();
3013 OpSafeForPHIOfOps.clear();
3014 ReachableBlocks.clear();
3015 ReachableEdges.clear();
3016#ifndef NDEBUG
3017 ProcessedCount.clear();
3018#endif
3019 InstrDFS.clear();
3020 InstructionsToErase.clear();
3021 DFSToInstr.clear();
3022 BlockInstRange.clear();
3023 TouchedInstructions.clear();
3024 MemoryAccessToClass.clear();
3025 PredicateToUsers.clear();
3026 MemoryToUsers.clear();
3027 RevisitOnReachabilityChange.clear();
3028 PredicateSwapChoice.clear();
3029}
3030
3031// Assign local DFS number mapping to instructions, and leave space for Value
3032// PHI's.
3033std::pair<unsigned, unsigned> NewGVN::assignDFSNumbers(BasicBlock *B,
3034 unsigned Start) {
3035 unsigned End = Start;
3036 if (MemoryAccess *MemPhi = getMemoryAccess(B)) {
3037 InstrDFS[MemPhi] = End++;
3038 DFSToInstr.emplace_back(MemPhi);
3039 }
3040
3041 // Then the real block goes next.
3042 for (auto &I : *B) {
3043 // There's no need to call isInstructionTriviallyDead more than once on
3044 // an instruction. Therefore, once we know that an instruction is dead
3045 // we change its DFS number so that it doesn't get value numbered.
3046 if (isInstructionTriviallyDead(&I, TLI)) {
3047 InstrDFS[&I] = 0;
3048 LLVM_DEBUG(dbgs() << "Skipping trivially dead instruction " << I << "\n");
3050 markInstructionForDeletion(&I);
3051 continue;
3052 }
3053 if (isa<PHINode>(&I))
3054 RevisitOnReachabilityChange[B].set(End);
3055 InstrDFS[&I] = End++;
3056 DFSToInstr.emplace_back(&I);
3057 }
3058
3059 // All of the range functions taken half-open ranges (open on the end side).
3060 // So we do not subtract one from count, because at this point it is one
3061 // greater than the last instruction.
3062 return std::make_pair(Start, End);
3063}
3064
3065void NewGVN::updateProcessedCount(const Value *V) {
3066#ifndef NDEBUG
3067 assert(++ProcessedCount[V] < 100 &&
3068 "Seem to have processed the same Value a lot");
3069#endif
3070}
3071
3072// Evaluate MemoryPhi nodes symbolically, just like PHI nodes
3073void NewGVN::valueNumberMemoryPhi(MemoryPhi *MP) {
3074 // If all the arguments are the same, the MemoryPhi has the same value as the
3075 // argument. Filter out unreachable blocks and self phis from our operands.
3076 // TODO: We could do cycle-checking on the memory phis to allow valueizing for
3077 // self-phi checking.
3078 const BasicBlock *PHIBlock = MP->getBlock();
3079 auto Filtered = make_filter_range(MP->operands(), [&](const Use &U) {
3080 return cast<MemoryAccess>(U) != MP &&
3081 !isMemoryAccessTOP(cast<MemoryAccess>(U)) &&
3082 ReachableEdges.count({MP->getIncomingBlock(U), PHIBlock});
3083 });
3084 // If all that is left is nothing, our memoryphi is poison. We keep it as
3085 // InitialClass. Note: The only case this should happen is if we have at
3086 // least one self-argument.
3087 if (Filtered.begin() == Filtered.end()) {
3088 if (setMemoryClass(MP, TOPClass))
3089 markMemoryUsersTouched(MP);
3090 return;
3091 }
3092
3093 // Transform the remaining operands into operand leaders.
3094 // FIXME: mapped_iterator should have a range version.
3095 auto LookupFunc = [&](const Use &U) {
3096 return lookupMemoryLeader(cast<MemoryAccess>(U));
3097 };
3098 auto MappedBegin = map_iterator(Filtered.begin(), LookupFunc);
3099 auto MappedEnd = map_iterator(Filtered.end(), LookupFunc);
3100
3101 // and now check if all the elements are equal.
3102 // Sadly, we can't use std::equals since these are random access iterators.
3103 const auto *AllSameValue = *MappedBegin;
3104 ++MappedBegin;
3105 bool AllEqual = std::all_of(
3106 MappedBegin, MappedEnd,
3107 [&AllSameValue](const MemoryAccess *V) { return V == AllSameValue; });
3108
3109 if (AllEqual)
3110 LLVM_DEBUG(dbgs() << "Memory Phi value numbered to " << *AllSameValue
3111 << "\n");
3112 else
3113 LLVM_DEBUG(dbgs() << "Memory Phi value numbered to itself\n");
3114 // If it's equal to something, it's in that class. Otherwise, it has to be in
3115 // a class where it is the leader (other things may be equivalent to it, but
3116 // it needs to start off in its own class, which means it must have been the
3117 // leader, and it can't have stopped being the leader because it was never
3118 // removed).
3119 CongruenceClass *CC =
3120 AllEqual ? getMemoryClass(AllSameValue) : ensureLeaderOfMemoryClass(MP);
3121 auto OldState = MemoryPhiState.lookup(MP);
3122 assert(OldState != MPS_Invalid && "Invalid memory phi state");
3123 auto NewState = AllEqual ? MPS_Equivalent : MPS_Unique;
3124 MemoryPhiState[MP] = NewState;
3125 if (setMemoryClass(MP, CC) || OldState != NewState)
3126 markMemoryUsersTouched(MP);
3127}
3128
3129// Value number a single instruction, symbolically evaluating, performing
3130// congruence finding, and updating mappings.
3131void NewGVN::valueNumberInstruction(Instruction *I) {
3132 LLVM_DEBUG(dbgs() << "Processing instruction " << *I << "\n");
3133 if (!I->isTerminator()) {
3134 const Expression *Symbolized = nullptr;
3136 if (DebugCounter::shouldExecute(VNCounter)) {
3137 auto Res = performSymbolicEvaluation(I, Visited);
3138 Symbolized = Res.Expr;
3139 addAdditionalUsers(Res, I);
3140
3141 // Make a phi of ops if necessary
3142 if (Symbolized && !isa<ConstantExpression>(Symbolized) &&
3143 !isa<VariableExpression>(Symbolized) && PHINodeUses.count(I)) {
3144 auto *PHIE = makePossiblePHIOfOps(I, Visited);
3145 // If we created a phi of ops, use it.
3146 // If we couldn't create one, make sure we don't leave one lying around
3147 if (PHIE) {
3148 Symbolized = PHIE;
3149 } else if (auto *Op = RealToTemp.lookup(I)) {
3150 removePhiOfOps(I, Op);
3151 }
3152 }
3153 } else {
3154 // Mark the instruction as unused so we don't value number it again.
3155 InstrDFS[I] = 0;
3156 }
3157 // If we couldn't come up with a symbolic expression, use the unknown
3158 // expression
3159 if (Symbolized == nullptr)
3160 Symbolized = createUnknownExpression(I);
3161 performCongruenceFinding(I, Symbolized);
3162 } else {
3163 // Handle terminators that return values. All of them produce values we
3164 // don't currently understand. We don't place non-value producing
3165 // terminators in a class.
3166 if (!I->getType()->isVoidTy()) {
3167 auto *Symbolized = createUnknownExpression(I);
3168 performCongruenceFinding(I, Symbolized);
3169 }
3170 processOutgoingEdges(I, I->getParent());
3171 }
3172}
3173
3174// Check if there is a path, using single or equal argument phi nodes, from
3175// First to Second.
3176bool NewGVN::singleReachablePHIPath(
3178 const MemoryAccess *Second) const {
3179 if (First == Second)
3180 return true;
3181 if (MSSA->isLiveOnEntryDef(First))
3182 return false;
3183
3184 // This is not perfect, but as we're just verifying here, we can live with
3185 // the loss of precision. The real solution would be that of doing strongly
3186 // connected component finding in this routine, and it's probably not worth
3187 // the complexity for the time being. So, we just keep a set of visited
3188 // MemoryAccess and return true when we hit a cycle.
3189 if (!Visited.insert(First).second)
3190 return true;
3191
3192 const auto *EndDef = First;
3193 for (const auto *ChainDef : optimized_def_chain(First)) {
3194 if (ChainDef == Second)
3195 return true;
3196 if (MSSA->isLiveOnEntryDef(ChainDef))
3197 return false;
3198 EndDef = ChainDef;
3199 }
3200 auto *MP = cast<MemoryPhi>(EndDef);
3201 auto ReachableOperandPred = [&](const Use &U) {
3202 return ReachableEdges.count({MP->getIncomingBlock(U), MP->getBlock()});
3203 };
3204 auto FilteredPhiArgs =
3205 make_filter_range(MP->operands(), ReachableOperandPred);
3206 SmallVector<const Value *, 32> OperandList(FilteredPhiArgs);
3207 bool Okay = all_equal(OperandList);
3208 if (Okay)
3209 return singleReachablePHIPath(Visited, cast<MemoryAccess>(OperandList[0]),
3210 Second);
3211 return false;
3212}
3213
3214// Verify the that the memory equivalence table makes sense relative to the
3215// congruence classes. Note that this checking is not perfect, and is currently
3216// subject to very rare false negatives. It is only useful for
3217// testing/debugging.
3218void NewGVN::verifyMemoryCongruency() const {
3219#ifndef NDEBUG
3220 // Verify that the memory table equivalence and memory member set match
3221 for (const auto *CC : CongruenceClasses) {
3222 if (CC == TOPClass || CC->isDead())
3223 continue;
3224 if (CC->getStoreCount() != 0) {
3225 assert((CC->getStoredValue() || !isa<StoreInst>(CC->getLeader())) &&
3226 "Any class with a store as a leader should have a "
3227 "representative stored value");
3228 assert(CC->getMemoryLeader() &&
3229 "Any congruence class with a store should have a "
3230 "representative access");
3231 }
3232
3233 if (CC->getMemoryLeader())
3234 assert(MemoryAccessToClass.lookup(CC->getMemoryLeader()) == CC &&
3235 "Representative MemoryAccess does not appear to be reverse "
3236 "mapped properly");
3237 for (const auto *M : CC->memory())
3238 assert(MemoryAccessToClass.lookup(M) == CC &&
3239 "Memory member does not appear to be reverse mapped properly");
3240 }
3241
3242 // Anything equivalent in the MemoryAccess table should be in the same
3243 // congruence class.
3244
3245 // Filter out the unreachable and trivially dead entries, because they may
3246 // never have been updated if the instructions were not processed.
3247 auto ReachableAccessPred =
3248 [&](const std::pair<const MemoryAccess *, CongruenceClass *> Pair) {
3249 bool Result = ReachableBlocks.count(Pair.first->getBlock());
3250 if (!Result || MSSA->isLiveOnEntryDef(Pair.first) ||
3251 MemoryToDFSNum(Pair.first) == 0)
3252 return false;
3253 if (auto *MemDef = dyn_cast<MemoryDef>(Pair.first))
3254 return !isInstructionTriviallyDead(MemDef->getMemoryInst());
3255
3256 // We could have phi nodes which operands are all trivially dead,
3257 // so we don't process them.
3258 if (auto *MemPHI = dyn_cast<MemoryPhi>(Pair.first)) {
3259 for (const auto &U : MemPHI->incoming_values()) {
3260 if (auto *I = dyn_cast<Instruction>(&*U)) {
3262 return true;
3263 }
3264 }
3265 return false;
3266 }
3267
3268 return true;
3269 };
3270
3271 auto Filtered = make_filter_range(MemoryAccessToClass, ReachableAccessPred);
3272 for (auto KV : Filtered) {
3273 if (auto *FirstMUD = dyn_cast<MemoryUseOrDef>(KV.first)) {
3274 auto *SecondMUD = dyn_cast<MemoryUseOrDef>(KV.second->getMemoryLeader());
3275 if (FirstMUD && SecondMUD) {
3277 assert((singleReachablePHIPath(VisitedMAS, FirstMUD, SecondMUD) ||
3278 ValueToClass.lookup(FirstMUD->getMemoryInst()) ==
3279 ValueToClass.lookup(SecondMUD->getMemoryInst())) &&
3280 "The instructions for these memory operations should have "
3281 "been in the same congruence class or reachable through"
3282 "a single argument phi");
3283 }
3284 } else if (auto *FirstMP = dyn_cast<MemoryPhi>(KV.first)) {
3285 // We can only sanely verify that MemoryDefs in the operand list all have
3286 // the same class.
3287 auto ReachableOperandPred = [&](const Use &U) {
3288 return ReachableEdges.count(
3289 {FirstMP->getIncomingBlock(U), FirstMP->getBlock()}) &&
3290 isa<MemoryDef>(U);
3291 };
3292 // All arguments should in the same class, ignoring unreachable arguments
3293 auto FilteredPhiArgs =
3294 make_filter_range(FirstMP->operands(), ReachableOperandPred);
3296 std::transform(FilteredPhiArgs.begin(), FilteredPhiArgs.end(),
3297 std::back_inserter(PhiOpClasses), [&](const Use &U) {
3298 const MemoryDef *MD = cast<MemoryDef>(U);
3299 return ValueToClass.lookup(MD->getMemoryInst());
3300 });
3301 assert(all_equal(PhiOpClasses) &&
3302 "All MemoryPhi arguments should be in the same class");
3303 }
3304 }
3305#endif
3306}
3307
3308// Verify that the sparse propagation we did actually found the maximal fixpoint
3309// We do this by storing the value to class mapping, touching all instructions,
3310// and redoing the iteration to see if anything changed.
3311void NewGVN::verifyIterationSettled(Function &F) {
3312#ifndef NDEBUG
3313 LLVM_DEBUG(dbgs() << "Beginning iteration verification\n");
3314 if (DebugCounter::isCounterSet(VNCounter))
3315 DebugCounter::setCounterState(VNCounter, StartingVNCounter);
3316
3317 // Note that we have to store the actual classes, as we may change existing
3318 // classes during iteration. This is because our memory iteration propagation
3319 // is not perfect, and so may waste a little work. But it should generate
3320 // exactly the same congruence classes we have now, with different IDs.
3321 std::map<const Value *, CongruenceClass> BeforeIteration;
3322
3323 for (auto &KV : ValueToClass) {
3324 if (auto *I = dyn_cast<Instruction>(KV.first))
3325 // Skip unused/dead instructions.
3326 if (InstrToDFSNum(I) == 0)
3327 continue;
3328 BeforeIteration.insert({KV.first, *KV.second});
3329 }
3330
3331 TouchedInstructions.set();
3332 TouchedInstructions.reset(0);
3333 OpSafeForPHIOfOps.clear();
3334 CacheIdx = 0;
3335 iterateTouchedInstructions();
3337 EqualClasses;
3338 for (const auto &KV : ValueToClass) {
3339 if (auto *I = dyn_cast<Instruction>(KV.first))
3340 // Skip unused/dead instructions.
3341 if (InstrToDFSNum(I) == 0)
3342 continue;
3343 // We could sink these uses, but i think this adds a bit of clarity here as
3344 // to what we are comparing.
3345 auto *BeforeCC = &BeforeIteration.find(KV.first)->second;
3346 auto *AfterCC = KV.second;
3347 // Note that the classes can't change at this point, so we memoize the set
3348 // that are equal.
3349 if (!EqualClasses.count({BeforeCC, AfterCC})) {
3350 assert(BeforeCC->isEquivalentTo(AfterCC) &&
3351 "Value number changed after main loop completed!");
3352 EqualClasses.insert({BeforeCC, AfterCC});
3353 }
3354 }
3355#endif
3356}
3357
3358// Verify that for each store expression in the expression to class mapping,
3359// only the latest appears, and multiple ones do not appear.
3360// Because loads do not use the stored value when doing equality with stores,
3361// if we don't erase the old store expressions from the table, a load can find
3362// a no-longer valid StoreExpression.
3363void NewGVN::verifyStoreExpressions() const {
3364#ifndef NDEBUG
3365 // This is the only use of this, and it's not worth defining a complicated
3366 // densemapinfo hash/equality function for it.
3367 std::set<
3368 std::pair<const Value *,
3369 std::tuple<const Value *, const CongruenceClass *, Value *>>>
3370 StoreExpressionSet;
3371 for (const auto &KV : ExpressionToClass) {
3372 if (auto *SE = dyn_cast<StoreExpression>(KV.first)) {
3373 // Make sure a version that will conflict with loads is not already there
3374 auto Res = StoreExpressionSet.insert(
3375 {SE->getOperand(0), std::make_tuple(SE->getMemoryLeader(), KV.second,
3376 SE->getStoredValue())});
3377 bool Okay = Res.second;
3378 // It's okay to have the same expression already in there if it is
3379 // identical in nature.
3380 // This can happen when the leader of the stored value changes over time.
3381 if (!Okay)
3382 Okay = (std::get<1>(Res.first->second) == KV.second) &&
3383 (lookupOperandLeader(std::get<2>(Res.first->second)) ==
3384 lookupOperandLeader(SE->getStoredValue()));
3385 assert(Okay && "Stored expression conflict exists in expression table");
3386 auto *ValueExpr = ValueToExpression.lookup(SE->getStoreInst());
3387 assert(ValueExpr && ValueExpr->equals(*SE) &&
3388 "StoreExpression in ExpressionToClass is not latest "
3389 "StoreExpression for value");
3390 }
3391 }
3392#endif
3393}
3394
3395// This is the main value numbering loop, it iterates over the initial touched
3396// instruction set, propagating value numbers, marking things touched, etc,
3397// until the set of touched instructions is completely empty.
3398void NewGVN::iterateTouchedInstructions() {
3399 uint64_t Iterations = 0;
3400 // Figure out where touchedinstructions starts
3401 int FirstInstr = TouchedInstructions.find_first();
3402 // Nothing set, nothing to iterate, just return.
3403 if (FirstInstr == -1)
3404 return;
3405 const BasicBlock *LastBlock = getBlockForValue(InstrFromDFSNum(FirstInstr));
3406 while (TouchedInstructions.any()) {
3407 ++Iterations;
3408 // Walk through all the instructions in all the blocks in RPO.
3409 // TODO: As we hit a new block, we should push and pop equalities into a
3410 // table lookupOperandLeader can use, to catch things PredicateInfo
3411 // might miss, like edge-only equivalences.
3412 for (unsigned InstrNum : TouchedInstructions.set_bits()) {
3413
3414 // This instruction was found to be dead. We don't bother looking
3415 // at it again.
3416 if (InstrNum == 0) {
3417 TouchedInstructions.reset(InstrNum);
3418 continue;
3419 }
3420
3421 Value *V = InstrFromDFSNum(InstrNum);
3422 const BasicBlock *CurrBlock = getBlockForValue(V);
3423
3424 // If we hit a new block, do reachability processing.
3425 if (CurrBlock != LastBlock) {
3426 LastBlock = CurrBlock;
3427 bool BlockReachable = ReachableBlocks.count(CurrBlock);
3428 const auto &CurrInstRange = BlockInstRange.lookup(CurrBlock);
3429
3430 // If it's not reachable, erase any touched instructions and move on.
3431 if (!BlockReachable) {
3432 TouchedInstructions.reset(CurrInstRange.first, CurrInstRange.second);
3433 LLVM_DEBUG(dbgs() << "Skipping instructions in block "
3434 << getBlockName(CurrBlock)
3435 << " because it is unreachable\n");
3436 continue;
3437 }
3438 // Use the appropriate cache for "OpIsSafeForPHIOfOps".
3439 CacheIdx = RPOOrdering.lookup(DT->getNode(CurrBlock)) - 1;
3440 updateProcessedCount(CurrBlock);
3441 }
3442 // Reset after processing (because we may mark ourselves as touched when
3443 // we propagate equalities).
3444 TouchedInstructions.reset(InstrNum);
3445
3446 if (auto *MP = dyn_cast<MemoryPhi>(V)) {
3447 LLVM_DEBUG(dbgs() << "Processing MemoryPhi " << *MP << "\n");
3448 valueNumberMemoryPhi(MP);
3449 } else if (auto *I = dyn_cast<Instruction>(V)) {
3450 valueNumberInstruction(I);
3451 } else {
3452 llvm_unreachable("Should have been a MemoryPhi or Instruction");
3453 }
3454 updateProcessedCount(V);
3455 }
3456 }
3457 NumGVNMaxIterations = std::max(NumGVNMaxIterations.getValue(), Iterations);
3458}
3459
3460// This is the main transformation entry point.
3461bool NewGVN::runGVN() {
3462 if (DebugCounter::isCounterSet(VNCounter))
3463 StartingVNCounter = DebugCounter::getCounterState(VNCounter);
3464 bool Changed = false;
3465 NumFuncArgs = F.arg_size();
3466 MSSAWalker = MSSA->getWalker();
3467 SingletonDeadExpression = new (ExpressionAllocator) DeadExpression();
3468
3469 // Count number of instructions for sizing of hash tables, and come
3470 // up with a global dfs numbering for instructions.
3471 unsigned ICount = 1;
3472 // Add an empty instruction to account for the fact that we start at 1
3473 DFSToInstr.emplace_back(nullptr);
3474 // Note: We want ideal RPO traversal of the blocks, which is not quite the
3475 // same as dominator tree order, particularly with regard whether backedges
3476 // get visited first or second, given a block with multiple successors.
3477 // If we visit in the wrong order, we will end up performing N times as many
3478 // iterations.
3479 // The dominator tree does guarantee that, for a given dom tree node, it's
3480 // parent must occur before it in the RPO ordering. Thus, we only need to sort
3481 // the siblings.
3483 unsigned Counter = 0;
3484 for (auto &B : RPOT) {
3485 auto *Node = DT->getNode(B);
3486 assert(Node && "RPO and Dominator tree should have same reachability");
3487 RPOOrdering[Node] = ++Counter;
3488 }
3489 // Sort dominator tree children arrays into RPO.
3490 for (auto &B : RPOT) {
3491 auto *Node = DT->getNode(B);
3492 if (Node->getNumChildren() > 1)
3493 llvm::sort(*Node, [&](const DomTreeNode *A, const DomTreeNode *B) {
3494 return RPOOrdering[A] < RPOOrdering[B];
3495 });
3496 }
3497
3498 // Now a standard depth first ordering of the domtree is equivalent to RPO.
3499 for (auto *DTN : depth_first(DT->getRootNode())) {
3500 BasicBlock *B = DTN->getBlock();
3501 const auto &BlockRange = assignDFSNumbers(B, ICount);
3502 BlockInstRange.insert({B, BlockRange});
3503 ICount += BlockRange.second - BlockRange.first;
3504 }
3505 initializeCongruenceClasses(F);
3506
3507 TouchedInstructions.resize(ICount);
3508 // Ensure we don't end up resizing the expressionToClass map, as
3509 // that can be quite expensive. At most, we have one expression per
3510 // instruction.
3511 ExpressionToClass.reserve(ICount);
3512
3513 // Initialize the touched instructions to include the entry block.
3514 const auto &InstRange = BlockInstRange.lookup(&F.getEntryBlock());
3515 TouchedInstructions.set(InstRange.first, InstRange.second);
3516 LLVM_DEBUG(dbgs() << "Block " << getBlockName(&F.getEntryBlock())
3517 << " marked reachable\n");
3518 ReachableBlocks.insert(&F.getEntryBlock());
3519 // Use index corresponding to entry block.
3520 CacheIdx = 0;
3521
3522 iterateTouchedInstructions();
3523 verifyMemoryCongruency();
3524 verifyIterationSettled(F);
3525 verifyStoreExpressions();
3526
3527 Changed |= eliminateInstructions(F);
3528
3529 // Delete all instructions marked for deletion.
3530 for (Instruction *ToErase : InstructionsToErase) {
3531 if (!ToErase->use_empty())
3532 ToErase->replaceAllUsesWith(PoisonValue::get(ToErase->getType()));
3533
3534 assert(ToErase->getParent() &&
3535 "BB containing ToErase deleted unexpectedly!");
3536 ToErase->eraseFromParent();
3537 }
3538 Changed |= !InstructionsToErase.empty();
3539
3540 // Delete all unreachable blocks.
3541 auto UnreachableBlockPred = [&](const BasicBlock &BB) {
3542 return !ReachableBlocks.count(&BB);
3543 };
3544
3545 for (auto &BB : make_filter_range(F, UnreachableBlockPred)) {
3546 LLVM_DEBUG(dbgs() << "We believe block " << getBlockName(&BB)
3547 << " is unreachable\n");
3548 deleteInstructionsInBlock(&BB);
3549 Changed = true;
3550 }
3551
3552 cleanupTables();
3553 return Changed;
3554}
3555
3557 int DFSIn = 0;
3558 int DFSOut = 0;
3559 int LocalNum = 0;
3560
3561 // Only one of Def and U will be set.
3562 // The bool in the Def tells us whether the Def is the stored value of a
3563 // store.
3565 Use *U = nullptr;
3566
3567 bool operator<(const ValueDFS &Other) const {
3568 // It's not enough that any given field be less than - we have sets
3569 // of fields that need to be evaluated together to give a proper ordering.
3570 // For example, if you have;
3571 // DFS (1, 3)
3572 // Val 0
3573 // DFS (1, 2)
3574 // Val 50
3575 // We want the second to be less than the first, but if we just go field
3576 // by field, we will get to Val 0 < Val 50 and say the first is less than
3577 // the second. We only want it to be less than if the DFS orders are equal.
3578 //
3579 // Each LLVM instruction only produces one value, and thus the lowest-level
3580 // differentiator that really matters for the stack (and what we use as a
3581 // replacement) is the local dfs number.
3582 // Everything else in the structure is instruction level, and only affects
3583 // the order in which we will replace operands of a given instruction.
3584 //
3585 // For a given instruction (IE things with equal dfsin, dfsout, localnum),
3586 // the order of replacement of uses does not matter.
3587 // IE given,
3588 // a = 5
3589 // b = a + a
3590 // When you hit b, you will have two valuedfs with the same dfsin, out, and
3591 // localnum.
3592 // The .val will be the same as well.
3593 // The .u's will be different.
3594 // You will replace both, and it does not matter what order you replace them
3595 // in (IE whether you replace operand 2, then operand 1, or operand 1, then
3596 // operand 2).
3597 // Similarly for the case of same dfsin, dfsout, localnum, but different
3598 // .val's
3599 // a = 5
3600 // b = 6
3601 // c = a + b
3602 // in c, we will a valuedfs for a, and one for b,with everything the same
3603 // but .val and .u.
3604 // It does not matter what order we replace these operands in.
3605 // You will always end up with the same IR, and this is guaranteed.
3606 return std::tie(DFSIn, DFSOut, LocalNum, Def, U) <
3607 std::tie(Other.DFSIn, Other.DFSOut, Other.LocalNum, Other.Def,
3608 Other.U);
3609 }
3610};
3611
3612// This function converts the set of members for a congruence class from values,
3613// to sets of defs and uses with associated DFS info. The total number of
3614// reachable uses for each value is stored in UseCount, and instructions that
3615// seem
3616// dead (have no non-dead uses) are stored in ProbablyDead.
3617void NewGVN::convertClassToDFSOrdered(
3618 const CongruenceClass &Dense, SmallVectorImpl<ValueDFS> &DFSOrderedSet,
3620 SmallPtrSetImpl<Instruction *> &ProbablyDead) const {
3621 for (auto *D : Dense) {
3622 // First add the value.
3623 BasicBlock *BB = getBlockForValue(D);
3624 // Constants are handled prior to ever calling this function, so
3625 // we should only be left with instructions as members.
3626 assert(BB && "Should have figured out a basic block for value");
3627 ValueDFS VDDef;
3628 DomTreeNode *DomNode = DT->getNode(BB);
3629 VDDef.DFSIn = DomNode->getDFSNumIn();
3630 VDDef.DFSOut = DomNode->getDFSNumOut();
3631 // If it's a store, use the leader of the value operand, if it's always
3632 // available, or the value operand. TODO: We could do dominance checks to
3633 // find a dominating leader, but not worth it ATM.
3634 if (auto *SI = dyn_cast<StoreInst>(D)) {
3635 auto Leader = lookupOperandLeader(SI->getValueOperand());
3636 if (alwaysAvailable(Leader)) {
3637 VDDef.Def.setPointer(Leader);
3638 } else {
3639 VDDef.Def.setPointer(SI->getValueOperand());
3640 VDDef.Def.setInt(true);
3641 }
3642 } else {
3643 VDDef.Def.setPointer(D);
3644 }
3645 assert(isa<Instruction>(D) &&
3646 "The dense set member should always be an instruction");
3647 Instruction *Def = cast<Instruction>(D);
3648 VDDef.LocalNum = InstrToDFSNum(D);
3649 DFSOrderedSet.push_back(VDDef);
3650 // If there is a phi node equivalent, add it
3651 if (auto *PN = RealToTemp.lookup(Def)) {
3652 auto *PHIE =
3653 dyn_cast_or_null<PHIExpression>(ValueToExpression.lookup(Def));
3654 if (PHIE) {
3655 VDDef.Def.setInt(false);
3656 VDDef.Def.setPointer(PN);
3657 VDDef.LocalNum = 0;
3658 DFSOrderedSet.push_back(VDDef);
3659 }
3660 }
3661
3662 unsigned int UseCount = 0;
3663 // Now add the uses.
3664 for (auto &U : Def->uses()) {
3665 if (auto *I = dyn_cast<Instruction>(U.getUser())) {
3666 // Don't try to replace into dead uses
3667 if (InstructionsToErase.count(I))
3668 continue;
3669 ValueDFS VDUse;
3670 // Put the phi node uses in the incoming block.
3671 BasicBlock *IBlock;
3672 if (auto *P = dyn_cast<PHINode>(I)) {
3673 IBlock = P->getIncomingBlock(U);
3674 // Make phi node users appear last in the incoming block
3675 // they are from.
3676 VDUse.LocalNum = InstrDFS.size() + 1;
3677 } else {
3678 IBlock = getBlockForValue(I);
3679 VDUse.LocalNum = InstrToDFSNum(I);
3680 }
3681
3682 // Skip uses in unreachable blocks, as we're going
3683 // to delete them.
3684 if (!ReachableBlocks.contains(IBlock))
3685 continue;
3686
3687 DomTreeNode *DomNode = DT->getNode(IBlock);
3688 VDUse.DFSIn = DomNode->getDFSNumIn();
3689 VDUse.DFSOut = DomNode->getDFSNumOut();
3690 VDUse.U = &U;
3691 ++UseCount;
3692 DFSOrderedSet.emplace_back(VDUse);
3693 }
3694 }
3695
3696 // If there are no uses, it's probably dead (but it may have side-effects,
3697 // so not definitely dead. Otherwise, store the number of uses so we can
3698 // track if it becomes dead later).
3699 if (UseCount == 0)
3700 ProbablyDead.insert(Def);
3701 else
3702 UseCounts[Def] = UseCount;
3703 }
3704}
3705
3706// This function converts the set of members for a congruence class from values,
3707// to the set of defs for loads and stores, with associated DFS info.
3708void NewGVN::convertClassToLoadsAndStores(
3709 const CongruenceClass &Dense,
3710 SmallVectorImpl<ValueDFS> &LoadsAndStores) const {
3711 for (auto *D : Dense) {
3712 if (!isa<LoadInst>(D) && !isa<StoreInst>(D))
3713 continue;
3714
3715 BasicBlock *BB = getBlockForValue(D);
3716 ValueDFS VD;
3717 DomTreeNode *DomNode = DT->getNode(BB);
3718 VD.DFSIn = DomNode->getDFSNumIn();
3719 VD.DFSOut = DomNode->getDFSNumOut();
3720 VD.Def.setPointer(D);
3721
3722 // If it's an instruction, use the real local dfs number.
3723 if (auto *I = dyn_cast<Instruction>(D))
3724 VD.LocalNum = InstrToDFSNum(I);
3725 else
3726 llvm_unreachable("Should have been an instruction");
3727
3728 LoadsAndStores.emplace_back(VD);
3729 }
3730}
3731
3734 I->replaceAllUsesWith(Repl);
3735}
3736
3737void NewGVN::deleteInstructionsInBlock(BasicBlock *BB) {
3738 LLVM_DEBUG(dbgs() << " BasicBlock Dead:" << *BB);
3739 ++NumGVNBlocksDeleted;
3740
3741 // Delete the instructions backwards, as it has a reduced likelihood of having
3742 // to update as many def-use and use-def chains. Start after the terminator.
3743 auto StartPoint = BB->rbegin();
3744 ++StartPoint;
3745 // Note that we explicitly recalculate BB->rend() on each iteration,
3746 // as it may change when we remove the first instruction.
3747 for (BasicBlock::reverse_iterator I(StartPoint); I != BB->rend();) {
3748 Instruction &Inst = *I++;
3749 if (!Inst.use_empty())
3751 if (isa<LandingPadInst>(Inst))
3752 continue;
3753 salvageKnowledge(&Inst, AC);
3754
3755 Inst.eraseFromParent();
3756 ++NumGVNInstrDeleted;
3757 }
3758 // Now insert something that simplifycfg will turn into an unreachable.
3759 Type *Int8Ty = Type::getInt8Ty(BB->getContext());
3760 new StoreInst(
3761 PoisonValue::get(Int8Ty),
3763 BB->getTerminator()->getIterator());
3764}
3765
3766void NewGVN::markInstructionForDeletion(Instruction *I) {
3767 LLVM_DEBUG(dbgs() << "Marking " << *I << " for deletion\n");
3768 InstructionsToErase.insert(I);
3769}
3770
3771void NewGVN::replaceInstruction(Instruction *I, Value *V) {
3772 LLVM_DEBUG(dbgs() << "Replacing " << *I << " with " << *V << "\n");
3774 // We save the actual erasing to avoid invalidating memory
3775 // dependencies until we are done with everything.
3776 markInstructionForDeletion(I);
3777}
3778
3779namespace {
3780
3781// This is a stack that contains both the value and dfs info of where
3782// that value is valid.
3783class ValueDFSStack {
3784public:
3785 Value *back() const { return ValueStack.back(); }
3786 std::pair<int, int> dfs_back() const { return DFSStack.back(); }
3787
3788 void push_back(Value *V, int DFSIn, int DFSOut) {
3789 ValueStack.emplace_back(V);
3790 DFSStack.emplace_back(DFSIn, DFSOut);
3791 }
3792
3793 bool empty() const { return DFSStack.empty(); }
3794
3795 bool isInScope(int DFSIn, int DFSOut) const {
3796 if (empty())
3797 return false;
3798 return DFSIn >= DFSStack.back().first && DFSOut <= DFSStack.back().second;
3799 }
3800
3801 void popUntilDFSScope(int DFSIn, int DFSOut) {
3802
3803 // These two should always be in sync at this point.
3804 assert(ValueStack.size() == DFSStack.size() &&
3805 "Mismatch between ValueStack and DFSStack");
3806 while (
3807 !DFSStack.empty() &&
3808 !(DFSIn >= DFSStack.back().first && DFSOut <= DFSStack.back().second)) {
3809 DFSStack.pop_back();
3810 ValueStack.pop_back();
3811 }
3812 }
3813
3814private:
3815 SmallVector<Value *, 8> ValueStack;
3817};
3818
3819} // end anonymous namespace
3820
3821// Given an expression, get the congruence class for it.
3822CongruenceClass *NewGVN::getClassForExpression(const Expression *E) const {
3823 if (auto *VE = dyn_cast<VariableExpression>(E))
3824 return ValueToClass.lookup(VE->getVariableValue());
3825 else if (isa<DeadExpression>(E))
3826 return TOPClass;
3827 return ExpressionToClass.lookup(E);
3828}
3829
3830// Given a value and a basic block we are trying to see if it is available in,
3831// see if the value has a leader available in that block.
3832Value *NewGVN::findPHIOfOpsLeader(const Expression *E,
3833 const Instruction *OrigInst,
3834 const BasicBlock *BB) const {
3835 // It would already be constant if we could make it constant
3836 if (auto *CE = dyn_cast<ConstantExpression>(E))
3837 return CE->getConstantValue();
3838 if (auto *VE = dyn_cast<VariableExpression>(E)) {
3839 auto *V = VE->getVariableValue();
3840 if (alwaysAvailable(V) || DT->dominates(getBlockForValue(V), BB))
3841 return VE->getVariableValue();
3842 }
3843
3844 auto *CC = getClassForExpression(E);
3845 if (!CC)
3846 return nullptr;
3847 if (alwaysAvailable(CC->getLeader()))
3848 return CC->getLeader();
3849
3850 for (auto *Member : *CC) {
3851 auto *MemberInst = dyn_cast<Instruction>(Member);
3852 if (MemberInst == OrigInst)
3853 continue;
3854 // Anything that isn't an instruction is always available.
3855 if (!MemberInst)
3856 return Member;
3857 if (DT->dominates(getBlockForValue(MemberInst), BB))
3858 return Member;
3859 }
3860 return nullptr;
3861}
3862
3863bool NewGVN::eliminateInstructions(Function &F) {
3864 // This is a non-standard eliminator. The normal way to eliminate is
3865 // to walk the dominator tree in order, keeping track of available
3866 // values, and eliminating them. However, this is mildly
3867 // pointless. It requires doing lookups on every instruction,
3868 // regardless of whether we will ever eliminate it. For
3869 // instructions part of most singleton congruence classes, we know we
3870 // will never eliminate them.
3871
3872 // Instead, this eliminator looks at the congruence classes directly, sorts
3873 // them into a DFS ordering of the dominator tree, and then we just
3874 // perform elimination straight on the sets by walking the congruence
3875 // class member uses in order, and eliminate the ones dominated by the
3876 // last member. This is worst case O(E log E) where E = number of
3877 // instructions in a single congruence class. In theory, this is all
3878 // instructions. In practice, it is much faster, as most instructions are
3879 // either in singleton congruence classes or can't possibly be eliminated
3880 // anyway (if there are no overlapping DFS ranges in class).
3881 // When we find something not dominated, it becomes the new leader
3882 // for elimination purposes.
3883 // TODO: If we wanted to be faster, We could remove any members with no
3884 // overlapping ranges while sorting, as we will never eliminate anything
3885 // with those members, as they don't dominate anything else in our set.
3886
3887 bool AnythingReplaced = false;
3888
3889 // Since we are going to walk the domtree anyway, and we can't guarantee the
3890 // DFS numbers are updated, we compute some ourselves.
3891 DT->updateDFSNumbers();
3892
3893 // Go through all of our phi nodes, and kill the arguments associated with
3894 // unreachable edges.
3895 auto ReplaceUnreachablePHIArgs = [&](PHINode *PHI, BasicBlock *BB) {
3896 for (auto &Operand : PHI->incoming_values())
3897 if (!ReachableEdges.count({PHI->getIncomingBlock(Operand), BB})) {
3898 LLVM_DEBUG(dbgs() << "Replacing incoming value of " << PHI
3899 << " for block "
3900 << getBlockName(PHI->getIncomingBlock(Operand))
3901 << " with poison due to it being unreachable\n");
3902 Operand.set(PoisonValue::get(PHI->getType()));
3903 }
3904 };
3905 // Replace unreachable phi arguments.
3906 // At this point, RevisitOnReachabilityChange only contains:
3907 //
3908 // 1. PHIs
3909 // 2. Temporaries that will convert to PHIs
3910 // 3. Operations that are affected by an unreachable edge but do not fit into
3911 // 1 or 2 (rare).
3912 // So it is a slight overshoot of what we want. We could make it exact by
3913 // using two SparseBitVectors per block.
3914 DenseMap<const BasicBlock *, unsigned> ReachablePredCount;
3915 for (auto &KV : ReachableEdges)
3916 ReachablePredCount[KV.getEnd()]++;
3917 for (auto &BBPair : RevisitOnReachabilityChange) {
3918 for (auto InstNum : BBPair.second) {
3919 auto *Inst = InstrFromDFSNum(InstNum);
3920 auto *PHI = dyn_cast<PHINode>(Inst);
3921 PHI = PHI ? PHI : dyn_cast_or_null<PHINode>(RealToTemp.lookup(Inst));
3922 if (!PHI)
3923 continue;
3924 auto *BB = BBPair.first;
3925 if (ReachablePredCount.lookup(BB) != PHI->getNumIncomingValues())
3926 ReplaceUnreachablePHIArgs(PHI, BB);
3927 }
3928 }
3929
3930 // Map to store the use counts
3932 for (auto *CC : reverse(CongruenceClasses)) {
3933 LLVM_DEBUG(dbgs() << "Eliminating in congruence class " << CC->getID()
3934 << "\n");
3935 // Track the equivalent store info so we can decide whether to try
3936 // dead store elimination.
3937 SmallVector<ValueDFS, 8> PossibleDeadStores;
3938 SmallPtrSet<Instruction *, 8> ProbablyDead;
3939 if (CC->isDead() || CC->empty())
3940 continue;
3941 // Everything still in the TOP class is unreachable or dead.
3942 if (CC == TOPClass) {
3943 for (auto *M : *CC) {
3944 auto *VTE = ValueToExpression.lookup(M);
3945 if (VTE && isa<DeadExpression>(VTE))
3946 markInstructionForDeletion(cast<Instruction>(M));
3947 assert((!ReachableBlocks.count(cast<Instruction>(M)->getParent()) ||
3948 InstructionsToErase.count(cast<Instruction>(M))) &&
3949 "Everything in TOP should be unreachable or dead at this "
3950 "point");
3951 }
3952 continue;
3953 }
3954
3955 assert(CC->getLeader() && "We should have had a leader");
3956 // If this is a leader that is always available, and it's a
3957 // constant or has no equivalences, just replace everything with
3958 // it. We then update the congruence class with whatever members
3959 // are left.
3960 Value *Leader =
3961 CC->getStoredValue() ? CC->getStoredValue() : CC->getLeader();
3962 if (alwaysAvailable(Leader)) {
3963 CongruenceClass::MemberSet MembersLeft;
3964 for (auto *M : *CC) {
3965 Value *Member = M;
3966 // Void things have no uses we can replace.
3967 if (Member == Leader || !isa<Instruction>(Member) ||
3968 Member->getType()->isVoidTy()) {
3969 MembersLeft.insert(Member);
3970 continue;
3971 }
3972
3973 LLVM_DEBUG(dbgs() << "Found replacement " << *(Leader) << " for "
3974 << *Member << "\n");
3975 auto *I = cast<Instruction>(Member);
3976 assert(Leader != I && "About to accidentally remove our leader");
3977 replaceInstruction(I, Leader);
3978 AnythingReplaced = true;
3979 }
3980 CC->swap(MembersLeft);
3981 } else {
3982 // If this is a singleton, we can skip it.
3983 if (CC->size() != 1 || RealToTemp.count(Leader)) {
3984 // This is a stack because equality replacement/etc may place
3985 // constants in the middle of the member list, and we want to use
3986 // those constant values in preference to the current leader, over
3987 // the scope of those constants.
3988 ValueDFSStack EliminationStack;
3989
3990 // Convert the members to DFS ordered sets and then merge them.
3991 SmallVector<ValueDFS, 8> DFSOrderedSet;
3992 convertClassToDFSOrdered(*CC, DFSOrderedSet, UseCounts, ProbablyDead);
3993
3994 // Sort the whole thing.
3995 llvm::sort(DFSOrderedSet);
3996 for (auto &VD : DFSOrderedSet) {
3997 int MemberDFSIn = VD.DFSIn;
3998 int MemberDFSOut = VD.DFSOut;
3999 Value *Def = VD.Def.getPointer();
4000 bool FromStore = VD.Def.getInt();
4001 Use *U = VD.U;
4002 // We ignore void things because we can't get a value from them.
4003 if (Def && Def->getType()->isVoidTy())
4004 continue;
4005 auto *DefInst = dyn_cast_or_null<Instruction>(Def);
4006 if (DefInst && AllTempInstructions.count(DefInst)) {
4007 auto *PN = cast<PHINode>(DefInst);
4008
4009 // If this is a value phi and that's the expression we used, insert
4010 // it into the program
4011 // remove from temp instruction list.
4012 AllTempInstructions.erase(PN);
4013 auto *DefBlock = getBlockForValue(Def);
4014 LLVM_DEBUG(dbgs() << "Inserting fully real phi of ops" << *Def
4015 << " into block "
4016 << getBlockName(getBlockForValue(Def)) << "\n");
4017 PN->insertBefore(DefBlock->begin());
4018 Def = PN;
4019 NumGVNPHIOfOpsEliminations++;
4020 }
4021
4022 if (EliminationStack.empty()) {
4023 LLVM_DEBUG(dbgs() << "Elimination Stack is empty\n");
4024 } else {
4025 LLVM_DEBUG(dbgs() << "Elimination Stack Top DFS numbers are ("
4026 << EliminationStack.dfs_back().first << ","
4027 << EliminationStack.dfs_back().second << ")\n");
4028 }
4029
4030 LLVM_DEBUG(dbgs() << "Current DFS numbers are (" << MemberDFSIn << ","
4031 << MemberDFSOut << ")\n");
4032 // First, we see if we are out of scope or empty. If so,
4033 // and there equivalences, we try to replace the top of
4034 // stack with equivalences (if it's on the stack, it must
4035 // not have been eliminated yet).
4036 // Then we synchronize to our current scope, by
4037 // popping until we are back within a DFS scope that
4038 // dominates the current member.
4039 // Then, what happens depends on a few factors
4040 // If the stack is now empty, we need to push
4041 // If we have a constant or a local equivalence we want to
4042 // start using, we also push.
4043 // Otherwise, we walk along, processing members who are
4044 // dominated by this scope, and eliminate them.
4045 bool ShouldPush = Def && EliminationStack.empty();
4046 bool OutOfScope =
4047 !EliminationStack.isInScope(MemberDFSIn, MemberDFSOut);
4048
4049 if (OutOfScope || ShouldPush) {
4050 // Sync to our current scope.
4051 EliminationStack.popUntilDFSScope(MemberDFSIn, MemberDFSOut);
4052 bool ShouldPush = Def && EliminationStack.empty();
4053 if (ShouldPush) {
4054 EliminationStack.push_back(Def, MemberDFSIn, MemberDFSOut);
4055 }
4056 }
4057
4058 // Skip the Def's, we only want to eliminate on their uses. But mark
4059 // dominated defs as dead.
4060 if (Def) {
4061 // For anything in this case, what and how we value number
4062 // guarantees that any side-effects that would have occurred (ie
4063 // throwing, etc) can be proven to either still occur (because it's
4064 // dominated by something that has the same side-effects), or never
4065 // occur. Otherwise, we would not have been able to prove it value
4066 // equivalent to something else. For these things, we can just mark
4067 // it all dead. Note that this is different from the "ProbablyDead"
4068 // set, which may not be dominated by anything, and thus, are only
4069 // easy to prove dead if they are also side-effect free. Note that
4070 // because stores are put in terms of the stored value, we skip
4071 // stored values here. If the stored value is really dead, it will
4072 // still be marked for deletion when we process it in its own class.
4073 auto *DefI = dyn_cast<Instruction>(Def);
4074 if (!EliminationStack.empty() && DefI && !FromStore) {
4075 Value *DominatingLeader = EliminationStack.back();
4076 if (DominatingLeader != Def) {
4077 // Even if the instruction is removed, we still need to update
4078 // flags/metadata due to downstreams users of the leader.
4079 patchReplacementInstruction(DefI, DominatingLeader);
4080
4082 findDbgUsers(DefI, DVRUsers);
4083
4084 for (auto *DVR : DVRUsers)
4085 DVR->replaceVariableLocationOp(DefI, DominatingLeader);
4086
4087 markInstructionForDeletion(DefI);
4088 }
4089 }
4090 continue;
4091 }
4092 // At this point, we know it is a Use we are trying to possibly
4093 // replace.
4094
4095 assert(isa<Instruction>(U->get()) &&
4096 "Current def should have been an instruction");
4097 assert(isa<Instruction>(U->getUser()) &&
4098 "Current user should have been an instruction");
4099
4100 // If the thing we are replacing into is already marked to be dead,
4101 // this use is dead. Note that this is true regardless of whether
4102 // we have anything dominating the use or not. We do this here
4103 // because we are already walking all the uses anyway.
4104 Instruction *InstUse = cast<Instruction>(U->getUser());
4105 if (InstructionsToErase.count(InstUse)) {
4106 auto &UseCount = UseCounts[U->get()];
4107 if (--UseCount == 0) {
4108 ProbablyDead.insert(cast<Instruction>(U->get()));
4109 }
4110 }
4111
4112 // If we get to this point, and the stack is empty we must have a use
4113 // with nothing we can use to eliminate this use, so just skip it.
4114 if (EliminationStack.empty())
4115 continue;
4116
4117 Value *DominatingLeader = EliminationStack.back();
4118
4119 Instruction *SSACopy = nullptr;
4120 if (auto *BC = dyn_cast<BitCastInst>(DominatingLeader)) {
4121 if (BC->getType() == BC->getOperand(0)->getType() &&
4122 PredInfo->getPredicateInfoFor(DominatingLeader)) {
4123 SSACopy = BC;
4124 DominatingLeader = BC->getOperand(0);
4125 }
4126 }
4127
4128 // Don't replace our existing users with ourselves.
4129 if (U->get() == DominatingLeader)
4130 continue;
4131
4132 // If we replaced something in an instruction, handle the patching of
4133 // metadata. Skip this if we are replacing predicateinfo with its
4134 // original operand, as we already know we can just drop it.
4135 auto *ReplacedInst = cast<Instruction>(U->get());
4136 auto *PI = PredInfo->getPredicateInfoFor(ReplacedInst);
4137 if (!PI || DominatingLeader != PI->OriginalOp)
4138 patchReplacementInstruction(ReplacedInst, DominatingLeader);
4139
4141 << "Found replacement " << *DominatingLeader << " for "
4142 << *U->get() << " in " << *(U->getUser()) << "\n");
4143 U->set(DominatingLeader);
4144 // This is now a use of the dominating leader, which means if the
4145 // dominating leader was dead, it's now live!
4146 auto &LeaderUseCount = UseCounts[DominatingLeader];
4147 // It's about to be alive again.
4148 if (LeaderUseCount == 0 && isa<Instruction>(DominatingLeader))
4149 ProbablyDead.erase(cast<Instruction>(DominatingLeader));
4150 // For copy instructions, we use their operand as a leader,
4151 // which means we remove a user of the copy and it may become dead.
4152 if (SSACopy) {
4153 auto It = UseCounts.find(SSACopy);
4154 if (It != UseCounts.end()) {
4155 unsigned &IIUseCount = It->second;
4156 if (--IIUseCount == 0)
4157 ProbablyDead.insert(SSACopy);
4158 }
4159 }
4160 ++LeaderUseCount;
4161 AnythingReplaced = true;
4162 }
4163 }
4164 }
4165
4166 // At this point, anything still in the ProbablyDead set is actually dead if
4167 // would be trivially dead.
4168 for (auto *I : ProbablyDead)
4170 markInstructionForDeletion(I);
4171
4172 // Cleanup the congruence class.
4173 CongruenceClass::MemberSet MembersLeft;
4174 for (auto *Member : *CC)
4175 if (!isa<Instruction>(Member) ||
4176 !InstructionsToErase.count(cast<Instruction>(Member)))
4177 MembersLeft.insert(Member);
4178 CC->swap(MembersLeft);
4179
4180 // If we have possible dead stores to look at, try to eliminate them.
4181 if (CC->getStoreCount() > 0) {
4182 convertClassToLoadsAndStores(*CC, PossibleDeadStores);
4183 llvm::sort(PossibleDeadStores);
4184 ValueDFSStack EliminationStack;
4185 for (auto &VD : PossibleDeadStores) {
4186 int MemberDFSIn = VD.DFSIn;
4187 int MemberDFSOut = VD.DFSOut;
4188 Instruction *Member = cast<Instruction>(VD.Def.getPointer());
4189 if (EliminationStack.empty() ||
4190 !EliminationStack.isInScope(MemberDFSIn, MemberDFSOut)) {
4191 // Sync to our current scope.
4192 EliminationStack.popUntilDFSScope(MemberDFSIn, MemberDFSOut);
4193 if (EliminationStack.empty()) {
4194 EliminationStack.push_back(Member, MemberDFSIn, MemberDFSOut);
4195 continue;
4196 }
4197 }
4198 // We already did load elimination, so nothing to do here.
4199 if (isa<LoadInst>(Member))
4200 continue;
4201 assert(!EliminationStack.empty());
4202 Instruction *Leader = cast<Instruction>(EliminationStack.back());
4203 (void)Leader;
4204 assert(DT->dominates(Leader->getParent(), Member->getParent()));
4205 // Member is dominater by Leader, and thus dead
4206 LLVM_DEBUG(dbgs() << "Marking dead store " << *Member
4207 << " that is dominated by " << *Leader << "\n");
4208 markInstructionForDeletion(Member);
4209 CC->erase(Member);
4210 ++NumGVNDeadStores;
4211 }
4212 }
4213 }
4214 return AnythingReplaced;
4215}
4216
4217// This function provides global ranking of operations so that we can place them
4218// in a canonical order. Note that rank alone is not necessarily enough for a
4219// complete ordering, as constants all have the same rank. However, generally,
4220// we will simplify an operation with all constants so that it doesn't matter
4221// what order they appear in.
4222unsigned int NewGVN::getRank(const Value *V) const {
4223 // Prefer constants to undef to anything else
4224 // Undef is a constant, have to check it first.
4225 // Prefer poison to undef as it's less defined.
4226 // Prefer smaller constants to constantexprs
4227 // Note that the order here matters because of class inheritance
4228 if (isa<ConstantExpr>(V))
4229 return 3;
4230 if (isa<PoisonValue>(V))
4231 return 1;
4232 if (isa<UndefValue>(V))
4233 return 2;
4234 if (isa<Constant>(V))
4235 return 0;
4236 if (auto *A = dyn_cast<Argument>(V))
4237 return 4 + A->getArgNo();
4238
4239 // Need to shift the instruction DFS by number of arguments + 5 to account for
4240 // the constant and argument ranking above.
4241 unsigned Result = InstrToDFSNum(V);
4242 if (Result > 0)
4243 return 5 + NumFuncArgs + Result;
4244 // Unreachable or something else, just return a really large number.
4245 return ~0;
4246}
4247
4248// This is a function that says whether two commutative operations should
4249// have their order swapped when canonicalizing.
4250bool NewGVN::shouldSwapOperands(const Value *A, const Value *B) const {
4251 // Because we only care about a total ordering, and don't rewrite expressions
4252 // in this order, we order by rank, which will give a strict weak ordering to
4253 // everything but constants, and then we order by pointer address.
4254 return std::make_pair(getRank(A), A) > std::make_pair(getRank(B), B);
4255}
4256
4257bool NewGVN::shouldSwapOperandsForPredicate(const Value *A, const Value *B,
4258 const BitCastInst *I) const {
4259 if (shouldSwapOperands(A, B)) {
4260 PredicateSwapChoice[I] = B;
4261 return true;
4262 }
4263
4264 auto LookupResult = PredicateSwapChoice.find(I);
4265 if (LookupResult != PredicateSwapChoice.end()) {
4266 auto *SeenPredicate = LookupResult->second;
4267 if (SeenPredicate) {
4268 // We previously decided to swap B to the left. Keep that choice.
4269 if (SeenPredicate == B)
4270 return true;
4271 else
4272 LookupResult->second = nullptr;
4273 }
4274 }
4275 return false;
4276}
4277
4279 // Apparently the order in which we get these results matter for
4280 // the old GVN (see Chandler's comment in GVN.cpp). I'll keep
4281 // the same order here, just in case.
4282 auto &AC = AM.getResult<AssumptionAnalysis>(F);
4283 auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
4284 auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
4285 auto &AA = AM.getResult<AAManager>(F);
4286 auto &MSSA = AM.getResult<MemorySSAAnalysis>(F).getMSSA();
4287 bool Changed =
4288 NewGVN(F, &DT, &AC, &TLI, &AA, &MSSA, F.getDataLayout())
4289 .runGVN();
4290 if (!Changed)
4291 return PreservedAnalyses::all();
4294 return PA;
4295}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
Rewrite undef for PHI
Unify divergent function exit nodes
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file defines the BumpPtrAllocator interface.
This file implements the BitVector class.
BlockVerifier::State From
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file provides an implementation of debug counters.
#define DEBUG_COUNTER(VARNAME, COUNTERNAME, DESC)
Definition: DebugCounter.h:194
This file defines DenseMapInfo traits for DenseMap.
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
std::optional< std::vector< StOtherPiece > > Other
Definition: ELFYAML.cpp:1328
bool End
Definition: ELF_riscv.cpp:480
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
The header file for the GVN pass that contains expression handling classes.
static void patchAndReplaceAllUsesWith(Instruction *I, Value *Repl)
Definition: GVN.cpp:2232
This is the interface for a simple mod/ref and alias analysis over globals.
This file defines the little GraphTraits<X> template class that should be specialized by classes that...
Hexagon Common GEP
This defines the Use class.
static bool lookup(const GsymReader &GR, DataExtractor &Data, uint64_t &Offset, uint64_t BaseAddr, uint64_t Addr, SourceLocations &SrcLocs, llvm::Error &Err)
A Lookup helper functions.
Definition: InlineInfo.cpp:108
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition: Lint.cpp:546
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
Branch Probability Basic Block static false std::string getBlockName(const MachineBasicBlock *BB)
Helper to print the name of a MBB.
This file exposes an interface to building/using memory SSA to walk memory instructions using a use/d...
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
static bool alwaysAvailable(Value *V)
Definition: NewGVN.cpp:1045
static Value * getCopyOf(const Value *V)
Definition: NewGVN.cpp:1015
static bool isCopyOfPHI(const Value *V, const PHINode *PN)
Definition: NewGVN.cpp:1023
static bool isCopyOfAPHI(const Value *V)
Definition: NewGVN.cpp:1027
static bool okayForPHIOfOps(const Instruction *I)
Definition: NewGVN.cpp:2621
static cl::opt< bool > EnableStoreRefinement("enable-store-refinement", cl::init(false), cl::Hidden)
static bool equalsLoadStoreHelper(const T &LHS, const Expression &RHS)
Definition: NewGVN.cpp:932
static cl::opt< bool > EnablePhiOfOps("enable-phi-of-ops", cl::init(true), cl::Hidden)
Currently, the generation "phi of ops" can result in correctness issues.
This file provides the interface for LLVM's Global Value Numbering pass.
#define P(N)
if(PassOpts->AAPipeline)
This file defines the PointerIntPair class.
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
This file implements the PredicateInfo analysis, which creates an Extended SSA form for operations us...
const SmallVectorImpl< MachineOperand > & Cond
bool isDead(const MachineInstr &MI, const MachineRegisterInfo &MRI)
This file defines generic set operations that may be used on set's of different types,...
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the SparseBitVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition: Statistic.h:167
#define LLVM_DEBUG(...)
Definition: Debug.h:119
Value * RHS
Value * LHS
A manager for alias analyses.
A private abstract base class describing the concept of an individual alias analysis implementation.
bool isMustAlias(const MemoryLocation &LocA, const MemoryLocation &LocB)
A trivial helper function to check to see if the specified pointers are must-alias.
bool doesNotAccessMemory(const CallBase *Call)
Checks if the specified call is known to never read or write memory.
bool onlyReadsMemory(const CallBase *Call)
Checks if the specified call is known to only read from non-volatile memory (or not access memory at ...
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:255
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Definition: PassManager.h:412
Recycle small arrays allocated from a BumpPtrAllocator.
Definition: ArrayRecycler.h:28
void clear(AllocatorType &Allocator)
Release all the tracked allocations to the allocator.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:147
iterator begin() const
Definition: ArrayRef.h:135
A function analysis which provides an AssumptionCache.
A cache of @llvm.assume calls within a function.
LLVM_ABI std::optional< AttributeList > intersectWith(LLVMContext &C, AttributeList Other) const
Try to intersect this AttributeList with Other.
LLVM Basic Block Representation.
Definition: BasicBlock.h:62
reverse_iterator rbegin()
Definition: BasicBlock.h:475
InstListType::reverse_iterator reverse_iterator
Definition: BasicBlock.h:172
reverse_iterator rend()
Definition: BasicBlock.h:477
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block lives.
Definition: BasicBlock.cpp:131
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition: BasicBlock.h:233
This class represents a no-op cast from one type to another.
BitVector & reset()
Definition: BitVector.h:392
int find_first() const
find_first - Returns the index of the first set bit, -1 if none of the bits are set.
Definition: BitVector.h:300
void resize(unsigned N, bool t=false)
resize - Grow or shrink the bitvector.
Definition: BitVector.h:341
void clear()
clear - Removes all bits from the bitvector.
Definition: BitVector.h:335
BitVector & set()
Definition: BitVector.h:351
bool any() const
any - Returns true if any bit is set.
Definition: BitVector.h:170
iterator_range< const_set_bits_iterator > set_bits() const
Definition: BitVector.h:140
Allocate memory in an ever growing pool, as if by bump-pointer.
Definition: Allocator.h:67
void Reset()
Deallocate all but the current slab and reset the current pointer to the beginning of it,...
Definition: Allocator.h:124
void Deallocate(const void *Ptr, size_t Size, size_t)
Definition: Allocator.h:226
bool isConvergent() const
Determine if the invoke is convergent.
Definition: InstrTypes.h:1967
AttributeList getAttributes() const
Return the attributes for this call.
Definition: InstrTypes.h:1424
This class represents a function call, abstracting a target machine's calling convention.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition: InstrTypes.h:678
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition: InstrTypes.h:681
@ ICMP_EQ
equal
Definition: InstrTypes.h:699
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition: InstrTypes.h:829
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition: InstrTypes.h:791
This is the shared class of boolean and integer constants.
Definition: Constants.h:87
bool isOne() const
This is just a convenience method to make client code smaller for a common case.
Definition: Constants.h:220
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
Definition: Constants.cpp:868
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition: Constants.h:214
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
Definition: Constants.cpp:875
static LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
Definition: Constants.cpp:882
This is an important base class in LLVM.
Definition: Constant.h:43
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
Definition: Constants.cpp:373
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
static CounterState getCounterState(unsigned ID)
Definition: DebugCounter.h:107
static bool isCounterSet(unsigned ID)
Definition: DebugCounter.h:97
static bool shouldExecute(unsigned CounterName)
Definition: DebugCounter.h:88
static void setCounterState(unsigned ID, CounterState State)
Definition: DebugCounter.h:115
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
Definition: DenseMap.h:203
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:177
bool erase(const KeyT &Val)
Definition: DenseMap.h:319
unsigned size() const
Definition: DenseMap.h:120
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
Definition: DenseMap.h:173
iterator end()
Definition: DenseMap.h:87
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition: DenseMap.h:230
Implements a dense probed hash-table based set.
Definition: DenseSet.h:263
unsigned getDFSNumIn() const
getDFSNumIn/getDFSNumOut - These return the DFS visitation order for nodes in the dominator tree.
unsigned getDFSNumOut() const
Analysis pass which computes a DominatorTree.
Definition: Dominators.h:284
DomTreeNodeBase< NodeT > * getRootNode()
getRootNode - This returns the entry node for the CFG of the function.
void updateDFSNumbers() const
updateDFSNumbers - Assign In and Out numbers to the nodes while walking dominator tree in dfs order.
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
bool properlyDominates(const DomTreeNodeBase< NodeT > *A, const DomTreeNodeBase< NodeT > *B) const
properlyDominates - Returns true iff A dominates B and A != B.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition: Dominators.h:165
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
Definition: Dominators.cpp:135
Class representing an expression and its matching format.
bool isPresplitCoroutine() const
Determine if the function is presplit coroutine.
Definition: Function.h:539
bool equals(const Expression &Other) const override
Definition: NewGVN.cpp:952
bool equals(const Expression &Other) const override
Definition: NewGVN.cpp:938
bool equals(const Expression &Other) const override
bool equals(const Expression &Other) const override
Definition: NewGVN.cpp:942
static LLVM_ABI std::optional< bool > isImpliedByMatchingCmp(CmpPredicate Pred1, CmpPredicate Pred2)
Determine if Pred1 implies Pred2 is true, false, or if nothing can be inferred about the implication,...
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
LLVM_ABI bool isAtomic() const LLVM_READONLY
Return true if this instruction has an AtomicOrdering of unordered or higher.
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
Definition: Instruction.cpp:82
An instruction for reading from memory.
Definition: Instructions.h:180
Value * getPointerOperand()
Definition: Instructions.h:259
bool isSimple() const
Definition: Instructions.h:251
BasicBlock * getBlock() const
Definition: MemorySSA.h:162
Represents phi nodes for memory accesses.
Definition: MemorySSA.h:479
BasicBlock * getIncomingBlock(unsigned I) const
Return incoming basic block number i.
Definition: MemorySSA.h:542
An analysis that produces MemorySSA for a function.
Definition: MemorySSA.h:936
This is the generic walker interface for walkers of MemorySSA.
Definition: MemorySSA.h:1024
MemoryAccess * getClobberingMemoryAccess(const Instruction *I, BatchAAResults &AA)
Given a memory Mod/Ref/ModRef'ing instruction, calling this will give you the nearest dominating Memo...
Definition: MemorySSA.h:1053
Encapsulates MemorySSA, including all data associated with memory accesses.
Definition: MemorySSA.h:702
LLVM_ABI MemorySSAWalker * getWalker()
Definition: MemorySSA.cpp:1590
MemoryUseOrDef * getMemoryAccess(const Instruction *I) const
Given a memory Mod/Ref'ing instruction, get the MemorySSA access associated with it.
Definition: MemorySSA.h:720
MemoryAccess * getLiveOnEntryDef() const
Definition: MemorySSA.h:744
const DefsList * getBlockDefs(const BasicBlock *BB) const
Return the list of MemoryDef's and MemoryPhi's for a given basic block.
Definition: MemorySSA.h:768
bool isLiveOnEntryDef(const MemoryAccess *MA) const
Return true if MA represents the live on entry value.
Definition: MemorySSA.h:740
Class that has the common methods + fields of memory uses/defs.
Definition: MemorySSA.h:250
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition: ArrayRef.h:303
PreservedAnalyses run(Function &F, AnalysisManager< Function > &AM)
Run the pass over the function.
Definition: NewGVN.cpp:4278
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
PointerIntPair - This class implements a pair of a pointer and small integer.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
Definition: DerivedTypes.h:720
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Definition: Constants.cpp:1885
Encapsulates PredicateInfo, including all data associated with memory accesses.
A set of analyses that are preserved following a run of a transformation pass.
Definition: Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition: Analysis.h:118
PreservedAnalyses & preserve()
Mark an analysis as preserved.
Definition: Analysis.h:132
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
Definition: SmallPtrSet.h:380
SmallPtrSetIterator< PtrType > const_iterator
Definition: SmallPtrSet.h:391
bool erase(PtrType Ptr)
Remove pointer from the set.
Definition: SmallPtrSet.h:418
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
Definition: SmallPtrSet.h:470
void insert_range(Range &&R)
Definition: SmallPtrSet.h:490
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:401
bool contains(ConstPtrType Ptr) const
Definition: SmallPtrSet.h:476
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:541
bool empty() const
Definition: SmallVector.h:82
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:938
void push_back(const T &Elt)
Definition: SmallVector.h:414
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
An instruction for storing to memory.
Definition: Instructions.h:296
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
bool isPointerTy() const
True if this is an instance of PointerType.
Definition: Type.h:267
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
Definition: Constants.cpp:1866
A Use represents the edge between a Value definition and its users.
Definition: Use.h:35
op_range operands()
Definition: User.h:292
Value * getOperand(unsigned i) const
Definition: User.h:232
unsigned getNumOperands() const
Definition: User.h:254
LLVM Value Representation.
Definition: Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:256
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition: Value.cpp:546
iterator_range< user_iterator > users()
Definition: Value.h:426
bool use_empty() const
Definition: Value.h:346
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
Definition: Value.cpp:1098
std::pair< iterator, bool > insert(const ValueT &V)
Definition: DenseSet.h:194
iterator find(const_arg_type_t< ValueT > V)
Definition: DenseSet.h:163
bool erase(const ValueT &V)
Definition: DenseSet.h:100
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
Definition: DenseSet.h:174
An opaque object representing a hash code.
Definition: Hashing.h:76
const ParentTy * getParent() const
Definition: ilist_node.h:34
self_iterator getIterator()
Definition: ilist_node.h:134
A range adaptor for a pair of iterators.
LLVM_ABI friend const_iterator begin(StringRef path, Style style)
Get begin iterator over path.
Definition: Path.cpp:226
LLVM_ABI friend const_iterator end(StringRef path)
Get end iterator over path.
Definition: Path.cpp:235
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
bool match(Val *V, const Pattern &P)
Definition: PatternMatch.h:49
brc_match< Cond_t, bind_ty< BasicBlock >, bind_ty< BasicBlock > > m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F)
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
Definition: PatternMatch.h:92
int analyzeLoadFromClobberingStore(Type *LoadTy, Value *LoadPtr, StoreInst *DepSI, const DataLayout &DL)
This function determines whether a value for the pointer LoadPtr can be extracted from the store at D...
Definition: VNCoercion.cpp:234
Constant * getConstantValueForLoad(Constant *SrcVal, unsigned Offset, Type *LoadTy, const DataLayout &DL)
Definition: VNCoercion.cpp:396
int analyzeLoadFromClobberingLoad(Type *LoadTy, Value *LoadPtr, LoadInst *DepLI, const DataLayout &DL)
This function determines whether a value for the pointer LoadPtr can be extracted from the load at De...
Definition: VNCoercion.cpp:255
Constant * getConstantMemInstValueForLoad(MemIntrinsic *SrcInst, unsigned Offset, Type *LoadTy, const DataLayout &DL)
Definition: VNCoercion.cpp:456
int analyzeLoadFromClobberingMemInst(Type *LoadTy, Value *LoadPtr, MemIntrinsic *DepMI, const DataLayout &DL)
This function determines whether a value for the pointer LoadPtr can be extracted from the memory int...
Definition: VNCoercion.cpp:269
@ CE
Windows NT (Windows on ARM)
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:444
std::vector< ExecutorSymbolDef > LookupResult
NodeAddr< DefNode * > Def
Definition: RDFGraph.h:384
LLVM_ABI const_iterator begin(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get begin iterator over path.
Definition: Path.cpp:226
LLVM_ABI const_iterator end(StringRef path LLVM_LIFETIME_BOUND)
Get end iterator over path.
Definition: Path.cpp:235
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:477
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1744
LLVM_ABI Value * simplifyGEPInst(Type *SrcTy, Value *Ptr, ArrayRef< Value * > Indices, GEPNoWrapFlags NW, const SimplifyQuery &Q)
Given operands for a GetElementPtrInst, fold the result or return null.
LLVM_ABI Constant * getInitialValueOfAllocation(const Value *V, const TargetLibraryInfo *TLI, Type *Ty)
If this is a call to an allocation function that initializes memory to a fixed value,...
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition: STLExtras.h:1702
LLVM_ABI void salvageDebugInfo(const MachineRegisterInfo &MRI, MachineInstr &MI)
Assuming the instruction MI is going to be deleted, attempt to salvage debug users of MI by writing t...
Definition: Utils.cpp:1723
auto successors(const MachineBasicBlock *BB)
SDValue getStoredValue(SDValue Op)
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
mapped_iterator< ItTy, FuncTy > map_iterator(ItTy I, FuncTy F)
Definition: STLExtras.h:381
bool set_is_subset(const S1Ty &S1, const S2Ty &S2)
set_is_subset(A, B) - Return true iff A in B
LLVM_ABI Value * simplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty, const SimplifyQuery &Q)
Given operands for a CastInst, fold the result or return null.
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
Definition: STLExtras.h:2147
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
Definition: STLExtras.h:1987
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1751
LLVM_ABI bool isInstructionTriviallyDead(Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction is not used, and the instruction will return.
Definition: Local.cpp:402
auto reverse(ContainerTy &&C)
Definition: STLExtras.h:428
void sort(IteratorTy Start, IteratorTy End)
Definition: STLExtras.h:1669
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:207
LLVM_ABI bool wouldInstructionBeTriviallyDead(const Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction would have no side effects if it was not used.
Definition: Local.cpp:421
LLVM_ABI void patchReplacementInstruction(Instruction *I, Value *Repl)
Patch the replacement so that it is not more restrictive than the value being replaced.
Definition: Local.cpp:3143
iterator_range< filter_iterator< detail::IterOfRange< RangeT >, PredicateT > > make_filter_range(RangeT &&Range, PredicateT Pred)
Convenience function that takes a range of elements and a predicate, and return a new filter_iterator...
Definition: STLExtras.h:581
@ Other
Any other memory.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
LLVM_ABI bool salvageKnowledge(Instruction *I, AssumptionCache *AC=nullptr, DominatorTree *DT=nullptr)
Calls BuildAssumeFromInst and if the resulting llvm.assume is valid insert if before I.
LLVM_ABI Value * simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a BinaryOperator, fold the result or return null.
DWARFExpression::Operation Op
OutputIt copy(R &&Range, OutputIt Out)
Definition: STLExtras.h:1854
iterator_range< df_iterator< T > > depth_first(const T &G)
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition: STLExtras.h:2127
LLVM_ABI Value * simplifyCmpInst(CmpPredicate Predicate, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a CmpInst, fold the result or return null.
LLVM_ABI bool isGuaranteedNotToBePoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be poison, but may be undef.
LLVM_ABI Constant * ConstantFoldInstOperands(const Instruction *I, ArrayRef< Constant * > Ops, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, bool AllowNonDeterministic=true)
ConstantFoldInstOperands - Attempt to constant fold an instruction with the specified operands.
LLVM_ABI Value * simplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal, const SimplifyQuery &Q)
Given operands for a SelectInst, fold the result or return null.
LLVM_ABI void findDbgUsers(Value *V, SmallVectorImpl< DbgVariableRecord * > &DbgVariableRecords)
Finds the debug info records describing a value.
Definition: DebugInfo.cpp:129
iterator_range< def_chain_iterator< T, true > > optimized_def_chain(T MA)
Definition: MemorySSA.h:1372
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:856
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:858
PointerIntPair< Value *, 1, bool > Def
Definition: NewGVN.cpp:3564
bool operator<(const ValueDFS &Other) const
Definition: NewGVN.cpp:3567
DOTGraphTraits - Template class that can be specialized to customize how graphs are converted to 'dot...
static unsigned getHashValue(const ExactEqualsExpression &E)
Definition: NewGVN.cpp:470
static unsigned getHashValue(const Expression *E)
Definition: NewGVN.cpp:466
static const Expression * getTombstoneKey()
Definition: NewGVN.cpp:460
static bool isEqual(const Expression *LHS, const Expression *RHS)
Definition: NewGVN.cpp:480
static const Expression * getEmptyKey()
Definition: NewGVN.cpp:454
static bool isEqual(const ExactEqualsExpression &LHS, const Expression *RHS)
Definition: NewGVN.cpp:474
An information struct used to provide DenseMap with the various necessary components for a given valu...
Definition: DenseMapInfo.h:54
ExactEqualsExpression(const Expression &E)
Definition: NewGVN.cpp:444
const Expression & E
Definition: NewGVN.cpp:442
hash_code getComputedHash() const
Definition: NewGVN.cpp:446
bool operator==(const Expression &Other) const
Definition: NewGVN.cpp:448
SimplifyQuery getWithInstruction(const Instruction *I) const
unsigned int LocalNum