mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
Make GVN more memory efficient, particularly on code that contains a large number of
allocations, which GVN can't optimize anyways. llvm-svn: 49329
This commit is contained in:
parent
93e8f5fbc3
commit
93ab00f1d9
@ -103,6 +103,10 @@ public:
|
||||
return C;
|
||||
}
|
||||
|
||||
size_t getNumChildren() const {
|
||||
return Children.size();
|
||||
}
|
||||
|
||||
void setIDom(DomTreeNodeBase<NodeT> *NewIDom) {
|
||||
assert(IDom && "No immediate dominator?");
|
||||
if (IDom != NewIDom) {
|
||||
|
@ -1593,6 +1593,11 @@ bool GVN::processInstruction(Instruction *I, ValueNumberedSet &currAvail,
|
||||
if (StoreInst *SI = dyn_cast<StoreInst>(I))
|
||||
return processStore(SI, toErase);
|
||||
|
||||
// Allocations are always uniquely numbered, so we can save time and memory
|
||||
// by fast failing them.
|
||||
if (isa<AllocationInst>(I))
|
||||
return false;
|
||||
|
||||
if (MemCpyInst* M = dyn_cast<MemCpyInst>(I)) {
|
||||
MemoryDependenceAnalysis& MD = getAnalysis<MemoryDependenceAnalysis>();
|
||||
|
||||
@ -1692,6 +1697,7 @@ bool GVN::iterateOnFunction(Function &F) {
|
||||
|
||||
SmallVector<Instruction*, 8> toErase;
|
||||
DenseMap<Value*, LoadInst*> lastSeenLoad;
|
||||
DenseMap<DomTreeNode*, size_t> numChildrenVisited;
|
||||
|
||||
// Top-down walk of the dominator tree
|
||||
for (df_iterator<DomTreeNode*> DI = df_begin(DT.getRootNode()),
|
||||
@ -1704,9 +1710,17 @@ bool GVN::iterateOnFunction(Function &F) {
|
||||
BasicBlock* BB = DI->getBlock();
|
||||
|
||||
// A block inherits AVAIL_OUT from its dominator
|
||||
if (DI->getIDom() != 0)
|
||||
if (DI->getIDom() != 0) {
|
||||
currAvail = availableOut[DI->getIDom()->getBlock()];
|
||||
|
||||
numChildrenVisited[DI->getIDom()]++;
|
||||
|
||||
if (numChildrenVisited[DI->getIDom()] == DI->getIDom()->getNumChildren()) {
|
||||
availableOut.erase(DI->getIDom()->getBlock());
|
||||
numChildrenVisited.erase(DI->getIDom());
|
||||
}
|
||||
}
|
||||
|
||||
for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();
|
||||
BI != BE;) {
|
||||
changed_function |= processInstruction(BI, currAvail,
|
||||
|
Loading…
Reference in New Issue
Block a user