bug fix for barriers...should be able to use joptimize with barriers now
authorbdemsky <bdemsky>
Tue, 2 Jun 2009 01:38:52 +0000 (01:38 +0000)
committerbdemsky <bdemsky>
Tue, 2 Jun 2009 01:38:52 +0000 (01:38 +0000)
Robust/src/Analysis/Loops/CSE.java
Robust/src/Analysis/Loops/GlobalFieldType.java
Robust/src/Analysis/Loops/LoopInvariant.java
Robust/src/Analysis/Loops/localCSE.java

index 254a40b1df28d04db8a1d4f7fe74796b24796c66..c17768481c5c6de5f3ea287bbfb395bfabdf4035 100644 (file)
@@ -57,7 +57,7 @@ public class CSE {
          MethodDescriptor md=fc.getMethod();
          Set<FieldDescriptor> fields=gft.getFields(md);
          Set<TypeDescriptor> arrays=gft.getArrays(md);
-         killexpressions(tab, fields, arrays, gft.containsAtomic(md));
+         killexpressions(tab, fields, arrays, gft.containsAtomic(md)||gft.containsBarrier(md));
          break;
        }
       case FKind.FlatOpNode:
index a1493f6a7b8418c88a054e855c1e76fcba173fcf..25b17b1455f60d6b61b302e232e5066da9093498 100644 (file)
@@ -19,6 +19,7 @@ public class GlobalFieldType {
   Hashtable<MethodDescriptor, Set<FieldDescriptor>> fields;
   Hashtable<MethodDescriptor, Set<TypeDescriptor>> arrays;
   HashSet<MethodDescriptor> containsAtomic;
+  HashSet<MethodDescriptor> containsBarrier;
   
   public GlobalFieldType(CallGraph cg, State st, MethodDescriptor root) {
     this.cg=cg;
@@ -27,6 +28,7 @@ public class GlobalFieldType {
     this.fields=new Hashtable<MethodDescriptor, Set<FieldDescriptor>>();
     this.arrays=new Hashtable<MethodDescriptor, Set<TypeDescriptor>>();
     this.containsAtomic=new HashSet<MethodDescriptor>();
+    this.containsBarrier=new HashSet<MethodDescriptor>();
     doAnalysis();
   }
   private void doAnalysis() {
@@ -86,6 +88,10 @@ public class GlobalFieldType {
            if (containsAtomic.add(md))
              changed=true;
          }
+         if (containsBarrier.contains(md2)) {
+           if (containsBarrier.add(md))
+             changed=true;
+         }
        }
       }
     }
@@ -95,6 +101,10 @@ public class GlobalFieldType {
     return containsAtomic.contains(md);
   }
 
+  public boolean containsBarrier(MethodDescriptor md) {
+    return containsBarrier.contains(md);
+  }
+
   public Set<FieldDescriptor> getFields(MethodDescriptor md) {
     return fields.get(md);
   }
@@ -118,6 +128,11 @@ public class GlobalFieldType {
        fields.get(md).add(fsfn.getField());
       } else if (fn.kind()==FKind.FlatAtomicEnterNode) {
        containsAtomic.add(md);
+      } else if (fn.kind()==FKind.FlatCall) {
+       MethodDescriptor mdcall=((FlatCall)fn).getMethod();
+       if (mdcall.getSymbol().equals("enterBarrier")&&
+           mdcall.getClassDesc().getSymbol().equals("Barrier"))
+         containsBarrier.add(md);
       }
     }
   }
index baa5c5521c4ca664a4ecf2cc60607767eebcf905..9fbc99909151e382d75a6b0771a09c82d61812e1 100644 (file)
@@ -78,7 +78,7 @@ public class LoopInvariant {
            fields.addAll(f);
          if (t!=null)
            types.addAll(t);
-         if (gft.containsAtomic(md)) {
+         if (gft.containsAtomic(md)||gft.containsBarrier(md)) {
            unsafe=true;
          }
        } else if (fn.kind()==FKind.FlatSetFieldNode) {
index 155b83082972ae0320b032e12897ec5e8d964e15..108d992e7a44bd550a5f0cbe5ec4485b5126c827 100644 (file)
@@ -132,7 +132,7 @@ public class localCSE {
          dstf.set.add(src);
          HashSet<FieldDescriptor> fields=new HashSet<FieldDescriptor>();
          fields.add(fsfn.getField());
-         kill(table, fields, null, false);
+         kill(table, fields, null, false, false);
          table.put(src, dstf);
          break;
        }
@@ -146,7 +146,7 @@ public class localCSE {
          dstf.set.add(src);
          HashSet<TypeDescriptor> arrays=new HashSet<TypeDescriptor>();
          arrays.add(fsen.getDst().getType());
-         kill(table, null, arrays, false);
+         kill(table, null, arrays, false, false);
          table.put(src, dstf);
          break;
        }
@@ -156,7 +156,7 @@ public class localCSE {
          MethodDescriptor md=fc.getMethod();
          Set<FieldDescriptor> fields=gft.getFields(md);
          Set<TypeDescriptor> arrays=gft.getArrays(md);
-         kill(table, fields, arrays, gft.containsAtomic(md));
+         kill(table, fields, arrays, gft.containsAtomic(md), gft.containsBarrier(md));
        }
        default: {
          TempDescriptor[] writes=fn.writesTemps();
@@ -168,11 +168,14 @@ public class localCSE {
       } while(fn.numPrev()==1);
     }
   }
-  public void kill(Hashtable<LocalExpression, Group> tab, Set<FieldDescriptor> fields, Set<TypeDescriptor> arrays, boolean isAtomic) {
+  public void kill(Hashtable<LocalExpression, Group> tab, Set<FieldDescriptor> fields, Set<TypeDescriptor> arrays, boolean isAtomic, boolean isBarrier) {
     Set<LocalExpression> eset=tab.keySet();
     for(Iterator<LocalExpression> it=eset.iterator();it.hasNext();) {
       LocalExpression e=it.next();
-      if (isAtomic&&(e.td!=null||e.f!=null)) {
+      if (isBarrier) {
+       //make Barriers kill everything
+       it.remove();
+      } else if (isAtomic&&(e.td!=null||e.f!=null)) {
        Group g=tab.get(e);
        g.set.remove(e);
        it.remove();