changes...plus a little optimization
[IRC.git] / Robust / src / IR / Flat / FlatSESEEnterNode.java
index 52985ab5349b91334a3162c1a846418e8cc39847..d75e137ebe13d5e36f0a871824f55aebc24e1afa 100644 (file)
@@ -3,6 +3,8 @@ import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Set;
 import java.util.Vector;
+import java.util.Iterator;
+import java.util.Collection;
 
 import Analysis.MLP.SESEEffectsKey;
 import Analysis.MLP.SESEEffectsSet;
@@ -28,9 +30,14 @@ public class FlatSESEEnterNode extends FlatNode {
   protected Integer           oldestAgeToTrack;
   protected boolean           isCallerSESEplaceholder;
 
+  protected static final int ISLEAF_UNINIT = 1;
+  protected static final int ISLEAF_FALSE  = 2;
+  protected static final int ISLEAF_TRUE   = 3;
+  protected int isLeafSESE;
+
   protected Set<FlatSESEEnterNode> children;
 
-  protected Set<TempDescriptor> inVars;
+  protected Vector<TempDescriptor> inVars;
   protected Set<TempDescriptor> outVars;
 
   protected Set<SESEandAgePair> needStaticNameInCode;
@@ -47,6 +54,10 @@ public class FlatSESEEnterNode extends FlatNode {
   
   private SESEEffectsSet seseEffectsSet;
 
+  // a subset of the in-set variables that shouuld be traversed during
+  // the dynamic coarse grained conflict strategy, remember them here so
+  // buildcode can be dumb and just gen the traversals
+  protected Set<TempDescriptor> inVarsForDynamicCoarseConflictResolution;
 
   // scope info for this SESE
   protected FlatMethod       fmEnclosing;
@@ -73,7 +84,7 @@ public class FlatSESEEnterNode extends FlatNode {
     oldestAgeToTrack     = new Integer( 0 );
 
     children             = new HashSet<FlatSESEEnterNode>();
-    inVars               = new HashSet<TempDescriptor>();
+    inVars               = new Vector<TempDescriptor>();
     outVars              = new HashSet<TempDescriptor>();
     needStaticNameInCode = new HashSet<SESEandAgePair>();
     staticInVarSrcs      = new HashSet<SESEandAgePair>();
@@ -82,6 +93,8 @@ public class FlatSESEEnterNode extends FlatNode {
     dynamicInVars        = new HashSet<TempDescriptor>();
     dynamicVars          = new HashSet<TempDescriptor>();
 
+    inVarsForDynamicCoarseConflictResolution = new HashSet<TempDescriptor>();
+    
     staticInVar2src = new Hashtable<TempDescriptor, VariableSourceToken>();
     
     seseEffectsSet = new SESEEffectsSet();
@@ -92,6 +105,8 @@ public class FlatSESEEnterNode extends FlatNode {
 
     isCallerSESEplaceholder = false;
 
+    isLeafSESE = ISLEAF_UNINIT;
+
     firstDepRecField = null;
     numDepRecs       = 0;
   }
@@ -154,7 +169,8 @@ public class FlatSESEEnterNode extends FlatNode {
   }
 
   public void addInVar( TempDescriptor td ) {
-    inVars.add( td );
+    if (!inVars.contains(td))
+      inVars.add( td );
   }
 
   public void addOutVar( TempDescriptor td ) {
@@ -162,14 +178,22 @@ public class FlatSESEEnterNode extends FlatNode {
   }
 
   public void addInVarSet( Set<TempDescriptor> s ) {
-    inVars.addAll( s );
+    for(Iterator<TempDescriptor> sit=s.iterator();sit.hasNext();) {
+      TempDescriptor tmp=sit.next();
+      if (!inVars.contains(tmp))
+       inVars.add(tmp);
+    }
   }
 
   public void addOutVarSet( Set<TempDescriptor> s ) {
     outVars.addAll( s );
   }
 
-  public Set<TempDescriptor> getInVarSet() {
+  public Collection<TempDescriptor> getInVarSet() {
+    return inVars;
+  }
+
+  public Vector<TempDescriptor> getInVarVector() {
     return inVars;
   }
 
@@ -383,4 +407,29 @@ public class FlatSESEEnterNode extends FlatNode {
   public int getNumDepRecs() {
     return numDepRecs;
   }
+  
+  public Set<TempDescriptor> getInVarsForDynamicCoarseConflictResolution() {
+    return inVarsForDynamicCoarseConflictResolution;
+  }
+  
+  public void addInVarForDynamicCoarseConflictResolution(TempDescriptor inVar) {
+    inVarsForDynamicCoarseConflictResolution.add(inVar);
+  }
+
+  
+  public void setIsLeafSESE( boolean isLeaf ) {
+    if( isLeaf ) {
+      isLeafSESE = ISLEAF_TRUE;
+    } else {
+      isLeafSESE = ISLEAF_FALSE;
+    }
+  }
+
+  public boolean getIsLeafSESE() {
+    if( isLeafSESE == ISLEAF_UNINIT ) {
+      throw new Error( "isLeafSESE uninitialized" );
+    }
+
+    return isLeafSESE == ISLEAF_TRUE;
+  }
 }