1 package Analysis.Loops;
4 import java.util.Iterator;
5 import java.util.Hashtable;
6 import java.util.HashSet;
9 public class CopyPropagation {
10 public CopyPropagation() {
13 public void optimize(FlatMethod fm) {
14 Hashtable<FlatNode, Hashtable<TempDescriptor, TempDescriptor>> table
15 =new Hashtable<FlatNode, Hashtable<TempDescriptor, TempDescriptor>>();
16 boolean changed=false;
17 TempDescriptor bogustd=new TempDescriptor("bogus");
20 HashSet tovisit=new HashSet();
21 HashSet discovered=new HashSet();
24 while(!tovisit.isEmpty()) {
25 FlatNode fn=(FlatNode) tovisit.iterator().next();
27 for(int i=0;i<fn.numNext();i++) {
28 FlatNode nnext=fn.getNext(i);
29 if (!discovered.contains(nnext)) {
30 discovered.add(nnext);
34 Hashtable<TempDescriptor, TempDescriptor> tab;
35 if (fn.numPrev()>=1&&table.containsKey(fn.getPrev(0)))
36 tab=new Hashtable<TempDescriptor, TempDescriptor>(table.get(fn.getPrev(0)));
38 tab=new Hashtable<TempDescriptor, TempDescriptor>();
39 //Compute intersection
40 for(int i=1;i<fn.numPrev();i++) {
41 Hashtable<TempDescriptor, TempDescriptor> tp=table.get(fn.getPrev(i));
42 for(Iterator tmpit=tab.entrySet().iterator();tmpit.hasNext();) {
43 Map.Entry t=(Map.Entry)tmpit.next();
44 TempDescriptor tmp=(TempDescriptor)t.getKey();
45 if (tp!=null&&(!tp.containsKey(tmp)||tp.get(tmp)!=tab.get(tmp))) {
50 TempDescriptor[]writes=fn.writesTemps();
51 for(int i=0;i<writes.length;i++) {
52 TempDescriptor tmp=writes[i];
53 for(Iterator<TempDescriptor> tmpit=tab.keySet().iterator();tmpit.hasNext();) {
54 TempDescriptor tmp2=tmpit.next();
55 if (tmp==tab.get(tmp2))
59 if (fn.kind()==FKind.FlatOpNode) {
60 FlatOpNode fon=(FlatOpNode)fn;
61 if (fon.getOp().getOp()==Operation.ASSIGN) {
62 tab.put(fon.getDest(), fon.getLeft());
65 if (!table.containsKey(fn)||!table.get(fn).equals(tab)) {
68 for(int i=0;i<fn.numNext();i++) {
69 FlatNode nnext=fn.getNext(i);
74 for(Iterator<FlatNode> it=fm.getNodeSet().iterator();it.hasNext();) {
75 FlatNode fn=it.next();
76 Hashtable<TempDescriptor, TempDescriptor> tab=table.get(fn);
78 TempDescriptor[]reads=fn.readsTemps();
79 for(int i=0;i<reads.length;i++) {
80 TempDescriptor tmp=reads[i];
81 if (tab.containsKey(tmp)) {
84 tmap.addPair(tmp, tab.get(tmp));