1 package Analysis.Prefetch;
7 import IR.MethodDescriptor;
10 import IR.ClassDescriptor;
13 public class LoopExit {
15 Hashtable<MethodDescriptor, Set<FlatCondBranch>> results;
17 public LoopExit(State state) {
19 this.results=new Hashtable<MethodDescriptor, Set<FlatCondBranch>>();
22 public Set<FlatCondBranch> getLoopBranches(MethodDescriptor md) {
23 if (!results.containsKey(md))
25 return results.get(md);
28 public boolean isLoopingBranch(MethodDescriptor md, FlatCondBranch fcb) {
29 return getLoopBranches(md).contains(fcb);
32 private void doAnalysis(MethodDescriptor md) {
33 FlatMethod fm=state.getMethodFlat(md);
34 HashSet<FlatNode> nodeset=new HashSet<FlatNode>();
35 nodeset.addAll(fm.getNodeSet());
36 Hashtable<FlatNode, Set<FlatCondBranch>> table=new Hashtable<FlatNode, Set<FlatCondBranch>>();
38 HashSet<FlatCondBranch> loopbranchset=new HashSet<FlatCondBranch>();
39 HashSet<FlatCondBranch> exitset=new HashSet<FlatCondBranch>();
41 while(!nodeset.isEmpty()) {
42 FlatNode fn=nodeset.iterator().next();
44 if (fn.kind()==FKind.FlatCondBranch&&((FlatCondBranch)fn).isLoopBranch()) {
45 FlatCondBranch fcb=(FlatCondBranch)fn;
46 loopbranchset.add(fcb);
48 propagateset(nodeset, table, fcb, fcb.getNext(0), fcb);
50 propagateset(nodeset, table, fcb, fcb.getNext(1), null);
51 loopbranchset.add(fcb);
52 } else if (fn.kind()==FKind.FlatReturnNode) {
53 if (table.containsKey(fn))
54 exitset.addAll(table.get(fn));
56 for(int i=0;i<fn.numNext();i++)
57 propagateset(nodeset, table, fn, fn.getNext(i), null);
60 loopbranchset.removeAll(exitset);
61 results.put(md, loopbranchset);
64 void propagateset(Set<FlatNode> tovisit, Hashtable<FlatNode, Set<FlatCondBranch>> table, FlatNode fn, FlatNode fnnext, FlatCondBranch fcb) {
65 boolean enqueuechange=false;
66 if (table.containsKey(fn)) {
67 if (!table.containsKey(fnnext))
68 table.put(fnnext, new HashSet<FlatCondBranch>());
69 if(!table.get(fnnext).containsAll(table.get(fn))) {
70 table.get(fnnext).addAll(table.get(fn));
75 if (!table.containsKey(fnnext))
76 table.put(fnnext, new HashSet<FlatCondBranch>());
77 if (!table.get(fnnext).contains(fcb)) {
78 table.get(fnnext).add(fcb);