changes
authorbdemsky <bdemsky>
Fri, 3 Jul 2009 22:46:47 +0000 (22:46 +0000)
committerbdemsky <bdemsky>
Fri, 3 Jul 2009 22:46:47 +0000 (22:46 +0000)
Robust/src/Analysis/Locality/DelayComputation.java
Robust/src/Analysis/Locality/DiscoverConflicts.java
Robust/src/IR/Flat/BuildCode.java

index c9c16d4e442ae1b005bdd57c74229c05d8c451f3..b7c48bbf0c05a9e8decfeeef2e227964f275cea4 100644 (file)
@@ -40,13 +40,18 @@ public class DelayComputation {
     return dcopts;
   }
 
+  public Hashtable<LocalityBinding, HashSet<FlatNode>> getCannotDelayMap() {
+    return cannotdelaymap;
+  }
+
   public void doAnalysis() {
     Set<LocalityBinding> localityset=locality.getLocalityBindings();
     for(Iterator<LocalityBinding> lbit=localityset.iterator();lbit.hasNext();) {
       analyzeMethod(lbit.next());
     }
 
-    dcopts=new DiscoverConflicts(locality, state, typeanalysis, cannotdelaymap);
+    //ignore things that aren't in the map
+    dcopts=new DiscoverConflicts(locality, state, typeanalysis, cannotdelaymap, false, false);
     dcopts.doAnalysis();
 
 
index e9127ae389d7cc1ba7776cd4b8fb455ec1c3437f..6dfc4a274cb96fce11893370aa0fbd5cbfc55233 100644 (file)
@@ -26,7 +26,8 @@ public class DiscoverConflicts {
   TypeAnalysis typeanalysis;
   Hashtable<LocalityBinding, HashSet<FlatNode>>cannotdelaymap;
   Hashtable<LocalityBinding, Hashtable<FlatNode, Hashtable<TempDescriptor, Set<TempFlatPair>>>> lbtofnmap;
-
+  boolean inclusive=false;
+  boolean normalassign=false;
 
   public DiscoverConflicts(LocalityAnalysis locality, State state, TypeAnalysis typeanalysis) {
     this.locality=locality;
@@ -42,7 +43,7 @@ public class DiscoverConflicts {
     lbtofnmap=new Hashtable<LocalityBinding, Hashtable<FlatNode, Hashtable<TempDescriptor, Set<TempFlatPair>>>>();
   }
 
-  public DiscoverConflicts(LocalityAnalysis locality, State state, TypeAnalysis typeanalysis, Hashtable<LocalityBinding, HashSet<FlatNode>> cannotdelaymap) {
+  public DiscoverConflicts(LocalityAnalysis locality, State state, TypeAnalysis typeanalysis, Hashtable<LocalityBinding, HashSet<FlatNode>> cannotdelaymap, boolean inclusive, boolean normalassign) {
     this.locality=locality;
     this.fields=new HashSet<FieldDescriptor>();
     this.arrays=new HashSet<TypeDescriptor>();
@@ -55,6 +56,8 @@ public class DiscoverConflicts {
     leftsrcmap=new Hashtable<LocalityBinding, Set<FlatNode>>();
     rightsrcmap=new Hashtable<LocalityBinding, Set<FlatNode>>();
     lbtofnmap=new Hashtable<LocalityBinding, Hashtable<FlatNode, Hashtable<TempDescriptor, Set<TempFlatPair>>>>();
+    this.inclusive=inclusive;
+    this.normalassign=normalassign;
   }
 
   public Set<FieldDescriptor> getFields() {
@@ -294,8 +297,8 @@ public class DiscoverConflicts {
     for(Iterator<FlatNode> fnit=fm.getNodeSet().iterator();fnit.hasNext();) {
       FlatNode fn=fnit.next();
 
-      //Check whether this node matters for delayed computation
-      if (cannotdelaymap!=null&&cannotdelaymap.containsKey(lb)&&!cannotdelaymap.get(lb).contains(fn))
+      //Check whether this node matters for cannot delayed computation
+      if (cannotdelaymap!=null&&cannotdelaymap.containsKey(lb)&&cannotdelaymap.get(lb).contains(fn)==inclusive)
        continue;
 
       Hashtable<FlatNode, Integer> atomictable=locality.getAtomic(lb);
@@ -432,9 +435,13 @@ public class DiscoverConflicts {
          }
          case FKind.FlatOpNode: {
            FlatOpNode fon=(FlatOpNode)fn;
-           if (fon.getOp().getOp()==Operation.ASSIGN&&fon.getDest().getType().isPtr()&&
-               ttofn.containsKey(fon.getLeft())) {
-             ttofn.put(fon.getDest(), new HashSet<TempFlatPair>(ttofn.get(fon.getLeft())));
+           if (fon.getOp().getOp()==Operation.ASSIGN&&fon.getDest().getType().isPtr()) {
+             HashSet<TempFlatPair> set=new HashSet<TempFlatPair>();
+             if (ttofn.containsKey(fon.getLeft()))
+               set.addAll(ttofn.get(fon.getLeft()));
+             if (normalassign)
+               set.add(new TempFlatPair(fon.getDest(), fn));
+             ttofn.put(fon.getDest(), set);
              break;
            }
          }
index 5c0991fa684afbd50fa3b623bd2d71134a6410cd..80a21860a5621f4e77e6804319bb9d9f4142587f 100644 (file)
@@ -69,6 +69,7 @@ public class BuildCode {
   boolean nonSESEpass=true;
   WriteBarrier wb;
   DiscoverConflicts dc;
+  DiscoverConflicts recorddc;
   DelayComputation delaycomp;
   CallGraph callgraph;
 
@@ -117,6 +118,7 @@ public class BuildCode {
       delaycomp=new DelayComputation(locality, st, typeanalysis, gft);
       delaycomp.doAnalysis();
       dc=delaycomp.getConflicts();
+      recorddc=new DiscoverConflicts(locality, st, typeanalysis, delaycomp.getCannotDelayMap(), true, true);
     }
 
     if(state.MLP) {
@@ -1994,7 +1996,12 @@ public class BuildCode {
            if (firstpass) {
              //need to store value written by previous node
              if (wrtmp.getType().isPtr()) {
-               output.println("STOREPTR("+generateTemp(fm, wrtmp,lb)+");");
+               //only lock the objects that may actually need locking
+               if (recorddc.getNeedTrans(lb, current_node)) {
+                 output.println("STOREPTR("+generateTemp(fm, wrtmp,lb)+");");
+               } else {
+                 output.println("STOREPTRNOTRANS("+generateTemp(fm, wrtmp,lb)+");");
+               }
              } else {
                output.println("STORE"+wrtmp.getType().getSafeDescriptor()+"("+generateTemp(fm, wrtmp, lb)+");");
              }