1 19 20 package soot.jimple.toolkits.annotation.logic; 21 22 import soot.*; 23 import soot.toolkits.graph.*; 24 import soot.jimple.*; 25 import java.util.*; 26 import soot.toolkits.scalar.*; 27 import soot.tagkit.*; 28 29 public class LoopInvariantFinder extends BodyTransformer { 30 31 private UnitGraph g; 32 private ArrayList constants; 33 34 public LoopInvariantFinder(Singletons.Global g){} 35 public static LoopInvariantFinder v() { return G.v().soot_jimple_toolkits_annotation_logic_LoopInvariantFinder();} 36 37 40 protected void internalTransform (Body b, String phaseName, Map options){ 41 42 UnitGraph g = new ExceptionalUnitGraph(b); 43 LocalDefs sld = new SmartLocalDefs(g, new SimpleLiveLocals(g)); 44 NaiveSideEffectTester nset = new NaiveSideEffectTester(); 45 46 LoopFinder lf = new LoopFinder(); 47 lf.internalTransform(b, phaseName, options); 48 49 HashMap loops = lf.loops(); 50 constants = new ArrayList(); 51 52 if (loops.isEmpty()) return; 54 55 Iterator hIt = loops.keySet().iterator(); 56 while (hIt.hasNext()){ 57 Stmt header = (Stmt)hIt.next(); 58 List loopStmts = (List)loops.get(header); 59 Iterator bIt = loopStmts.iterator(); 60 while (bIt.hasNext()){ 61 Stmt tStmt = (Stmt)bIt.next(); 62 handleLoopBodyStmt(tStmt, nset, loopStmts); 65 } 66 } 67 } 68 69 private void handleLoopBodyStmt(Stmt s, NaiveSideEffectTester nset, List loopStmts){ 70 74 if (s instanceof DefinitionStmt) { 76 DefinitionStmt ds = (DefinitionStmt)s; 77 if (ds.getLeftOp() instanceof Local && ds.getRightOp() instanceof Constant){ 78 if (!constants.contains(ds.getLeftOp())){ 79 constants.add(ds.getLeftOp()); 80 } 81 else { 82 constants.remove(ds.getLeftOp()); 83 } 84 } 85 } 86 87 if (s instanceof GotoStmt) return; 89 90 if (s instanceof InvokeStmt) return; 92 93 G.v().out.println("s : "+s+" use boxes: "+s.getUseBoxes()+" def boxes: "+s.getDefBoxes()); 94 Iterator useBoxesIt = s.getUseBoxes().iterator(); 96 boolean result = true; 97 uses: while (useBoxesIt.hasNext()){ 98 ValueBox vb = (ValueBox)useBoxesIt.next(); 99 Value v = vb.getValue(); 100 if (v instanceof NewExpr) { 104 result = false; 105 G.v().out.println("break uses: due to new expr"); 106 break uses; 107 } 108 if (v instanceof InvokeExpr) { 110 result = false; 111 G.v().out.println("break uses: due to invoke expr"); 112 break uses; 113 } 114 if (v instanceof Expr) continue; 116 117 G.v().out.println("test: "+v+" of kind: "+v.getClass()); 118 Iterator loopStmtsIt = loopStmts.iterator(); 119 while (loopStmtsIt.hasNext()){ 120 Stmt next = (Stmt)loopStmtsIt.next(); 121 if (nset.unitCanWriteTo(next, v)){ 122 if (!isConstant(next)){ 123 G.v().out.println("result = false unit can be written to by: "+next); 124 result = false; 125 break uses; 126 } 127 } 128 } 129 130 } 131 132 Iterator defBoxesIt = s.getDefBoxes().iterator(); 133 defs: while (defBoxesIt.hasNext()){ 134 ValueBox vb = (ValueBox)defBoxesIt.next(); 135 Value v = vb.getValue(); 136 if (v instanceof NewExpr) { 138 result = false; 139 G.v().out.println("break defs due to new"); 140 break defs; 141 } 142 if (v instanceof InvokeExpr) { 144 result = false; 145 G.v().out.println("break defs due to invoke"); 146 break defs; 147 } 148 if (v instanceof Expr) continue; 150 151 G.v().out.println("test: "+v+" of kind: "+v.getClass()); 152 153 Iterator loopStmtsIt = loopStmts.iterator(); 154 while (loopStmtsIt.hasNext()){ 155 Stmt next = (Stmt)loopStmtsIt.next(); 156 if (next.equals(s)) continue; 157 if (nset.unitCanWriteTo(next, v)){ 158 if (!isConstant(next)){ 159 G.v().out.println("result false: unit can be written to by: "+next); 160 result = false; 161 break defs; 162 } 163 } 164 } 165 166 } 167 G.v().out.println("stmt: "+s+" result: "+result); 168 if (result){ 169 s.addTag(new LoopInvariantTag("is loop invariant")); 170 s.addTag(new ColorTag(ColorTag.RED, "Loop Invariant Analysis")); 171 } 172 else { 173 } 179 } 180 181 private boolean isConstant(Stmt s){ 182 if (s instanceof DefinitionStmt){ 183 DefinitionStmt ds = (DefinitionStmt)s; 184 if (constants.contains(ds.getLeftOp())){ 185 return true; 186 } 187 } 188 return false; 189 } 190 } 191 | Popular Tags |