adding a test case
[IRC.git] / Robust / src / Analysis / Loops / DeadCode.java
1 package Analysis.Loops;
2 import IR.Flat.*;
3 import IR.Operation;
4 import java.util.HashSet;
5 import java.util.Iterator;
6
7 public class DeadCode {
8   public DeadCode() {
9   }
10   public void optimize(FlatMethod fm) {
11     UseDef ud=new UseDef(fm);
12     HashSet useful=new HashSet();
13     boolean changed=true;
14     while(changed) {
15       changed=false;
16 nextfn:
17       for(Iterator<FlatNode> it=fm.getNodeSet().iterator(); it.hasNext(); ) {
18         FlatNode fn=it.next();
19         switch(fn.kind()) {
20         case FKind.FlatCall:
21         case FKind.FlatFieldNode:
22         case FKind.FlatSetFieldNode:
23         case FKind.FlatNew:
24         case FKind.FlatCastNode:
25         case FKind.FlatReturnNode:
26         case FKind.FlatCondBranch:
27         case FKind.FlatSetElementNode:
28         case FKind.FlatElementNode:
29         case FKind.FlatFlagActionNode:
30         case FKind.FlatCheckNode:
31         case FKind.FlatBackEdge:
32         case FKind.FlatExit:
33         case FKind.FlatTagDeclaration:
34         case FKind.FlatMethod:
35         case FKind.FlatAtomicEnterNode:
36         case FKind.FlatAtomicExitNode:
37         case FKind.FlatPrefetchNode:
38         case FKind.FlatSESEEnterNode:
39         case FKind.FlatSESEExitNode:
40         case FKind.FlatGenReachNode:
41         case FKind.FlatGenDefReachNode:
42           if (!useful.contains(fn)) {
43             useful.add(fn);
44             changed=true;
45           }
46           break;
47
48         case FKind.FlatOpNode:
49           FlatOpNode fon=(FlatOpNode)fn;
50           if (fon.getOp().getOp()==Operation.DIV||
51               fon.getOp().getOp()==Operation.MOD) {
52             if (!useful.contains(fn)) {
53               useful.add(fn);
54               changed=true;
55             }
56             break;
57           }
58
59         default:
60           TempDescriptor[] writes=fn.writesTemps();
61           if (!useful.contains(fn))
62             for(int i=0; i<writes.length; i++) {
63               for(Iterator<FlatNode> uit=ud.useMap(fn,writes[i]).iterator(); uit.hasNext(); ) {
64                 FlatNode ufn=uit.next();
65                 if (useful.contains(ufn)) {
66                   //we are useful
67                   useful.add(fn);
68                   changed=true;
69                   continue nextfn;
70                 }
71               }
72             }
73         }
74       }
75     }
76     //get rid of useless nodes
77     for(Iterator<FlatNode> it=fm.getNodeSet().iterator(); it.hasNext(); ) {
78       FlatNode fn=it.next();
79       if (!useful.contains(fn)||isuseless(fn)) {
80         //We have a useless node
81         FlatNode fnnext=fn.getNext(0);
82         for(int i=0; i<fn.numPrev(); i++) {
83           FlatNode nprev=fn.getPrev(i);
84
85           for(int j=0; j<nprev.numNext(); j++) {
86             if (nprev.getNext(j)==fn) {
87               nprev.setnext(j, fnnext);
88               fnnext.addPrev(nprev);
89             }
90           }
91         }
92         //fix up prev edge of fnnext
93         fnnext.removePrev(fn);
94       }
95     }
96   }
97   public boolean isuseless(FlatNode fn) {
98     if (fn.kind()==FKind.FlatOpNode) {
99       FlatOpNode fon=(FlatOpNode)fn;
100       if (fon.getOp().getOp()==Operation.ASSIGN&&fon.getLeft()==fon.getDest())
101         return true;
102     }
103     return false;
104   }
105
106 }