1 //===- GVN.h - Eliminate redundant values and loads -------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
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.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_TRANSFORMS_SCALAR_GVN_H
16 #define LLVM_TRANSFORMS_SCALAR_GVN_H
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/AliasAnalysis.h"
24 #include "llvm/Analysis/InstructionPrecedenceTracking.h"
25 #include "llvm/Analysis/MemoryDependenceAnalysis.h"
26 #include "llvm/IR/Dominators.h"
27 #include "llvm/IR/InstrTypes.h"
28 #include "llvm/IR/PassManager.h"
29 #include "llvm/IR/ValueHandle.h"
30 #include "llvm/Support/Allocator.h"
31 #include "llvm/Support/Compiler.h"
38 class AssumptionCache
;
43 class ExtractValueInst
;
49 class OptimizationRemarkEmitter
;
51 class TargetLibraryInfo
;
54 /// A private "module" namespace for types and utilities used by GVN. These
55 /// are implementation details and should not be used by clients.
56 namespace gvn LLVM_LIBRARY_VISIBILITY
{
58 struct AvailableValue
;
59 struct AvailableValueInBlock
;
62 } // end namespace gvn
64 /// The core GVN pass object.
66 /// FIXME: We should have a good summary of the GVN algorithm implemented by
67 /// this particular pass here.
68 class GVN
: public PassInfoMixin
<GVN
> {
72 /// Run the pass over the function.
73 PreservedAnalyses
run(Function
&F
, FunctionAnalysisManager
&AM
);
75 /// This removes the specified instruction from
76 /// our various maps and marks it for deletion.
77 void markInstructionForDeletion(Instruction
*I
) {
79 InstrsToErase
.push_back(I
);
82 DominatorTree
&getDominatorTree() const { return *DT
; }
83 AliasAnalysis
*getAliasAnalysis() const { return VN
.getAliasAnalysis(); }
84 MemoryDependenceResults
&getMemDep() const { return *MD
; }
86 /// This class holds the mapping between values and value numbers. It is used
87 /// as an efficient mechanism to determine the expression-wise equivalence of
90 DenseMap
<Value
*, uint32_t> valueNumbering
;
91 DenseMap
<Expression
, uint32_t> expressionNumbering
;
93 // Expressions is the vector of Expression. ExprIdx is the mapping from
94 // value number to the index of Expression in Expressions. We use it
95 // instead of a DenseMap because filling such mapping is faster than
96 // filling a DenseMap and the compile time is a little better.
97 uint32_t nextExprNumber
;
99 std::vector
<Expression
> Expressions
;
100 std::vector
<uint32_t> ExprIdx
;
102 // Value number to PHINode mapping. Used for phi-translate in scalarpre.
103 DenseMap
<uint32_t, PHINode
*> NumberingPhi
;
105 // Cache for phi-translate in scalarpre.
106 using PhiTranslateMap
=
107 DenseMap
<std::pair
<uint32_t, const BasicBlock
*>, uint32_t>;
108 PhiTranslateMap PhiTranslateTable
;
111 MemoryDependenceResults
*MD
;
114 uint32_t nextValueNumber
= 1;
116 Expression
createExpr(Instruction
*I
);
117 Expression
createCmpExpr(unsigned Opcode
, CmpInst::Predicate Predicate
,
118 Value
*LHS
, Value
*RHS
);
119 Expression
createExtractvalueExpr(ExtractValueInst
*EI
);
120 uint32_t lookupOrAddCall(CallInst
*C
);
121 uint32_t phiTranslateImpl(const BasicBlock
*BB
, const BasicBlock
*PhiBlock
,
122 uint32_t Num
, GVN
&Gvn
);
123 bool areCallValsEqual(uint32_t Num
, uint32_t NewNum
, const BasicBlock
*Pred
,
124 const BasicBlock
*PhiBlock
, GVN
&Gvn
);
125 std::pair
<uint32_t, bool> assignExpNewValueNum(Expression
&exp
);
126 bool areAllValsInBB(uint32_t num
, const BasicBlock
*BB
, GVN
&Gvn
);
130 ValueTable(const ValueTable
&Arg
);
131 ValueTable(ValueTable
&&Arg
);
134 uint32_t lookupOrAdd(Value
*V
);
135 uint32_t lookup(Value
*V
, bool Verify
= true) const;
136 uint32_t lookupOrAddCmp(unsigned Opcode
, CmpInst::Predicate Pred
,
137 Value
*LHS
, Value
*RHS
);
138 uint32_t phiTranslate(const BasicBlock
*BB
, const BasicBlock
*PhiBlock
,
139 uint32_t Num
, GVN
&Gvn
);
140 void eraseTranslateCacheEntry(uint32_t Num
, const BasicBlock
&CurrBlock
);
141 bool exists(Value
*V
) const;
142 void add(Value
*V
, uint32_t num
);
144 void erase(Value
*v
);
145 void setAliasAnalysis(AliasAnalysis
*A
) { AA
= A
; }
146 AliasAnalysis
*getAliasAnalysis() const { return AA
; }
147 void setMemDep(MemoryDependenceResults
*M
) { MD
= M
; }
148 void setDomTree(DominatorTree
*D
) { DT
= D
; }
149 uint32_t getNextUnusedValueNumber() { return nextValueNumber
; }
150 void verifyRemoved(const Value
*) const;
154 friend class gvn::GVNLegacyPass
;
155 friend struct DenseMapInfo
<Expression
>;
157 MemoryDependenceResults
*MD
;
159 const TargetLibraryInfo
*TLI
;
161 SetVector
<BasicBlock
*> DeadBlocks
;
162 OptimizationRemarkEmitter
*ORE
;
163 ImplicitControlFlowTracking
*ICF
;
168 /// A mapping from value numbers to lists of Value*'s that
169 /// have that value number. Use findLeader to query it.
170 struct LeaderTableEntry
{
172 const BasicBlock
*BB
;
173 LeaderTableEntry
*Next
;
175 DenseMap
<uint32_t, LeaderTableEntry
> LeaderTable
;
176 BumpPtrAllocator TableAllocator
;
178 // Block-local map of equivalent values to their leader, does not
179 // propagate to any successors. Entries added mid-block are applied
180 // to the remaining instructions in the block.
181 SmallMapVector
<Value
*, Value
*, 4> ReplaceOperandsWithMap
;
182 SmallVector
<Instruction
*, 8> InstrsToErase
;
184 // Map the block to reversed postorder traversal number. It is used to
185 // find back edge easily.
186 DenseMap
<AssertingVH
<BasicBlock
>, uint32_t> BlockRPONumber
;
188 // This is set 'true' initially and also when new blocks have been added to
189 // the function being analyzed. This boolean is used to control the updating
190 // of BlockRPONumber prior to accessing the contents of BlockRPONumber.
191 bool InvalidBlockRPONumbers
= true;
193 using LoadDepVect
= SmallVector
<NonLocalDepResult
, 64>;
194 using AvailValInBlkVect
= SmallVector
<gvn::AvailableValueInBlock
, 64>;
195 using UnavailBlkVect
= SmallVector
<BasicBlock
*, 64>;
197 bool runImpl(Function
&F
, AssumptionCache
&RunAC
, DominatorTree
&RunDT
,
198 const TargetLibraryInfo
&RunTLI
, AAResults
&RunAA
,
199 MemoryDependenceResults
*RunMD
, LoopInfo
*LI
,
200 OptimizationRemarkEmitter
*ORE
);
202 /// Push a new Value to the LeaderTable onto the list for its value number.
203 void addToLeaderTable(uint32_t N
, Value
*V
, const BasicBlock
*BB
) {
204 LeaderTableEntry
&Curr
= LeaderTable
[N
];
211 LeaderTableEntry
*Node
= TableAllocator
.Allocate
<LeaderTableEntry
>();
214 Node
->Next
= Curr
.Next
;
218 /// Scan the list of values corresponding to a given
219 /// value number, and remove the given instruction if encountered.
220 void removeFromLeaderTable(uint32_t N
, Instruction
*I
, BasicBlock
*BB
) {
221 LeaderTableEntry
*Prev
= nullptr;
222 LeaderTableEntry
*Curr
= &LeaderTable
[N
];
224 while (Curr
&& (Curr
->Val
!= I
|| Curr
->BB
!= BB
)) {
233 Prev
->Next
= Curr
->Next
;
239 LeaderTableEntry
*Next
= Curr
->Next
;
240 Curr
->Val
= Next
->Val
;
242 Curr
->Next
= Next
->Next
;
247 // List of critical edges to be split between iterations.
248 SmallVector
<std::pair
<Instruction
*, unsigned>, 4> toSplit
;
250 // Helper functions of redundant load elimination
251 bool processLoad(LoadInst
*L
);
252 bool processNonLocalLoad(LoadInst
*L
);
253 bool processAssumeIntrinsic(IntrinsicInst
*II
);
255 /// Given a local dependency (Def or Clobber) determine if a value is
256 /// available for the load. Returns true if an value is known to be
257 /// available and populates Res. Returns false otherwise.
258 bool AnalyzeLoadAvailability(LoadInst
*LI
, MemDepResult DepInfo
,
259 Value
*Address
, gvn::AvailableValue
&Res
);
261 /// Given a list of non-local dependencies, determine if a value is
262 /// available for the load in each specified block. If it is, add it to
263 /// ValuesPerBlock. If not, add it to UnavailableBlocks.
264 void AnalyzeLoadAvailability(LoadInst
*LI
, LoadDepVect
&Deps
,
265 AvailValInBlkVect
&ValuesPerBlock
,
266 UnavailBlkVect
&UnavailableBlocks
);
268 bool PerformLoadPRE(LoadInst
*LI
, AvailValInBlkVect
&ValuesPerBlock
,
269 UnavailBlkVect
&UnavailableBlocks
);
271 // Other helper routines
272 bool processInstruction(Instruction
*I
);
273 bool processBlock(BasicBlock
*BB
);
274 void dump(DenseMap
<uint32_t, Value
*> &d
) const;
275 bool iterateOnFunction(Function
&F
);
276 bool performPRE(Function
&F
);
277 bool performScalarPRE(Instruction
*I
);
278 bool performScalarPREInsertion(Instruction
*Instr
, BasicBlock
*Pred
,
279 BasicBlock
*Curr
, unsigned int ValNo
);
280 Value
*findLeader(const BasicBlock
*BB
, uint32_t num
);
281 void cleanupGlobalSets();
282 void fillImplicitControlFlowInfo(BasicBlock
*BB
);
283 void verifyRemoved(const Instruction
*I
) const;
284 bool splitCriticalEdges();
285 BasicBlock
*splitCriticalEdges(BasicBlock
*Pred
, BasicBlock
*Succ
);
286 bool replaceOperandsForInBlockEquality(Instruction
*I
) const;
287 bool propagateEquality(Value
*LHS
, Value
*RHS
, const BasicBlockEdge
&Root
,
288 bool DominatesByEdge
);
289 bool processFoldableCondBr(BranchInst
*BI
);
290 void addDeadBlock(BasicBlock
*BB
);
291 void assignValNumForDeadCode();
292 void assignBlockRPONumber(Function
&F
);
295 /// Create a legacy GVN pass. This also allows parameterizing whether or not
296 /// loads are eliminated by the pass.
297 FunctionPass
*createGVNPass(bool NoLoads
= false);
299 /// A simple and fast domtree-based GVN pass to hoist common expressions
300 /// from sibling branches.
301 struct GVNHoistPass
: PassInfoMixin
<GVNHoistPass
> {
302 /// Run the pass over the function.
303 PreservedAnalyses
run(Function
&F
, FunctionAnalysisManager
&AM
);
306 /// Uses an "inverted" value numbering to decide the similarity of
307 /// expressions and sinks similar expressions into successors.
308 struct GVNSinkPass
: PassInfoMixin
<GVNSinkPass
> {
309 /// Run the pass over the function.
310 PreservedAnalyses
run(Function
&F
, FunctionAnalysisManager
&AM
);
313 } // end namespace llvm
315 #endif // LLVM_TRANSFORMS_SCALAR_GVN_H