/*! * Start constraint solving */ void AndersenLCD::processNode(NodeID nodeId) { numOfIteration++; if(0 == numOfIteration % OnTheFlyIterBudgetForStat) { dumpStat(); } ConstraintNode* node = consCG->getConstraintNode(nodeId); for (ConstraintNode::const_iterator it = node->outgoingAddrsBegin(), eit = node->outgoingAddrsEnd(); it != eit; ++it) { processAddr(cast<AddrCGEdge>(*it)); } for (PointsTo::iterator piter = getPts(nodeId).begin(), epiter = getPts( nodeId).end(); piter != epiter; ++piter) { NodeID ptd = *piter; // handle load for (ConstraintNode::const_iterator it = node->outgoingLoadsBegin(), eit = node->outgoingLoadsEnd(); it != eit; ++it) { if(processLoad(ptd, *it)) pushIntoWorklist(ptd); } // handle store for (ConstraintNode::const_iterator it = node->incomingStoresBegin(), eit = node->incomingStoresEnd(); it != eit; ++it) { if(processStore(ptd, *it)) pushIntoWorklist((*it)->getSrcID()); } } // handle copy, call, return, gep bool lcd = false; for (ConstraintNode::const_iterator it = node->directOutEdgeBegin(), eit = node->directOutEdgeEnd(); it != eit; ++it) { if(GepCGEdge* gepEdge = llvm::dyn_cast<GepCGEdge>(*it)) processGep(nodeId,gepEdge); else if(processCopy(nodeId,*it)) lcd = true; } if(lcd) SCCDetect(); // update call graph updateCallGraph(getIndirectCallsites()); }
/*! * Post process node */ void AndersenWave::postProcessNode(NodeID nodeId) { double insertStart = stat->getClk(); ConstraintNode* node = consCG->getConstraintNode(nodeId); // handle load for (ConstraintNode::const_iterator it = node->outgoingLoadsBegin(), eit = node->outgoingLoadsEnd(); it != eit; ++it) { if (handleLoad(nodeId, *it)) reanalyze = true; } // handle store for (ConstraintNode::const_iterator it = node->incomingStoresBegin(), eit = node->incomingStoresEnd(); it != eit; ++it) { if (handleStore(nodeId, *it)) reanalyze = true; } double insertEnd = stat->getClk(); timeOfProcessLoadStore += (insertEnd - insertStart) / TIMEINTERVAL; }