* Make some methods more const correct.

* Change the FunctionCalls and AuxFunctionCalls vectors into std::lists.
  This makes many operations on these lists much more natural, and avoids
  *exteremely* expensive copying of DSCallSites (e.g. moving nodes around
  between lists, erasing a node from not the end of the vector, etc).

With a profile build of analyze, this speeds up BU DS from 25.14s to
12.59s on 176.gcc.  I expect that it would help TD even more, but I don't
have data for it.

This effectively eliminates removeIdenticalCalls and children from the
profile, going from 6.53 to 0.27s.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19939 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2005-01-30 23:51:02 +00:00
parent 7b2a5270b7
commit a9548d9fd9
12 changed files with 271 additions and 235 deletions

View File

@@ -23,18 +23,18 @@ namespace llvm {
struct DSCallSiteIterator {
// FCs are the edges out of the current node are the call site targets...
const std::vector<DSCallSite> *FCs;
unsigned CallSite;
std::list<DSCallSite> *FCs;
std::list<DSCallSite>::iterator CallSite;
unsigned CallSiteEntry;
DSCallSiteIterator(const std::vector<DSCallSite> &CS) : FCs(&CS) {
CallSite = 0; CallSiteEntry = 0;
DSCallSiteIterator(std::list<DSCallSite> &CS) : FCs(&CS) {
CallSite = CS.begin(); CallSiteEntry = 0;
advanceToValidCallee();
}
// End iterator ctor...
DSCallSiteIterator(const std::vector<DSCallSite> &CS, bool) : FCs(&CS) {
CallSite = FCs->size(); CallSiteEntry = 0;
// End iterator ctor.
DSCallSiteIterator(std::list<DSCallSite> &CS, bool) : FCs(&CS) {
CallSite = CS.end(); CallSiteEntry = 0;
}
static bool isVAHackFn(const Function *F) {
@@ -52,13 +52,13 @@ struct DSCallSiteIterator {
}
void advanceToValidCallee() {
while (CallSite < FCs->size()) {
if ((*FCs)[CallSite].isDirectCall()) {
while (CallSite != FCs->end()) {
if (CallSite->isDirectCall()) {
if (CallSiteEntry == 0 && // direct call only has one target...
! isUnresolvableFunc((*FCs)[CallSite].getCalleeFunc()))
! isUnresolvableFunc(CallSite->getCalleeFunc()))
return; // and not an unresolvable external func
} else {
DSNode *CalleeNode = (*FCs)[CallSite].getCalleeNode();
DSNode *CalleeNode = CallSite->getCalleeNode();
if (CallSiteEntry || isCompleteNode(CalleeNode)) {
const std::vector<GlobalValue*> &Callees = CalleeNode->getGlobals();
while (CallSiteEntry < Callees.size()) {
@@ -98,8 +98,8 @@ public:
static DSCallSiteIterator end_std(DSGraph &G) {
return DSCallSiteIterator(G.getFunctionCalls(), true);
}
static DSCallSiteIterator begin(std::vector<DSCallSite> &CSs) { return CSs; }
static DSCallSiteIterator end(std::vector<DSCallSite> &CSs) {
static DSCallSiteIterator begin(std::list<DSCallSite> &CSs) { return CSs; }
static DSCallSiteIterator end(std::list<DSCallSite> &CSs) {
return DSCallSiteIterator(CSs, true);
}
bool operator==(const DSCallSiteIterator &CSI) const {
@@ -109,14 +109,14 @@ public:
return !operator==(CSI);
}
unsigned getCallSiteIdx() const { return CallSite; }
const DSCallSite &getCallSite() const { return (*FCs)[CallSite]; }
std::list<DSCallSite>::iterator getCallSiteIdx() const { return CallSite; }
const DSCallSite &getCallSite() const { return *CallSite; }
Function *operator*() const {
if ((*FCs)[CallSite].isDirectCall()) {
return (*FCs)[CallSite].getCalleeFunc();
if (CallSite->isDirectCall()) {
return CallSite->getCalleeFunc();
} else {
DSNode *Node = (*FCs)[CallSite].getCalleeNode();
DSNode *Node = CallSite->getCalleeNode();
return cast<Function>(Node->getGlobals()[CallSiteEntry]);
}
}