15#ifndef LLVM_TRANSFORMS_SCALAR_GVN_H
16#define LLVM_TRANSFORMS_SCALAR_GVN_H
141 function_ref<StringRef(StringRef)> MapClassName2PassName);
171 std::vector<Expression> Expressions;
172 std::vector<uint32_t> ExprIdx;
182 using PhiTranslateMap =
184 PhiTranslateMap PhiTranslateTable;
188 bool IsMDEnabled =
false;
190 bool IsMSSAEnabled =
false;
206 std::pair<uint32_t, bool> assignExpNewValueNum(
Expression &Exp);
235 IsMDEnabled = MDEnabled;
239 IsMSSAEnabled = MSSAEnabled;
272 struct LeaderListNode {
274 LeaderListNode *
Next;
281 const LeaderListNode *Current;
292 assert(Current &&
"Dereferenced end of leader list!");
293 Current = Current->Next;
297 return Current ==
Other.Current;
300 return Current !=
Other.Current;
306 auto I = NumToLeaders.
find(
N);
307 if (
I == NumToLeaders.
end()) {
309 leader_iterator(
nullptr));
313 leader_iterator(
nullptr));
318 LLVM_ABI void verifyRemoved(
const Value *Inst)
const;
320 NumToLeaders.
clear();
321 TableAllocator.
Reset();
324 LeaderMap LeaderTable;
328 DenseMap<AssertingVH<BasicBlock>, uint32_t> BlockRPONumber;
333 bool InvalidBlockRPONumbers =
true;
335 using LoadDepVect = SmallVector<NonLocalDepResult, 64>;
336 using AvailValInBlkVect = SmallVector<gvn::AvailableValueInBlock, 64>;
337 using UnavailBlkVect = SmallVector<BasicBlock *, 64>;
339 bool runImpl(Function &
F, AssumptionCache &RunAC, DominatorTree &RunDT,
340 const TargetLibraryInfo &RunTLI, AAResults &RunAA,
341 MemoryDependenceResults *RunMD, LoopInfo &LI,
342 OptimizationRemarkEmitter *ORE,
MemorySSA *MSSA =
nullptr);
348 bool processLoad(LoadInst *L);
349 bool processMaskedLoad(IntrinsicInst *
I);
350 bool processNonLocalLoad(LoadInst *L);
351 bool processAssumeIntrinsic(AssumeInst *
II);
355 std::optional<gvn::AvailableValue>
356 AnalyzeLoadAvailability(LoadInst *Load, MemDepResult DepInfo,
Value *
Address);
361 void AnalyzeLoadAvailability(LoadInst *Load, LoadDepVect &Deps,
362 AvailValInBlkVect &ValuesPerBlock,
363 UnavailBlkVect &UnavailableBlocks);
367 LoadInst *findLoadToHoistIntoPred(BasicBlock *Pred, BasicBlock *LoadBB,
370 bool PerformLoadPRE(LoadInst *Load, AvailValInBlkVect &ValuesPerBlock,
371 UnavailBlkVect &UnavailableBlocks);
376 bool performLoopLoadPRE(LoadInst *Load, AvailValInBlkVect &ValuesPerBlock,
377 UnavailBlkVect &UnavailableBlocks);
381 void eliminatePartiallyRedundantLoad(
382 LoadInst *Load, AvailValInBlkVect &ValuesPerBlock,
383 MapVector<BasicBlock *, Value *> &AvailableLoads,
384 MapVector<BasicBlock *, LoadInst *> *CriticalEdgePredAndLoad);
387 bool processInstruction(Instruction *
I);
388 bool processBlock(BasicBlock *BB);
389 void dump(DenseMap<uint32_t, Value *> &Map)
const;
390 bool iterateOnFunction(Function &
F);
391 bool performPRE(Function &
F);
392 bool performScalarPRE(Instruction *
I);
393 bool performScalarPREInsertion(Instruction *Instr, BasicBlock *Pred,
394 BasicBlock *Curr,
unsigned int ValNo);
395 Value *findLeader(
const BasicBlock *BB, uint32_t Num);
396 void cleanupGlobalSets();
397 void removeInstruction(Instruction *
I);
398 void verifyRemoved(
const Instruction *
I)
const;
399 bool splitCriticalEdges();
400 BasicBlock *splitCriticalEdges(BasicBlock *Pred, BasicBlock *Succ);
403 const std::variant<BasicBlockEdge, Instruction *> &Root);
404 bool processFoldableCondBr(BranchInst *BI);
405 void addDeadBlock(BasicBlock *BB);
406 void assignValNumForDeadCode();
407 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.