projects
/
IRC.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
f066cd0
)
bug fix for barriers...should be able to use joptimize with barriers now
author
bdemsky
<bdemsky>
Tue, 2 Jun 2009 01:38:52 +0000
(
01:38
+0000)
committer
bdemsky
<bdemsky>
Tue, 2 Jun 2009 01:38:52 +0000
(
01:38
+0000)
Robust/src/Analysis/Loops/CSE.java
patch
|
blob
|
history
Robust/src/Analysis/Loops/GlobalFieldType.java
patch
|
blob
|
history
Robust/src/Analysis/Loops/LoopInvariant.java
patch
|
blob
|
history
Robust/src/Analysis/Loops/localCSE.java
patch
|
blob
|
history
diff --git
a/Robust/src/Analysis/Loops/CSE.java
b/Robust/src/Analysis/Loops/CSE.java
index 254a40b1df28d04db8a1d4f7fe74796b24796c66..c17768481c5c6de5f3ea287bbfb395bfabdf4035 100644
(file)
--- 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<FieldDescriptor> fields=gft.getFields(md);
Set<TypeDescriptor> arrays=gft.getArrays(md);
MethodDescriptor md=fc.getMethod();
Set<FieldDescriptor> fields=gft.getFields(md);
Set<TypeDescriptor> 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:
break;
}
case FKind.FlatOpNode:
diff --git
a/Robust/src/Analysis/Loops/GlobalFieldType.java
b/Robust/src/Analysis/Loops/GlobalFieldType.java
index a1493f6a7b8418c88a054e855c1e76fcba173fcf..25b17b1455f60d6b61b302e232e5066da9093498 100644
(file)
--- a/
Robust/src/Analysis/Loops/GlobalFieldType.java
+++ b/
Robust/src/Analysis/Loops/GlobalFieldType.java
@@
-19,6
+19,7
@@
public class GlobalFieldType {
Hashtable<MethodDescriptor, Set<FieldDescriptor>> fields;
Hashtable<MethodDescriptor, Set<TypeDescriptor>> arrays;
HashSet<MethodDescriptor> containsAtomic;
Hashtable<MethodDescriptor, Set<FieldDescriptor>> fields;
Hashtable<MethodDescriptor, Set<TypeDescriptor>> arrays;
HashSet<MethodDescriptor> containsAtomic;
+ HashSet<MethodDescriptor> containsBarrier;
public GlobalFieldType(CallGraph cg, State st, MethodDescriptor root) {
this.cg=cg;
public GlobalFieldType(CallGraph cg, State st, MethodDescriptor root) {
this.cg=cg;
@@
-27,6
+28,7
@@
public class GlobalFieldType {
this.fields=new Hashtable<MethodDescriptor, Set<FieldDescriptor>>();
this.arrays=new Hashtable<MethodDescriptor, Set<TypeDescriptor>>();
this.containsAtomic=new HashSet<MethodDescriptor>();
this.fields=new Hashtable<MethodDescriptor, Set<FieldDescriptor>>();
this.arrays=new Hashtable<MethodDescriptor, Set<TypeDescriptor>>();
this.containsAtomic=new HashSet<MethodDescriptor>();
+ this.containsBarrier=new HashSet<MethodDescriptor>();
doAnalysis();
}
private void doAnalysis() {
doAnalysis();
}
private void doAnalysis() {
@@
-86,6
+88,10
@@
public class GlobalFieldType {
if (containsAtomic.add(md))
changed=true;
}
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);
}
return containsAtomic.contains(md);
}
+ public boolean containsBarrier(MethodDescriptor md) {
+ return containsBarrier.contains(md);
+ }
+
public Set<FieldDescriptor> getFields(MethodDescriptor md) {
return fields.get(md);
}
public Set<FieldDescriptor> 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);
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 baa5c5521c4ca664a4ecf2cc60607767eebcf905..9fbc99909151e382d75a6b0771a09c82d61812e1 100644
(file)
--- 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);
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) {
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 155b83082972ae0320b032e12897ec5e8d964e15..108d992e7a44bd550a5f0cbe5ec4485b5126c827 100644
(file)
--- 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<FieldDescriptor> fields=new HashSet<FieldDescriptor>();
fields.add(fsfn.getField());
dstf.set.add(src);
HashSet<FieldDescriptor> fields=new HashSet<FieldDescriptor>();
fields.add(fsfn.getField());
- kill(table, fields, null, false);
+ kill(table, fields, null, false
, false
);
table.put(src, dstf);
break;
}
table.put(src, dstf);
break;
}
@@
-146,7
+146,7
@@
public class localCSE {
dstf.set.add(src);
HashSet<TypeDescriptor> arrays=new HashSet<TypeDescriptor>();
arrays.add(fsen.getDst().getType());
dstf.set.add(src);
HashSet<TypeDescriptor> arrays=new HashSet<TypeDescriptor>();
arrays.add(fsen.getDst().getType());
- kill(table, null, arrays, false);
+ kill(table, null, arrays, false
, false
);
table.put(src, dstf);
break;
}
table.put(src, dstf);
break;
}
@@
-156,7
+156,7
@@
public class localCSE {
MethodDescriptor md=fc.getMethod();
Set<FieldDescriptor> fields=gft.getFields(md);
Set<TypeDescriptor> arrays=gft.getArrays(md);
MethodDescriptor md=fc.getMethod();
Set<FieldDescriptor> fields=gft.getFields(md);
Set<TypeDescriptor> 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();
}
default: {
TempDescriptor[] writes=fn.writesTemps();
@@
-168,11
+168,14
@@
public class localCSE {
} while(fn.numPrev()==1);
}
}
} while(fn.numPrev()==1);
}
}
- public void kill(Hashtable<LocalExpression, Group> tab, Set<FieldDescriptor> fields, Set<TypeDescriptor> arrays, boolean isAtomic) {
+ public void kill(Hashtable<LocalExpression, Group> tab, Set<FieldDescriptor> fields, Set<TypeDescriptor> arrays, boolean isAtomic
, boolean isBarrier
) {
Set<LocalExpression> eset=tab.keySet();
for(Iterator<LocalExpression> it=eset.iterator();it.hasNext();) {
LocalExpression e=it.next();
Set<LocalExpression> eset=tab.keySet();
for(Iterator<LocalExpression> 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();
Group g=tab.get(e);
g.set.remove(e);
it.remove();