1 19 20 25 26 27 28 29 30 31 package soot.jimple.toolkits.scalar; 32 import soot.options.*; 33 34 import soot.*; 35 import soot.jimple.*; 36 import soot.toolkits.scalar.*; 37 import soot.util.*; 38 import soot.toolkits.graph.*; 39 import java.util.*; 40 41 public class DeadAssignmentEliminator extends BodyTransformer 42 { 43 public DeadAssignmentEliminator( Singletons.Global g ) {} 44 public static DeadAssignmentEliminator v() { return G.v().soot_jimple_toolkits_scalar_DeadAssignmentEliminator(); } 45 46 52 53 protected void internalTransform(Body b, String phaseName, Map options) 54 { 55 boolean eliminateOnlyStackLocals = PhaseOptions.getBoolean(options, "only-stack-locals"); 56 57 if(Options.v().verbose()) 58 G.v().out.println("[" + b.getMethod().getName() + 59 "] Eliminating dead code..."); 60 61 if(Options.v().time()) 62 Timers.v().deadCodeTimer.start(); 63 64 Set essentialStmts = new HashSet(); 65 LinkedList toVisit = new LinkedList(); 66 Chain units = b.getUnits(); 67 68 { 71 Iterator stmtIt = units.iterator(); 72 73 while(stmtIt.hasNext()) 74 { 75 Stmt s = (Stmt) stmtIt.next(); 76 boolean isEssential = true; 77 78 if(s instanceof NopStmt) 79 isEssential = false; 80 81 if(s instanceof AssignStmt) 82 { 83 AssignStmt as = (AssignStmt) s; 84 85 if(as.getLeftOp() instanceof Local && 86 (!eliminateOnlyStackLocals || 87 ((Local) as.getLeftOp()).getName().startsWith("$"))) 88 { 89 Value rhs = as.getRightOp(); 90 91 isEssential = false; 92 93 if(rhs instanceof InvokeExpr || 94 rhs instanceof ArrayRef) 95 { 96 99 isEssential = true; 100 } 101 102 if(rhs instanceof InstanceFieldRef && 103 !(!b.getMethod().isStatic() && 104 ((InstanceFieldRef)rhs).getBase() == 105 b.getThisLocal())) 106 { 107 isEssential = true; 111 } 112 113 114 else if(rhs instanceof DivExpr || 115 rhs instanceof RemExpr) 116 { 117 BinopExpr expr = (BinopExpr) rhs; 118 119 if(expr.getOp1().getType().equals(IntType.v()) || 120 expr.getOp2().getType().equals(IntType.v()) || 121 expr.getOp1().getType().equals(LongType.v()) || 122 expr.getOp2().getType().equals(LongType.v())) 123 { 124 isEssential = true; 126 } 127 } 128 129 else if(rhs instanceof CastExpr) 130 { 131 isEssential = true; 133 } 134 } 135 } 136 137 if(isEssential) 138 { 139 essentialStmts.add(s); 140 toVisit.addLast(s); 141 } 142 } 143 } 144 145 ExceptionalUnitGraph graph = new ExceptionalUnitGraph(b); 146 LocalDefs defs = new SmartLocalDefs(graph, new SimpleLiveLocals(graph)); 147 LocalUses uses = new SimpleLocalUses(graph, defs); 148 149 { 152 153 while(!toVisit.isEmpty()) 154 { 155 Stmt s = (Stmt) toVisit.removeFirst(); 156 Iterator boxIt = s.getUseBoxes().iterator(); 157 158 while(boxIt.hasNext()) 159 { 160 ValueBox box = (ValueBox) boxIt.next(); 161 162 if(box.getValue() instanceof Local) 163 { 164 Iterator defIt = defs.getDefsOfAt( 165 (Local) box.getValue(), s).iterator(); 166 167 while(defIt.hasNext()) 168 { 169 171 Stmt def = (Stmt) defIt.next(); 172 173 if(!essentialStmts.contains(def)) 174 { 175 essentialStmts.add(def); 176 toVisit.addLast(def); 177 } 178 } 179 } 180 } 181 } 182 } 183 184 { 186 Iterator stmtIt = units.iterator(); 187 188 while(stmtIt.hasNext()) 189 { 190 Stmt s = (Stmt) stmtIt.next(); 191 192 if(!essentialStmts.contains(s)){ 193 stmtIt.remove(); 194 s.clearUnitBoxes(); 195 } 196 else if(s instanceof AssignStmt && 197 ((AssignStmt) s).getLeftOp() == ((AssignStmt) s).getRightOp() && 198 ((AssignStmt) s).getLeftOp() instanceof Local) 199 { 200 202 stmtIt.remove(); 203 s.clearUnitBoxes(); 204 } 205 } 206 } 207 208 { 211 Iterator stmtIt = units.snapshotIterator(); 212 213 while(stmtIt.hasNext()) 214 { 215 Stmt s = (Stmt) stmtIt.next(); 216 217 if(s instanceof AssignStmt && 218 s.containsInvokeExpr()) 219 { 220 Local l = (Local) ((AssignStmt) s).getLeftOp(); 221 InvokeExpr e = (InvokeExpr) s.getInvokeExpr(); 222 223 { 225 Iterator useIt = uses.getUsesOf(s).iterator(); 226 boolean isEssential = false; 227 228 while(useIt.hasNext()) 229 { 230 UnitValueBoxPair pair = (UnitValueBoxPair) 231 useIt.next(); 232 233 if(essentialStmts.contains(pair.unit)) 234 { 235 isEssential = true; 236 break; 237 } 238 } 239 240 if(!isEssential) 241 { 242 244 Stmt newInvoke = Jimple.v().newInvokeStmt(e); 245 newInvoke.addAllTagsOf(s); 246 247 units.swapWith(s, newInvoke); 248 } 249 } 250 } 251 } 252 } 253 254 if(Options.v().time()) 255 Timers.v().deadCodeTimer.end(); 256 257 } 258 } 259 260 261 262 263 264 265 266 | Popular Tags |