mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-26 07:18:15 +00:00
* 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:
@@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user