• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- GVN.h - Eliminate redundant values and loads -------------*- C++ -*-===//
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 /// \file
9 /// This file provides the interface for LLVM's Global Value Numbering pass
10 /// which eliminates fully redundant instructions. It also does somewhat Ad-Hoc
11 /// PRE and dead load elimination.
12 ///
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_TRANSFORMS_SCALAR_GVN_H
16 #define LLVM_TRANSFORMS_SCALAR_GVN_H
17 
18 #include "llvm/ADT/DenseMap.h"
19 #include "llvm/ADT/MapVector.h"
20 #include "llvm/ADT/PostOrderIterator.h"
21 #include "llvm/ADT/SetVector.h"
22 #include "llvm/ADT/SmallVector.h"
23 #include "llvm/Analysis/InstructionPrecedenceTracking.h"
24 #include "llvm/Analysis/MemoryDependenceAnalysis.h"
25 #include "llvm/IR/Dominators.h"
26 #include "llvm/IR/InstrTypes.h"
27 #include "llvm/IR/PassManager.h"
28 #include "llvm/IR/ValueHandle.h"
29 #include "llvm/Support/Allocator.h"
30 #include "llvm/Support/Compiler.h"
31 #include <cstdint>
32 #include <utility>
33 #include <vector>
34 
35 namespace llvm {
36 
37 class AAResults;
38 class AssumptionCache;
39 class BasicBlock;
40 class BranchInst;
41 class CallInst;
42 class Constant;
43 class ExtractValueInst;
44 class Function;
45 class FunctionPass;
46 class IntrinsicInst;
47 class LoadInst;
48 class LoopInfo;
49 class MemorySSA;
50 class MemorySSAUpdater;
51 class OptimizationRemarkEmitter;
52 class PHINode;
53 class TargetLibraryInfo;
54 class Value;
55 /// A private "module" namespace for types and utilities used by GVN. These
56 /// are implementation details and should not be used by clients.
57 namespace gvn LLVM_LIBRARY_VISIBILITY {
58 
59 struct AvailableValue;
60 struct AvailableValueInBlock;
61 class GVNLegacyPass;
62 
63 } // end namespace gvn
64 
65 /// A set of parameters to control various transforms performed by GVN pass.
66 //  Each of the optional boolean parameters can be set to:
67 ///      true - enabling the transformation.
68 ///      false - disabling the transformation.
69 ///      None - relying on a global default.
70 /// Intended use is to create a default object, modify parameters with
71 /// additional setters and then pass it to GVN.
72 struct GVNOptions {
73   Optional<bool> AllowPRE = None;
74   Optional<bool> AllowLoadPRE = None;
75   Optional<bool> AllowLoadInLoopPRE = None;
76   Optional<bool> AllowLoadPRESplitBackedge = None;
77   Optional<bool> AllowMemDep = None;
78 
79   GVNOptions() = default;
80 
81   /// Enables or disables PRE in GVN.
setPREGVNOptions82   GVNOptions &setPRE(bool PRE) {
83     AllowPRE = PRE;
84     return *this;
85   }
86 
87   /// Enables or disables PRE of loads in GVN.
setLoadPREGVNOptions88   GVNOptions &setLoadPRE(bool LoadPRE) {
89     AllowLoadPRE = LoadPRE;
90     return *this;
91   }
92 
setLoadInLoopPREGVNOptions93   GVNOptions &setLoadInLoopPRE(bool LoadInLoopPRE) {
94     AllowLoadInLoopPRE = LoadInLoopPRE;
95     return *this;
96   }
97 
98   /// Enables or disables PRE of loads in GVN.
setLoadPRESplitBackedgeGVNOptions99   GVNOptions &setLoadPRESplitBackedge(bool LoadPRESplitBackedge) {
100     AllowLoadPRESplitBackedge = LoadPRESplitBackedge;
101     return *this;
102   }
103 
104   /// Enables or disables use of MemDepAnalysis.
setMemDepGVNOptions105   GVNOptions &setMemDep(bool MemDep) {
106     AllowMemDep = MemDep;
107     return *this;
108   }
109 };
110 
111 /// The core GVN pass object.
112 ///
113 /// FIXME: We should have a good summary of the GVN algorithm implemented by
114 /// this particular pass here.
115 class GVN : public PassInfoMixin<GVN> {
116   GVNOptions Options;
117 
118 public:
119   struct Expression;
120 
Options(Options)121   GVN(GVNOptions Options = {}) : Options(Options) {}
122 
123   /// Run the pass over the function.
124   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
125 
126   /// This removes the specified instruction from
127   /// our various maps and marks it for deletion.
markInstructionForDeletion(Instruction * I)128   void markInstructionForDeletion(Instruction *I) {
129     VN.erase(I);
130     InstrsToErase.push_back(I);
131   }
132 
getDominatorTree()133   DominatorTree &getDominatorTree() const { return *DT; }
getAliasAnalysis()134   AAResults *getAliasAnalysis() const { return VN.getAliasAnalysis(); }
getMemDep()135   MemoryDependenceResults &getMemDep() const { return *MD; }
136 
137   bool isPREEnabled() const;
138   bool isLoadPREEnabled() const;
139   bool isLoadInLoopPREEnabled() const;
140   bool isLoadPRESplitBackedgeEnabled() const;
141   bool isMemDepEnabled() const;
142 
143   /// This class holds the mapping between values and value numbers.  It is used
144   /// as an efficient mechanism to determine the expression-wise equivalence of
145   /// two values.
146   class ValueTable {
147     DenseMap<Value *, uint32_t> valueNumbering;
148     DenseMap<Expression, uint32_t> expressionNumbering;
149 
150     // Expressions is the vector of Expression. ExprIdx is the mapping from
151     // value number to the index of Expression in Expressions. We use it
152     // instead of a DenseMap because filling such mapping is faster than
153     // filling a DenseMap and the compile time is a little better.
154     uint32_t nextExprNumber = 0;
155 
156     std::vector<Expression> Expressions;
157     std::vector<uint32_t> ExprIdx;
158 
159     // Value number to PHINode mapping. Used for phi-translate in scalarpre.
160     DenseMap<uint32_t, PHINode *> NumberingPhi;
161 
162     // Cache for phi-translate in scalarpre.
163     using PhiTranslateMap =
164         DenseMap<std::pair<uint32_t, const BasicBlock *>, uint32_t>;
165     PhiTranslateMap PhiTranslateTable;
166 
167     AAResults *AA = nullptr;
168     MemoryDependenceResults *MD = nullptr;
169     DominatorTree *DT = nullptr;
170 
171     uint32_t nextValueNumber = 1;
172 
173     Expression createExpr(Instruction *I);
174     Expression createCmpExpr(unsigned Opcode, CmpInst::Predicate Predicate,
175                              Value *LHS, Value *RHS);
176     Expression createExtractvalueExpr(ExtractValueInst *EI);
177     uint32_t lookupOrAddCall(CallInst *C);
178     uint32_t phiTranslateImpl(const BasicBlock *BB, const BasicBlock *PhiBlock,
179                               uint32_t Num, GVN &Gvn);
180     bool areCallValsEqual(uint32_t Num, uint32_t NewNum, const BasicBlock *Pred,
181                           const BasicBlock *PhiBlock, GVN &Gvn);
182     std::pair<uint32_t, bool> assignExpNewValueNum(Expression &exp);
183     bool areAllValsInBB(uint32_t num, const BasicBlock *BB, GVN &Gvn);
184 
185   public:
186     ValueTable();
187     ValueTable(const ValueTable &Arg);
188     ValueTable(ValueTable &&Arg);
189     ~ValueTable();
190     ValueTable &operator=(const ValueTable &Arg);
191 
192     uint32_t lookupOrAdd(Value *V);
193     uint32_t lookup(Value *V, bool Verify = true) const;
194     uint32_t lookupOrAddCmp(unsigned Opcode, CmpInst::Predicate Pred,
195                             Value *LHS, Value *RHS);
196     uint32_t phiTranslate(const BasicBlock *BB, const BasicBlock *PhiBlock,
197                           uint32_t Num, GVN &Gvn);
198     void eraseTranslateCacheEntry(uint32_t Num, const BasicBlock &CurrBlock);
199     bool exists(Value *V) const;
200     void add(Value *V, uint32_t num);
201     void clear();
202     void erase(Value *v);
setAliasAnalysis(AAResults * A)203     void setAliasAnalysis(AAResults *A) { AA = A; }
getAliasAnalysis()204     AAResults *getAliasAnalysis() const { return AA; }
setMemDep(MemoryDependenceResults * M)205     void setMemDep(MemoryDependenceResults *M) { MD = M; }
setDomTree(DominatorTree * D)206     void setDomTree(DominatorTree *D) { DT = D; }
getNextUnusedValueNumber()207     uint32_t getNextUnusedValueNumber() { return nextValueNumber; }
208     void verifyRemoved(const Value *) const;
209   };
210 
211 private:
212   friend class gvn::GVNLegacyPass;
213   friend struct DenseMapInfo<Expression>;
214 
215   MemoryDependenceResults *MD = nullptr;
216   DominatorTree *DT = nullptr;
217   const TargetLibraryInfo *TLI = nullptr;
218   AssumptionCache *AC = nullptr;
219   SetVector<BasicBlock *> DeadBlocks;
220   OptimizationRemarkEmitter *ORE = nullptr;
221   ImplicitControlFlowTracking *ICF = nullptr;
222   LoopInfo *LI = nullptr;
223   MemorySSAUpdater *MSSAU = nullptr;
224 
225   ValueTable VN;
226 
227   /// A mapping from value numbers to lists of Value*'s that
228   /// have that value number.  Use findLeader to query it.
229   struct LeaderTableEntry {
230     Value *Val;
231     const BasicBlock *BB;
232     LeaderTableEntry *Next;
233   };
234   DenseMap<uint32_t, LeaderTableEntry> LeaderTable;
235   BumpPtrAllocator TableAllocator;
236 
237   // Block-local map of equivalent values to their leader, does not
238   // propagate to any successors. Entries added mid-block are applied
239   // to the remaining instructions in the block.
240   SmallMapVector<Value *, Value *, 4> ReplaceOperandsWithMap;
241   SmallVector<Instruction *, 8> InstrsToErase;
242 
243   // Map the block to reversed postorder traversal number. It is used to
244   // find back edge easily.
245   DenseMap<AssertingVH<BasicBlock>, uint32_t> BlockRPONumber;
246 
247   // This is set 'true' initially and also when new blocks have been added to
248   // the function being analyzed. This boolean is used to control the updating
249   // of BlockRPONumber prior to accessing the contents of BlockRPONumber.
250   bool InvalidBlockRPONumbers = true;
251 
252   using LoadDepVect = SmallVector<NonLocalDepResult, 64>;
253   using AvailValInBlkVect = SmallVector<gvn::AvailableValueInBlock, 64>;
254   using UnavailBlkVect = SmallVector<BasicBlock *, 64>;
255 
256   bool runImpl(Function &F, AssumptionCache &RunAC, DominatorTree &RunDT,
257                const TargetLibraryInfo &RunTLI, AAResults &RunAA,
258                MemoryDependenceResults *RunMD, LoopInfo *LI,
259                OptimizationRemarkEmitter *ORE, MemorySSA *MSSA = nullptr);
260 
261   /// Push a new Value to the LeaderTable onto the list for its value number.
262   void addToLeaderTable(uint32_t N, Value *V, const BasicBlock *BB) {
263     LeaderTableEntry &Curr = LeaderTable[N];
264     if (!Curr.Val) {
265       Curr.Val = V;
266       Curr.BB = BB;
267       return;
268     }
269 
270     LeaderTableEntry *Node = TableAllocator.Allocate<LeaderTableEntry>();
271     Node->Val = V;
272     Node->BB = BB;
273     Node->Next = Curr.Next;
274     Curr.Next = Node;
275   }
276 
277   /// Scan the list of values corresponding to a given
278   /// value number, and remove the given instruction if encountered.
279   void removeFromLeaderTable(uint32_t N, Instruction *I, BasicBlock *BB) {
280     LeaderTableEntry *Prev = nullptr;
281     LeaderTableEntry *Curr = &LeaderTable[N];
282 
283     while (Curr && (Curr->Val != I || Curr->BB != BB)) {
284       Prev = Curr;
285       Curr = Curr->Next;
286     }
287 
288     if (!Curr)
289       return;
290 
291     if (Prev) {
292       Prev->Next = Curr->Next;
293     } else {
294       if (!Curr->Next) {
295         Curr->Val = nullptr;
296         Curr->BB = nullptr;
297       } else {
298         LeaderTableEntry *Next = Curr->Next;
299         Curr->Val = Next->Val;
300         Curr->BB = Next->BB;
301         Curr->Next = Next->Next;
302       }
303     }
304   }
305 
306   // List of critical edges to be split between iterations.
307   SmallVector<std::pair<Instruction *, unsigned>, 4> toSplit;
308 
309   // Helper functions of redundant load elimination
310   bool processLoad(LoadInst *L);
311   bool processNonLocalLoad(LoadInst *L);
312   bool processAssumeIntrinsic(IntrinsicInst *II);
313 
314   /// Given a local dependency (Def or Clobber) determine if a value is
315   /// available for the load.  Returns true if an value is known to be
316   /// available and populates Res.  Returns false otherwise.
317   bool AnalyzeLoadAvailability(LoadInst *LI, MemDepResult DepInfo,
318                                Value *Address, gvn::AvailableValue &Res);
319 
320   /// Given a list of non-local dependencies, determine if a value is
321   /// available for the load in each specified block.  If it is, add it to
322   /// ValuesPerBlock.  If not, add it to UnavailableBlocks.
323   void AnalyzeLoadAvailability(LoadInst *LI, LoadDepVect &Deps,
324                                AvailValInBlkVect &ValuesPerBlock,
325                                UnavailBlkVect &UnavailableBlocks);
326 
327   bool PerformLoadPRE(LoadInst *LI, AvailValInBlkVect &ValuesPerBlock,
328                       UnavailBlkVect &UnavailableBlocks);
329 
330   // Other helper routines
331   bool processInstruction(Instruction *I);
332   bool processBlock(BasicBlock *BB);
333   void dump(DenseMap<uint32_t, Value *> &d) const;
334   bool iterateOnFunction(Function &F);
335   bool performPRE(Function &F);
336   bool performScalarPRE(Instruction *I);
337   bool performScalarPREInsertion(Instruction *Instr, BasicBlock *Pred,
338                                  BasicBlock *Curr, unsigned int ValNo);
339   Value *findLeader(const BasicBlock *BB, uint32_t num);
340   void cleanupGlobalSets();
341   void verifyRemoved(const Instruction *I) const;
342   bool splitCriticalEdges();
343   BasicBlock *splitCriticalEdges(BasicBlock *Pred, BasicBlock *Succ);
344   bool replaceOperandsForInBlockEquality(Instruction *I) const;
345   bool propagateEquality(Value *LHS, Value *RHS, const BasicBlockEdge &Root,
346                          bool DominatesByEdge);
347   bool processFoldableCondBr(BranchInst *BI);
348   void addDeadBlock(BasicBlock *BB);
349   void assignValNumForDeadCode();
350   void assignBlockRPONumber(Function &F);
351 };
352 
353 /// Create a legacy GVN pass. This also allows parameterizing whether or not
354 /// MemDep is enabled.
355 FunctionPass *createGVNPass(bool NoMemDepAnalysis = false);
356 
357 /// A simple and fast domtree-based GVN pass to hoist common expressions
358 /// from sibling branches.
359 struct GVNHoistPass : PassInfoMixin<GVNHoistPass> {
360   /// Run the pass over the function.
361   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
362 };
363 
364 /// Uses an "inverted" value numbering to decide the similarity of
365 /// expressions and sinks similar expressions into successors.
366 struct GVNSinkPass : PassInfoMixin<GVNSinkPass> {
367   /// Run the pass over the function.
368   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
369 };
370 
371 } // end namespace llvm
372 
373 #endif // LLVM_TRANSFORMS_SCALAR_GVN_H
374