mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-09 13:33:17 +00:00
Get rid of the EquivClassGraphArgsInfo class, and the map that held it.
We only need one instance of the vector that it contains at a time. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17407 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7cc372bfc3
commit
77408b8987
@ -28,18 +28,6 @@ class Module;
|
|||||||
class Function;
|
class Function;
|
||||||
|
|
||||||
namespace PA {
|
namespace PA {
|
||||||
|
|
||||||
/// EquivClassGraphArgsInfo - Information about the set of argument nodes
|
|
||||||
/// in a DS graph (the number of argument nodes is the max of argument nodes
|
|
||||||
/// for all functions folded into the graph).
|
|
||||||
/// FIXME: This class is only used temporarily and could be eliminated.
|
|
||||||
///
|
|
||||||
struct EquivClassGraphArgsInfo {
|
|
||||||
const DSGraph* ECGraph;
|
|
||||||
std::vector<DSNodeHandle> argNodes;
|
|
||||||
EquivClassGraphArgsInfo() : ECGraph(NULL) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
/// EquivClassGraphs - This is the same as the complete bottom-up graphs, but
|
/// EquivClassGraphs - This is the same as the complete bottom-up graphs, but
|
||||||
/// with functions partitioned into equivalence classes and a single merged
|
/// with functions partitioned into equivalence classes and a single merged
|
||||||
/// DS graph for all functions in an equivalence class. After this merging,
|
/// DS graph for all functions in an equivalence class. After this merging,
|
||||||
@ -61,10 +49,6 @@ namespace PA {
|
|||||||
// same function pointer are in the same class.
|
// same function pointer are in the same class.
|
||||||
EquivalenceClasses<Function*> FuncECs;
|
EquivalenceClasses<Function*> FuncECs;
|
||||||
|
|
||||||
// Each equivalence class graph contains several functions.
|
|
||||||
// Remember their argument nodes (and return nodes?)
|
|
||||||
std::map<const DSGraph*, EquivClassGraphArgsInfo> ECGraphInfo;
|
|
||||||
|
|
||||||
/// OneCalledFunction - For each indirect call, we keep track of one
|
/// OneCalledFunction - For each indirect call, we keep track of one
|
||||||
/// target of the call. This is used to find equivalence class called by
|
/// target of the call. This is used to find equivalence class called by
|
||||||
/// a call site.
|
/// a call site.
|
||||||
@ -112,16 +96,6 @@ namespace PA {
|
|||||||
return FuncECs.getEqClass(leaderF);
|
return FuncECs.getEqClass(leaderF);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// getECGraphInfo - Get the graph info object with arg nodes info
|
|
||||||
///
|
|
||||||
EquivClassGraphArgsInfo &getECGraphInfo(const DSGraph* G) {
|
|
||||||
assert(G != NULL && "getECGraphInfo: Null graph!");
|
|
||||||
EquivClassGraphArgsInfo& GraphInfo = ECGraphInfo[G];
|
|
||||||
if (GraphInfo.ECGraph == NULL)
|
|
||||||
GraphInfo.ECGraph = G;
|
|
||||||
return GraphInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
DSGraph &getGlobalsGraph() const {
|
DSGraph &getGlobalsGraph() const {
|
||||||
return *GlobalsGraph;
|
return *GlobalsGraph;
|
||||||
}
|
}
|
||||||
|
@ -115,7 +115,7 @@ bool PA::EquivClassGraphs::runOnModule(Module &M) {
|
|||||||
//
|
//
|
||||||
void PA::EquivClassGraphs::buildIndirectFunctionSets(Module &M) {
|
void PA::EquivClassGraphs::buildIndirectFunctionSets(Module &M) {
|
||||||
const ActualCalleesTy& AC = CBU->getActualCallees();
|
const ActualCalleesTy& AC = CBU->getActualCallees();
|
||||||
|
|
||||||
// Loop over all of the indirect calls in the program. If a call site can
|
// Loop over all of the indirect calls in the program. If a call site can
|
||||||
// call multiple different functions, we need to unify all of the callees into
|
// call multiple different functions, we need to unify all of the callees into
|
||||||
// the same equivalence class.
|
// the same equivalence class.
|
||||||
@ -196,11 +196,12 @@ void PA::EquivClassGraphs::buildIndirectFunctionSets(Module &M) {
|
|||||||
// equivalence graph.
|
// equivalence graph.
|
||||||
DSGraph *mergedG = &getOrCreateGraph(*LF);
|
DSGraph *mergedG = &getOrCreateGraph(*LF);
|
||||||
|
|
||||||
// Record the argument nodes for use in merging later below
|
// Record the argument nodes for use in merging later below.
|
||||||
EquivClassGraphArgsInfo& GraphInfo = getECGraphInfo(mergedG);
|
std::vector<DSNodeHandle> ArgNodes;
|
||||||
|
|
||||||
for (Function::aiterator AI1 = LF->abegin(); AI1 != LF->aend(); ++AI1)
|
for (Function::aiterator AI1 = LF->abegin(); AI1 != LF->aend(); ++AI1)
|
||||||
if (DS::isPointerType(AI1->getType()))
|
if (DS::isPointerType(AI1->getType()))
|
||||||
GraphInfo.argNodes.push_back(mergedG->getNodeForValue(AI1));
|
ArgNodes.push_back(mergedG->getNodeForValue(AI1));
|
||||||
|
|
||||||
// Merge in the graphs of all other functions in this equiv. class. Note
|
// Merge in the graphs of all other functions in this equiv. class. Note
|
||||||
// that two or more functions may have the same graph, and it only needs
|
// that two or more functions may have the same graph, and it only needs
|
||||||
@ -234,14 +235,14 @@ void PA::EquivClassGraphs::buildIndirectFunctionSets(Module &M) {
|
|||||||
// Merge the function arguments with all argument nodes found so far.
|
// Merge the function arguments with all argument nodes found so far.
|
||||||
// If there are extra function args, add them to the vector of argNodes
|
// If there are extra function args, add them to the vector of argNodes
|
||||||
Function::aiterator AI2 = F->abegin(), AI2end = F->aend();
|
Function::aiterator AI2 = F->abegin(), AI2end = F->aend();
|
||||||
for (unsigned arg=0, numArgs=GraphInfo.argNodes.size();
|
for (unsigned arg=0, numArgs = ArgNodes.size();
|
||||||
arg != numArgs && AI2 != AI2end; ++AI2, ++arg)
|
arg != numArgs && AI2 != AI2end; ++AI2, ++arg)
|
||||||
if (DS::isPointerType(AI2->getType()))
|
if (DS::isPointerType(AI2->getType()))
|
||||||
GraphInfo.argNodes[arg].mergeWith(mergedG->getNodeForValue(AI2));
|
ArgNodes[arg].mergeWith(mergedG->getNodeForValue(AI2));
|
||||||
|
|
||||||
for ( ; AI2 != AI2end; ++AI2)
|
for ( ; AI2 != AI2end; ++AI2)
|
||||||
if (DS::isPointerType(AI2->getType()))
|
if (DS::isPointerType(AI2->getType()))
|
||||||
GraphInfo.argNodes.push_back(mergedG->getNodeForValue(AI2));
|
ArgNodes.push_back(mergedG->getNodeForValue(AI2));
|
||||||
DEBUG(mergedG->AssertGraphOK());
|
DEBUG(mergedG->AssertGraphOK());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user