[llvm-commits] [poolalloc] r130276 - in /poolalloc/trunk: include/dsa/DSSupport.h lib/DSA/DSGraph.cpp

Will Dietz wdietz2 at illinois.edu
Tue Apr 26 20:00:03 PDT 2011


Author: wdietz2
Date: Tue Apr 26 22:00:03 2011
New Revision: 130276

URL: http://llvm.org/viewvc/llvm-project?rev=130276&view=rev
Log:
Switch MappedSites from vector to set.  Significantly reduces memory, runtime.
If MappedSites is too expensive later/still, perhaps use SuperSet.
Allows running -dsa-bu on 176.gcc in 85s and 4G on gravity.
(Without this change, it ran for 24 minutes using 7G before I got bored)
DSA still runs out of memory in -dsa-cbu on 176.gcc (so no poolalloc).
Other than more appropriate datastructure, no functionality changed.

Modified:
    poolalloc/trunk/include/dsa/DSSupport.h
    poolalloc/trunk/lib/DSA/DSGraph.cpp

Modified: poolalloc/trunk/include/dsa/DSSupport.h
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/include/dsa/DSSupport.h?rev=130276&r1=130275&r2=130276&view=diff
==============================================================================
--- poolalloc/trunk/include/dsa/DSSupport.h (original)
+++ poolalloc/trunk/include/dsa/DSSupport.h Tue Apr 26 22:00:03 2011
@@ -156,13 +156,16 @@
 /// the DSNode handles for the function arguments.
 ///
 class DSCallSite {
+public:
+  typedef std::set<CallSite> MappedSites_t;
+private:
   CallSite        Site;               // Actual call site
   const Function *CalleeF;            // The function called (direct call)
   DSNodeHandle    CalleeN;            // The function node called (indirect call)
   DSNodeHandle    RetVal;             // Returned value
   DSNodeHandle    VarArgVal;          // Merged var-arg val
   std::vector<DSNodeHandle> CallArgs; // The pointer arguments
-  std::vector<CallSite> MappedSites;  // The merged callsites
+  MappedSites_t MappedSites;          // The merged callsites
 
   static void InitNH(DSNodeHandle &NH, const DSNodeHandle &Src,
                      const std::map<const DSNode*, DSNode*> &NodeMap) {
@@ -226,9 +229,7 @@
     CallArgs.resize(FromCall.CallArgs.size());
     for (unsigned i = 0, e = FromCall.CallArgs.size(); i != e; ++i)
       InitNH(CallArgs[i], FromCall.CallArgs[i], NodeMap);
-    MappedSites.resize(FromCall.MappedSites.size());
-    for (unsigned i = 0, e = FromCall.MappedSites.size(); i != e; ++i)
-      MappedSites[i] = FromCall.MappedSites[i];
+    MappedSites = FromCall.MappedSites;
   }
 
   const DSCallSite &operator=(const DSCallSite &RHS) {
@@ -278,14 +279,9 @@
     return CallArgs[i];
   }
   
-  CallSite &getMappedCallSite(unsigned i) {
-    assert(i < MappedSites.size() && "Argument to getMappedCallSite is out of range!");
-    return MappedSites[i];
-  }
-  const CallSite &getMappedCallSite(unsigned i) const {
-    assert(i < MappedSites.size() && "Argument to getMappedCallSite is out of range!");
-    return MappedSites[i];
-  }
+
+  const MappedSites_t::iterator ms_begin() const { return MappedSites.begin(); }
+  const MappedSites_t::iterator ms_end() const { return MappedSites.end(); }
 
   void addPtrArg(const DSNodeHandle &NH) {
     CallArgs.push_back(NH);
@@ -318,9 +314,8 @@
     for (unsigned a = MinArgs, e = CS.getNumPtrArgs(); a != e; ++a)
       CallArgs.push_back(CS.getPtrArg(a));
 
-    MappedSites.push_back(CS.getCallSite());
-    for (unsigned a = 0, e = CS.MappedSites.size(); a != e; ++a)
-      MappedSites.push_back(CS.MappedSites[a]);
+    MappedSites.insert(CS.getCallSite());
+    MappedSites.insert(CS.ms_begin(), CS.ms_end());
   }
 
   /// markReachableNodes - This method recursively traverses the specified

Modified: poolalloc/trunk/lib/DSA/DSGraph.cpp
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/DSGraph.cpp?rev=130276&r1=130275&r2=130276&view=diff
==============================================================================
--- poolalloc/trunk/lib/DSA/DSGraph.cpp (original)
+++ poolalloc/trunk/lib/DSA/DSGraph.cpp Tue Apr 26 22:00:03 2011
@@ -1650,8 +1650,8 @@
   //
   const std::list<DSCallSite>& Calls = getFunctionCalls();
   for (std::list<DSCallSite>::const_iterator ii = Calls.begin(),
-                                             ee = Calls.end();
-       ii != ee; ++ii) {
+      ee = Calls.end();
+      ii != ee; ++ii) {
     //
     // Direct calls are easy.  We know to where they go.
     //
@@ -1685,18 +1685,20 @@
           DCG.insert(CS, *Fi);
         else
           ++NumFiltered;
-     for (unsigned i = 0; i < ii->getNumMappedSites(); i++) {
-       CallSite MCS = ii->getMappedCallSite(i);
-       for (std::vector<const Function*>::iterator Fi = MaybeTargets.begin(),
+      for (DSCallSite::MappedSites_t::iterator I = ii->ms_begin(),
+           E = ii->ms_end(); I != E; ++I) {
+        CallSite MCS = *I;
+        for (std::vector<const Function*>::iterator Fi = MaybeTargets.begin(),
              Fe = MaybeTargets.end(); Fi != Fe; ++Fi)
           if (!filter || functionIsCallable(MCS, *Fi))
             DCG.insert(MCS, *Fi);
           else
             ++NumFiltered;
-       }
+      }
     }
   }
 }
+
 void DSGraph::buildCompleteCallGraph(DSCallGraph& DCG, 
                                      std::vector<const Function*>& GlobalFunctionList, bool filter) const {
   //
@@ -1724,10 +1726,12 @@
         DCG.insert(CS, *Fi);
       else
         ++NumFiltered;
-    for (unsigned i = 0; i < ii->getNumMappedSites(); i++) {
-      CallSite MCS = ii->getMappedCallSite(i);
+
+    for (DSCallSite::MappedSites_t::iterator I = ii->ms_begin(),
+         E = ii->ms_end(); I != E; ++I) {
+      CallSite MCS = *I;
       for (std::vector<const Function*>::iterator Fi = MaybeTargets.begin(),
-            Fe = MaybeTargets.end(); Fi != Fe; ++Fi){
+           Fe = MaybeTargets.end(); Fi != Fe; ++Fi) {
         if (!filter || functionIsCallable(MCS, *Fi))
           DCG.insert(MCS, *Fi);
         else





More information about the llvm-commits mailing list