mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
* Eliminate boolean arguments in favor of using enums
* T-D pass now eliminates unreachable globals llvm-svn: 5419
This commit is contained in:
parent
1c82a35a0b
commit
f1afc156f8
@ -364,8 +364,8 @@ DSGraph &BUDataStructures::calculateGraph(Function &F) {
|
||||
// Recompute the Incomplete markers. If there are any function calls left
|
||||
// now that are complete, we must loop!
|
||||
Graph.maskIncompleteMarkers();
|
||||
Graph.markIncompleteNodes();
|
||||
Graph.removeDeadNodes();
|
||||
Graph.markIncompleteNodes(DSGraph::MarkFormalArgs);
|
||||
Graph.removeDeadNodes(DSGraph::KeepUnreachableGlobals);
|
||||
|
||||
DEBUG(std::cerr << " [BU] Done inlining: " << F.getName() << " ["
|
||||
<< Graph.getGraphSize() << "+" << Graph.getAuxFunctionCalls().size()
|
||||
@ -440,8 +440,8 @@ DSGraph &BUDataStructures::inlineNonSCCGraphs(Function &F,
|
||||
// Recompute the Incomplete markers. If there are any function calls left
|
||||
// now that are complete, we must loop!
|
||||
Graph.maskIncompleteMarkers();
|
||||
Graph.markIncompleteNodes();
|
||||
Graph.removeDeadNodes();
|
||||
Graph.markIncompleteNodes(DSGraph::MarkFormalArgs);
|
||||
Graph.removeDeadNodes(DSGraph::KeepUnreachableGlobals);
|
||||
|
||||
DEBUG(std::cerr << " [BU] Done Non-SCC inlining: " << F.getName() << " ["
|
||||
<< Graph.getGraphSize() << "+" << Graph.getAuxFunctionCalls().size()
|
||||
@ -535,8 +535,8 @@ DSGraph &BUDataStructures::calculateSCCGraph(Function &F,
|
||||
// Recompute the Incomplete markers. If there are any function calls left
|
||||
// now that are complete, we must loop!
|
||||
Graph.maskIncompleteMarkers();
|
||||
Graph.markIncompleteNodes();
|
||||
Graph.removeDeadNodes();
|
||||
Graph.markIncompleteNodes(DSGraph::MarkFormalArgs);
|
||||
Graph.removeDeadNodes(DSGraph::KeepUnreachableGlobals);
|
||||
|
||||
DEBUG(std::cerr << " [BU] Done inlining: " << F.getName() << " ["
|
||||
<< Graph.getGraphSize() << "+" << Graph.getAuxFunctionCalls().size()
|
||||
|
@ -785,9 +785,9 @@ static void markIncomplete(DSCallSite &Call) {
|
||||
// scope of current analysis may have modified it), the 'Incomplete' flag is
|
||||
// added to the NodeType.
|
||||
//
|
||||
void DSGraph::markIncompleteNodes(bool markFormalArgs) {
|
||||
void DSGraph::markIncompleteNodes(unsigned Flags) {
|
||||
// Mark any incoming arguments as incomplete...
|
||||
if (markFormalArgs && Func)
|
||||
if ((Flags & DSGraph::MarkFormalArgs) && Func)
|
||||
for (Function::aiterator I = Func->abegin(), E = Func->aend(); I != E; ++I)
|
||||
if (isPointerType(I->getType()) && ScalarMap.find(I) != ScalarMap.end())
|
||||
markIncompleteNode(ScalarMap[I].getNode());
|
||||
@ -1010,7 +1010,7 @@ static void markAlive(DSCallSite &CS, std::set<DSNode*> &Alive) {
|
||||
// from the caller's graph entirely. This is only appropriate to use when
|
||||
// inlining graphs.
|
||||
//
|
||||
void DSGraph::removeDeadNodes() {
|
||||
void DSGraph::removeDeadNodes(unsigned Flags) {
|
||||
// Reduce the amount of work we have to do...
|
||||
removeTriviallyDeadNodes();
|
||||
|
||||
@ -1023,10 +1023,11 @@ void DSGraph::removeDeadNodes() {
|
||||
// Mark all nodes reachable by (non-global) scalar nodes as alive...
|
||||
for (std::map<Value*, DSNodeHandle>::iterator I = ScalarMap.begin(),
|
||||
E = ScalarMap.end(); I != E; ++I)
|
||||
// if (!isa<GlobalValue>(I->first)) // Don't mark globals!
|
||||
if (!(Flags & DSGraph::RemoveUnreachableGlobals) ||
|
||||
!isa<GlobalValue>(I->first)) // Don't mark globals!
|
||||
markAlive(I->second.getNode(), Alive);
|
||||
// else // Keep track of global nodes
|
||||
// GlobalNodes.push_back(std::make_pair(I->first, I->second.getNode()));
|
||||
else // Keep track of global nodes
|
||||
GlobalNodes.push_back(std::make_pair(I->first, I->second.getNode()));
|
||||
|
||||
// The return value is alive as well...
|
||||
markAlive(RetNode.getNode(), Alive);
|
||||
|
@ -136,10 +136,10 @@ DSGraph::DSGraph(Function &F, DSGraph *GG) : Func(&F), GlobalsGraph(GG) {
|
||||
#ifndef NDEBUG
|
||||
Timer::addPeakMemoryMeasurement();
|
||||
#endif
|
||||
markIncompleteNodes();
|
||||
markIncompleteNodes(DSGraph::MarkFormalArgs);
|
||||
|
||||
// Remove any nodes made dead due to merging...
|
||||
removeDeadNodes();
|
||||
removeDeadNodes(DSGraph::KeepUnreachableGlobals);
|
||||
}
|
||||
|
||||
|
||||
|
@ -196,10 +196,10 @@ bool Steens::run(Module &M) {
|
||||
// Update the "incomplete" markers on the nodes, ignoring unknownness due to
|
||||
// incoming arguments...
|
||||
ResultGraph->maskIncompleteMarkers();
|
||||
ResultGraph->markIncompleteNodes(false);
|
||||
ResultGraph->markIncompleteNodes(DSGraph::IgnoreFormalArgs);
|
||||
|
||||
// Remove any nodes that are dead after all of the merging we have done...
|
||||
ResultGraph->removeDeadNodes();
|
||||
ResultGraph->removeDeadNodes(DSGraph::KeepUnreachableGlobals);
|
||||
|
||||
DEBUG(print(std::cerr, &M));
|
||||
return false;
|
||||
|
@ -186,9 +186,10 @@ void TDDataStructures::calculateGraph(Function &F) {
|
||||
|
||||
// Recompute the Incomplete markers and eliminate unreachable nodes.
|
||||
CG.maskIncompleteMarkers();
|
||||
CG.markIncompleteNodes(/*markFormals*/ !F.hasInternalLinkage()
|
||||
CG.markIncompleteNodes(F.hasInternalLinkage() ? DSGraph::IgnoreFormalArgs:
|
||||
DSGraph::MarkFormalArgs
|
||||
/*&& FIXME: NEED TO CHECK IF ALL CALLERS FOUND!*/);
|
||||
CG.removeDeadNodes();
|
||||
CG.removeDeadNodes(DSGraph::RemoveUnreachableGlobals);
|
||||
}
|
||||
|
||||
DEBUG(std::cerr << " [TD] Done inlining into callees for: " << F.getName()
|
||||
|
Loading…
Reference in New Issue
Block a user