Main Page   Packages   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members  

TemporaryLocalsReduction.java

00001 package edu.ksu.cis.bandera.jjjc.optimizer;
00002 
00003 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00004  * Bandera, a Java(TM) analysis and transformation toolkit           *
00005  * Copyright (C) 1999, 2000   Robby (robby@cis.ksu.edu)              *
00006  * All rights reserved.                                              *
00007  *                                                                   *
00008  * This work was done as a project in the SAnToS Laboratory,         *
00009  * Department of Computing and Information Sciences, Kansas State    *
00010  * University, USA (http://www.cis.ksu.edu/santos).                  *
00011  * It is understood that any modification not identified as such is  *
00012  * not covered by the preceding statement.                           *
00013  *                                                                   *
00014  * This work is free software; you can redistribute it and/or        *
00015  * modify it under the terms of the GNU Library General Public       *
00016  * License as published by the Free Software Foundation; either      *
00017  * version 2 of the License, or (at your option) any later version.  *
00018  *                                                                   *
00019  * This work is distributed in the hope that it will be useful,      *
00020  * but WITHOUT ANY WARRANTY; without even the implied warranty of    *
00021  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU *
00022  * Library General Public License for more details.                  *
00023  *                                                                   *
00024  * You should have received a copy of the GNU Library General Public *
00025  * License along with this toolkit; if not, write to the             *
00026  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,      *
00027  * Boston, MA  02111-1307, USA.                                      *
00028  *                                                                   *
00029  * Java is a trademark of Sun Microsystems, Inc.                     *
00030  *                                                                   *
00031  * To submit a bug report, send a comment, or get the latest news on *
00032  * this project and other SAnToS projects, please visit the web-site *
00033  *                http://www.cis.ksu.edu/santos                      *
00034  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00035 import ca.mcgill.sable.soot.*;
00036 import ca.mcgill.sable.soot.jimple.*;
00037 import ca.mcgill.sable.util.*;
00038 import java.util.*;
00039 import edu.ksu.cis.bandera.annotation.*;
00040 import ca.mcgill.sable.util.Iterator;
00041 
00042 public class TemporaryLocalsReduction {
00043 /**
00044  * 
00045  * @return 
00046  * @param body JimpleBody
00047  * @param annotation edu.ksu.cis.bandera.annotation.Annotation
00048  */
00049 public static void reduce(JimpleBody body, Annotation annotation) {
00050     SootClass sc = body.getMethod().getDeclaringClass();
00051     StmtList stmtList = body.getStmtList();
00052     Hashtable localToDefCount = new Hashtable();
00053     Hashtable localToUseCount = new Hashtable();
00054 
00055     // Count number of definitions for each local.
00056     {
00057         for (Iterator i = stmtList.iterator(); i.hasNext();) {
00058             Stmt s = (Stmt) i.next();
00059             if (s instanceof DefinitionStmt && ((DefinitionStmt) s).getLeftOp() instanceof Local) {
00060                 Local l = (Local) ((DefinitionStmt) s).getLeftOp();
00061                 if (!localToDefCount.containsKey(l))
00062                     localToDefCount.put(l, new Integer(1));
00063                 else
00064                     localToDefCount.put(l, new Integer(((Integer) localToDefCount.get(l)).intValue() + 1));
00065             }
00066             for (Iterator j = s.getUseBoxes().iterator(); j.hasNext();) {
00067                 ValueBox vb = (ValueBox) j.next();
00068                 if (vb.getValue() instanceof Local) {
00069                     Local l = (Local) vb.getValue();
00070                     if (!localToUseCount.containsKey(l))
00071                         localToUseCount.put(l, new Integer(1));
00072                     else
00073                         localToUseCount.put(l, new Integer(((Integer) localToUseCount.get(l)).intValue() + 1));
00074                 }
00075             }
00076         }
00077     }
00078 
00079     CompleteStmtGraph graph = new CompleteStmtGraph(stmtList);
00080     Local thisLocal = null;
00081     Stmt thisIdentityStmt = null;
00082     
00083     for (Iterator i = graph.pseudoTopologicalOrderIterator(); i.hasNext();) {
00084         Stmt stmt = (Stmt) i.next();
00085         if (stmt instanceof JAssignStmt) {
00086             Value leftOp = ((JAssignStmt) stmt).getLeftOp();
00087             Value rightOp = ((JAssignStmt) stmt).getRightOp();
00088             if ((leftOp instanceof Local) && (rightOp instanceof Local)) {
00089                 Local leftLocal = (Local) leftOp;
00090                 Local rightLocal = (Local) rightOp;
00091                 if (!leftLocal.getName().startsWith("JJJCTEMP$") && rightLocal.getName().startsWith("JJJCTEMP$")
00092                         && (((Integer) localToDefCount.get(rightLocal)).intValue() == 1)) {
00093                     for (Iterator j = stmtList.iterator(); j.hasNext();) {
00094                         for (Iterator k = ((Stmt) j.next()).getUseAndDefBoxes().iterator(); k.hasNext();) {
00095                             ValueBox vb = (ValueBox) k.next();
00096                             if (vb.getValue() == rightLocal) {
00097                                 vb.setValue(leftLocal);
00098                             }
00099                         }
00100                     }
00101                 }
00102             } else if ((leftOp instanceof Local) && (rightOp instanceof InvokeExpr)) {
00103                 Local leftLocal = (Local) leftOp;
00104                 if (leftLocal.getName().startsWith("JJJCTEMP$") && (localToUseCount.get(leftLocal) == null)) {
00105                     Stmt s = Jimple.v().newInvokeStmt(rightOp);
00106                     try {
00107                         annotation.replaceStmt(stmt, s);
00108                     } catch (AnnotationException e) {}
00109                     stmtList.set(stmtList.indexOf(stmt), s);
00110                     body.redirectJumps(stmt, s);
00111                 }
00112             }
00113         } else if (stmt instanceof JIdentityStmt) {
00114             Value leftOp = ((JIdentityStmt) stmt).getLeftOp();
00115             Value rightOp = ((JIdentityStmt) stmt).getRightOp();
00116             if (rightOp instanceof ThisRef) {
00117                 if (thisLocal == null) {
00118                     thisLocal = (Local) leftOp;
00119                     thisIdentityStmt = stmt;
00120                 } else {
00121                     for (Iterator j = stmtList.iterator(); j.hasNext();) {
00122                         for (Iterator k = ((Stmt) j.next()).getUseAndDefBoxes().iterator(); k.hasNext();) {
00123                             ValueBox vb = (ValueBox) k.next();
00124                             if (vb.getValue() == leftOp) {
00125                                 vb.setValue(thisLocal);
00126                             }
00127                         }
00128                     }
00129                 }
00130             }
00131         }
00132     }
00133 
00134     for (Iterator i = stmtList.iterator(); i.hasNext();) {
00135         Stmt s = (Stmt) i.next();
00136         if ((s instanceof JIdentityStmt) && (((JIdentityStmt) s).getRightOp() instanceof ThisRef)
00137                 && (s != thisIdentityStmt))
00138             stmtList.remove(s);
00139     }
00140 }
00141 }

Generated at Thu Feb 7 06:56:42 2002 for Bandera by doxygen1.2.10 written by Dimitri van Heesch, © 1997-2001