more bug fixes...two examples working
authorbdemsky <bdemsky>
Thu, 10 Mar 2011 08:13:27 +0000 (08:13 +0000)
committerbdemsky <bdemsky>
Thu, 10 Mar 2011 08:13:27 +0000 (08:13 +0000)
Robust/src/Analysis/Pointer/Delta.java
Robust/src/Analysis/Pointer/Edge.java
Robust/src/Analysis/Pointer/MySet.java
Robust/src/Analysis/Pointer/Pointer.java

index 7c3e37b756a3d9b8270f3e5b633af99d11a5bb8f..743b8dbf7f805822449fbd1cc6ec6977b62bbab1 100644 (file)
@@ -23,6 +23,13 @@ public class Delta {
        if (e.src!=node)
          throw new Error(e.src+" is not equal to "+node);
     }
+
+    for(Map.Entry<TempDescriptor, MySet<Edge>> entry:varedgeadd.entrySet()) {
+      TempDescriptor tmp=entry.getKey();
+      for(Edge e:entry.getValue())
+       if (e.srcvar!=tmp)
+         throw new Error(e.srcvar+" is not equal to "+tmp);
+    }
     return this;
   }
 
@@ -69,7 +76,12 @@ public class Delta {
     //Update variable edge mappings
     newdelta.varedgeadd=new HashMap<TempDescriptor, MySet<Edge>>();
     for(Map.Entry<TempDescriptor, MySet<Edge>> entry:varedgeadd.entrySet()) {
-      varedgeadd.put(tmpMap.get(entry.getKey()), entry.getValue());
+      TempDescriptor origTmp=entry.getKey();
+      TempDescriptor newTmp=tmpMap.get(entry.getKey());
+      newdelta.varedgeadd.put(newTmp, new MySet<Edge>());
+      for(Edge e:entry.getValue()) {
+       newdelta.varedgeadd.get(newTmp).add(e.rewrite(origTmp, newTmp));
+      }
     }
     newdelta.varedgeremove=varedgeremove;
     newdelta.addNodeAges=addNodeAges;
index fe62bb571fa5962116a6ff2bc7fbbb8bd40e227b..e2f25b6a66c03b02c0faa895814b56aa3f86c387 100644 (file)
@@ -97,6 +97,14 @@ public class Edge {
     return e;
   }
 
+  public Edge rewrite(TempDescriptor orig, TempDescriptor newtmp) {
+    Edge e=copy();
+    if (e.srcvar!=orig)
+      throw new Error("Mismatched temps");
+    e.srcvar=newtmp;
+    return e;
+  }
+
   public boolean statusDominates(Edge other) {
     return (statuspredicate==NEW)||
       ((other.statuspredicate|statuspredicate)==statuspredicate);
index a3d523bf21fde0291e9f9eb421c80f5c9677abf1..172023154e7e37be7b3ecf63c46251b0d254c2f6 100644 (file)
@@ -48,6 +48,20 @@ public class MySet<T> extends AbstractSet<T> {
     return map.containsKey(obj);
   }
 
+  public boolean removeAll(Collection c) {
+    if (c!=null)
+      return super.removeAll(c);
+    else
+      return false;
+  }
+
+  public boolean addAll(Collection c) {
+    if (c!=null)
+      return super.addAll(c);
+    else
+      return false;
+  }
+
   public T get(T obj) {
     return map.get(obj);
   }
index 102e2ab8df2c980076beee8b067c977d45b89000..af467a283156e489d57f68c12b5f483e248cac2d 100644 (file)
@@ -191,6 +191,7 @@ public class Pointer {
        /* Store the results */
        newDelta.varedgeadd.put(tmp, newbaseedge);
       }
+      delta.basevaredge.clear();
 
       /* Next we build heap edges */
       HashSet<AllocNode> nodeSet=new HashSet<AllocNode>();
@@ -471,6 +472,7 @@ public class Pointer {
     for(TempDescriptor tmp:temps) {
       //Compute set of edges from given node
       MySet<Edge> edges=new MySet<Edge>(delta.basevaredge.get(tmp));
+      
       edges.removeAll(delta.varedgeremove.get(tmp));
       edges.addAll(delta.varedgeadd.get(tmp));
       
@@ -855,11 +857,11 @@ public class Pointer {
     if (delta.getInit()) {
       HashSet<AllocNode> srcNodes=GraphManip.getNodes(graph, delta, src);
       HashSet<AllocNode> dstNodes=GraphManip.getNodes(graph, delta, dst);
-      MySet<Edge> edgesToAdd=GraphManip.genEdges(srcNodes, fd, dstNodes);
+      MySet<Edge> edgesToAdd=GraphManip.genEdges(dstNodes, fd, srcNodes);
       MySet<Edge> edgesToRemove=null;
-      if (srcNodes.size()==1&&!srcNodes.iterator().next().isSummary()) {
+      if (dstNodes.size()==1&&!dstNodes.iterator().next().isSummary()) {
        /* Can do a strong update */
-       edgesToRemove=GraphManip.getEdges(graph, delta, srcNodes, fd);
+       edgesToRemove=GraphManip.getEdges(graph, delta, dstNodes, fd);
        graph.strongUpdateSet=edgesToRemove;
       } else
        graph.strongUpdateSet=new MySet<Edge>();
@@ -876,23 +878,23 @@ public class Pointer {
 
 
       MySet<Edge> edgesToRemove=null;
-      if (newSrcNodes.size()!=0) {
-       if (srcNodes.size()>1&&!srcNodes.iterator().next().isSummary()) {
+      if (newDstNodes.size()!=0) {
+       if (dstNodes.size()>1&&!dstNodes.iterator().next().isSummary()) {
          /* Need to undo strong update */
          if (graph.strongUpdateSet!=null) {
            edgesToAdd.addAll(graph.strongUpdateSet);
            graph.strongUpdateSet=null; //Prevent future strong updates
          }
-       } else if (srcNodes.size()==1&&newSrcNodes.size()==1&&!newSrcNodes.iterator().next().isSummary()&&graph.strongUpdateSet!=null) {
-         edgesToRemove=GraphManip.getEdges(graph, delta, srcNodes, fd);
+       } else if (dstNodes.size()==1&&newDstNodes.size()==1&&!newDstNodes.iterator().next().isSummary()&&graph.strongUpdateSet!=null) {
+         edgesToRemove=GraphManip.getEdges(graph, delta, dstNodes, fd);
          graph.strongUpdateSet.addAll(edgesToRemove);
        }
-       edgesToAdd.addAll(GraphManip.genEdges(newSrcNodes, fd, dstNodes));
+       edgesToAdd.addAll(GraphManip.genEdges(newDstNodes, fd, srcNodes));
       }
 
       //Kill new edges
       if (graph.strongUpdateSet!=null) {
-       MySet<Edge> otherEdgesToRemove=GraphManip.getDiffEdges(delta, srcNodes);
+       MySet<Edge> otherEdgesToRemove=GraphManip.getDiffEdges(delta, dstNodes);
        if (edgesToRemove!=null)
          edgesToRemove.addAll(otherEdgesToRemove);
        else
@@ -901,7 +903,7 @@ public class Pointer {
       }
 
       //Next look at new destinations
-      edgesToAdd.addAll(GraphManip.genEdges(srcNodes, fd, newDstNodes));
+      edgesToAdd.addAll(GraphManip.genEdges(dstNodes, fd, newSrcNodes));
 
       /* Update diff */
       updateHeapDelta(graph, delta, edgesToAdd, edgesToRemove);
@@ -1264,6 +1266,7 @@ public class Pointer {
       mergeVarEdges(graph, delta, newdelta);
       mergeAges(graph, delta, newdelta);
     }
+
     return newdelta;
   }