1 package Analysis.Loops;
4 import java.util.HashSet;
5 import java.util.Iterator;
7 public class DeadCode {
10 public void optimize(FlatMethod fm) {
11 UseDef ud=new UseDef(fm);
12 HashSet useful=new HashSet();
17 for(Iterator<FlatNode> it=fm.getNodeSet().iterator(); it.hasNext(); ) {
18 FlatNode fn=it.next();
21 case FKind.FlatFieldNode:
22 case FKind.FlatSetFieldNode:
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:
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 if (!useful.contains(fn)) {
47 case FKind.FlatOpNode:
48 FlatOpNode fon=(FlatOpNode)fn;
49 if (fon.getOp().getOp()==Operation.DIV||
50 fon.getOp().getOp()==Operation.MOD) {
51 if (!useful.contains(fn)) {
59 TempDescriptor[] writes=fn.writesTemps();
60 if (!useful.contains(fn))
61 for(int i=0; i<writes.length; i++) {
62 for(Iterator<FlatNode> uit=ud.useMap(fn,writes[i]).iterator(); uit.hasNext(); ) {
63 FlatNode ufn=uit.next();
64 if (useful.contains(ufn)) {
75 //get rid of useless nodes
76 for(Iterator<FlatNode> it=fm.getNodeSet().iterator(); it.hasNext(); ) {
77 FlatNode fn=it.next();
78 if (!useful.contains(fn)||isuseless(fn)) {
79 //We have a useless node
80 FlatNode fnnext=fn.getNext(0);
81 for(int i=0; i<fn.numPrev(); i++) {
82 FlatNode nprev=fn.getPrev(i);
84 for(int j=0; j<nprev.numNext(); j++) {
85 if (nprev.getNext(j)==fn) {
86 nprev.setnext(j, fnnext);
87 fnnext.addPrev(nprev);
91 //fix up prev edge of fnnext
92 fnnext.removePrev(fn);
96 public boolean isuseless(FlatNode fn) {
97 if (fn.kind()==FKind.FlatOpNode) {
98 FlatOpNode fon=(FlatOpNode)fn;
99 if (fon.getOp().getOp()==Operation.ASSIGN&&fon.getLeft()==fon.getDest())