Make SESE root spliced into IR graph just as any other SESE, make sure MLP analysis...
authorjjenista <jjenista>
Mon, 15 Jun 2009 22:51:52 +0000 (22:51 +0000)
committerjjenista <jjenista>
Mon, 15 Jun 2009 22:51:52 +0000 (22:51 +0000)
Robust/src/Analysis/MLP/MLPAnalysis.java
Robust/src/IR/Flat/BuildFlat.java
Robust/src/Tests/mlp/tinyTest/test.java

index 0673a1ff57824e7df680dfd06cb11eee382aa838..b2a66874c8ae2651e4961ccc04bd5049d45f9746 100644 (file)
@@ -12,15 +12,12 @@ import java.io.*;
 public class MLPAnalysis {
 
   // data from the compiler
-  private State state;
-  private TypeUtil typeUtil;
-  private CallGraph callGraph;
+  private State             state;
+  private TypeUtil          typeUtil;
+  private CallGraph         callGraph;
   private OwnershipAnalysis ownAnalysis;
 
-  private SESENode          rootTree;
-  private FlatSESEEnterNode rootSESE;
-  private FlatSESEExitNode  rootExit;
-
+  private FlatSESEEnterNode      rootSESE;  
   private Set<FlatSESEEnterNode> allSESEs;
 
   private Hashtable< FlatNode, Stack<FlatSESEEnterNode> > seseStacks;
@@ -32,15 +29,16 @@ public class MLPAnalysis {
 
   private static final int maxSESEage = 2;
 
-  // use these methods in BuildCode to have access to analysis results
-  public Set<FlatSESEEnterNode> getAllSESEs() {
-    return allSESEs;
-  }
 
+  // use these methods in BuildCode to have access to analysis results
   public FlatSESEEnterNode getRootSESE() {
     return rootSESE;
   }
 
+  public Set<FlatSESEEnterNode> getAllSESEs() {
+    return allSESEs;
+  }
+
   public int getMaxSESEage() {
     return maxSESEage;
   }
@@ -74,16 +72,10 @@ public class MLPAnalysis {
     notAvailableResults  = new Hashtable< FlatNode, Set<TempDescriptor>      >();
     codePlans            = new Hashtable< FlatNode, CodePlan                 >();
 
-
-    // build an implicit root SESE to wrap contents of main method
-    rootTree = new SESENode( "root" );
-    rootSESE = new FlatSESEEnterNode( rootTree );
-    rootExit = new FlatSESEExitNode ( rootTree );
-    rootSESE.setFlatExit ( rootExit );
-    rootExit.setFlatEnter( rootSESE );
-
     FlatMethod fmMain = state.getMethodFlat( tu.getMain() );
 
+    rootSESE = (FlatSESEEnterNode) fmMain.getNext(0);
+
 
     // 1st pass
     // run analysis on each method that is actually called
@@ -173,7 +165,6 @@ public class MLPAnalysis {
     Set<FlatNode> visited = new HashSet<FlatNode>();    
 
     Stack<FlatSESEEnterNode> seseStackFirst = new Stack<FlatSESEEnterNode>();
-    seseStackFirst.push( rootSESE );
     seseStacks.put( fm, seseStackFirst );
 
     while( !flatNodesToVisit.isEmpty() ) {
@@ -212,9 +203,11 @@ public class MLPAnalysis {
       allSESEs.add( fsen );
       fsen.setEnclosingFlatMeth( fm );
 
-      assert !seseStack.empty();
-      seseStack.peek().addChild( fsen );
-      fsen.setParent( seseStack.peek() );
+      if( !seseStack.empty() ) {
+       seseStack.peek().addChild( fsen );
+       fsen.setParent( seseStack.peek() );
+      }
+
       seseStack.push( fsen );
     } break;
 
@@ -226,9 +219,9 @@ public class MLPAnalysis {
 
     case FKind.FlatReturnNode: {
       FlatReturnNode frn = (FlatReturnNode) fn;
-      if( !seseStack.empty() && 
-         !seseStack.peek().equals( rootSESE ) ) {
-       throw new Error( "Error: return statement enclosed within "+seseStack.peek() );
+      if( !seseStack.empty() ) {
+       throw new Error( "Error: return statement enclosed within SESE "+
+                        seseStack.peek().getPrettyIdentifier() );
       }
     } break;
       
@@ -436,10 +429,13 @@ public class MLPAnalysis {
        inUnion.merge( incoming );
       }
 
-      VarSrcTokTable curr = variable_nodeActions( fn, inUnion, seseStack.peek() );     
+      VarSrcTokTable curr = null;
+      if( !seseStack.empty() ) {
+       curr = variable_nodeActions( fn, inUnion, seseStack.peek() );
+      }
 
       // if a new result, schedule forward nodes for analysis
-      if( !curr.equals( prev ) ) {       
+      if( curr != null && !curr.equals( prev ) ) {       
        variableResults.put( fn, curr );
 
        for( int i = 0; i < fn.numNext(); i++ ) {
@@ -589,10 +585,13 @@ public class MLPAnalysis {
         }
       }
 
-      Set<TempDescriptor> curr = notAvailable_nodeActions( fn, inUnion, seseStack.peek() );     
+      Set<TempDescriptor> curr = null;
+      if( !seseStack.empty() ) {
+       curr = notAvailable_nodeActions( fn, inUnion, seseStack.peek() );     
+      }
 
       // if a new result, schedule forward nodes for analysis
-      if( !curr.equals( prev ) ) {
+      if( curr != null && !curr.equals( prev ) ) {
        notAvailableResults.put( fn, curr );
 
        for( int i = 0; i < fn.numNext(); i++ ) {
@@ -746,7 +745,9 @@ public class MLPAnalysis {
         }
       }
 
-      computeStalls_nodeActions( fn, dotSTtable, dotSTnotAvailSet, seseStack.peek() );
+      if( !seseStack.empty() ) {
+       computeStalls_nodeActions( fn, dotSTtable, dotSTnotAvailSet, seseStack.peek() );
+      }
 
       for( int i = 0; i < fn.numNext(); i++ ) {
        FlatNode nn = fn.getNext( i );
@@ -867,8 +868,11 @@ public class MLPAnalysis {
     for( int i = 0; i < fn.numNext(); i++ ) {
       FlatNode nn = fn.getNext( i );
       VarSrcTokTable nextVstTable = variableResults.get( nn );
-      assert nextVstTable != null;
-      static2dynamicSet.addAll( vstTable.getStatic2DynamicSet( nextVstTable ) );
+      // the table can be null if it is one of the few IR nodes
+      // completely outside of the root SESE scope
+      if( nextVstTable != null ) {
+       static2dynamicSet.addAll( vstTable.getStatic2DynamicSet( nextVstTable ) );
+      }
     }
     /*
     Iterator<VariableSourceToken> vstItr = static2dynamicSet.iterator();
index 95b57a9925ef6d1bddbcf1db5c75751d0e50571e..d2f4727a40f12447e5eed5aee1215e0adf713de8 100644 (file)
@@ -116,9 +116,21 @@ public class BuildFlat {
 
   private void flattenClass(ClassDescriptor cn) {
     Iterator methodit=cn.getMethods();
-    while(methodit.hasNext()) {
-      fe=new FlatExit();
+    while(methodit.hasNext()) {     
       currmd=(MethodDescriptor)methodit.next();
+
+      FlatSESEEnterNode rootSESE = null;
+      FlatSESEExitNode  rootExit = null;
+      if (state.MLP && currmd.equals(typeutil.getMain())) {
+       SESENode rootTree = new SESENode( "root" );
+       rootSESE = new FlatSESEEnterNode( rootTree );
+       rootExit = new FlatSESEExitNode ( rootTree );
+       rootSESE.setFlatExit ( rootExit );
+       rootExit.setFlatEnter( rootSESE );
+      }
+
+      fe=new FlatExit();
+
       BlockNode bn=state.getMethodBody(currmd);
 
       if (state.DSM&&currmd.getModifiers().isAtomic()) {
@@ -151,6 +163,14 @@ public class BuildFlat {
          aen.addNext(rnflat);
          rnflat.addNext(fe);
        }
+      } else if (state.MLP && rootSESE != null) {
+       rootSESE.addNext(fn);
+       fn=rootSESE;
+       FlatReturnNode rnflat=new FlatReturnNode(null);
+       np.getEnd().addNext(rootExit);
+       rootExit.addNext(rnflat);
+       rnflat.addNext(fe);
+
       } else if (np.getEnd()!=null&&np.getEnd().kind()!=FKind.FlatReturnNode) {
        FlatReturnNode rnflat=new FlatReturnNode(null);
        np.getEnd().addNext(rnflat);
index b2883db6f64fb06a7737190d889e8f3d71cb0e66..a8654e351a301cdd95bcdc66311f8781d025bf2b 100644 (file)
@@ -12,6 +12,17 @@ public class Test {
       }      
     }
 
+
+    // just for testing root's ability to
+    // realize a single exit after all returns
+    // DOESN'T WORK!
+    /*
+    if( false ) {
+      return;
+    }
+    */
+
+
     /*  ADD BACK IN LATER, TO TEST STALLS
     // shouldn't cause a stall
     int z = x;