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