add options to close array boundary check in Bamboo
[IRC.git] / Robust / src / IR / Flat / BuildCode.java
index 89e549f19e4833f3d9b34f436293cd8102ec1f6a..6cc1e6c906f7b70227ad4ad72ad29ac8dda8b072 100644 (file)
@@ -3,6 +3,7 @@ import IR.Tree.FlagExpressionNode;
 import IR.Tree.DNFFlag;
 import IR.Tree.DNFFlagAtom;
 import IR.Tree.TagExpressionList;
+import IR.Tree.OffsetNode;
 import IR.*;
 import java.util.*;
 import java.io.*;
@@ -18,6 +19,7 @@ import Analysis.Locality.LocalityAnalysis;
 import Analysis.Locality.LocalityBinding;
 import Analysis.Prefetch.*;
 
+
 public class BuildCode {
   State state;
   Hashtable temptovar;
@@ -27,6 +29,7 @@ public class BuildCode {
   Hashtable flagorder;
   int tag=0;
   String localsprefix="___locals___";
+  String fcrevert="___fcrevert___";
   String paramsprefix="___params___";
   String oidstr="___nextobject___";
   String nextobjstr="___nextobject___";
@@ -274,6 +277,9 @@ public class BuildCode {
     outmethod.println("printf(\"nmhashSearch= %d\\n\", nmhashSearch);");
     outmethod.println("printf(\"nprehashSearch= %d\\n\", nprehashSearch);");
     outmethod.println("printf(\"nRemoteReadSend= %d\\n\", nRemoteSend);");
+    outmethod.println("printf(\"nSoftAbort= %d\\n\", nSoftAbort);");
+    outmethod.println("printf(\"bytesSent= %d\\n\", bytesSent);");
+    outmethod.println("printf(\"bytesRecv= %d\\n\", bytesRecv);");
     outmethod.println("#endif\n");
     outmethod.println("}");
 
@@ -323,6 +329,9 @@ public class BuildCode {
       outmethod.println("#include \"addPrefetchEnhance.h\"");
       outmethod.println("#include \"localobjects.h\"");
     }
+    if (state.FASTCHECK) {
+      outmethod.println("#include \"localobjects.h\"");      
+    }
     if(state.MULTICORE) {
       outmethod.println("#include \"task.h\"");
     }
@@ -441,6 +450,8 @@ public class BuildCode {
        outclassdefs.println("  int isolate;");        // indicate if this object is shared or not
        outclassdefs.println("  int version;");
        outclassdefs.println("  struct ___Object___ * original;");
+       //outclassdefs.println("  int numlocks;");        // array for locks
+       outclassdefs.println("  int * lock;");
       }
       if(state.OPTIONAL) {
        outclassdefs.println("  int numfses;");
@@ -735,6 +746,9 @@ public class BuildCode {
     outclassdefs.print("extern int nmhashSearch;\n");
     outclassdefs.print("extern int nprehashSearch;\n");
     outclassdefs.print("extern int nRemoteSend;\n");
+    outclassdefs.print("extern int nSoftAbort;\n");
+    outclassdefs.print("extern int bytesSent;\n");
+    outclassdefs.print("extern int bytesRecv;\n");
     outclassdefs.print("extern void handle();\n");
     outclassdefs.print("#endif\n");
     outclassdefs.print("int numprefetchsites = " + pa.prefetchsiteid + ";\n");
@@ -1040,6 +1054,8 @@ public class BuildCode {
        classdefout.println("  int isolate;");        // indicate if this object is shared or not
        classdefout.println("  int version;");
        classdefout.println("  struct ___Object___ * original;");
+       //classdefout.println("  int numlocks;");        // array for locks
+       classdefout.println("  int * lock;");
       }
       if (state.OPTIONAL) {
        classdefout.println("  int numfses;");
@@ -1298,9 +1314,9 @@ public class BuildCode {
 
     if ((state.THREAD||state.DSM)&&GENERATEPRECISEGC) {
       if (state.DSM&&lb.isAtomic())
-       output.println("checkcollect2(&"+localsprefix+",trans);");
+       output.println("if (needtocollect) checkcollect2(&"+localsprefix+",trans);");
       else
-       output.println("checkcollect(&"+localsprefix+");");
+       output.println("if (needtocollect) checkcollect(&"+localsprefix+");");
     }
 
     /* Do the actual code generation */
@@ -1395,6 +1411,7 @@ public class BuildCode {
     TempObject objecttemps=(TempObject) tempstable.get(lb!=null ? lb : md!=null ? md : task);
 
     if (objecttemps.isLocalPrim(td)||objecttemps.isParamPrim(td)) {
+      //System.out.println("generateTemp returns " + td.getSafeSymbol());
       return td.getSafeSymbol();
     }
 
@@ -1418,6 +1435,14 @@ public class BuildCode {
       generateFlatAtomicExitNode(fm, lb, (FlatAtomicExitNode) fn, output);
       return;
 
+    case FKind.FlatSESEEnterNode:
+      generateFlatSESEEnterNode(fm, lb, (FlatSESEEnterNode) fn, output);
+      return;
+
+    case FKind.FlatSESEExitNode:
+      generateFlatSESEExitNode(fm, lb, (FlatSESEExitNode) fn, output);
+      return;
+
     case FKind.FlatGlobalConvNode:
       generateFlatGlobalConvNode(fm, lb, (FlatGlobalConvNode) fn, output);
       return;
@@ -1473,9 +1498,9 @@ public class BuildCode {
     case FKind.FlatBackEdge:
       if ((state.THREAD||state.DSM)&&GENERATEPRECISEGC) {
        if(state.DSM&&locality.getAtomic(lb).get(fn).intValue()>0) {
-         output.println("checkcollect2(&"+localsprefix+",trans);");
+         output.println("if (needtocollect) checkcollect2(&"+localsprefix+",trans);");
        } else
-         output.println("checkcollect(&"+localsprefix+");");
+         output.println("if (needtocollect) checkcollect(&"+localsprefix+");");
       } else
        output.println("/* nop */");
       return;
@@ -1491,10 +1516,23 @@ public class BuildCode {
     case FKind.FlatPrefetchNode:
       generateFlatPrefetchNode(fm,lb, (FlatPrefetchNode) fn, output);
       return;
+
+    case FKind.FlatOffsetNode:
+      generateFlatOffsetNode(fm, lb, (FlatOffsetNode)fn, output);
+      return;
     }
     throw new Error();
   }
 
+  public void generateFlatOffsetNode(FlatMethod fm, LocalityBinding lb, FlatOffsetNode fofn, PrintWriter output) {
+    output.println("/* FlatOffsetNode */");
+    ClassDescriptor cn = fofn.getClassDesc();
+    FieldDescriptor fd = fofn.getField();
+    System.out.println("ClassDescriptor cn =" + cn.toString() + " FieldDescriptor fd =" + fd.toString());
+    System.out.println("TempDescriptor td =" + fofn.getDst().toString() + "Type of TempDescriptor =" + fofn.getDst().getType());
+    output.println("((struct "+cn.getSafeSymbol() +" *)0)->"+ fd.getSafeSymbol()+";");
+  }
+
   public void generateFlatPrefetchNode(FlatMethod fm, LocalityBinding lb, FlatPrefetchNode fpn, PrintWriter output) {
     if (state.PREFETCH) {
       Vector oids = new Vector();
@@ -1735,6 +1773,14 @@ public class BuildCode {
     output.println("}");
   }
 
+  public void generateFlatSESEEnterNode(FlatMethod fm,  LocalityBinding lb, FlatSESEEnterNode faen, PrintWriter output) {
+    
+  }
+
+  public void generateFlatSESEExitNode(FlatMethod fm,  LocalityBinding lb, FlatSESEExitNode faen, PrintWriter output) {
+    
+  }
+
   private void generateFlatCheckNode(FlatMethod fm,  LocalityBinding lb, FlatCheckNode fcn, PrintWriter output) {
     if (state.CONSCHECK) {
       String specname=fcn.getSpec();
@@ -2029,6 +2075,18 @@ public class BuildCode {
        output.println("}");
       }
     } else {
+      if (state.FASTCHECK) {
+       String dst=generateTemp(fm, fsfn.getDst(),lb);
+       output.println("if(!"+dst+"->"+localcopystr+") {");
+       /* Link object into list */
+       if (GENERATEPRECISEGC)
+         output.println("COPY_OBJ((struct garbagelist *)&"+localsprefix+",(struct ___Object___ *)"+dst+");");
+       else
+         output.println("COPY_OBJ("+dst+");");
+       output.println(dst+"->"+nextobjstr+"="+fcrevert+";");
+       output.println(fcrevert+"=(struct ___Object___ *)"+dst+";");
+       output.println("}");
+      }
       output.println(generateTemp(fm, fsfn.getDst(),lb)+"->"+ fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc(),lb)+";");
     }
   }
@@ -2042,7 +2100,7 @@ public class BuildCode {
     else
       type=elementtype.getSafeSymbol()+" ";
 
-    if (fen.needsBoundsCheck()) {
+    if (this.state.ARRAYBOUNDARYCHECK && fen.needsBoundsCheck()) {
       output.println("if ("+generateTemp(fm, fen.getIndex(),lb)+"< 0 || "+generateTemp(fm, fen.getIndex(),lb)+" >= "+generateTemp(fm,fen.getSrc(),lb) + "->___length___)");
       output.println("failedboundschk();");
     }
@@ -2086,8 +2144,7 @@ public class BuildCode {
     else
       type=elementtype.getSafeSymbol()+" ";
 
-
-    if (fsen.needsBoundsCheck()) {
+    if (this.state.ARRAYBOUNDARYCHECK && fsen.needsBoundsCheck()) {
       output.println("if ("+generateTemp(fm, fsen.getIndex(),lb)+"< 0 || "+generateTemp(fm, fsen.getIndex(),lb)+" >= "+generateTemp(fm,fsen.getDst(),lb) + "->___length___)");
       output.println("failedboundschk();");
     }
@@ -2125,11 +2182,24 @@ public class BuildCode {
       } else {
        output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]="+generateTemp(fm,fsen.getSrc(),lb)+";");
       }
-    } else
+    } else {
+      if (state.FASTCHECK) {
+       String dst=generateTemp(fm, fsen.getDst(),lb);
+       output.println("if(!"+dst+"->"+localcopystr+") {");
+       /* Link object into list */
+       if (GENERATEPRECISEGC)
+         output.println("COPY_OBJ((struct garbagelist *)&"+localsprefix+",(struct ___Object___ *)"+dst+");");
+       else
+         output.println("COPY_OBJ("+dst+");");
+       output.println(dst+"->"+nextobjstr+"="+fcrevert+";");
+       output.println(fcrevert+"=(struct ___Object___ *)"+dst+";");
+       output.println("}");
+      }
       output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]="+generateTemp(fm,fsen.getSrc(),lb)+";");
+    }
   }
 
-  private void generateFlatNew(FlatMethod fm, LocalityBinding lb, FlatNew fn, PrintWriter output) {
+  protected void generateFlatNew(FlatMethod fm, LocalityBinding lb, FlatNew fn, PrintWriter output) {
     if (state.DSM && locality.getAtomic(lb).get(fn).intValue()>0&&!fn.isGlobal()) {
       //Stash pointer in case of GC
       String revertptr=generateTemp(fm, reverttable.get(lb),lb);
@@ -2155,7 +2225,16 @@ public class BuildCode {
     }
     if (state.DSM && locality.getAtomic(lb).get(fn).intValue()>0&&!fn.isGlobal()) {
       String revertptr=generateTemp(fm, reverttable.get(lb),lb);
-      output.println("trans->revertlist="+revertptr+";");
+      String dst=generateTemp(fm,fn.getDst(),lb);
+      output.println(dst+"->___localcopy___=(struct ___Object___*)1;");
+      output.println(dst+"->"+nextobjstr+"="+revertptr+";");
+      output.println("trans->revertlist=(struct ___Object___ *)"+dst+";");
+    }
+    if (state.FASTCHECK) {
+      String dst=generateTemp(fm,fn.getDst(),lb);
+      output.println(dst+"->___localcopy___=(struct ___Object___*)1;");
+      output.println(dst+"->"+nextobjstr+"="+fcrevert+";");
+      output.println(fcrevert+"=(struct ___Object___ *)"+dst+";");
     }
   }
 
@@ -2204,6 +2283,16 @@ public class BuildCode {
   }
 
   private void generateFlatLiteralNode(FlatMethod fm, LocalityBinding lb, FlatLiteralNode fln, PrintWriter output) {
+    if (fln.getType().isOffset()) {
+      if (fln.getValue() instanceof OffsetNode) {
+       OffsetNode ofn = (OffsetNode) fln.getValue();
+       output.println(generateTemp(fm, fln.getDst(),lb)+
+                      " = (short) (&((struct "+ofn.getClassDesc().getSafeSymbol() +" *)0)->"+
+                      ofn.getField().getSafeSymbol()+");");
+      }
+      output.println("/* offset */");
+      return;
+    }
     if (fln.getValue()==null)
       output.println(generateTemp(fm, fln.getDst(),lb)+"=0;");
     else if (fln.getType().getSymbol().equals(TypeUtil.StringClass)) {