Change the ActualCallees callgraph from hash_multimap<Instruction,Function>
authorChris Lattner <sabre@nondot.org>
Sat, 2 Apr 2005 19:15:15 +0000 (19:15 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 2 Apr 2005 19:15:15 +0000 (19:15 +0000)
to std::set<std::pair<Inst,Func>> to avoid duplicate entries.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21030 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/DataStructure/DataStructure.h
include/llvm/Analysis/DataStructure/EquivClassGraphs.h

index d2331e1bbd5d14d36e6bff48bc45be4418498ac2..8e83f3037b164afa6f4621b162f33ef5d072b0c1 100644 (file)
@@ -102,7 +102,7 @@ protected:
   // DSInfo, one graph for each function
   hash_map<Function*, DSGraph*> DSInfo;
   DSGraph *GlobalsGraph;
-  hash_multimap<Instruction*, Function*> ActualCallees;
+  std::set<std::pair<Instruction*, Function*> > ActualCallees;
 
   // This map is only maintained during construction of BU Graphs
   std::map<std::vector<Function*>,
@@ -152,11 +152,20 @@ public:
     AU.addRequired<LocalDataStructures>();
   }
 
-  typedef hash_multimap<Instruction*, Function*> ActualCalleesTy;
+  typedef std::set<std::pair<Instruction*, Function*> > ActualCalleesTy;
   const ActualCalleesTy &getActualCallees() const {
     return ActualCallees;
   }
 
+  ActualCalleesTy::iterator callee_begin(Instruction *I) const {
+    return ActualCallees.lower_bound(std::pair<Instruction*,Function*>(I, 0));
+  }
+
+  ActualCalleesTy::iterator callee_end(Instruction *I) const {
+    I = (Instruction*)((char*)I + 1);
+    return ActualCallees.lower_bound(std::pair<Instruction*,Function*>(I, 0));
+  }
+
 private:
   void calculateGraph(DSGraph &G);
 
@@ -177,6 +186,7 @@ class TDDataStructures : public ModulePass {
   hash_map<Function*, DSGraph*> DSInfo;
   hash_set<Function*> ArgsRemainIncomplete;
   DSGraph *GlobalsGraph;
+  BUDataStructures *BUInfo;
 
   /// GlobalECs - The equivalence classes for each global value that is merged
   /// with other global values in the DSGraphs.
@@ -257,8 +267,7 @@ private:
   void InlineCallersIntoGraph(DSGraph &G);
   DSGraph &getOrCreateDSGraph(Function &F);
   void ComputePostOrder(Function &F, hash_set<DSGraph*> &Visited,
-                        std::vector<DSGraph*> &PostOrder,
-                        const BUDataStructures::ActualCalleesTy &ActualCallees);
+                        std::vector<DSGraph*> &PostOrder);
 };
 
 
index 5b0a2206d6f4d01363ab37e93acba5b0c2c7220a..d97739acbf3cdfacb08f9bd42c9fe8056553aaa4 100644 (file)
@@ -39,7 +39,7 @@ namespace llvm {
 
     /// ActualCallees - The actual functions callable from indirect call sites.
     ///
-    hash_multimap<Instruction*, Function*> ActualCallees;
+    std::set<std::pair<Instruction*, Function*> > ActualCallees;
   
     // Equivalence class where functions that can potentially be called via the
     // same function pointer are in the same class.
@@ -96,10 +96,19 @@ namespace llvm {
       return *GlobalsGraph;
     }
     
-    typedef hash_multimap<Instruction*, Function*> ActualCalleesTy;
+    typedef std::set<std::pair<Instruction*, Function*> > ActualCalleesTy;
     const ActualCalleesTy &getActualCallees() const {
       return ActualCallees;
     }
+    
+    ActualCalleesTy::iterator callee_begin(Instruction *I) const {
+      return ActualCallees.lower_bound(std::pair<Instruction*,Function*>(I, 0));
+    }
+    
+    ActualCalleesTy::iterator callee_end(Instruction *I) const {
+      I = (Instruction*)((char*)I + 1);
+      return ActualCallees.lower_bound(std::pair<Instruction*,Function*>(I, 0));
+    }
 
     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
       AU.setPreservesAll();