From: bdemsky Date: Tue, 2 Jun 2009 01:38:52 +0000 (+0000) Subject: bug fix for barriers...should be able to use joptimize with barriers now X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=97744faef19a7f9e470e7ccf3c86ab10c40fe69f;p=IRC.git bug fix for barriers...should be able to use joptimize with barriers now --- diff --git a/Robust/src/Analysis/Loops/CSE.java b/Robust/src/Analysis/Loops/CSE.java index 254a40b1..c1776848 100644 --- a/Robust/src/Analysis/Loops/CSE.java +++ b/Robust/src/Analysis/Loops/CSE.java @@ -57,7 +57,7 @@ public class CSE { MethodDescriptor md=fc.getMethod(); Set fields=gft.getFields(md); Set arrays=gft.getArrays(md); - killexpressions(tab, fields, arrays, gft.containsAtomic(md)); + killexpressions(tab, fields, arrays, gft.containsAtomic(md)||gft.containsBarrier(md)); break; } case FKind.FlatOpNode: diff --git a/Robust/src/Analysis/Loops/GlobalFieldType.java b/Robust/src/Analysis/Loops/GlobalFieldType.java index a1493f6a..25b17b14 100644 --- a/Robust/src/Analysis/Loops/GlobalFieldType.java +++ b/Robust/src/Analysis/Loops/GlobalFieldType.java @@ -19,6 +19,7 @@ public class GlobalFieldType { Hashtable> fields; Hashtable> arrays; HashSet containsAtomic; + HashSet containsBarrier; public GlobalFieldType(CallGraph cg, State st, MethodDescriptor root) { this.cg=cg; @@ -27,6 +28,7 @@ public class GlobalFieldType { this.fields=new Hashtable>(); this.arrays=new Hashtable>(); this.containsAtomic=new HashSet(); + this.containsBarrier=new HashSet(); doAnalysis(); } private void doAnalysis() { @@ -86,6 +88,10 @@ public class GlobalFieldType { if (containsAtomic.add(md)) changed=true; } + if (containsBarrier.contains(md2)) { + if (containsBarrier.add(md)) + changed=true; + } } } } @@ -95,6 +101,10 @@ public class GlobalFieldType { return containsAtomic.contains(md); } + public boolean containsBarrier(MethodDescriptor md) { + return containsBarrier.contains(md); + } + public Set getFields(MethodDescriptor md) { return fields.get(md); } @@ -118,6 +128,11 @@ public class GlobalFieldType { fields.get(md).add(fsfn.getField()); } else if (fn.kind()==FKind.FlatAtomicEnterNode) { containsAtomic.add(md); + } else if (fn.kind()==FKind.FlatCall) { + MethodDescriptor mdcall=((FlatCall)fn).getMethod(); + if (mdcall.getSymbol().equals("enterBarrier")&& + mdcall.getClassDesc().getSymbol().equals("Barrier")) + containsBarrier.add(md); } } } diff --git a/Robust/src/Analysis/Loops/LoopInvariant.java b/Robust/src/Analysis/Loops/LoopInvariant.java index baa5c552..9fbc9990 100644 --- a/Robust/src/Analysis/Loops/LoopInvariant.java +++ b/Robust/src/Analysis/Loops/LoopInvariant.java @@ -78,7 +78,7 @@ public class LoopInvariant { fields.addAll(f); if (t!=null) types.addAll(t); - if (gft.containsAtomic(md)) { + if (gft.containsAtomic(md)||gft.containsBarrier(md)) { unsafe=true; } } else if (fn.kind()==FKind.FlatSetFieldNode) { diff --git a/Robust/src/Analysis/Loops/localCSE.java b/Robust/src/Analysis/Loops/localCSE.java index 155b8308..108d992e 100644 --- a/Robust/src/Analysis/Loops/localCSE.java +++ b/Robust/src/Analysis/Loops/localCSE.java @@ -132,7 +132,7 @@ public class localCSE { dstf.set.add(src); HashSet fields=new HashSet(); fields.add(fsfn.getField()); - kill(table, fields, null, false); + kill(table, fields, null, false, false); table.put(src, dstf); break; } @@ -146,7 +146,7 @@ public class localCSE { dstf.set.add(src); HashSet arrays=new HashSet(); arrays.add(fsen.getDst().getType()); - kill(table, null, arrays, false); + kill(table, null, arrays, false, false); table.put(src, dstf); break; } @@ -156,7 +156,7 @@ public class localCSE { MethodDescriptor md=fc.getMethod(); Set fields=gft.getFields(md); Set arrays=gft.getArrays(md); - kill(table, fields, arrays, gft.containsAtomic(md)); + kill(table, fields, arrays, gft.containsAtomic(md), gft.containsBarrier(md)); } default: { TempDescriptor[] writes=fn.writesTemps(); @@ -168,11 +168,14 @@ public class localCSE { } while(fn.numPrev()==1); } } - public void kill(Hashtable tab, Set fields, Set arrays, boolean isAtomic) { + public void kill(Hashtable tab, Set fields, Set arrays, boolean isAtomic, boolean isBarrier) { Set eset=tab.keySet(); for(Iterator it=eset.iterator();it.hasNext();) { LocalExpression e=it.next(); - if (isAtomic&&(e.td!=null||e.f!=null)) { + if (isBarrier) { + //make Barriers kill everything + it.remove(); + } else if (isAtomic&&(e.td!=null||e.f!=null)) { Group g=tab.get(e); g.set.remove(e); it.remove();