got 2nd case of def reach up and running, one to go
[IRC.git] / Robust / src / Analysis / Disjoint / DisjointAnalysis.java
index 3128519ed2bce28e4c2a4487aa050877bd612ef4..99eb4f62f27b48a40022f4f024a18d7d897e304e 100644 (file)
@@ -1306,6 +1306,7 @@ public class DisjointAnalysis implements HeapAnalysis {
     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();
@@ -1496,13 +1497,15 @@ public class DisjointAnalysis implements HeapAnalysis {
 
       boolean strongUpdate = false;
 
-      alreadyReachable = false;
-      edgeKeysRemoved  = null;
-      edgeKeysAdded    = null;
+      alreadyReachable     = false;
+      edgeKeysRemoved      = null;
+      edgeKeysAdded        = null;
+      edgesToElideFromProp = null;
       if( doDefiniteReachAnalysis ) {
-        alreadyReachable = definiteReachAnalysis.isAlreadyReachable( rhs, lhs, fn );
-        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
@@ -1534,7 +1537,8 @@ public class DisjointAnalysis implements HeapAnalysis {
                                                          fn, 
                                                          alreadyReachable,
                                                          edgeKeysRemoved,
-                                                         edgeKeysAdded );
+                                                         edgeKeysAdded,
+                                                         edgesToElideFromProp );
         if( doDefiniteReachAnalysis ) {
           definiteReachAnalysis.store( fn, 
                                        lhs,
@@ -1613,13 +1617,15 @@ public class DisjointAnalysis implements HeapAnalysis {
       tdElement = lhs.getType().dereference();
       fdElement = getArrayField(tdElement);
 
-      alreadyReachable = false;
-      edgeKeysRemoved  = null;
-      edgeKeysAdded    = null;
+      alreadyReachable     = false;
+      edgeKeysRemoved      = null;
+      edgeKeysAdded        = null;
+      edgesToElideFromProp = null;
       if( doDefiniteReachAnalysis ) {
-        alreadyReachable = definiteReachAnalysis.isAlreadyReachable( rhs, lhs, fn );
-        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
@@ -1653,7 +1659,8 @@ public class DisjointAnalysis implements HeapAnalysis {
                                             fn, 
                                             alreadyReachable,
                                             edgeKeysRemoved,
-                                            edgeKeysAdded );
+                                            edgeKeysAdded,
+                                            edgesToElideFromProp );
         }
 
         if( doDefiniteReachAnalysis ) {