got 2nd case of def reach up and running, one to go
[IRC.git] / Robust / src / Analysis / Disjoint / DisjointAnalysis.java
index c5d03684280c9e3a6aa926e132a6ea1a43114b46..99eb4f62f27b48a40022f4f024a18d7d897e304e 100644 (file)
@@ -726,8 +726,6 @@ public class DisjointAnalysis implements HeapAnalysis {
     mapDescriptorToReachGraph =
       new Hashtable<Descriptor, ReachGraph>();
 
-    pm = new PointerMethod();
-
     fc2enclosing = new Hashtable<FlatCall, Descriptor>();
   }
 
@@ -849,9 +847,11 @@ public class DisjointAnalysis implements HeapAnalysis {
     ReachGraph.debugCallSiteVisitCounter
       = 0; // count visits from 1, is incremented before first visit    
 
+    pm = new PointerMethod();
+
     if( state.DO_DEFINITE_REACH_ANALYSIS ) {
       doDefiniteReachAnalysis = true;
-      definiteReachAnalysis = new DefiniteReachAnalysis();
+      definiteReachAnalysis = new DefiniteReachAnalysis( pm );
     }
 
 
@@ -1302,9 +1302,11 @@ public class DisjointAnalysis implements HeapAnalysis {
     FlatSESEEnterNode sese;
     FlatSESEExitNode fsexn;
 
+    boolean alreadyReachable;
     Set<EdgeKey> edgeKeysForLoad;
     Set<EdgeKey> edgeKeysRemoved;
     Set<EdgeKey> edgeKeysAdded;
+    Set<DefiniteReachState.FdEntry> edgesToElideFromProp;
 
     //Stores the flatnode's reach graph at enter
     ReachGraph rgOnEnter = new ReachGraph();
@@ -1495,11 +1497,15 @@ public class DisjointAnalysis implements HeapAnalysis {
 
       boolean strongUpdate = false;
 
-      edgeKeysRemoved = null;
-      edgeKeysAdded   = null;
+      alreadyReachable     = false;
+      edgeKeysRemoved      = null;
+      edgeKeysAdded        = null;
+      edgesToElideFromProp = null;
       if( doDefiniteReachAnalysis ) {
-        edgeKeysRemoved = new HashSet<EdgeKey>();
-        edgeKeysAdded   = new HashSet<EdgeKey>();
+        alreadyReachable     = definiteReachAnalysis.isAlreadyReachable( rhs, lhs, fn );
+        edgeKeysRemoved      = new HashSet<EdgeKey>();
+        edgeKeysAdded        = new HashSet<EdgeKey>();
+        edgesToElideFromProp = definiteReachAnalysis.edgesToElidePropagation( lhs, rhs, fn );
       }
 
       // before transfer func, possibly inject
@@ -1529,8 +1535,10 @@ public class DisjointAnalysis implements HeapAnalysis {
                                                          fld, 
                                                          rhs, 
                                                          fn, 
+                                                         alreadyReachable,
                                                          edgeKeysRemoved,
-                                                         edgeKeysAdded );
+                                                         edgeKeysAdded,
+                                                         edgesToElideFromProp );
         if( doDefiniteReachAnalysis ) {
           definiteReachAnalysis.store( fn, 
                                        lhs,
@@ -1609,11 +1617,15 @@ public class DisjointAnalysis implements HeapAnalysis {
       tdElement = lhs.getType().dereference();
       fdElement = getArrayField(tdElement);
 
-      edgeKeysRemoved = null;
-      edgeKeysAdded   = null;
+      alreadyReachable     = false;
+      edgeKeysRemoved      = null;
+      edgeKeysAdded        = null;
+      edgesToElideFromProp = null;
       if( doDefiniteReachAnalysis ) {
-        edgeKeysRemoved = new HashSet<EdgeKey>();
-        edgeKeysAdded   = new HashSet<EdgeKey>();
+        alreadyReachable     = definiteReachAnalysis.isAlreadyReachable( rhs, lhs, fn );
+        edgeKeysRemoved      = new HashSet<EdgeKey>();
+        edgeKeysAdded        = new HashSet<EdgeKey>();
+        edgesToElideFromProp = definiteReachAnalysis.edgesToElidePropagation( lhs, rhs, fn );
       }
 
       // before transfer func, possibly inject
@@ -1645,8 +1657,10 @@ public class DisjointAnalysis implements HeapAnalysis {
                                             fdElement, 
                                             rhs, 
                                             fn, 
+                                            alreadyReachable,
                                             edgeKeysRemoved,
-                                            edgeKeysAdded );
+                                            edgeKeysAdded,
+                                            edgesToElideFromProp );
         }
 
         if( doDefiniteReachAnalysis ) {