variable analysis stable, reports stalls all over--buggy
authorjjenista <jjenista>
Wed, 22 Apr 2009 19:57:50 +0000 (19:57 +0000)
committerjjenista <jjenista>
Wed, 22 Apr 2009 19:57:50 +0000 (19:57 +0000)
Robust/src/Analysis/MLP/MLPAnalysis.java
Robust/src/Analysis/MLP/VarSrcTokTable.java

index 8693ab56fc2ce4140cbdf310dbf6e02ab4e86bd3..d47ec3f8aafdc5f99b533ee4ead0f2c9904fdcda 100644 (file)
@@ -100,6 +100,17 @@ public class MLPAnalysis {
     }
 
 
+    // 4th pass
+    methItr = ownAnalysis.descriptorsToAnalyze.iterator();
+    while( methItr.hasNext() ) {
+      Descriptor d = methItr.next();
+      
+      FlatMethod fm = state.getMethodFlat( d );
+
+      computeStallsForward( fm );
+    }
+
+
     double timeEndAnalysis = (double) System.nanoTime();
     double dt = (timeEndAnalysis - timeStartAnalysis)/(Math.pow( 10.0, 9.0 ) );
     String treport = String.format( "The mlp analysis took %.3f sec.", dt );
@@ -390,4 +401,61 @@ public class MLPAnalysis {
 
     return vstTable;
   }
+
+
+  private void computeStallsForward( FlatMethod fm ) {
+    
+    // start from flat method top, visit every node in
+    // method exactly once
+    Set<FlatNode> flatNodesToVisit = new HashSet<FlatNode>();
+    flatNodesToVisit.add( fm );
+
+    Set<FlatNode> visited = new HashSet<FlatNode>();    
+
+    while( !flatNodesToVisit.isEmpty() ) {
+      Iterator<FlatNode> fnItr = flatNodesToVisit.iterator();
+      FlatNode fn = fnItr.next();
+
+      flatNodesToVisit.remove( fn );
+      visited.add( fn );      
+
+      Stack<FlatSESEEnterNode> seseStack = seseStacks.get( fn );
+      assert seseStack != null;      
+
+      VarSrcTokTable vstTable = variableResults.get( fn );
+
+      computeStalls_nodeActions( fn, vstTable, seseStack.peek() );
+
+      for( int i = 0; i < fn.numNext(); i++ ) {
+       FlatNode nn = fn.getNext( i );
+
+       if( !visited.contains( nn ) ) {
+         flatNodesToVisit.add( nn );
+       }
+      }
+    }      
+  }
+
+  private void computeStalls_nodeActions( FlatNode fn,
+                                          VarSrcTokTable vstTable,
+                                          FlatSESEEnterNode currentSESE ) {
+    switch( fn.kind() ) {
+
+    case FKind.FlatSESEEnterNode: {
+      FlatSESEEnterNode fsen = (FlatSESEEnterNode) fn;      
+    } break;
+
+    case FKind.FlatSESEExitNode: {
+      FlatSESEExitNode fsexn = (FlatSESEExitNode) fn;
+    } break;
+
+    default: {
+      Set<VariableSourceToken> stallSet = 
+        vstTable.getStallSet( currentSESE );
+
+      System.out.println( fn+" should stall on\n  "+stallSet+"\n" );
+    } break;
+
+    } // end switch
+  }
 }
index 18f4e3aa5bc9ceb8aac2c0ecb4bb7fd697dfa15f..6b940d4e905af69da3b9a954084ac29b42f680c0 100644 (file)
@@ -300,6 +300,20 @@ public class VarSrcTokTable {
   }   \r
 \r
 \r
+  public Set<VariableSourceToken> getStallSet( FlatSESEEnterNode curr ) {\r
+\r
+    Set<VariableSourceToken> out = new HashSet<VariableSourceToken>();\r
+\r
+    Iterator<FlatSESEEnterNode> cItr = curr.getChildren().iterator();\r
+    while( cItr.hasNext() ) {\r
+      FlatSESEEnterNode child = cItr.next();\r
+      out.addAll( get( child ) );\r
+    }\r
+\r
+    return out;\r
+  }\r
+\r
+\r
   public boolean equals( Object o ) {\r
     if( o == null ) {\r
       return false;\r