From: bdemsky Date: Wed, 14 Oct 2009 09:42:58 +0000 (+0000) Subject: more changes towards word level support for arrays X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=1e1504ed1e2df2f6f15f927b1c8202d8c046291a;p=IRC.git more changes towards word level support for arrays --- diff --git a/Robust/src/Analysis/Loops/WriteBarrier.java b/Robust/src/Analysis/Loops/WriteBarrier.java index 16a6d79d..144674ae 100644 --- a/Robust/src/Analysis/Loops/WriteBarrier.java +++ b/Robust/src/Analysis/Loops/WriteBarrier.java @@ -38,6 +38,11 @@ public class WriteBarrier { FlatSetElementNode fsen=(FlatSetElementNode)fn; return !nb.contains(fsen.getDst()); } + case FKind.FlatElementNode: + { + FlatElementNode fen=(FlatElementNode)fn; + return !nb.contains(fen.getSrc()); + } case FKind.FlatSetFieldNode: { FlatSetFieldNode fsfn=(FlatSetFieldNode)fn; @@ -80,7 +85,8 @@ public class WriteBarrier { case FKind.FlatSetElementNode: { FlatSetElementNode fsen=(FlatSetElementNode)fn; - nb.add(fsen.getDst()); + if (!state.STMARRAY) + nb.add(fsen.getDst()); break; } case FKind.FlatSetFieldNode: diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 5bc9fb6a..144085e0 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -3674,7 +3674,11 @@ public class BuildCode { if (state.SINGLETM) { //Single machine transaction case String dst=generateTemp(fm, fen.getDst(),lb); - output.println(dst +"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex(),lb)+"];"); + if (!state.STMARRAY||wb.needBarrier(fen)||locality.getNodePreTempInfo(lb, fen).get(fen.getSrc())==LocalityAnalysis.SCRATCH) { + output.println(dst +"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex(),lb)+"];"); + } else { + output.println("STMGETARRAY("+dst+", "+ generateTemp(fm,fen.getSrc(),lb)+", "+generateTemp(fm, fen.getIndex(),lb)+", "+type+");"); + } if (elementtype.isPtr()&&locality.getAtomic(lb).get(fen).intValue()>0&& locality.getNodePreTempInfo(lb, fen).get(fen.getSrc())!=LocalityAnalysis.SCRATCH) { @@ -3688,7 +3692,6 @@ public class BuildCode { Integer status=locality.getNodePreTempInfo(lb,fen).get(fen.getSrc()); if (status==LocalityAnalysis.GLOBAL) { String dst=generateTemp(fm, fen.getDst(),lb); - if (elementtype.isPtr()) { output.println(dst +"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex(),lb)+"];"); output.println("TRANSREAD("+dst+", "+dst+");"); @@ -3731,7 +3734,7 @@ public class BuildCode { if (state.SINGLETM && locality.getAtomic(lb).get(fsen).intValue()>0) { //Transaction set element case - if (wb.needBarrier(fsen)&& + if (!state.STMARRAY&&wb.needBarrier(fsen)&& locality.getNodePreTempInfo(lb, fsen).get(fsen.getDst())!=LocalityAnalysis.SCRATCH) { output.println("*((unsigned int *)&("+generateTemp(fm,fsen.getDst(),lb)+"->___objstatus___))|=DIRTY;"); } @@ -3744,10 +3747,18 @@ public class BuildCode { } else { output.println("INTPTR srcoid=(INTPTR)"+src+";"); } - output.println("((INTPTR*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]=srcoid;"); + if (state.STMARRAY&&locality.getNodePreTempInfo(lb, fsen).get(fsen.getDst())!=LocalityAnalysis.SCRATCH&&wb.needBarrier(fsen)) { + output.println("STMSETARRAY("+generateTemp(fm, fsen.getDst(),lb)+", "+generateTemp(fm, fsen.getIndex(),lb)+", srcoid, INTPTR);"); + } else { + output.println("((INTPTR*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]=srcoid;"); + } output.println("}"); } else { - output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]="+generateTemp(fm,fsen.getSrc(),lb)+";"); + if (state.STMARRAY&&locality.getNodePreTempInfo(lb, fsen).get(fsen.getDst())!=LocalityAnalysis.SCRATCH&&wb.needBarrier(fsen)) { + output.println("STMSETARRAY("+generateTemp(fm, fsen.getDst(),lb)+", "+generateTemp(fm, fsen.getIndex(),lb)+", "+ generateTemp(fm, fsen.getSrc(), lb) +", "+type+");"); + } else { + output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]="+generateTemp(fm,fsen.getSrc(),lb)+";"); + } } } else if (state.DSM && locality.getAtomic(lb).get(fsen).intValue()>0) { Integer statussrc=locality.getNodePreTempInfo(lb,fsen).get(fsen.getSrc()); @@ -3755,7 +3766,7 @@ public class BuildCode { boolean srcglobal=statussrc==LocalityAnalysis.GLOBAL; boolean dstglobal=statusdst==LocalityAnalysis.GLOBAL; boolean dstlocal=statusdst==LocalityAnalysis.LOCAL; - + if (dstglobal) { if (wb.needBarrier(fsen)) output.println("*((unsigned int *)&("+generateTemp(fm,fsen.getDst(),lb)+"->___localcopy___))|=DIRTY;"); diff --git a/Robust/src/Runtime/STM/array.h b/Robust/src/Runtime/STM/array.h index de5b88b0..b32e8990 100644 --- a/Robust/src/Runtime/STM/array.h +++ b/Robust/src/Runtime/STM/array.h @@ -34,10 +34,12 @@ int byteindex=index*sizeof(type); \ int * lengthoff=&array->___length___; \ int *status; \ - GETLOCKPTR(status, array, byteindex); \ - if ((*status)==STMNONE) { \ - arraycopy(array, byteindex); \ - *status=STMCLEAN;}; \ + if (array!=array->___objlocation___) { \ + GETLOCKPTR(status, array, byteindex); \ + if ((*status)==STMNONE) { \ + arraycopy(array, byteindex); \ + *status=STMCLEAN;}; \ + } \ dst=((type *)(((char *) lengthoff)+sizeof(int)))[index]; \ }