1) allow to set the maximum threshold for the liveness analysis. if threashold is...
[IRC.git] / Robust / src / Analysis / Loops / CSE.java
index 76adcd851a4c7dd278bc1b566c1330356bda4b3c..efa1f8437a7d82b5c239885a478cb1c0fc87ad3e 100644 (file)
@@ -22,7 +22,6 @@ public class CSE {
 
   public void doAnalysis(FlatMethod fm) {
     Hashtable<FlatNode,Hashtable<Expression, TempDescriptor>> availexpr=new Hashtable<FlatNode,Hashtable<Expression, TempDescriptor>>();
-
     HashSet toprocess=new HashSet();
     HashSet discovered=new HashSet();
     toprocess.add(fm);
@@ -30,176 +29,214 @@ public class CSE {
     while(!toprocess.isEmpty()) {
       FlatNode fn=(FlatNode)toprocess.iterator().next();
       toprocess.remove(fn);
-      for(int i=0;i<fn.numNext();i++) {
-       FlatNode nnext=fn.getNext(i);
-       if (!discovered.contains(nnext)) {
-         toprocess.add(nnext);
-         discovered.add(nnext);
-       }
+      for(int i=0; i<fn.numNext(); i++) {
+        FlatNode nnext=fn.getNext(i);
+        if (!discovered.contains(nnext)) {
+          toprocess.add(nnext);
+          discovered.add(nnext);
+        }
       }
       Hashtable<Expression, TempDescriptor> tab=computeIntersection(fn, availexpr);
-
+      
+//      if(tab.size()>1000){
+//        System.out.println("Skipping CSE of "+fm.getMethod()+" due to size.");
+//        return;
+//      }
+      
       //Do kills of expression/variable mappings
       TempDescriptor[] write=fn.writesTemps();
-      for(int i=0;i<write.length;i++) {
-       if (tab.containsKey(write[i]))
-         tab.remove(write[i]);
+      for(int i=0; i<write.length; i++) {
+        for(Iterator it=tab.entrySet().iterator(); it.hasNext(); ) {
+          Map.Entry m=(Map.Entry)it.next();
+          TempDescriptor td=(TempDescriptor)m.getValue();
+          if(td.equals(write[i])){
+            it.remove();
+          }        
+        }
       }
       
+      
+      
+
       switch(fn.kind()) {
+      case FKind.FlatAtomicEnterNode:
+      {
+        killexpressions(tab, null, null, true);
+        break;
+      }
+
       case FKind.FlatCall:
-       {
-         FlatCall fc=(FlatCall) fn;
-         MethodDescriptor md=fc.getMethod();
-         Set<FieldDescriptor> fields=gft.getFields(md);
-         Set<TypeDescriptor> arrays=gft.getArrays(md);
-         killexpressions(tab, fields, arrays);
-         break;
-       }
+      {
+        FlatCall fc=(FlatCall) fn;
+        MethodDescriptor md=fc.getMethod();
+        Set<FieldDescriptor> fields=gft.getFieldsAll(md);
+        Set<TypeDescriptor> arrays=gft.getArraysAll(md);
+        killexpressions(tab, fields, arrays, gft.containsAtomicAll(md)||gft.containsBarrierAll(md));
+        break;
+      }
+
       case FKind.FlatOpNode:
-       {
-         FlatOpNode fon=(FlatOpNode) fn;
-         Expression e=new Expression(fon.getLeft(), fon.getRight(),fon.getOp());
-         tab.put(e, fon.getDest());
-         break;
-       }
+      {
+        FlatOpNode fon=(FlatOpNode) fn;
+        Expression e=new Expression(fon.getLeft(), fon.getRight(), fon.getOp());
+        tab.put(e, fon.getDest());
+        break;
+      }
+
       case FKind.FlatSetFieldNode:
-       {
-         FlatSetFieldNode fsfn=(FlatSetFieldNode)fn;
-         Set<FieldDescriptor> fields=new HashSet<FieldDescriptor>();
-         fields.add(fsfn.getField());
-         killexpressions(tab, fields, null);
-         Expression e=new Expression(fsfn.getDst(), fsfn.getField());
-         tab.put(e, fsfn.getSrc());
-         break;
-       }
+      {
+        FlatSetFieldNode fsfn=(FlatSetFieldNode)fn;
+        Set<FieldDescriptor> fields=new HashSet<FieldDescriptor>();
+        fields.add(fsfn.getField());
+        killexpressions(tab, fields, null, false);
+        Expression e=new Expression(fsfn.getDst(), fsfn.getField());
+        tab.put(e, fsfn.getSrc());
+        break;
+      }
+
       case FKind.FlatFieldNode:
-       {
-         FlatFieldNode ffn=(FlatFieldNode)fn;
-         Expression e=new Expression(ffn.getSrc(), ffn.getField());
-         tab.put(e, ffn.getDst());
-         break;
-       }
+      {
+        FlatFieldNode ffn=(FlatFieldNode)fn;
+        Expression e=new Expression(ffn.getSrc(), ffn.getField());
+        tab.put(e, ffn.getDst());
+        break;
+      }
+
       case FKind.FlatSetElementNode:
-       {
-         FlatSetElementNode fsen=(FlatSetElementNode)fn;
-         Expression e=new Expression(fsen.getDst(),fsen.getIndex());
-         tab.put(e, fsen.getSrc());
-         break;
-       }
+      {
+        FlatSetElementNode fsen=(FlatSetElementNode)fn;
+        Expression e=new Expression(fsen.getDst(),fsen.getIndex());
+        tab.put(e, fsen.getSrc());
+        break;
+      }
+
       case FKind.FlatElementNode:
-       {
-         FlatElementNode fen=(FlatElementNode)fn;
-         Expression e=new Expression(fen.getSrc(),fen.getIndex());
-         tab.put(e, fen.getDst());
-         break;
-       }
+      {
+        FlatElementNode fen=(FlatElementNode)fn;
+        Expression e=new Expression(fen.getSrc(),fen.getIndex());
+        tab.put(e, fen.getDst());
+        break;
+      }
+
       default:
       }
-      
+
       if (write.length==1) {
-       TempDescriptor w=write[0];
-       for(Iterator it=tab.entrySet().iterator();it.hasNext();) {
-         Map.Entry m=(Map.Entry)it.next();
-         Expression e=(Expression)m.getKey();
-         if (e.a==w||e.b==w)
-           it.remove();
-       }
+        TempDescriptor w=write[0];
+        for(Iterator it=tab.entrySet().iterator(); it.hasNext(); ) {
+          Map.Entry m=(Map.Entry)it.next();
+          Expression e=(Expression)m.getKey();
+          if (e.a==w||e.b==w)
+            it.remove();
+        }
       }
       if (!availexpr.containsKey(fn)||!availexpr.get(fn).equals(tab)) {
-       availexpr.put(fn, tab);
-       for(int i=0;i<fn.numNext();i++) {
-         FlatNode nnext=fn.getNext(i);
-         toprocess.add(nnext);
-       }
+        availexpr.put(fn, tab);
+        for(int i=0; i<fn.numNext(); i++) {
+          FlatNode nnext=fn.getNext(i);
+          toprocess.add(nnext);
+        }
       }
     }
+
     doOptimize(fm, availexpr);
   }
-    
+
   public void doOptimize(FlatMethod fm, Hashtable<FlatNode,Hashtable<Expression, TempDescriptor>> availexpr) {
-      for(Iterator<FlatNode> it=fm.getNodeSet().iterator();it.hasNext();) {
-         FlatNode fn=it.next();
-         Hashtable<Expression, TempDescriptor> tab=computeIntersection(fn, availexpr);
-         switch(fn.kind()) {
-         case FKind.FlatOpNode:
-             {
-                 FlatOpNode fon=(FlatOpNode) fn;
-                 Expression e=new Expression(fon.getLeft(), fon.getRight(),fon.getOp());
-                 if (tab.containsKey(e)) {
-                     TempDescriptor t=tab.get(e);
-                     FlatOpNode newfon=new FlatOpNode(fon.getDest(),t,null,new Operation(Operation.ASSIGN));
-                     fon.replace(newfon);
-                 }
-                 break;
-             }
-         case FKind.FlatFieldNode:
-             {
-                 FlatFieldNode ffn=(FlatFieldNode)fn;
-                 Expression e=new Expression(ffn.getSrc(), ffn.getField());
-                 if (tab.containsKey(e)) {
-                     TempDescriptor t=tab.get(e);
-                     FlatOpNode newfon=new FlatOpNode(ffn.getDst(),t,null,new Operation(Operation.ASSIGN));
-                     ffn.replace(newfon);
-                 }
-                 break;
-             }
-         case FKind.FlatElementNode:
-             {
-                 FlatElementNode fen=(FlatElementNode)fn;
-                 Expression e=new Expression(fen.getSrc(),fen.getIndex());
-                 if (tab.containsKey(e)) {
-                     TempDescriptor t=tab.get(e);
-                     FlatOpNode newfon=new FlatOpNode(fen.getDst(),t,null,new Operation(Operation.ASSIGN));
-                     fen.replace(newfon);
-                 }
-                 break;
-             }
-         default: 
-         }
+    Hashtable<FlatNode, FlatNode> replacetable=new Hashtable<FlatNode, FlatNode>();
+    for(Iterator<FlatNode> it=fm.getNodeSet().iterator(); it.hasNext(); ) {
+      FlatNode fn=it.next();
+      Hashtable<Expression, TempDescriptor> tab=computeIntersection(fn, availexpr);
+      switch(fn.kind()) {
+      case FKind.FlatOpNode:
+      {
+        FlatOpNode fon=(FlatOpNode) fn;
+        Expression e=new Expression(fon.getLeft(), fon.getRight(),fon.getOp());
+        if (tab.containsKey(e)) {
+          TempDescriptor t=tab.get(e);
+          FlatNode newfon=new FlatOpNode(fon.getDest(),t,null,new Operation(Operation.ASSIGN));
+          replacetable.put(fon,newfon);
+        }
+        break;
+      }
+
+      case FKind.FlatFieldNode:
+      {
+        FlatFieldNode ffn=(FlatFieldNode)fn;
+        Expression e=new Expression(ffn.getSrc(), ffn.getField());
+        if (tab.containsKey(e)) {
+          TempDescriptor t=tab.get(e);
+          FlatNode newfon=new FlatOpNode(ffn.getDst(),t,null,new Operation(Operation.ASSIGN));
+          replacetable.put(ffn,newfon);
+        }
+        break;
+      }
+
+      case FKind.FlatElementNode:
+      {
+        FlatElementNode fen=(FlatElementNode)fn;
+        Expression e=new Expression(fen.getSrc(),fen.getIndex());
+        if (tab.containsKey(e)) {
+          TempDescriptor t=tab.get(e);
+          FlatNode newfon=new FlatOpNode(fen.getDst(),t,null,new Operation(Operation.ASSIGN));
+          replacetable.put(fen,newfon);
+        }
+        break;
+      }
+
+      default:
       }
+    }
+    for(Iterator<FlatNode> it=replacetable.keySet().iterator(); it.hasNext(); ) {
+      FlatNode fn=it.next();
+      FlatNode newfn=replacetable.get(fn);
+      fn.replace(newfn);
+    }
   }
 
   public Hashtable<Expression, TempDescriptor> computeIntersection(FlatNode fn, Hashtable<FlatNode,Hashtable<Expression, TempDescriptor>> availexpr) {
     Hashtable<Expression, TempDescriptor> tab=new Hashtable<Expression, TempDescriptor>();
     boolean first=true;
-    
+
     //compute intersection
-    for(int i=0;i<fn.numPrev();i++) {
+    for(int i=0; i<fn.numPrev(); i++) {
       FlatNode prev=fn.getPrev(i);
       if (first) {
-       if (availexpr.containsKey(prev))
-         tab.putAll(availexpr.get(prev));
-       first=false;
+        if (availexpr.containsKey(prev)) {
+          tab.putAll(availexpr.get(prev));
+          first=false;
+        }
       } else {
-       if (availexpr.containsKey(prev)) {
-         Hashtable<Expression, TempDescriptor> table=availexpr.get(prev);
-         for(Iterator mapit=tab.entrySet().iterator();mapit.hasNext();) {
-           Object entry=mapit.next();
-           if (!table.contains(entry))
-             mapit.remove();
-         }
-       }
+        if (availexpr.containsKey(prev)) {
+          Hashtable<Expression, TempDescriptor> table=availexpr.get(prev);
+          for(Iterator mapit=tab.entrySet().iterator(); mapit.hasNext(); ) {
+            Object entry=mapit.next();
+            if (!table.contains(entry))
+              mapit.remove();
+          }
+        }
       }
     }
     return tab;
   }
 
-  public void killexpressions(Hashtable<Expression, TempDescriptor> tab, Set<FieldDescriptor> fields, Set<TypeDescriptor> arrays) {
-    for(Iterator it=tab.entrySet().iterator();it.hasNext();) {
+  public void killexpressions(Hashtable<Expression, TempDescriptor> tab, Set<FieldDescriptor> fields, Set<TypeDescriptor> arrays, boolean killall) {
+    for(Iterator it=tab.entrySet().iterator(); it.hasNext(); ) {
       Map.Entry m=(Map.Entry)it.next();
       Expression e=(Expression)m.getKey();
-      if (e.f!=null&&fields!=null&&fields.contains(e.f)) 
-       it.remove();
+      if (killall&&(e.f!=null||e.a!=null))
+        it.remove();
+      else if (e.f!=null&&fields!=null&&fields.contains(e.f))
+        it.remove();
       else if ((e.a!=null)&&(arrays!=null)) {
-       for(Iterator<TypeDescriptor> arit=arrays.iterator();arit.hasNext();) {
-         TypeDescriptor artd=arit.next();
-         if (typeutil.isSuperorType(artd,e.a.getType())||
-             typeutil.isSuperorType(e.a.getType(),artd)) {
-           it.remove();
-           break;
-         }
-       }
+        for(Iterator<TypeDescriptor> arit=arrays.iterator(); arit.hasNext(); ) {
+          TypeDescriptor artd=arit.next();
+          if (typeutil.isSuperorType(artd,e.a.getType())||
+              typeutil.isSuperorType(e.a.getType(),artd)) {
+            it.remove();
+            break;
+          }
+        }
       }
     }
   }