[llvm-commits] [poolalloc] r159069 - in /poolalloc/trunk: include/dsa/DSCallGraph.h include/dsa/DSNode.h include/dsa/DataStructure.h include/dsa/svset.h lib/DSA/BottomUpClosure.cpp lib/DSA/DSCallGraph.cpp lib/DSA/DataStructure.cpp lib/DSA/TopDownClosure.cpp

Will Dietz wdietz2 at illinois.edu
Fri Jun 22 19:57:02 PDT 2012


Author: wdietz2
Date: Fri Jun 22 21:57:02 2012
New Revision: 159069

URL: http://llvm.org/viewvc/llvm-project?rev=159069&view=rev
Log:
Everywhere: Use svset when collecting list of globals from diverse sources.

This saves quite a few duplicates in practice, and better matches
the desired operation (the comments already say "compute the set", etc).

Leave the old "addFullFunctionList" interface around to ensure not to break
things like SAFECode.  However, the implementation is now simply a wrapper
around the set version and as such should probably be converted at some point.

Modified:
    poolalloc/trunk/include/dsa/DSCallGraph.h
    poolalloc/trunk/include/dsa/DSNode.h
    poolalloc/trunk/include/dsa/DataStructure.h
    poolalloc/trunk/include/dsa/svset.h
    poolalloc/trunk/lib/DSA/BottomUpClosure.cpp
    poolalloc/trunk/lib/DSA/DSCallGraph.cpp
    poolalloc/trunk/lib/DSA/DataStructure.cpp
    poolalloc/trunk/lib/DSA/TopDownClosure.cpp

Modified: poolalloc/trunk/include/dsa/DSCallGraph.h
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/include/dsa/DSCallGraph.h?rev=159069&r1=159068&r2=159069&view=diff
==============================================================================
--- poolalloc/trunk/include/dsa/DSCallGraph.h (original)
+++ poolalloc/trunk/include/dsa/DSCallGraph.h Fri Jun 22 21:57:02 2012
@@ -183,10 +183,16 @@
   void buildSCCs();
 
   void buildRoots();
-  
+
   void buildIncompleteCalleeSet(svset<const llvm::Function*> callees);
-  
-  void addFullFunctionList(llvm::CallSite CS, std::vector<const llvm::Function*> &List) const;
+
+  void addFullFunctionSet(llvm::CallSite CS, svset<const llvm::Function*> &Set) const;
+  // Temporary compat wrapper
+  void addFullFunctionList(llvm::CallSite CS, std::vector<const llvm::Function*> &List) const {
+    svset<const llvm::Function*> Set;
+    addFullFunctionSet(CS, Set);
+    List.insert(List.end(), Set.begin(), Set.end());
+  }
 
   void dump();
 

Modified: poolalloc/trunk/include/dsa/DSNode.h
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/include/dsa/DSNode.h?rev=159069&r1=159068&r2=159069&view=diff
==============================================================================
--- poolalloc/trunk/include/dsa/DSNode.h (original)
+++ poolalloc/trunk/include/dsa/DSNode.h Fri Jun 22 21:57:02 2012
@@ -316,14 +316,28 @@
   bool isEmptyGlobals() const { return Globals.empty(); }
   unsigned numGlobals() const { return Globals.size(); }
 
-  /// addFullGlobalsList - Compute the full set of global values that are
+  /// addFullGlobalSet - Compute the full set of global values that are
   /// represented by this node.  Unlike getGlobalsList(), this requires fair
   /// amount of work to compute, so don't treat this method call as free.
-  void addFullGlobalsList(std::vector<const GlobalValue*> &List) const;
+  void addFullGlobalsSet(svset<const GlobalValue*> &Set) const;
+  /// Same as above, keeping for compat reasons
+  void addFullGlobalsList(std::vector<const GlobalValue*> &List) const {
+    svset<const GlobalValue*> Set;
+    addFullGlobalsSet(Set);
+    List.insert(List.end(), Set.begin(), Set.end());
+  }
 
-  /// addFullFunctionList - Identical to addFullGlobalsList, but only return the
+  /// addFullFunctionSet - Identical to addFullGlobalsSet, but only return the
   /// functions in the full list.
-  void addFullFunctionList(std::vector<const Function*> &List) const;
+  void addFullFunctionSet(svset<const Function*> &Set) const;
+  /// Same as above, keeping for compat reasons
+  void addFullFunctionList(std::vector<const Function*> &List) const {
+    svset<const Function*> Set;
+    addFullFunctionSet(Set);
+    List.insert(List.end(), Set.begin(), Set.end());
+  }
+  /// Same as above, only doesn't include duplicates
+  /// (keeping both for compat with existing clients)
 
   /// globals_iterator/begin/end - Provide iteration methods over the global
   /// value leaders set that is merged into this node.  Like the getGlobalsList

Modified: poolalloc/trunk/include/dsa/DataStructure.h
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/include/dsa/DataStructure.h?rev=159069&r1=159068&r2=159069&view=diff
==============================================================================
--- poolalloc/trunk/include/dsa/DataStructure.h (original)
+++ poolalloc/trunk/include/dsa/DataStructure.h Fri Jun 22 21:57:02 2012
@@ -257,22 +257,21 @@
   // Private typedefs
   typedef std::map<const Function*, unsigned> TarjanMap;
   typedef std::vector<const Function*>        TarjanStack;
+  typedef svset<const Function*>              FuncSet;
 
   void postOrderInline (Module & M);
   unsigned calculateGraphs (const Function *F,
                             TarjanStack & Stack,
                             unsigned & NextID,
                             TarjanMap & ValMap);
-  
+
   void calculateGraph(DSGraph* G);
 
   void CloneAuxIntoGlobal(DSGraph* G);
 
-  void getAllCallees(const DSCallSite &CS,
-                     std::vector<const Function*> &Callees);
-  void getAllAuxCallees (DSGraph* G, std::vector<const Function*> & Callees);
-  void applyCallsiteFilter(const DSCallSite &DCS,
-                           std::vector<const Function*> &Callees);
+  void getAllCallees(const DSCallSite &CS, FuncSet &Callees);
+  void getAllAuxCallees (DSGraph* G, FuncSet &Callees);
+  void applyCallsiteFilter(const DSCallSite &DCS, FuncSet &Callees);
 };
 
 /// CompleteBUDataStructures - This is the exact same as the bottom-up graphs,

Modified: poolalloc/trunk/include/dsa/svset.h
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/include/dsa/svset.h?rev=159069&r1=159068&r2=159069&view=diff
==============================================================================
--- poolalloc/trunk/include/dsa/svset.h (original)
+++ poolalloc/trunk/include/dsa/svset.h Fri Jun 22 21:57:02 2012
@@ -156,8 +156,8 @@
     container_.swap(ctemp);
   }
 
-  void erase ( iterator position ) {
-    container_.erase(position);
+  iterator erase ( iterator position ) {
+    return container_.erase(position);
   }
 
   size_type erase(const key_type& x) {
@@ -169,8 +169,8 @@
     return 0;
   }
 
-  void erase ( iterator first, iterator last ) {
-    container_.erase(first, last);
+  iterator erase ( iterator first, iterator last ) {
+    return container_.erase(first, last);
   }
 
   /// Swap the content of two sorted_vector.

Modified: poolalloc/trunk/lib/DSA/BottomUpClosure.cpp
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/BottomUpClosure.cpp?rev=159069&r1=159068&r2=159069&view=diff
==============================================================================
--- poolalloc/trunk/lib/DSA/BottomUpClosure.cpp (original)
+++ poolalloc/trunk/lib/DSA/BottomUpClosure.cpp Fri Jun 22 21:57:02 2012
@@ -139,11 +139,11 @@
 //  Does no filtering if 'filterCallees' is set to false.
 //
 void BUDataStructures::
-applyCallsiteFilter(const DSCallSite &DCS, std::vector<const Function*> &Callees) {
+applyCallsiteFilter(const DSCallSite &DCS, FuncSet &Callees) {
 
   if (!filterCallees) return;
 
-  std::vector<const Function*>::iterator I = Callees.begin();
+  FuncSet::iterator I = Callees.begin();
   CallSite CS = DCS.getCallSite();
   while (I != Callees.end()) {
     if (functionIsCallable(CS, *I)) {
@@ -163,7 +163,7 @@
 //  only add the functions that are valid targets of this callsite.
 //
 void BUDataStructures::
-getAllCallees(const DSCallSite &CS, std::vector<const Function*> &Callees) {
+getAllCallees(const DSCallSite &CS, FuncSet &Callees) {
   //
   // FIXME: Should we check for the Unknown flag on indirect call sites?
   //
@@ -174,19 +174,19 @@
   //
   if (CS.isDirectCall()) {
     if (!CS.getCalleeFunc()->isDeclaration())
-      Callees.push_back(CS.getCalleeFunc());
+      Callees.insert(CS.getCalleeFunc());
   } else if (CS.getCalleeNode()->isCompleteNode()) {
     // Get all callees.
     if (!CS.getCalleeNode()->isExternFuncNode()) {
       // Get all the callees for this callsite
-      std::vector<const Function *> tempCallees;
-      CS.getCalleeNode()->addFullFunctionList(tempCallees);
+      FuncSet TempCallees;
+      CS.getCalleeNode()->addFullFunctionSet(TempCallees);
       // Filter out the ones that are invalid targets with respect
       // to this particular callsite.
-      applyCallsiteFilter(CS, tempCallees);
+      applyCallsiteFilter(CS, TempCallees);
       // Insert the remaining callees (legal ones, if we're filtering)
       // into the master 'Callees' list
-      Callees.insert(Callees.end(),tempCallees.begin(),tempCallees.end());
+      Callees.insert(TempCallees.begin(), TempCallees.end());
     }
   }
 }
@@ -208,7 +208,7 @@
 //            functions are added to it.
 //
 void BUDataStructures::
-getAllAuxCallees (DSGraph* G, std::vector<const Function*> & Callees) {
+getAllAuxCallees (DSGraph* G, FuncSet & Callees) {
   //
   // Clear out the list of callees.
   //
@@ -376,7 +376,7 @@
   // Find all callee functions.  Use the DSGraph for this (do not use the call
   // graph (DSCallgraph) as we're still in the process of constructing it).
   //
-  std::vector<const Function*> CalleeFunctions;
+  FuncSet CalleeFunctions;
   getAllAuxCallees(Graph, CalleeFunctions);
 
   //
@@ -384,8 +384,9 @@
   // node (i.e., the current function) in Tarjan graph parlance).  Find the
   // minimum assigned ID.
   //
-  for (unsigned i = 0, e = CalleeFunctions.size(); i != e; ++i) {
-    const Function *Callee = CalleeFunctions[i];
+  for (FuncSet::iterator I = CalleeFunctions.begin(), E = CalleeFunctions.end();
+       I != E; ++I) {
+    const Function *Callee = *I;
     unsigned M;
     //
     // If we have not visited this callee before, visit it now (this is the
@@ -634,7 +635,7 @@
 
     // Find all callees for this callsite, according to the DSGraph!
     // Do *not* use the callgraph, because we're updating that as we go!
-    std::vector<const Function*> CalledFuncs;
+    FuncSet CalledFuncs;
     getAllCallees(CS,CalledFuncs);
 
     if (CalledFuncs.empty()) {
@@ -659,8 +660,9 @@
 
     DSGraph *GI;
 
-    for (unsigned x = 0; x < CalledFuncs.size(); ++x) {
-      const Function *Callee = CalledFuncs[x];
+    for (FuncSet::iterator I = CalledFuncs.begin(), E = CalledFuncs.end();
+         I != E; ++I) {
+      const Function *Callee = *I;
       // Get the data structure graph for the called function.
 
       GI = getDSGraph(*Callee);  // Graph to inline

Modified: poolalloc/trunk/lib/DSA/DSCallGraph.cpp
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/DSCallGraph.cpp?rev=159069&r1=159068&r2=159069&view=diff
==============================================================================
--- poolalloc/trunk/lib/DSA/DSCallGraph.cpp (original)
+++ poolalloc/trunk/lib/DSA/DSCallGraph.cpp Fri Jun 22 21:57:02 2012
@@ -258,24 +258,18 @@
   SimpleCallees[F];
 }
 
-void DSCallGraph::addFullFunctionList(llvm::CallSite CS, 
-                    std::vector<const llvm::Function*> &List) const {
+void DSCallGraph::addFullFunctionSet(llvm::CallSite CS,
+                    svset<const llvm::Function*> &Set) const {
   DSCallGraph::callee_iterator csi = callee_begin(CS),
                                cse = callee_end(CS);
   while(csi != cse) {
-    const Function *F = *csi;        
-    DSCallGraph::scc_iterator sccii = scc_begin(F),
-                              sccee = scc_end(F);
-    for(;sccii != sccee; ++sccii) {
-      List.push_back (*sccii);
-    }
+    const Function *F = *csi;
+    Set.insert(scc_begin(F), scc_end(F));
     ++csi;
   }
   const Function *F1 = CS.getInstruction()->getParent()->getParent();
   F1 = sccLeader(&*F1);
   DSCallGraph::scc_iterator sccii = scc_begin(F1),
                             sccee = scc_end(F1);
-  for(;sccii != sccee; ++sccii) {
-    List.push_back (*sccii);
-  }
+  Set.insert(scc_begin(F1), scc_end(F1));
 }

Modified: poolalloc/trunk/lib/DSA/DataStructure.cpp
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/DataStructure.cpp?rev=159069&r1=159068&r2=159069&view=diff
==============================================================================
--- poolalloc/trunk/lib/DSA/DataStructure.cpp (original)
+++ poolalloc/trunk/lib/DSA/DataStructure.cpp Fri Jun 22 21:57:02 2012
@@ -280,10 +280,10 @@
 
   }
 }
-/// addFullGlobalsList - Compute the full set of global values that are
+/// addFullGlobalsSet - Compute the full set of global values that are
 /// represented by this node.  Unlike getGlobalsList(), this requires fair
 /// amount of work to compute, so don't treat this method call as free.
-void DSNode::addFullGlobalsList(std::vector<const GlobalValue*> &List) const {
+void DSNode::addFullGlobalsSet(svset<const GlobalValue*> &Set) const {
   if (globals_begin() == globals_end()) return;
 
   EquivalenceClasses<const GlobalValue*> &EC = getParentGraph()->getGlobalECs();
@@ -291,15 +291,15 @@
   for (globals_iterator I = globals_begin(), E = globals_end(); I != E; ++I) {
     EquivalenceClasses<const GlobalValue*>::iterator ECI = EC.findValue(*I);
     if (ECI == EC.end())
-      List.push_back(*I);
+      Set.insert(*I);
     else
-      List.insert(List.end(), EC.member_begin(ECI), EC.member_end());
+      Set.insert(EC.member_begin(ECI), EC.member_end());
   }
 }
 
-/// addFullFunctionList - Identical to addFullGlobalsList, but only return the
+/// addFullFunctionSet - Identical to addFullGlobalsSet, but only return the
 /// functions in the full list.
-void DSNode::addFullFunctionList(std::vector<const Function*> &List) const {
+void DSNode::addFullFunctionSet(svset<const Function*> &Set) const {
   if (globals_begin() == globals_end()) return;
 
   EquivalenceClasses<const GlobalValue*> &EC = getParentGraph()->getGlobalECs();
@@ -308,12 +308,12 @@
     EquivalenceClasses<const GlobalValue*>::iterator ECI = EC.findValue(*I);
     if (ECI == EC.end()) {
       if (const Function *F = dyn_cast<Function>(*I))
-        List.push_back(F);
+        Set.insert(F);
     } else {
       for (EquivalenceClasses<const GlobalValue*>::member_iterator MI =
            EC.member_begin(ECI), E = EC.member_end(); MI != E; ++MI)
         if (const Function *F = dyn_cast<Function>(*MI))
-          List.push_back(F);
+          Set.insert(F);
     }
   }
 }

Modified: poolalloc/trunk/lib/DSA/TopDownClosure.cpp
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/TopDownClosure.cpp?rev=159069&r1=159068&r2=159069&view=diff
==============================================================================
--- poolalloc/trunk/lib/DSA/TopDownClosure.cpp (original)
+++ poolalloc/trunk/lib/DSA/TopDownClosure.cpp Fri Jun 22 21:57:02 2012
@@ -55,9 +55,7 @@
 
   // Handle this node
   {
-    std::vector<const Function*> Functions;
-    N->addFullFunctionList(Functions);
-    ExternallyCallable.insert(Functions.begin(), Functions.end());
+    N->addFullFunctionSet(ExternallyCallable);
   }
 
   for (DSNode::edge_iterator ii = N->edge_begin(),
@@ -65,9 +63,7 @@
     if (!ii->second.isNull()) {
       DSNodeHandle &NH = ii->second;
       DSNode * NN = NH.getNode();
-      std::vector<const Function*> Functions;
-      NN->addFullFunctionList(Functions);
-      ExternallyCallable.insert(Functions.begin(), Functions.end());
+      NN->addFullFunctionSet(ExternallyCallable);
       markReachableFunctionsExternallyAccessible(NN, Visited);
     }
 }
@@ -203,7 +199,7 @@
   if (!Visited.insert(G).second) return;
 
   // Recursively traverse all of the callee graphs.
-  std::vector<const Function*> Callees;
+  svset<const Function*> Callees;
 
   // Go through all of the callsites in this graph and find all callees
   // Here we're trying to capture all possible callees so that we can ensure
@@ -221,16 +217,11 @@
       // This includes all members of the SCC's of those callees,
       // and well as others in F's SCC, since we must assume
       // any indirect call might be intra-SCC.
-      callgraph.addFullFunctionList(CI->getCallSite(), Callees);
+      callgraph.addFullFunctionSet(CI->getCallSite(), Callees);
     }
   }
 
-  // Sort and eliminate duplicates.
-  // Not needed for correctness, but might as well.
-  std::sort(Callees.begin(), Callees.end());
-  Callees.erase(std::unique(Callees.begin(), Callees.end()), Callees.end());
-
-  for (std::vector<const Function*>::iterator I = Callees.begin(),
+  for (svset<const Function*>::iterator I = Callees.begin(),
        E = Callees.end(); I != E; ++I)
     ComputePostOrder(**I, Visited, PostOrder);
 
@@ -367,15 +358,14 @@
       continue;
     }
 
-    std::vector<const Function*> AllCallees, Callees;
+    svset<const Function*> AllCallees;
+    std::vector<const Function*> Callees;
 
     // Get the list of callees
-    callgraph.addFullFunctionList(CI->getCallSite(), AllCallees);
-    std::sort(AllCallees.begin(), AllCallees.end());
-    AllCallees.erase(std::unique(AllCallees.begin(), AllCallees.end()), AllCallees.end());
+    callgraph.addFullFunctionSet(CI->getCallSite(), AllCallees);
 
     // Filter all non-declarations, and calls within this DSGraph
-    for (std::vector<const Function*>::iterator I = AllCallees.begin(),
+    for (svset<const Function*>::iterator I = AllCallees.begin(),
         E = AllCallees.end(); I != E; ++I) {
       const Function *F = *I;
       if (!F->isDeclaration() && getDSGraph(**I) != DSG)





More information about the llvm-commits mailing list