15#ifndef LLVM_TRANSFORMS_SCALAR_GVN_H
16#define LLVM_TRANSFORMS_SCALAR_GVN_H
140 function_ref<StringRef(StringRef)> MapClassName2PassName);
170 std::vector<Expression> Expressions;
171 std::vector<uint32_t> ExprIdx;
181 using PhiTranslateMap =
183 PhiTranslateMap PhiTranslateTable;
187 bool IsMDEnabled =
false;
189 bool IsMSSAEnabled =
false;
205 std::pair<uint32_t, bool> assignExpNewValueNum(
Expression &Exp);
234 IsMDEnabled = MDEnabled;
238 IsMSSAEnabled = MSSAEnabled;
271 struct LeaderListNode {
273 LeaderListNode *
Next;
280 const LeaderListNode *Current;
291 assert(Current &&
"Dereferenced end of leader list!");
292 Current = Current->Next;
296 return Current ==
Other.Current;
299 return Current !=
Other.Current;
305 auto I = NumToLeaders.
find(
N);
306 if (
I == NumToLeaders.
end()) {
308 leader_iterator(
nullptr));
312 leader_iterator(
nullptr));
317 LLVM_ABI void verifyRemoved(
const Value *Inst)
const;
319 NumToLeaders.
clear();
320 TableAllocator.
Reset();
323 LeaderMap LeaderTable;
328 SmallMapVector<Value *, Value *, 4> ReplaceOperandsWithMap;
332 DenseMap<AssertingVH<BasicBlock>, uint32_t> BlockRPONumber;
337 bool InvalidBlockRPONumbers =
true;
339 using LoadDepVect = SmallVector<NonLocalDepResult, 64>;
340 using AvailValInBlkVect = SmallVector<gvn::AvailableValueInBlock, 64>;
341 using UnavailBlkVect = SmallVector<BasicBlock *, 64>;
343 bool runImpl(Function &
F, AssumptionCache &RunAC, DominatorTree &RunDT,
344 const TargetLibraryInfo &RunTLI, AAResults &RunAA,
345 MemoryDependenceResults *RunMD, LoopInfo &LI,
346 OptimizationRemarkEmitter *ORE,
MemorySSA *MSSA =
nullptr);
352 bool processLoad(LoadInst *L);
353 bool processMaskedLoad(IntrinsicInst *
I);
354 bool processNonLocalLoad(LoadInst *L);
355 bool processAssumeIntrinsic(AssumeInst *
II);
359 std::optional<gvn::AvailableValue>
360 AnalyzeLoadAvailability(LoadInst *Load, MemDepResult DepInfo,
Value *
Address);
365 void AnalyzeLoadAvailability(LoadInst *Load, LoadDepVect &Deps,
366 AvailValInBlkVect &ValuesPerBlock,
367 UnavailBlkVect &UnavailableBlocks);
371 LoadInst *findLoadToHoistIntoPred(BasicBlock *Pred, BasicBlock *LoadBB,
374 bool PerformLoadPRE(LoadInst *Load, AvailValInBlkVect &ValuesPerBlock,
375 UnavailBlkVect &UnavailableBlocks);
380 bool performLoopLoadPRE(LoadInst *Load, AvailValInBlkVect &ValuesPerBlock,
381 UnavailBlkVect &UnavailableBlocks);
385 void eliminatePartiallyRedundantLoad(
386 LoadInst *Load, AvailValInBlkVect &ValuesPerBlock,
387 MapVector<BasicBlock *, Value *> &AvailableLoads,
388 MapVector<BasicBlock *, LoadInst *> *CriticalEdgePredAndLoad);
391 bool processInstruction(Instruction *
I);
392 bool processBlock(BasicBlock *BB);
393 void dump(DenseMap<uint32_t, Value *> &Map)
const;
394 bool iterateOnFunction(Function &
F);
395 bool performPRE(Function &
F);
396 bool performScalarPRE(Instruction *
I);
397 bool performScalarPREInsertion(Instruction *Instr, BasicBlock *Pred,
398 BasicBlock *Curr,
unsigned int ValNo);
399 Value *findLeader(
const BasicBlock *BB, uint32_t Num);
400 void cleanupGlobalSets();
401 void removeInstruction(Instruction *
I);
402 void verifyRemoved(
const Instruction *
I)
const;
403 bool splitCriticalEdges();
404 BasicBlock *splitCriticalEdges(BasicBlock *Pred, BasicBlock *Succ);
405 bool replaceOperandsForInBlockEquality(Instruction *
I)
const;
407 bool DominatesByEdge);
408 bool processFoldableCondBr(BranchInst *BI);
409 void addDeadBlock(BasicBlock *BB);
410 void assignValNumForDeadCode();
411 void assignBlockRPONumber(Function &
F);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the BumpPtrAllocator interface.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
#define LLVM_LIBRARY_VISIBILITY_NAMESPACE
This file defines the DenseMap class.
early cse Early CSE w MemorySSA
This header defines various interfaces for pass management in LLVM.
This file implements a map that provides insertion order iteration.
uint64_t IntrinsicInst * II
ppc ctr loops PowerPC CTR Loops Verify
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallVector class.
This represents the llvm.assume intrinsic.
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Conditional or Unconditional Branch instruction.
void Reset()
Deallocate all but the current slab and reset the current pointer to the beginning of it,...
This class represents a function call, abstracting a target machine's calling convention.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
iterator find(const_arg_type_t< KeyT > Val)
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
FunctionPass class - This class is used to implement most global optimizations.
const LeaderTableEntry value_type
std::forward_iterator_tag iterator_category
bool operator==(const leader_iterator &Other) const
bool operator!=(const leader_iterator &Other) const
leader_iterator(const LeaderListNode *C)
leader_iterator & operator++()
std::ptrdiff_t difference_type
reference operator*() const
This class holds the mapping between values and value numbers.
void setMemDep(MemoryDependenceResults *M, bool MDEnabled=true)
LLVM_ABI ValueTable(ValueTable &&Arg)
void setMemorySSA(MemorySSA *M, bool MSSAEnabled=false)
LLVM_ABI uint32_t lookupOrAddCmp(unsigned Opcode, CmpInst::Predicate Pred, Value *LHS, Value *RHS)
Returns the value number of the given comparison, assigning it a new number if it did not have one be...
uint32_t getNextUnusedValueNumber()
LLVM_ABI uint32_t lookup(Value *V, bool Verify=true) const
Returns the value number of the specified value.
LLVM_ABI ValueTable & operator=(const ValueTable &Arg)
void setAliasAnalysis(AAResults *A)
LLVM_ABI void add(Value *V, uint32_t Num)
add - Insert a value into the table with a specified value number.
LLVM_ABI void clear()
Remove all entries from the ValueTable.
LLVM_ABI bool exists(Value *V) const
Returns true if a value number exists for the specified value.
LLVM_ABI ValueTable(const ValueTable &Arg)
LLVM_ABI uint32_t lookupOrAdd(MemoryAccess *MA)
AAResults * getAliasAnalysis() const
LLVM_ABI uint32_t phiTranslate(const BasicBlock *BB, const BasicBlock *PhiBlock, uint32_t Num, GVNPass &GVN)
Wrap phiTranslateImpl to provide caching functionality.
void setDomTree(DominatorTree *D)
LLVM_ABI void eraseTranslateCacheEntry(uint32_t Num, const BasicBlock &CurrBlock)
Erase stale entry from phiTranslate cache so phiTranslate can be computed again.
LLVM_ABI void erase(Value *V)
Remove a value from the value numbering.
LLVM_ABI void verifyRemoved(const Value *) const
verifyRemoved - Verify that the value is removed from all internal data structures.
LLVM_ABI bool isPREEnabled() const
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Run the pass over the function.
LLVM_ABI void salvageAndRemoveInstruction(Instruction *I)
This removes the specified instruction from our various maps and marks it for deletion.
AAResults * getAliasAnalysis() const
LLVM_ABI bool isLoadPREEnabled() const
GVNPass(GVNOptions Options={})
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
LLVM_ABI bool isMemorySSAEnabled() const
DominatorTree & getDominatorTree() const
LLVM_ABI bool isLoadInLoopPREEnabled() const
LLVM_ABI bool isLoadPRESplitBackedgeEnabled() const
LLVM_ABI bool isMemDepEnabled() const
MemoryDependenceResults & getMemDep() const
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
This class allows to keep track on instructions with implicit control flow.
A wrapper class for inspecting calls to intrinsic functions.
An instruction for reading from memory.
A memory dependence query can return one of three different answers.
Provides a lazy, caching interface for making common memory aliasing information queries,...
Representation for a specific memory location.
Encapsulates MemorySSA, including all data associated with memory accesses.
This is a result from a NonLocal dependence query.
A set of analyses that are preserved following a run of a transformation pass.
A vector that has set insertion semantics.
Provides information about what library functions are available for the current target.
LLVM Value Representation.
A range adaptor for a pair of iterators.
@ C
The default llvm calling convention, compatible with C.
@ BasicBlock
Various leaf nodes.
A private "module" namespace for types and utilities used by GVN.
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
BumpPtrAllocatorImpl BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
iterator_range(Container &&) -> iterator_range< llvm::detail::IterOfRange< Container > >
LLVM_ABI FunctionPass * createGVNPass()
Create a legacy GVN pass.
FunctionAddr VTableAddr Next
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
An information struct used to provide DenseMap with the various necessary components for a given valu...
A simple and fast domtree-based GVN pass to hoist common expressions from sibling branches.
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Run the pass over the function.
A set of parameters to control various transforms performed by GVN pass.
GVNOptions & setLoadPRE(bool LoadPRE)
Enables or disables PRE of loads in GVN.
std::optional< bool > AllowLoadPRESplitBackedge
GVNOptions & setPRE(bool PRE)
Enables or disables PRE in GVN.
GVNOptions & setLoadInLoopPRE(bool LoadInLoopPRE)
std::optional< bool > AllowPRE
std::optional< bool > AllowLoadInLoopPRE
std::optional< bool > AllowMemDep
GVNOptions & setMemDep(bool MemDep)
Enables or disables use of MemDepAnalysis.
std::optional< bool > AllowLoadPRE
GVNOptions & setLoadPRESplitBackedge(bool LoadPRESplitBackedge)
Enables or disables PRE of loads in GVN.
std::optional< bool > AllowMemorySSA
GVNOptions & setMemorySSA(bool MemSSA)
Enables or disables use of MemorySSA.
Uses an "inverted" value numbering to decide the similarity of expressions and sinks similar expressi...
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Run the pass over the function.
A CRTP mix-in to automatically provide informational APIs needed for passes.
Represents an AvailableValue which can be rematerialized at the end of the associated BasicBlock.
Represents a particular available value that we know how to materialize.