/*! * Expand all fields of an aggregate in all points-to sets */ void BVDataPTAImpl::expandFIObjs(const PointsTo& pts, PointsTo& expandedPts) { expandedPts = pts;; for(PointsTo::iterator pit = pts.begin(), epit = pts.end(); pit!=epit; ++pit) { if(pag->getBaseObjNode(*pit)==*pit) { expandedPts |= pag->getAllFieldsObjNode(*pit); } } }
/*! * Add copy edges which haven't been added before */ bool AndersenWaveDiff::handleStore(NodeID node, const ConstraintEdge* edge) { /// calculate diff pts. PointsTo & cache = getCachePts(edge); PointsTo & pts = getPts(node); PointsTo newPts; newPts.intersectWithComplement(pts, cache); cache |= newPts; bool changed = false; for (PointsTo::iterator piter = newPts.begin(), epiter = newPts.end(); piter != epiter; ++piter) { NodeID ptdId = *piter; if (processStore(ptdId, edge)) { changed = true; } } return changed; }
/*! * Given a condition pts, insert into cptsToRepCPtsMap * Always map it to its superset(rep) cpts according to existing items * 1) map cpts to its superset(rep) which exists in the map, otherwise its superset is itself * 2) adjust existing items in the map if their supersets are cpts */ void MRGenerator::sortPointsTo(const PointsTo& cpts) { if(cptsToRepCPtsMap.find(cpts)!=cptsToRepCPtsMap.end()) return; PointsToList subSetList; PointsTo repCPts = cpts; for(PtsToRepPtsSetMap::iterator it = cptsToRepCPtsMap.begin(), eit = cptsToRepCPtsMap.end(); it!=eit; ++it) { PointsTo& existCPts = it->second; if(cpts.contains(existCPts)) { subSetList.insert(it->first); } else if(existCPts.contains(cpts)) { repCPts = existCPts; } } for(PointsToList::iterator it = subSetList.begin(), eit = subSetList.end(); it!=eit; ++it) { cptsToRepCPtsMap[*it] = cpts; } cptsToRepCPtsMap[cpts] = repCPts; }