stable version with debug, chasing an analysis bug
authorjjenista <jjenista>
Wed, 15 Apr 2009 16:56:20 +0000 (16:56 +0000)
committerjjenista <jjenista>
Wed, 15 Apr 2009 16:56:20 +0000 (16:56 +0000)
Robust/src/Analysis/MLP/MLPAnalysis.java
Robust/src/Analysis/MLP/VarSrcTokTable.java
Robust/src/Tests/mlp/tinyTest/test.java

index e79424c4f7d1ccaa6e155d5b9dcd08c8bcb9ed6d..c64542c4ee4c55196517aea2e9a1b25f14c40578 100644 (file)
@@ -103,9 +103,6 @@ public class MLPAnalysis {
 
       analyzeFlatNodeForward( fn, seseStack );
 
-      // initialize for backward computation in next step
-      //pointResults.put( fn, new VarSrcTokTable() );
-
       for( int i = 0; i < fn.numNext(); i++ ) {
        FlatNode nn = fn.getNext( i );
 
@@ -129,18 +126,29 @@ public class MLPAnalysis {
       computeReadAndWriteSetBackward( fsenChild );
     }
     
+    System.out.println( "backwards on "+fsen );
 
     // start from an SESE exit, visit nodes in reverse up to
     // SESE enter in a fixed-point scheme, where children SESEs
     // should already be analyzed and therefore can be skipped 
     // because child SESE enter node has all necessary info
     Set<FlatNode> flatNodesToVisit = new HashSet<FlatNode>();
-    flatNodesToVisit.add( fsen.getFlatExit() );
+    flatNodesToVisit.add( fsen );
+
+    FlatSESEExitNode fsexn = fsen.getFlatExit();
+    for( int i = 0; i < fsexn.numPrev(); i++ ) {
+      FlatNode nn = fsexn.getPrev( i );         
+      flatNodesToVisit.add( nn );       
+    }
 
     while( !flatNodesToVisit.isEmpty() ) {
       FlatNode fn = (FlatNode) flatNodesToVisit.iterator().next();
       flatNodesToVisit.remove( fn );      
 
+      if( fn.kind() == FKind.FlatSESEExitNode ) {
+       fn = ((FlatSESEExitNode)fn).getFlatEnter();
+      }
+
       VarSrcTokTable prev = pointResults.get( fn );
 
       // merge sets from control flow joins
@@ -152,6 +160,10 @@ public class MLPAnalysis {
 
       VarSrcTokTable curr = analyzeFlatNodeBackward( fn, inUnion, fsen );
 
+      
+      //System.out.println( "\nConsidering "+fn+" and\n  prev="+prev+"\n  curr="+curr );
+
+
       // if a new result, schedule backward nodes for analysis
       if( !curr.equals( prev ) ) {
 
@@ -167,6 +179,8 @@ public class MLPAnalysis {
       }
     }
     
+    if( pointResults.get( fsen ) == null ) { System.out.println( "UGH" ); }
+
     fsen.addInVarSet( pointResults.get( fsen ).get() );
 
     if( state.MLPDEBUG ) { 
@@ -224,12 +238,14 @@ public class MLPAnalysis {
     switch( fn.kind() ) {
 
     case FKind.FlatSESEEnterNode: {
-      FlatSESEEnterNode fsen = (FlatSESEEnterNode) fn;      
+      FlatSESEEnterNode fsen = (FlatSESEEnterNode) fn;
+      vstTable.addAll( fsen.getInVarSet() );
     } break;
 
     case FKind.FlatSESEExitNode: {
       FlatSESEExitNode fsexn = (FlatSESEExitNode) fn;
-       
+
+      
       //FlatSESEEnterNode fsen  = fsexn.getFlatEnter();
       //assert fsen == seseStack.pop();
       //seseStack.peek().addInVarSet ( fsen.getInVarSet()  );
index 9c3f1c19591618afa80067c579a7a90822ec609b..296c8ece869c92501f8c15333360d9fe03b71564 100644 (file)
@@ -57,6 +57,13 @@ public class VarSrcTokTable {
     sv2vst.put( key, s );
   }
 
+  public void addAll( Set<VariableSourceToken> s ) {
+    Iterator<VariableSourceToken> itr = s.iterator();
+    while( itr.hasNext() ) {
+      add( itr.next() );
+    }
+  }
+
 
   public Set<VariableSourceToken> get() {
     return trueSet;
@@ -187,7 +194,7 @@ public class VarSrcTokTable {
     }
     
     trueSet.removeAll( s );
-    sv2vst  .remove( key  );
+    sv2vst.remove( key );
   }
 
   public void remove( VariableSourceToken vst ) {
index 72a784e3a105499b6a553a3febf2e9066355b8ea..239734bb3c275f55df6124e3130475b130a58fb1 100644 (file)
@@ -1,19 +1,24 @@
 public class Test {
 
   public static void main( String args[] ) {
+    // no code is outside the root sese
+    // in the main method
+    sese root {
+      int n = 10;
 
-    int n = 10;
-
-    sese top {     
-      int x = 0;
+      sese top {     
+       int x = 0;
       
-      for( int i = 0; i < 3; ++i ) {
-       sese iter {
-         x = x + i;
-       }
-      }      
+       for( int i = 0; i < 3; ++i ) {
+         sese iter {
+           x = x + i;
+         }
+       }      
+       
+       int j = x + n;
+      }
 
-      int j = x + n;
+      int z = n + j;
     }
   }
 }