]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/include/llvm/Transforms/Scalar/GVN.h
Update lld to trunk r290819 and resolve conflicts.
[FreeBSD/FreeBSD.git] / contrib / llvm / include / llvm / Transforms / Scalar / GVN.h
1 //===- GVN.h - Eliminate redundant values and loads -------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 /// \file
10 /// This file provides the interface for LLVM's Global Value Numbering pass
11 /// which eliminates fully redundant instructions. It also does somewhat Ad-Hoc
12 /// PRE and dead load elimination.
13 ///
14 //===----------------------------------------------------------------------===//
15
16 #ifndef LLVM_TRANSFORMS_SCALAR_GVN_H
17 #define LLVM_TRANSFORMS_SCALAR_GVN_H
18
19 #include "llvm/ADT/DenseMap.h"
20 #include "llvm/ADT/MapVector.h"
21 #include "llvm/ADT/SetVector.h"
22 #include "llvm/ADT/SmallPtrSet.h"
23 #include "llvm/Analysis/AliasAnalysis.h"
24 #include "llvm/Analysis/AssumptionCache.h"
25 #include "llvm/Analysis/LoopInfo.h"
26 #include "llvm/Analysis/MemoryDependenceAnalysis.h"
27 #include "llvm/IR/Dominators.h"
28 #include "llvm/IR/IntrinsicInst.h"
29 #include "llvm/IR/PassManager.h"
30
31 namespace llvm {
32 class OptimizationRemarkEmitter;
33
34 /// A private "module" namespace for types and utilities used by GVN. These
35 /// are implementation details and should not be used by clients.
36 namespace gvn LLVM_LIBRARY_VISIBILITY {
37 struct AvailableValue;
38 struct AvailableValueInBlock;
39 class GVNLegacyPass;
40 }
41
42 /// The core GVN pass object.
43 ///
44 /// FIXME: We should have a good summary of the GVN algorithm implemented by
45 /// this particular pass here.
46 class GVN : public PassInfoMixin<GVN> {
47 public:
48
49   /// \brief Run the pass over the function.
50   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
51
52   /// This removes the specified instruction from
53   /// our various maps and marks it for deletion.
54   void markInstructionForDeletion(Instruction *I) {
55     VN.erase(I);
56     InstrsToErase.push_back(I);
57   }
58
59   DominatorTree &getDominatorTree() const { return *DT; }
60   AliasAnalysis *getAliasAnalysis() const { return VN.getAliasAnalysis(); }
61   MemoryDependenceResults &getMemDep() const { return *MD; }
62
63   struct Expression;
64
65   /// This class holds the mapping between values and value numbers.  It is used
66   /// as an efficient mechanism to determine the expression-wise equivalence of
67   /// two values.
68   class ValueTable {
69     DenseMap<Value *, uint32_t> valueNumbering;
70     DenseMap<Expression, uint32_t> expressionNumbering;
71     AliasAnalysis *AA;
72     MemoryDependenceResults *MD;
73     DominatorTree *DT;
74
75     uint32_t nextValueNumber;
76
77     Expression createExpr(Instruction *I);
78     Expression createCmpExpr(unsigned Opcode, CmpInst::Predicate Predicate,
79                              Value *LHS, Value *RHS);
80     Expression createExtractvalueExpr(ExtractValueInst *EI);
81     uint32_t lookupOrAddCall(CallInst *C);
82
83   public:
84     ValueTable();
85     ValueTable(const ValueTable &Arg);
86     ValueTable(ValueTable &&Arg);
87     ~ValueTable();
88
89     uint32_t lookupOrAdd(Value *V);
90     uint32_t lookup(Value *V) const;
91     uint32_t lookupOrAddCmp(unsigned Opcode, CmpInst::Predicate Pred,
92                             Value *LHS, Value *RHS);
93     bool exists(Value *V) const;
94     void add(Value *V, uint32_t num);
95     void clear();
96     void erase(Value *v);
97     void setAliasAnalysis(AliasAnalysis *A) { AA = A; }
98     AliasAnalysis *getAliasAnalysis() const { return AA; }
99     void setMemDep(MemoryDependenceResults *M) { MD = M; }
100     void setDomTree(DominatorTree *D) { DT = D; }
101     uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
102     void verifyRemoved(const Value *) const;
103   };
104
105 private:
106   friend class gvn::GVNLegacyPass;
107   friend struct DenseMapInfo<Expression>;
108
109   MemoryDependenceResults *MD;
110   DominatorTree *DT;
111   const TargetLibraryInfo *TLI;
112   AssumptionCache *AC;
113   SetVector<BasicBlock *> DeadBlocks;
114   OptimizationRemarkEmitter *ORE;
115
116   ValueTable VN;
117
118   /// A mapping from value numbers to lists of Value*'s that
119   /// have that value number.  Use findLeader to query it.
120   struct LeaderTableEntry {
121     Value *Val;
122     const BasicBlock *BB;
123     LeaderTableEntry *Next;
124   };
125   DenseMap<uint32_t, LeaderTableEntry> LeaderTable;
126   BumpPtrAllocator TableAllocator;
127
128   // Block-local map of equivalent values to their leader, does not
129   // propagate to any successors. Entries added mid-block are applied
130   // to the remaining instructions in the block.
131   SmallMapVector<llvm::Value *, llvm::Constant *, 4> ReplaceWithConstMap;
132   SmallVector<Instruction *, 8> InstrsToErase;
133
134   typedef SmallVector<NonLocalDepResult, 64> LoadDepVect;
135   typedef SmallVector<gvn::AvailableValueInBlock, 64> AvailValInBlkVect;
136   typedef SmallVector<BasicBlock *, 64> UnavailBlkVect;
137
138   bool runImpl(Function &F, AssumptionCache &RunAC, DominatorTree &RunDT,
139                const TargetLibraryInfo &RunTLI, AAResults &RunAA,
140                MemoryDependenceResults *RunMD, LoopInfo *LI,
141                OptimizationRemarkEmitter *ORE);
142
143   /// Push a new Value to the LeaderTable onto the list for its value number.
144   void addToLeaderTable(uint32_t N, Value *V, const BasicBlock *BB) {
145     LeaderTableEntry &Curr = LeaderTable[N];
146     if (!Curr.Val) {
147       Curr.Val = V;
148       Curr.BB = BB;
149       return;
150     }
151
152     LeaderTableEntry *Node = TableAllocator.Allocate<LeaderTableEntry>();
153     Node->Val = V;
154     Node->BB = BB;
155     Node->Next = Curr.Next;
156     Curr.Next = Node;
157   }
158
159   /// Scan the list of values corresponding to a given
160   /// value number, and remove the given instruction if encountered.
161   void removeFromLeaderTable(uint32_t N, Instruction *I, BasicBlock *BB) {
162     LeaderTableEntry *Prev = nullptr;
163     LeaderTableEntry *Curr = &LeaderTable[N];
164
165     while (Curr && (Curr->Val != I || Curr->BB != BB)) {
166       Prev = Curr;
167       Curr = Curr->Next;
168     }
169
170     if (!Curr)
171       return;
172
173     if (Prev) {
174       Prev->Next = Curr->Next;
175     } else {
176       if (!Curr->Next) {
177         Curr->Val = nullptr;
178         Curr->BB = nullptr;
179       } else {
180         LeaderTableEntry *Next = Curr->Next;
181         Curr->Val = Next->Val;
182         Curr->BB = Next->BB;
183         Curr->Next = Next->Next;
184       }
185     }
186   }
187
188   // List of critical edges to be split between iterations.
189   SmallVector<std::pair<TerminatorInst *, unsigned>, 4> toSplit;
190
191   // Helper functions of redundant load elimination
192   bool processLoad(LoadInst *L);
193   bool processNonLocalLoad(LoadInst *L);
194   bool processAssumeIntrinsic(IntrinsicInst *II);
195   /// Given a local dependency (Def or Clobber) determine if a value is
196   /// available for the load.  Returns true if an value is known to be
197   /// available and populates Res.  Returns false otherwise.
198   bool AnalyzeLoadAvailability(LoadInst *LI, MemDepResult DepInfo,
199                                Value *Address, gvn::AvailableValue &Res);
200   /// Given a list of non-local dependencies, determine if a value is
201   /// available for the load in each specified block.  If it is, add it to
202   /// ValuesPerBlock.  If not, add it to UnavailableBlocks.
203   void AnalyzeLoadAvailability(LoadInst *LI, LoadDepVect &Deps,
204                                AvailValInBlkVect &ValuesPerBlock,
205                                UnavailBlkVect &UnavailableBlocks);
206   bool PerformLoadPRE(LoadInst *LI, AvailValInBlkVect &ValuesPerBlock,
207                       UnavailBlkVect &UnavailableBlocks);
208
209   // Other helper routines
210   bool processInstruction(Instruction *I);
211   bool processBlock(BasicBlock *BB);
212   void dump(DenseMap<uint32_t, Value *> &d);
213   bool iterateOnFunction(Function &F);
214   bool performPRE(Function &F);
215   bool performScalarPRE(Instruction *I);
216   bool performScalarPREInsertion(Instruction *Instr, BasicBlock *Pred,
217                                  unsigned int ValNo);
218   Value *findLeader(const BasicBlock *BB, uint32_t num);
219   void cleanupGlobalSets();
220   void verifyRemoved(const Instruction *I) const;
221   bool splitCriticalEdges();
222   BasicBlock *splitCriticalEdges(BasicBlock *Pred, BasicBlock *Succ);
223   bool replaceOperandsWithConsts(Instruction *I) const;
224   bool propagateEquality(Value *LHS, Value *RHS, const BasicBlockEdge &Root,
225                          bool DominatesByEdge);
226   bool processFoldableCondBr(BranchInst *BI);
227   void addDeadBlock(BasicBlock *BB);
228   void assignValNumForDeadCode();
229 };
230
231 /// Create a legacy GVN pass. This also allows parameterizing whether or not
232 /// loads are eliminated by the pass.
233 FunctionPass *createGVNPass(bool NoLoads = false);
234
235 /// \brief A simple and fast domtree-based GVN pass to hoist common expressions
236 /// from sibling branches.
237 struct GVNHoistPass : PassInfoMixin<GVNHoistPass> {
238   /// \brief Run the pass over the function.
239   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
240 };
241
242 }
243
244 #endif