obj support in MLP is in good shape, code gets generated but answers wont agree until...
authorjjenista <jjenista>
Tue, 8 Sep 2009 22:53:51 +0000 (22:53 +0000)
committerjjenista <jjenista>
Tue, 8 Sep 2009 22:53:51 +0000 (22:53 +0000)
Robust/src/IR/Flat/BuildCode.java
Robust/src/Tests/mlp/regression/runTests
Robust/src/Tests/mlp/regression/test.java
Robust/src/Tests/mlp/tinyTest/test.java

index 0cb950ffe2f1a7bd88d03f129afada7b00d7251d..6359abda2cb7b24496e3cc9ef1418537d629336a 100644 (file)
@@ -232,6 +232,9 @@ public class BuildCode {
 
     // Output function prototypes and structures for SESE's and code
     if( state.MLP ) {
+
+      // used to differentiate, during code generation, whether we are
+      // passing over SESE body code, or non-SESE code
       nonSESEpass = false;
 
       // first generate code for each sese's internals
@@ -1760,17 +1763,19 @@ public class BuildCode {
     // Build normal temp object for bogus method descriptor
     TempObject objecttemps = new TempObject( objectparams, mdBogus, tag++ );
     tempstable.put( mdBogus, objecttemps );
-    
-    for(Iterator nodeit=fsen.getNodeSet().iterator(); nodeit.hasNext();) {
-      FlatNode fn=(FlatNode)nodeit.next();
-      TempDescriptor[] writes=fn.writesTemps();
-      for(int i=0; i<writes.length; i++) {
-       TempDescriptor temp=writes[i];
-       TypeDescriptor type=temp.getType();
-       if (type.isPtr()&&GENERATEPRECISEGC) {
-         objecttemps.addPtr(temp);
+
+    for( Iterator nodeit = fsen.getNodeSet().iterator(); nodeit.hasNext(); ) {
+      FlatNode         fn     = (FlatNode)nodeit.next();
+      TempDescriptor[] writes = fn.writesTemps();
+
+      for( int i = 0; i < writes.length; i++ ) {
+       TempDescriptor temp = writes[i];
+       TypeDescriptor type = temp.getType();
+
+       if( type.isPtr() ) {
+         objecttemps.addPtr( temp );
        } else {
-         objecttemps.addPrim(temp);
+         objecttemps.addPrim( temp );
        }
       }
     }
@@ -1783,20 +1788,30 @@ public class BuildCode {
                                     PrintWriter outputMethods
                                     ) {
 
-    ParamsObject objectparams = (ParamsObject) paramstable.get( fsen.getmdBogus() );
-                
-    TempObject objecttemps = (TempObject) tempstable.get( fsen.getmdBogus() );
+    ParamsObject objectparams = (ParamsObject) paramstable.get( fsen.getmdBogus() );                
+    TempObject   objecttemps  = (TempObject)   tempstable .get( fsen.getmdBogus() );
     
     // generate locals structure
-    outputStructs.println("struct "+fsen.getcdEnclosing().getSafeSymbol()+fsen.getmdBogus().getSafeSymbol()+"_"+fsen.getmdBogus().getSafeMethodDescriptor()+"_locals {");
+    outputStructs.println("struct "+
+                         fsen.getcdEnclosing().getSafeSymbol()+
+                         fsen.getmdBogus().getSafeSymbol()+"_"+
+                         fsen.getmdBogus().getSafeMethodDescriptor()+
+                         "_locals {");
     outputStructs.println("  INTPTR size;");
     outputStructs.println("  void * next;");
     for(int i=0; i<objecttemps.numPointers(); i++) {
       TempDescriptor temp=objecttemps.getPointer(i);
+
+      if( fsen.getPrettyIdentifier().equals( "calc" ) ) {
+       System.out.println( "  got a pointer "+temp );
+      }
+
       if (temp.getType().isNull())
         outputStructs.println("  void * "+temp.getSafeSymbol()+";");
       else
-        outputStructs.println("  struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol()+";");
+        outputStructs.println("  struct "+
+                             temp.getType().getSafeSymbol()+" * "+
+                             temp.getSafeSymbol()+";");
     }
     outputStructs.println("};\n");
 
@@ -3116,13 +3131,16 @@ public class BuildCode {
       return;
     }
 
+    // get the enter node for this exit that has meta data embedded
+    FlatSESEEnterNode fsen = fsexn.getFlatEnter();
+
     // there may be an SESE in an unreachable method, skip over
-    if( !mlpa.getAllSESEs().contains( fsexn.getFlatEnter() ) ) {
+    if( !mlpa.getAllSESEs().contains( fsen ) ) {
       return;
     }
 
     // also, if we have encountered a placeholder, just jump it
-    if( fsexn.getFlatEnter().getIsCallerSESEplaceholder() ) {
+    if( fsen.getIsCallerSESEplaceholder() ) {
       return;
     }
 
@@ -3139,12 +3157,35 @@ public class BuildCode {
     output.println("   }");
 
     // copy out-set from local temps into the sese record
-    Iterator<TempDescriptor> itr = fsexn.getFlatEnter().getOutVarSet().iterator();
+    Iterator<TempDescriptor> itr = fsen.getOutVarSet().iterator();
     while( itr.hasNext() ) {
-      TempDescriptor temp = itr.next();      
+      TempDescriptor temp = itr.next();
+
+      // only have to do this for primitives
+      if( !temp.getType().isPrimitive() ) {
+       continue;
+      }
+
+      // have to determine the context enclosing this sese
+      boolean useParentContext = false;
+
+      if( fsen != mlpa.getMainSESE() ) {
+       assert fsen.getParent() != null;
+       if( !fsen.getParent().getIsCallerSESEplaceholder() ) {
+         useParentContext = true;
+       }
+      }
+
+      String from;
+      if( useParentContext ) {
+       from = generateTemp( fsen.getParent().getfmBogus(), temp, null );
+      } else {
+       from = generateTemp( fsen.getfmEnclosing(),         temp, null );
+      }
+
       output.println("   "+paramsprefix+
                     "->"+temp.getSafeSymbol()+
-                    " = "+temp.getSafeSymbol()+";" );
+                    " = "+from+";");
     }    
     
     // mark yourself done, your SESE data is now read-only
index efe1a65a4db802bd162a45a6bf3de85805ec43ac..53dbd1b3962957485ce87bfc50b0e2d7aba7b30c 100755 (executable)
@@ -3,7 +3,7 @@ echo 'Each single/multi output line pair should be identical'
 echo '' > resultsSingle.txt
 echo '' > resultsMulti.txt
 
-for i in $(seq 20)
+for i in $(seq 3)
 do
 echo 'running...'
 ./testSingle.bin $[ i      ] >> resultsSingle.txt
index 4318fed0c253486468f05771db8fe950158d2c08..8b7647f2a2730b44f0581bb882c19edca0ac224f 100644 (file)
@@ -1,15 +1,24 @@
+public class Foo {
+  public int z;
+
+  public Foo( int z ) {
+    this.z = z;
+  }  
+}
 
 public class Test {
 
   public static void main( String args[] ) {        
     int x = Integer.parseInt( args[0] );
-    doSomeWork( x );
+    Foo f = new Foo( x + 10000 );
+    doSomeWork( x, f );
     nullMethodBodyFinalNode();
   }
 
-  public static void doSomeWork( int x ) {
+  public static void doSomeWork( int x, Foo f ) {
     for( int i = 0; i < x; ++i ) {
       sese calc {
+       Foo g = new Foo( i );
        int sum = 0;
        for( int j = 0; j <= i; ++j ) {
          sum = calculateStuff( sum, 1, 0 );
@@ -19,6 +28,10 @@ public class Test {
        if( i % 3 == 0 ) {
          sum = sum + (i % 20);
        }
+       g.z = sum + 1000;
+      }
+      sese modobj {
+       g.z = g.z + f.z;
       }
       if( i % 2 == 0 ) {
        sese change {
@@ -30,10 +43,10 @@ public class Test {
        
        for( int l = 0; l < 3; ++l ) {
          sum = calculateStuff( sum, 2, 2 );
-       }
-      }
+       }       
+      }      
       sese prnt {
-       mightPrint( x, i, sum );
+       mightPrint( x, i, sum, g );
       }
     }
   }
@@ -73,9 +86,9 @@ public class Test {
     }
   }
 
-  public static void mightPrint( int x, int i, int sum ) {
+  public static void mightPrint( int x, int i, int sum, Foo g ) {
     if( i == x - 1 ) {
-      System.out.println( "sum of integers 0-"+i+"("+x+") is "+sum );
+      System.out.println( "Results "+i+", "+x+", "+sum+", "+g.z );
     }
   }
 }
index 75e30bb8d4d67ed71d94288e12cabff828bf9ad1..8b7647f2a2730b44f0581bb882c19edca0ac224f 100644 (file)
@@ -1,36 +1,94 @@
+public class Foo {
+  public int z;
+
+  public Foo( int z ) {
+    this.z = z;
+  }  
+}
 
 public class Test {
 
-  public static void main( String args[] ) {
+  public static void main( String args[] ) {        
     int x = Integer.parseInt( args[0] );
-    doSomeWork( x );
+    Foo f = new Foo( x + 10000 );
+    doSomeWork( x, f );
+    nullMethodBodyFinalNode();
   }
 
-  public static void doSomeWork( int x ) {
+  public static void doSomeWork( int x, Foo f ) {
     for( int i = 0; i < x; ++i ) {
-      int sum = 0;
+      sese calc {
+       Foo g = new Foo( i );
+       int sum = 0;
+       for( int j = 0; j <= i; ++j ) {
+         sum = calculateStuff( sum, 1, 0 );
+       }
+      }
+      sese forceVirtualReal {
+       if( i % 3 == 0 ) {
+         sum = sum + (i % 20);
+       }
+       g.z = sum + 1000;
+      }
+      sese modobj {
+       g.z = g.z + f.z;
+      }
+      if( i % 2 == 0 ) {
+       sese change {
+         for( int k = 0; k < i*2; ++k ) {
+           sum = calculateStuff( sum, k, 1 );
+         }
+         sum = sum + 1;
+       }       
        
-      sese change {
-       sum = sum + 1;  
-      }        
-
-      for( int l = 0; l < 3; ++l ) {
-       sum = calculateStuff( sum, 2, 2 );
+       for( int l = 0; l < 3; ++l ) {
+         sum = calculateStuff( sum, 2, 2 );
+       }       
       }      
-
       sese prnt {
-       mightPrint( x, i, sum );
+       mightPrint( x, i, sum, g );
       }
     }
   }
 
   public static int calculateStuff( int sum, int num, int mode ) {
-    return sum + 10;
+    int answer = sum;    
+    sese makePlaceholderStallAfter {
+      sum = sum + 1;
+    }
+    sum = sum + 1;
+    if( mode == 0 ) {
+      sese mode1 {
+       answer = sum + num;
+      }
+    } else if( mode == 1 ) {
+      sese mode2 {
+       answer = sum + (num/2);
+      }
+    } else {
+      sese mode3 {
+       answer = sum / num;
+      }
+    }    
+    return answer;
+  }
+
+  public static void nullMethodBodyFinalNode() {
+    int y = 1;
+    sese nothing {
+      int x = 0;
+    }
+    y = x;
+    if( x > y ) {
+      return;
+    } else {
+      return;
+    }
   }
 
-  public static void mightPrint( int x, int i, int sum ) {
+  public static void mightPrint( int x, int i, int sum, Foo g ) {
     if( i == x - 1 ) {
-      System.out.println( "sum of integers 0-"+i+"("+x+") is "+sum );
+      System.out.println( "Results "+i+", "+x+", "+sum+", "+g.z );
     }
   }
 }