bug fixes for effects analysis
authorjjenista <jjenista>
Mon, 28 Jun 2010 21:20:05 +0000 (21:20 +0000)
committerjjenista <jjenista>
Mon, 28 Jun 2010 21:20:05 +0000 (21:20 +0000)
Robust/src/Analysis/Disjoint/DisjointAnalysis.java

index e43a39304b1b5b2826002e3aa30cfd3aa491c4d6..c30c3c99db3f2eac337c862f3da842254577a840 100644 (file)
@@ -1017,17 +1017,11 @@ public class DisjointAnalysis {
     // nullified in the graph to reduce edges
     //rg.nullifyDeadVars( liveness.getLiveInTemps( fmContaining, fn ) );
 
-    /*
-      if( doEffectsAnalysis &&  && fmContaining != fmAnalysisEntry
-        rra.isEndOfRegion(fn)){
-      rg.clearAccessibleVarSet();
-      also need to clear stall mapping
-    }
-    */
-         
     TempDescriptor  lhs;
     TempDescriptor  rhs;
     FieldDescriptor fld;
+    TypeDescriptor  tdElement;
+    FieldDescriptor fdElement;
 
     // use node type to decide what transfer function
     // to apply to the reachability graph
@@ -1095,6 +1089,7 @@ public class DisjointAnalysis {
 
     case FKind.FlatFieldNode:
       FlatFieldNode ffn = (FlatFieldNode) fn;
+
       lhs = ffn.getDst();
       rhs = ffn.getSrc();
       fld = ffn.getField();
@@ -1120,21 +1115,24 @@ public class DisjointAnalysis {
 
         // transfer func
        rg.assignTempXEqualToTempYFieldF( lhs, rhs, fld );
-
-        // after transfer, use updated graph to
-        // do effects analysis
-        if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) {
-          effectsAnalysis.analyzeFlatFieldNode( rg, rhs, fld );          
-        }
       }          
+
+      // after transfer, use updated graph to
+      // do effects analysis
+      if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) {
+        effectsAnalysis.analyzeFlatFieldNode( rg, rhs, fld );          
+      }
       break;
 
     case FKind.FlatSetFieldNode:
       FlatSetFieldNode fsfn = (FlatSetFieldNode) fn;
+
       lhs = fsfn.getDst();
       fld = fsfn.getField();
       rhs = fsfn.getSrc();
 
+      boolean strongUpdate = false;
+
       if( shouldAnalysisTrack( fld.getType() ) ) {
 
         // before transfer func, possibly inject
@@ -1159,27 +1157,29 @@ public class DisjointAnalysis {
         }
 
         // transfer func
-        boolean strongUpdate = rg.assignTempXFieldFEqualToTempY( lhs, fld, rhs );
-
-        // use transformed graph to do effects analysis
-        if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) {
-          effectsAnalysis.analyzeFlatSetFieldNode( rg, lhs, fld, strongUpdate );          
-        }
+        strongUpdate = rg.assignTempXFieldFEqualToTempY( lhs, fld, rhs );
       }           
+
+      // use transformed graph to do effects analysis
+      if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) {
+        effectsAnalysis.analyzeFlatSetFieldNode( rg, lhs, fld, strongUpdate );          
+      }
       break;
 
     case FKind.FlatElementNode:
       FlatElementNode fen = (FlatElementNode) fn;
+
       lhs = fen.getDst();
       rhs = fen.getSrc();
-      if( shouldAnalysisTrack( lhs.getType() ) ) {
 
-       assert rhs.getType() != null;
-       assert rhs.getType().isArray();
+      assert rhs.getType() != null;
+      assert rhs.getType().isArray();
+
+      tdElement = rhs.getType().dereference();
+      fdElement = getArrayField( tdElement );
+
+      if( shouldAnalysisTrack( lhs.getType() ) ) {
        
-       TypeDescriptor  tdElement = rhs.getType().dereference();
-       FieldDescriptor fdElement = getArrayField( tdElement );
-  
         // before transfer func, possibly inject
         // stall-site taint
         if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) {
@@ -1199,31 +1199,27 @@ public class DisjointAnalysis {
 
         // transfer func
        rg.assignTempXEqualToTempYFieldF( lhs, rhs, fdElement );
-        
-        // use transformed graph to do effects analysis
-        if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) {
-          effectsAnalysis.analyzeFlatFieldNode( rg, rhs, fdElement );                    
-        }
       }
+
+      // use transformed graph to do effects analysis
+      if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) {
+        effectsAnalysis.analyzeFlatFieldNode( rg, rhs, fdElement );                    
+      }        
       break;
 
     case FKind.FlatSetElementNode:
       FlatSetElementNode fsen = (FlatSetElementNode) fn;
 
-      if( arrayReferencees.doesNotCreateNewReaching( fsen ) ) {
-       // skip this node if it cannot create new reachability paths
-        break;
-      }
-
       lhs = fsen.getDst();
       rhs = fsen.getSrc();
-      if( shouldAnalysisTrack( rhs.getType() ) ) {
 
-       assert lhs.getType() != null;
-       assert lhs.getType().isArray();
-       
-       TypeDescriptor  tdElement = lhs.getType().dereference();
-       FieldDescriptor fdElement = getArrayField( tdElement );
+      assert lhs.getType() != null;
+      assert lhs.getType().isArray();  
+
+      tdElement = lhs.getType().dereference();
+      fdElement = getArrayField( tdElement );
+
+      if( shouldAnalysisTrack( rhs.getType() ) ) {
 
         // before transfer func, possibly inject
         // stall-site taints
@@ -1246,15 +1242,18 @@ public class DisjointAnalysis {
           }
         }
 
-        // transfer func
-       rg.assignTempXFieldFEqualToTempY( lhs, fdElement, rhs );
-
-        // use transformed graph to do effects analysis
-        if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) {
-          effectsAnalysis.analyzeFlatSetFieldNode( rg, lhs, fdElement,
-                                                   false );          
+        // transfer func, BUT
+        // skip this node if it cannot create new reachability paths
+        if( !arrayReferencees.doesNotCreateNewReaching( fsen ) ) {
+          rg.assignTempXFieldFEqualToTempY( lhs, fdElement, rhs );
         }
       }
+
+      // use transformed graph to do effects analysis
+      if( doEffectsAnalysis && fmContaining != fmAnalysisEntry ) {
+        effectsAnalysis.analyzeFlatSetFieldNode( rg, lhs, fdElement,
+                                                 false );          
+      }
       break;
       
     case FKind.FlatNew: