generate annotated source code again but it's still not the correct one...
[IRC.git] / Robust / src / Analysis / Loops / LoopInvariant.java
index 60bdc5a9363e55e342eaeb1c5369b617b1a11802..a4686a66f55958bc102dcd6d7a1976aa036e1c1c 100644 (file)
@@ -39,7 +39,7 @@ public class LoopInvariant {
   }
 
   public void recurse(Loops parent) {
-    for(Iterator lpit=parent.nestedLoops().iterator();lpit.hasNext();) {
+    for(Iterator lpit=parent.nestedLoops().iterator(); lpit.hasNext(); ) {
       Loops child=(Loops)lpit.next();
       processLoop(child, child.nestedLoops().size()==0);
       recurse(child);
@@ -58,98 +58,100 @@ public class LoopInvariant {
 
     HashSet<FieldDescriptor> fields=new HashSet<FieldDescriptor>();
     HashSet<TypeDescriptor> types=new HashSet<TypeDescriptor>();
-    
+
     if (!isLeaf) {
-      unsafe=true; 
+      unsafe=true;
     } else {
       /* Check whether it is safe to reuse values. */
-      for(Iterator elit=elements.iterator();elit.hasNext();) {
-       FlatNode fn=(FlatNode)elit.next();
-       if (fn.kind()==FKind.FlatAtomicEnterNode||
-           fn.kind()==FKind.FlatAtomicExitNode) {
-         unsafe=true;
-         break;
-       } else if (fn.kind()==FKind.FlatCall) {
-         FlatCall fcall=(FlatCall)fn;
-         MethodDescriptor md=fcall.getMethod();
-         Set<FieldDescriptor> f=gft.getFieldsAll(md);
-         Set<TypeDescriptor> t=gft.getArraysAll(md);
-         if (f!=null)
-           fields.addAll(f);
-         if (t!=null)
-           types.addAll(t);
-         if (gft.containsAtomicAll(md)||gft.containsBarrierAll(md)) {
-           unsafe=true;
-         }
-       } else if (fn.kind()==FKind.FlatSetFieldNode) {
-         FlatSetFieldNode fsfn=(FlatSetFieldNode)fn;
-         fields.add(fsfn.getField());
-       } else if (fn.kind()==FKind.FlatSetElementNode) {
-         FlatSetElementNode fsen=(FlatSetElementNode)fn;
-         types.add(fsen.getDst().getType());
-       }
-      }   
+      for(Iterator elit=elements.iterator(); elit.hasNext(); ) {
+        FlatNode fn=(FlatNode)elit.next();
+        if (fn.kind()==FKind.FlatAtomicEnterNode||
+            fn.kind()==FKind.FlatAtomicExitNode) {
+          unsafe=true;
+          break;
+        } else if (fn.kind()==FKind.FlatCall) {
+          FlatCall fcall=(FlatCall)fn;
+          MethodDescriptor md=fcall.getMethod();
+          Set<FieldDescriptor> f=gft.getFieldsAll(md);
+          Set<TypeDescriptor> t=gft.getArraysAll(md);
+          if (f!=null)
+            fields.addAll(f);
+          if (t!=null)
+            types.addAll(t);
+          if (gft.containsAtomicAll(md)||gft.containsBarrierAll(md)) {
+            unsafe=true;
+          }
+        } else if (fn.kind()==FKind.FlatSetFieldNode) {
+          FlatSetFieldNode fsfn=(FlatSetFieldNode)fn;
+          fields.add(fsfn.getField());
+        } else if (fn.kind()==FKind.FlatSetElementNode) {
+          FlatSetElementNode fsen=(FlatSetElementNode)fn;
+          types.add(fsen.getDst().getType());
+        }
+      }
     }
-    
+
     HashSet dominatorset=unsafe?null:computeAlways(l);
 
     /* Compute loop invariants */
     table.put(entrance, new Vector<FlatNode>());
     while(changed) {
       changed=false;
-      nextfn:
-      for(Iterator tpit=toprocess.iterator();tpit.hasNext();) {
-       FlatNode fn=(FlatNode)tpit.next();
-       switch(fn.kind()) {
-       case FKind.FlatOpNode:
-         int op=((FlatOpNode)fn).getOp().getOp();
-         if (op==Operation.DIV||op==Operation.MOD||
-             checkNode(fn,elements)) {
-           continue nextfn;
-         }
-         break;
+nextfn:
+      for(Iterator tpit=toprocess.iterator(); tpit.hasNext(); ) {
+        FlatNode fn=(FlatNode)tpit.next();
+        switch(fn.kind()) {
+        case FKind.FlatOpNode:
+          int op=((FlatOpNode)fn).getOp().getOp();
+          if (op==Operation.DIV||op==Operation.MOD||
+              checkNode(fn,elements)||
+              !unsafe&&!dominatorset.contains(fn)) {
+            continue nextfn;
+          }
+          break;
 
-       case FKind.FlatInstanceOfNode:
-         if (checkNode(fn,elements)) {
-           continue nextfn;
-         }
-         break;
+        case FKind.FlatInstanceOfNode:
+          if (checkNode(fn,elements)||
+              !unsafe&&!dominatorset.contains(fn)) {
+            continue nextfn;
+          }
+          break;
 
-       case FKind.FlatElementNode:
-         if (unsafe||dominatorset==null||
-             !dominatorset.contains(fn)||
-             checkNode(fn,elements))
-           continue nextfn;
-         TypeDescriptor td=((FlatElementNode)fn).getSrc().getType();
-         for(Iterator<TypeDescriptor> tdit=types.iterator();tdit.hasNext();) {
-           TypeDescriptor td2=tdit.next();
-           if (typeutil.isSuperorType(td,td2)||
-               typeutil.isSuperorType(td2,td)) {
-             continue nextfn;
-           }
-         }
-         if (isLeaf)
-           tounroll.add(entrance);
-         break;
+        case FKind.FlatElementNode:
+          if (unsafe||dominatorset==null||
+              !dominatorset.contains(fn)||
+              checkNode(fn,elements))
+            continue nextfn;
+          TypeDescriptor td=((FlatElementNode)fn).getSrc().getType();
+          for(Iterator<TypeDescriptor> tdit=types.iterator(); tdit.hasNext(); ) {
+            TypeDescriptor td2=tdit.next();
+            if (typeutil.isSuperorType(td,td2)||
+                typeutil.isSuperorType(td2,td)) {
+              continue nextfn;
+            }
+          }
+          if (isLeaf)
+            tounroll.add(entrance);
+          break;
 
-       case FKind.FlatFieldNode:
-         if (unsafe||dominatorset==null||
-             !dominatorset.contains(fn)||
-             fields.contains(((FlatFieldNode)fn).getField())||
-             checkNode(fn,elements)) {
-           continue nextfn;
-         }
-         if (isLeaf)
-           tounroll.add(entrance);
-         break;
+        case FKind.FlatFieldNode:
+          if (unsafe||dominatorset==null||
+              !dominatorset.contains(fn)||
+              fields.contains(((FlatFieldNode)fn).getField())||
+              checkNode(fn,elements)) {
+            continue nextfn;
+          }
+          if (isLeaf)
+            tounroll.add(entrance);
+          break;
 
-       default:
-         continue nextfn;
-       }
-       //mark to hoist
-       if (hoisted.add(fn))
-           changed=true;
-       table.get(entrance).add(fn);
+        default:
+          continue nextfn;
+        }
+        //mark to hoist
+        if (hoisted.add(fn))
+          changed=true;
+        table.get(entrance).add(fn);
       }
     }
   }
@@ -163,26 +165,26 @@ public class LoopInvariant {
     assert entrances.size()==1;
     FlatNode entrance=(FlatNode)entrances.iterator().next();
     boolean first=true;
-    for (int i=0;i<entrance.numPrev();i++) {
+    for (int i=0; i<entrance.numPrev(); i++) {
       FlatNode incoming=entrance.getPrev(i);
       if (elements.contains(incoming)) {
-       HashSet domset=new HashSet();
-       domset.add(incoming);
-       FlatNode tmp=incoming;
-       while(tmp!=entrance) {
-         tmp=domtree.idom(tmp);
-         domset.add(tmp);
-       }
-       if (first) {
-         dominatorset=domset;
-         first=false;
-       } else {
-         for(Iterator it=dominatorset.iterator();it.hasNext();) {
-           FlatNode fn=(FlatNode)it.next();
-           if (!domset.contains(fn))
-             it.remove();
-         }
-       }
+        HashSet domset=new HashSet();
+        domset.add(incoming);
+        FlatNode tmp=incoming;
+        while(tmp!=entrance) {
+          tmp=domtree.idom(tmp);
+          domset.add(tmp);
+        }
+        if (first) {
+          dominatorset=domset;
+          first=false;
+        } else {
+          for(Iterator it=dominatorset.iterator(); it.hasNext(); ) {
+            FlatNode fn=(FlatNode)it.next();
+            if (!domset.contains(fn))
+              it.remove();
+          }
+        }
       }
     }
     return dominatorset;
@@ -190,16 +192,16 @@ public class LoopInvariant {
 
   public boolean checkNode(FlatNode fn, Set elements) {
     //Can hoist if all variables are loop invariant
-    TempDescriptor[]uses=fn.readsTemps();
-    for(int i=0;i<uses.length;i++) {
+    TempDescriptor[] uses=fn.readsTemps();
+    for(int i=0; i<uses.length; i++) {
       TempDescriptor t=uses[i];
       Set<FlatNode> defset=usedef.defMap(fn, t);
-      for(Iterator<FlatNode> defit=defset.iterator();defit.hasNext();) {
-       FlatNode def=defit.next();
-       if (elements.contains(def)&&defset.size()>1)
-         return true;
-       if (elements.contains(def)&&!hoisted.contains(def))
-         return true;
+      for(Iterator<FlatNode> defit=defset.iterator(); defit.hasNext(); ) {
+        FlatNode def=defit.next();
+        if (elements.contains(def)&&defset.size()>1)
+          return true;
+        if (elements.contains(def)&&!hoisted.contains(def))
+          return true;
       }
     }
     return false;