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 case FKind.FlatGenDefReachNode:
42 if (!useful.contains(fn)) {
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)) {
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)) {
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);
85 for(int j=0; j<nprev.numNext(); j++) {
86 if (nprev.getNext(j)==fn) {
87 nprev.setnext(j, fnnext);
88 fnnext.addPrev(nprev);
92 //fix up prev edge of fnnext
93 fnnext.removePrev(fn);
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())