it passes the definite clearance analysis.
[IRC.git] / Robust / src / Analysis / Locality / BranchAnalysis.java
index 31a1402666573e12f6f1aa49e8226ae555766457..e2a0940e5e03f3845fb15ad310abc9ff49bdf92d 100644 (file)
@@ -22,6 +22,9 @@ public class BranchAnalysis {
     Set<FlatNode> group=groupmap.get(fn);
     if (group==null)
       return -1;
+    while (next.numNext()==1&&group.contains(next)) {
+      next=fnmap.get(next)[0];
+    }
     if (group.contains(next))
       return -1;
     Vector<FlatNode> exits=table.get(group);
@@ -50,7 +53,7 @@ public class BranchAnalysis {
   public Set<FlatNode> getTargets() {
     HashSet<FlatNode> targets=new HashSet<FlatNode>();
     Collection<Set<FlatNode>> groups=groupmap.values();
-    for(Iterator<Set<FlatNode>> setit=groups.iterator();setit.hasNext();) {
+    for(Iterator<Set<FlatNode>> setit=groups.iterator(); setit.hasNext(); ) {
       Set<FlatNode> group=setit.next();
       targets.addAll(table.get(group));
     }
@@ -83,22 +86,22 @@ public class BranchAnalysis {
       String label=getGroup(fn);
       output.println(label+":");
       if (numJumps(fn)==1) {
-       FlatNode fndst=getJumps(fn).get(0);
-       output.println("goto "+nodetolabels.get(fndst)+";");
+        FlatNode fndst=getJumps(fn).get(0);
+        output.println("goto L"+nodetolabels.get(fndst)+";");
       } else if (numJumps(fn)==2) {
-       Vector<FlatNode> exits=getJumps(fn);
-       output.println("if(RESTOREBRANCH())");
-       output.println("goto L"+nodetolabels.get(exits.get(1))+";");
-       output.println("else");
-       output.println("goto L"+nodetolabels.get(exits.get(0))+";");
+        Vector<FlatNode> exits=getJumps(fn);
+        output.println("if(RESTOREBRANCH())");
+        output.println("goto L"+nodetolabels.get(exits.get(1))+";");
+        output.println("else");
+        output.println("goto L"+nodetolabels.get(exits.get(0))+";");
       } else {
-       Vector<FlatNode> exits=getJumps(fn);
-       output.println("switch(RESTOREBRANCH()) {");
-       for(int i=0;i<exits.size();i++) {
-         output.println("case "+i+":");
-         output.println("goto L"+nodetolabels.get(exits.get(i))+";");
-       }
-       output.println("}");
+        Vector<FlatNode> exits=getJumps(fn);
+        output.println("switch(RESTOREBRANCH()) {");
+        for(int i=0; i<exits.size(); i++) {
+          output.println("case "+i+":");
+          output.println("goto L"+nodetolabels.get(exits.get(i))+";");
+        }
+        output.println("}");
       }
     }
   }
@@ -108,39 +111,42 @@ public class BranchAnalysis {
     fnmap=computeMap(transset, nodeset, storeset);
     groupmap=new Hashtable<FlatNode, Set<FlatNode>>();
 
-    for(Iterator<FlatNode> fnit=transset.iterator();fnit.hasNext();) {
+    for(Iterator<FlatNode> fnit=transset.iterator(); fnit.hasNext(); ) {
       FlatNode fn=fnit.next();
-      if (fn.numNext()>1&&storeset.contains(fn)) {
-       FlatNode[] children=fnmap.get(fn);
-       if (!groupmap.containsKey(fn)) {
-         groupmap.put(fn, new HashSet<FlatNode>());
-         groupmap.get(fn).add(fn);
-       }
-       for(int i=0;i<children.length;i++) {
-         FlatNode child=children[i];
-         if (child.numNext()>1&&storeset.contains(child))
-           mergegroups(fn, child, groupmap);
-         }
+      if ((fn.numNext()>1&&storeset.contains(fn))||fn.kind()==FKind.FlatBackEdge||fn.kind()==FKind.FlatNop) {
+        FlatNode[] children=fnmap.get(fn);
+        if (children==null)
+          continue;
+        if (!groupmap.containsKey(fn)) {
+          groupmap.put(fn, new HashSet<FlatNode>());
+          groupmap.get(fn).add(fn);
+        }
+        for(int i=0; i<children.length; i++) {
+          FlatNode child=children[i];
+          if ((child.numNext()>1&&storeset.contains(child))||child.kind()==FKind.FlatBackEdge||child.kind()==FKind.FlatNop) {
+            mergegroups(fn, child, groupmap);
+          }
+        }
       }
     }
     //now we have groupings...
     Collection<Set<FlatNode>> groups=groupmap.values();
-    for(Iterator<Set<FlatNode>> setit=groups.iterator();setit.hasNext();) {
+    for(Iterator<Set<FlatNode>> setit=groups.iterator(); setit.hasNext(); ) {
       Set<FlatNode> group=setit.next();
       Vector<FlatNode> exits=new Vector<FlatNode>();
       table.put(group, exits);
-      for(Iterator<FlatNode> fnit=group.iterator();fnit.hasNext();) {
-       FlatNode fn=fnit.next();
-       FlatNode[] nextnodes=fnmap.get(fn);
-       for(int i=0;i<nextnodes.length;i++) {
-         FlatNode nextnode=nextnodes[i];
-         if (!group.contains(nextnode)) {
-           //outside edge
-           if (!exits.contains(nextnode)) {
-             exits.add(nextnode);
-           }
-         }
-       }
+      for(Iterator<FlatNode> fnit=group.iterator(); fnit.hasNext(); ) {
+        FlatNode fn=fnit.next();
+        FlatNode[] nextnodes=fnmap.get(fn);
+        for(int i=0; i<nextnodes.length; i++) {
+          FlatNode nextnode=nextnodes[i];
+          if (!group.contains(nextnode)) {
+            //outside edge
+            if (!exits.contains(nextnode)) {
+              exits.add(nextnode);
+            }
+          }
+        }
       }
     }
   }
@@ -156,9 +162,9 @@ public class BranchAnalysis {
     }
     if (groupmap.get(fn1)!=groupmap.get(fn2)) {
       groupmap.get(fn1).addAll(groupmap.get(fn2));
-      for(Iterator<FlatNode> fnit=groupmap.get(fn2).iterator();fnit.hasNext();) {
-       FlatNode fn3=fnit.next();
-       groupmap.put(fn3, groupmap.get(fn1));
+      for(Iterator<FlatNode> fnit=groupmap.get(fn2).iterator(); fnit.hasNext(); ) {
+        FlatNode fn3=fnit.next();
+        groupmap.put(fn3, groupmap.get(fn1));
       }
     }
   }
@@ -173,44 +179,44 @@ public class BranchAnalysis {
       toprocess.remove(fn);
       Set<Object[]> incomingtuples=new HashSet<Object[]>();
 
-      for(int i=0;i<fn.numPrev();i++) {
-       FlatNode fprev=fn.getPrev(i);
-       if (nodeset.contains(fprev)||storeset.contains(fprev)) {
-         for(int j=0;j<fprev.numNext();j++) {
-           if (fprev.getNext(j)==fn) {
-             Object[] pair=new Object[2];
-             pair[0]=new Integer(j);pair[1]=fprev;
-             incomingtuples.add(pair);
-           }
-         }
-       } else {
-         Set<Object[]> tuple=fntotuple.get(fprev);
-         if (tuple!=null)
-           incomingtuples.addAll(tuple);
-       }
+      for(int i=0; i<fn.numPrev(); i++) {
+        FlatNode fprev=fn.getPrev(i);
+        if (nodeset.contains(fprev)||storeset.contains(fprev)) {
+          for(int j=0; j<fprev.numNext(); j++) {
+            if (fprev.getNext(j)==fn) {
+              Object[] pair=new Object[2];
+              pair[0]=new Integer(j); pair[1]=fprev;
+              incomingtuples.add(pair);
+            }
+          }
+        } else {
+          Set<Object[]> tuple=fntotuple.get(fprev);
+          if (tuple!=null)
+            incomingtuples.addAll(tuple);
+        }
       }
 
       if (nodeset.contains(fn)||storeset.contains(fn)||fn.kind()==FKind.FlatAtomicExitNode) {
-       //nodeset contains this node
-       for(Iterator<Object[]> it=incomingtuples.iterator();it.hasNext();) {
-         Object[] pair=it.next();
-         int index=((Integer)pair[0]).intValue();
-         FlatNode node=(FlatNode)pair[1];
-         if (!fnmap.containsKey(node))
-           fnmap.put(node, new FlatNode[node.numNext()]);
-         fnmap.get(node)[index]=fn;
-       }
-       incomingtuples=new HashSet<Object[]>();
+        //nodeset contains this node
+        for(Iterator<Object[]> it=incomingtuples.iterator(); it.hasNext(); ) {
+          Object[] pair=it.next();
+          int index=((Integer)pair[0]).intValue();
+          FlatNode node=(FlatNode)pair[1];
+          if (!fnmap.containsKey(node))
+            fnmap.put(node, new FlatNode[node.numNext()]);
+          fnmap.get(node)[index]=fn;
+        }
+        incomingtuples=new HashSet<Object[]>();
       }
 
       //add if we need to update
       if (!fntotuple.containsKey(fn)||
-         !fntotuple.get(fn).equals(incomingtuples)) {
-       fntotuple.put(fn,incomingtuples);
-       for(int i=0;i<fn.numNext();i++) {
-         if (transset.contains(fn.getNext(i)))
-           toprocess.add(fn.getNext(i));
-       }
+          !fntotuple.get(fn).equals(incomingtuples)) {
+        fntotuple.put(fn,incomingtuples);
+        for(int i=0; i<fn.numNext(); i++) {
+          if (transset.contains(fn.getNext(i)))
+            toprocess.add(fn.getNext(i));
+        }
       }
     }
     return fnmap;
@@ -225,7 +231,7 @@ public class BranchAnalysis {
       FlatNode fn=tovisit.iterator().next();
       tovisit.remove(fn);
       if (locality.getAtomic(lb).get(fn).intValue()>0||fn.kind()==FKind.FlatAtomicExitNode)
-       transset.add(fn);
+        transset.add(fn);
     }
     return transset;
   }