Added disjoint analysis for Java
authorjjenista <jjenista>
Sat, 31 Jan 2009 00:00:02 +0000 (00:00 +0000)
committerjjenista <jjenista>
Sat, 31 Jan 2009 00:00:02 +0000 (00:00 +0000)
12 files changed:
Robust/src/Analysis/OwnershipAnalysis/AllocationSite.java
Robust/src/Analysis/OwnershipAnalysis/OwnershipAnalysis.java
Robust/src/Analysis/OwnershipAnalysis/OwnershipGraph.java
Robust/src/IR/Flat/BuildFlat.java
Robust/src/IR/Flat/FlatNew.java
Robust/src/IR/Tree/BuildIR.java
Robust/src/IR/Tree/CreateObjectNode.java
Robust/src/Lex/Keyword.java
Robust/src/Lex/Lexer.java
Robust/src/Parse/java14.cup
Robust/src/Tests/mlp/syntaxTest/makefile
Robust/src/Tests/mlp/syntaxTest/test.java

index 34864eb7c060cfa32a81712803d6b59bc05e8216..7829ea112c8f33870fa902c8b961149e0f661806 100644 (file)
@@ -28,6 +28,7 @@ public class AllocationSite {
   protected Vector<Integer> ithOldest;
   protected Integer summary;
   protected FlatNew flatNew;
+  protected boolean forceAnalyze;
 
   public static final int AGE_notInThisSite = 100;
   public static final int AGE_in_I          = 101;
@@ -40,11 +41,12 @@ public class AllocationSite {
   public static final int SHADOWAGE_summary       = -103;
 
 
-  public AllocationSite(int allocationDepth, FlatNew flatNew) {
+  public AllocationSite(int allocationDepth, FlatNew flatNew, boolean forceAnalyze) {
     assert allocationDepth >= 1;
 
     this.allocationDepth = allocationDepth;
     this.flatNew         = flatNew;
+    this.forceAnalyze    = forceAnalyze;
 
     ithOldest = new Vector<Integer>(allocationDepth);
     id        = generateUniqueAllocationSiteID();
@@ -56,6 +58,11 @@ public class AllocationSite {
   }
 
 
+  public boolean doForceAnalyze() {
+    return forceAnalyze;
+  }
+
+
   public int getAllocationDepth() {
     return allocationDepth;
   }
index 68ec11d11676832de3d7e8e16bcfbee44dc659fb..a3b2c3be0bbcff815fc308ddeb8ec96094c89743 100644 (file)
@@ -280,15 +280,39 @@ public class OwnershipAnalysis {
       mapMethodContextToNumUpdates = new Hashtable<MethodContext, Integer>();
     }
 
-    // initialize methods to visit as the set of all tasks in the
-    // program and then any method that could be called starting
-    // from those tasks
-    Iterator taskItr = state.getTaskSymbolTable().getDescriptorsIterator();
-    while( taskItr.hasNext() ) {
-      Descriptor d = (Descriptor) taskItr.next();
-      scheduleAllCallees(d);
+
+    if( state.TASK ) {
+      // initialize methods to visit as the set of all tasks in the
+      // program and then any method that could be called starting
+      // from those tasks
+      Iterator taskItr = state.getTaskSymbolTable().getDescriptorsIterator();
+      while( taskItr.hasNext() ) {
+       Descriptor d = (Descriptor) taskItr.next();
+       scheduleAllCallees(d);
+      }
+
+    } else {
+      // we are not in task mode, just normal Java, so start with
+      // the main method
+      
+      // get all classes, get all methods, look for static main, then stop?
+      
+      // YOU CAN DEFINE MORE THAN ONE MAIN!!!!
+
+      Iterator classItr = state.getClassSymbolTable().getDescriptorsIterator();
+      while( classItr.hasNext() ) {
+       ClassDescriptor cd = (ClassDescriptor) classItr.next();
+
+       Iterator methItr = cd.getMethods();
+       while( methItr.hasNext() ) {
+         Descriptor d = (Descriptor) methItr.next();
+         scheduleAllCallees(d);
+       }
+      }
+      
     }
 
+
     // before beginning analysis, initialize every scheduled method
     // with an ownership graph that has populated parameter index tables
     // by analyzing the first node which is always a FlatMethod node
@@ -796,7 +820,7 @@ public class OwnershipAnalysis {
   private AllocationSite getAllocationSiteFromFlatNewPRIVATE(FlatNew fn) {
 
     if( !mapFlatNewToAllocationSite.containsKey(fn) ) {
-      AllocationSite as = new AllocationSite(allocationDepth, fn);
+      AllocationSite as = new AllocationSite(allocationDepth, fn, fn.isDisjoint());
 
       // the newest nodes are single objects
       for( int i = 0; i < allocationDepth; ++i ) {
index 851b3e708ce1d159cd1554c16cd7edc4a3dcbf06..be55291826ea4dde36f53bca7e8f88088a216943 100644 (file)
@@ -85,7 +85,7 @@ public class OwnershipGraph {
     }
 
     if( alpha == null ) {
-      if( isFlagged || isParameter ) {
+      if( isFlagged || isParameter || allocSite.doForceAnalyze() ) {
        alpha = new ReachabilitySet(
          new TokenTuple(id,
                         !isSingleObject,
index 9ed529d8da3a5e75a8316407988618925e3756e5..7b4edf85427bbd0532c490a126fda65f1d4255e0 100644 (file)
@@ -212,7 +212,7 @@ public class BuildFlat {
   private NodePair flattenCreateObjectNode(CreateObjectNode con,TempDescriptor out_temp) {
     TypeDescriptor td=con.getType();
     if (!td.isArray()) {
-      FlatNew fn=new FlatNew(td, out_temp, con.isGlobal());
+      FlatNew fn=new FlatNew(td, out_temp, con.isGlobal(), con.isDisjoint());
       TempDescriptor[] temps=new TempDescriptor[con.numArgs()];
       FlatNode last=fn;
       // Build arguments
@@ -271,7 +271,7 @@ public class BuildFlat {
                             out_temp :
                             TempDescriptor.tempFactory("arg",en.getType());
       }
-      FlatNew fn=new FlatNew(td, out_temp, temps[0], con.isGlobal());
+      FlatNew fn=new FlatNew(td, out_temp, temps[0], con.isGlobal(), con.isDisjoint());
       last.addNext(fn);
       if (temps.length>1) {
        NodePair np=generateNewArrayLoop(temps, td.dereference(), out_temp, 0, con.isGlobal());
index eec4beb44d950dad8834ab71dfc42d6369f98e05..03f2892dabc253df97d65556c51317b3e83f6870 100644 (file)
@@ -6,12 +6,22 @@ public class FlatNew extends FlatNode {
   TypeDescriptor type;
   TempDescriptor size;
   boolean isglobal;
+  boolean isdisjoint;
 
   public FlatNew(TypeDescriptor type, TempDescriptor dst, boolean isglobal) {
     this.type=type;
     this.dst=dst;
     this.size=null;
     this.isglobal=isglobal;
+    this.isdisjoint=false;
+  }
+
+  public FlatNew(TypeDescriptor type, TempDescriptor dst, boolean isglobal, boolean isdisjoint) {
+    this.type=type;
+    this.dst=dst;
+    this.size=null;
+    this.isglobal=isglobal;
+    this.isdisjoint=isdisjoint;
   }
 
   public FlatNew(TypeDescriptor type, TempDescriptor dst, TempDescriptor size, boolean isglobal) {
@@ -19,12 +29,25 @@ public class FlatNew extends FlatNode {
     this.dst=dst;
     this.size=size;
     this.isglobal=isglobal;
+    this.isdisjoint=false;
+  }
+
+  public FlatNew(TypeDescriptor type, TempDescriptor dst, TempDescriptor size, boolean isglobal, boolean isdisjoint) {
+    this.type=type;
+    this.dst=dst;
+    this.size=size;
+    this.isglobal=isglobal;
+    this.isdisjoint=isdisjoint;
   }
 
   public boolean isGlobal() {
     return isglobal;
   }
 
+  public boolean isDisjoint() {
+    return isdisjoint;
+  }
+
   public String toString() {
     String str = "FlatNew_"+dst.toString()+"= NEW "+type.toString();
     if (size!=null)
index d577cbb115e6a9eded0a984449ac9160af9c8bdc..342fd89730246749d22ae2efb7c01c7922f28ec4 100644 (file)
@@ -398,7 +398,8 @@ public class BuildIR {
       TypeDescriptor td=parseTypeDescriptor(pn);
       Vector args=parseArgumentList(pn);
       boolean isglobal=pn.getChild("global")!=null;
-      CreateObjectNode con=new CreateObjectNode(td, isglobal);
+      boolean isdisjoint=pn.getChild("disjoint")!=null;
+      CreateObjectNode con=new CreateObjectNode(td, isglobal, isdisjoint);
       for(int i=0; i<args.size(); i++) {
        con.addArgument((ExpressionNode)args.get(i));
       }
@@ -417,6 +418,7 @@ public class BuildIR {
     } else if (isNode(pn,"createarray")) {
       //System.out.println(pn.PPrint(3,true));
       boolean isglobal=pn.getChild("global")!=null;
+      boolean isdisjoint=pn.getChild("disjoint")!=null;
       TypeDescriptor td=parseTypeDescriptor(pn);
       Vector args=parseDimExprs(pn);
       int num=0;
@@ -424,7 +426,7 @@ public class BuildIR {
        num=((Integer)pn.getChild("dims_opt").getLiteral()).intValue();
       for(int i=0; i<(args.size()+num); i++)
        td=td.makeArray(state);
-      CreateObjectNode con=new CreateObjectNode(td, isglobal);
+      CreateObjectNode con=new CreateObjectNode(td, isglobal, isdisjoint);
       for(int i=0; i<args.size(); i++) {
        con.addArgument((ExpressionNode)args.get(i));
       }
index 7c8230d49c7d55c565d6189ab61ccf7dca780f07..5379b6f50fa514a0d13bd431614200839d667fc0 100644 (file)
@@ -9,17 +9,23 @@ public class CreateObjectNode extends ExpressionNode {
   MethodDescriptor md;
   FlagEffects fe;
   boolean isglobal;
+  boolean isdisjoint;  
 
-  public CreateObjectNode(TypeDescriptor type, boolean isglobal) {
+  public CreateObjectNode(TypeDescriptor type, boolean isglobal, boolean isdisjoint) {
     td=type;
     argumentlist=new Vector();
     this.isglobal=isglobal;
+    this.isdisjoint=isdisjoint;
   }
 
   public boolean isGlobal() {
     return isglobal;
   }
 
+  public boolean isDisjoint() {
+    return isdisjoint;
+  }
+
   public void addFlagEffects(FlagEffects fe) {
     this.fe=fe;
   }
index 634b0a9ead3f1863dcafb23d7a4a4b0239309229..315327beb756220e35d59e156691126e65c5b469 100644 (file)
@@ -81,6 +81,8 @@ class Keyword extends Token {
     key_table.put("global", new Integer(Sym.GLOBAL));
     //Keywords for hacking prefetch calls in java
     key_table.put("getoffset", new Integer(Sym.GETOFFSET));
+    //Keywords for disjointness in Java
+    key_table.put("disjoint", new Integer(Sym.DISJOINT));
     //Keywords for coarse-grain parallelization
     key_table.put("sese", new Integer(Sym.SESE));
   }
index 7aaa638a869983619f9c1585ed80a1a3eda8c23b..ec5b5ca7cdaf1f0c69d498701356baed6b410fc2 100644 (file)
@@ -255,7 +255,9 @@ public class Lexer {
 
   static final String[] keywords = new String[] {
     "abstract", "assert", "atomic", "boolean", "break", "byte", "case", "catch", "char",
-    "class", "const", "continue", "default", "do", "double", "else", "enum",
+    "class", "const", "continue", 
+    "default", "disjoint", "do", "double", 
+    "else", "enum",
     "extends", "external", "final", "finally",
     "flag", //keyword for failure aware computation
     "float", "for","getoffset", "global", "goto", "if",
index a41025fb3a56e01f3d3e68649389dd21bbcdb34a..0bbbe88ee885e5546db11d6d3583fc36d4b743e6 100644 (file)
@@ -260,6 +260,9 @@ terminal GETOFFSET;
 non terminal ParseNode atomic_statement;
 non terminal ParseNode getoffset_expression;
 
+//disjointness for Java
+terminal DISJOINT;
+
 //coarse-grain parallelization
 terminal SESE;
 non terminal ParseNode sese_statement;
@@ -1419,6 +1422,16 @@ class_instance_creation_expression ::=
                pn.addChild("global");
                RESULT=pn;
        :}
+       // Objects we want to track in disjointness analysis
+       | DISJOINT IDENTIFIER:id NEW class_or_interface_type:type LPAREN argument_list_opt:args RPAREN flag_list_opt:feo {: 
+               ParseNode pn=new ParseNode("createobject");
+               pn.addChild(type);
+               pn.addChild(args);
+               pn.addChild(feo);
+               pn.addChild("disjoint");
+               pn.addChild(id);
+               RESULT=pn;
+       :}
        | NEW class_or_interface_type:type LPAREN argument_list_opt:args RPAREN LBRACE RBRACE LBRACE tag_list:tl RBRACE {: 
                ParseNode pn=new ParseNode("createobject");
                pn.addChild(type);
@@ -1508,6 +1521,15 @@ array_creation_uninit ::=
                pn.addChild("global");
                RESULT=pn;
                :}
+       |       DISJOINT IDENTIFIER:id NEW primitive_type:type dim_exprs:dimexpr dims_opt:dims {: 
+               ParseNode pn=new ParseNode("createarray");
+               pn.addChild(type);
+               pn.addChild(dimexpr);
+               pn.addChild("dims_opt").setLiteral(dims);
+               pn.addChild("disjoint");
+               pn.addChild(id);
+               RESULT=pn;
+               :}
        |       GLOBAL NEW class_or_interface_type:type dim_exprs:dimexpr dims_opt:dims {: 
                ParseNode pn=new ParseNode("createarray");
                pn.addChild(type);
@@ -1515,7 +1537,16 @@ array_creation_uninit ::=
                pn.addChild("dims_opt").setLiteral(dims);
                pn.addChild("global");
                RESULT=pn;
-       :}
+               :}
+       |       DISJOINT IDENTIFIER:id NEW class_or_interface_type:type dim_exprs:dimexpr dims_opt:dims {: 
+               ParseNode pn=new ParseNode("createarray");
+               pn.addChild(type);
+               pn.addChild(dimexpr);
+               pn.addChild("dims_opt").setLiteral(dims);
+               pn.addChild("disjoint");
+               pn.addChild(id);
+               RESULT=pn;
+               :}
        ;
 //array_creation_init ::=
 //             NEW primitive_type dims array_initializer
index 385858adf0a9f38eb1d140a068f520c6b3beffcc..6cf21b138d8bb9e41b9e056414d6be5c6209edfc 100644 (file)
@@ -3,7 +3,7 @@ PROGRAM=test
 SOURCE_FILES=$(PROGRAM).java
 
 BUILDSCRIPT=~/research/Robust/src/buildscript
-BSFLAGS= -recover -ownership -ownallocdepth 1 -ownaliasfile aliases.txt -ownwritedots final -enable-assertions -flatirtasks
+BSFLAGS= -ownership -ownallocdepth 1 -ownwritedots final -enable-assertions -flatirtasks #-recover -ownaliasfile aliases.txt
 
 all: $(PROGRAM).bin
 
index 9e01205bc1e34c274d363e4ccb1cdeda26eef3b7..9dffe0924c5820fd1be377f17da2b31d47c1270b 100644 (file)
@@ -1,29 +1,35 @@
+public class Test {
 
-
-task Startup( StartupObject s{ initialstate } ) {
-
-  int a = 0;
-
-  sese {
-    int x = 3;
-  }
-  
-  a = x;
-  
-  
-  sese {
-    int y = 4;
-    y+=4;
-
+  public static void main( String args[] ) {
+    
+    /*
+    int a = 0;
+    
     sese {
-      int z = x + y;
-      z+=6;
-      Integer n=new Integer(23);
+      int x = 3;
     }
-  }
+    
+    a = x;
+    
+    
+    sese {
+      int y = 4;
+      y+=4;
+      
+      sese {
+       int z = x + y;
+       z+=6;
+       Integer n=new Integer(23);
+      }
+    }
+    
+    x = y + z;
+    */
 
-  x = y + z;
+    Integer   r = disjoint t1 new Integer(23);
 
+    int[]     s = disjoint t2 new     int[10];
 
-  taskexit( s{ !initialstate } );
+    Integer[] t = disjoint t3 new Integer[10];
+  }
 }