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

SimpleLiveLocalsAnalysis.java

00001 package ca.mcgill.sable.soot.jimple;
00002 
00003 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00004  * Jimple, a 3-address code Java(TM) bytecode representation.        *
00005  * Copyright (C) 1997, 1998 Raja Vallee-Rai (kor@sable.mcgill.ca)    *
00006  * All rights reserved.                                              *
00007  *                                                                   *
00008  * This work was done as a project of the Sable Research Group,      *
00009  * School of Computer Science, McGill University, Canada             *
00010  * (http://www.sable.mcgill.ca/).  It is understood that any         *
00011  * modification not identified as such is not covered by the         *
00012  * 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 library; 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 Sable Research Group projects, please      *
00033  * visit the web site: http://www.sable.mcgill.ca/                   *
00034  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00035 
00036 /*
00037  Reference Version
00038  -----------------
00039  This is the latest official version on which this file is based.
00040  The reference version is: $SootVersion: 1.beta.4 $
00041 
00042  Change History
00043  --------------
00044  A) Notes:
00045 
00046  Please use the following template.  Most recent changes should
00047  appear at the top of the list.
00048 
00049  - Modified on [date (March 1, 1900)] by [name]. [(*) if appropriate]
00050    [description of modification].
00051 
00052  Any Modification flagged with "(*)" was done as a project of the
00053  Sable Research Group, School of Computer Science,
00054  McGill University, Canada (http://www.sable.mcgill.ca/).
00055 
00056  You should add your copyright, using the following template, at
00057  the top of this file, along with other copyrights.
00058 
00059  *                                                                   *
00060  * Modifications by [name] are                                       *
00061  * Copyright (C) [year(s)] [your name (or company)].  All rights     *
00062  * reserved.                                                         *
00063  *                                                                   *
00064 
00065  B) Changes:
00066 
00067  - Modified on March 13, 1999 by Raja Vallee-Rai (rvalleerai@sable.mcgill.ca) (*)
00068    Re-organized the timers.
00069 
00070  - Modified on February 4, 1998 by Raja Vallee-Rai (kor@sable.mcgill.ca) (*)
00071    Added getLiveLocalsAfter();
00072    
00073  - Modified on November 2, 1998 by Raja Vallee-Rai (kor@sable.mcgill.ca) (*)
00074    Repackaged all source files and performed extensive modifications.
00075    First initial release of Soot.
00076 
00077  - Modified on 23-Jul-1998 by Raja Vallee-Rai (kor@sable.mcgill.ca). (*)
00078    Renamed the uses of Hashtable to HashMap.
00079 
00080  - Modified on 15-Jun-1998 by Raja Vallee-Rai (kor@sable.mcgill.ca). (*)
00081    First internal release (Version 0.1).
00082 */
00083 
00084 import ca.mcgill.sable.soot.*;
00085 import ca.mcgill.sable.util.*;
00086 
00087 class SimpleLiveLocalsAnalysis extends BackwardFlowAnalysis
00088 {
00089     FlowSet emptySet;
00090     Map stmtToGenerateSet;
00091     Map stmtToPreserveSet;
00092 
00093     SimpleLiveLocalsAnalysis(StmtGraph g)
00094     {
00095         super(g);
00096 
00097         if(Main.isProfilingOptimization)
00098             Main.liveSetupTimer.start();
00099 
00100         // Generate list of locals and empty set
00101         {
00102             List locals = g.getBody().getLocals();
00103             FlowUniverse localUniverse = new FlowUniverse(locals.toArray());
00104 
00105             emptySet = new ArrayPackedSet(localUniverse);
00106             
00107         }
00108 
00109         // Create preserve sets.
00110         {
00111             stmtToPreserveSet = new HashMap(g.size() * 2 + 1, 0.7f);
00112 
00113             Iterator stmtIt = g.iterator();
00114 
00115             while(stmtIt.hasNext())
00116             {
00117                 Stmt s = (Stmt) stmtIt.next();
00118 
00119                 BoundedFlowSet killSet = (BoundedFlowSet) emptySet.clone();
00120 
00121                 Iterator boxIt = s.getDefBoxes().iterator();
00122 
00123                 while(boxIt.hasNext())
00124                 {
00125                     ValueBox box = (ValueBox) boxIt.next();
00126 
00127                     if(box.getValue() instanceof Local)
00128                         killSet.add(box.getValue(), killSet);
00129                 }
00130 
00131                 // Store complement
00132                     killSet.complement(killSet);
00133                     stmtToPreserveSet.put(s, killSet);
00134             }
00135         }
00136 
00137         // Create generate sets
00138         {
00139             stmtToGenerateSet = new HashMap(g.size() * 2 + 1, 0.7f);
00140 
00141             Iterator stmtIt = g.iterator();
00142 
00143             while(stmtIt.hasNext())
00144             {
00145                 Stmt s = (Stmt) stmtIt.next();
00146 
00147                 FlowSet genSet = (FlowSet) emptySet.clone();
00148 
00149                 Iterator boxIt = s.getUseBoxes().iterator();
00150 
00151                 while(boxIt.hasNext())
00152                 {
00153                     ValueBox box = (ValueBox) boxIt.next();
00154 
00155                     if(box.getValue() instanceof Local)
00156                         genSet.add(box.getValue(), genSet);
00157                 }
00158 
00159                 stmtToGenerateSet.put(s, genSet);
00160             }
00161         }
00162 
00163         if(Main.isProfilingOptimization)
00164             Main.liveSetupTimer.end();
00165 
00166         if(Main.isProfilingOptimization)
00167             Main.liveAnalysisTimer.start();
00168 
00169         doAnalysis();
00170         
00171         if(Main.isProfilingOptimization)
00172             Main.liveAnalysisTimer.end();
00173 
00174     }
00175     protected void copy(Object source, Object dest)
00176     {
00177         FlowSet sourceSet = (FlowSet) source,
00178             destSet = (FlowSet) dest;
00179             
00180         sourceSet.copy(destSet);
00181     }
00182     protected void flowThrough(Object inValue, Stmt stmt, Object outValue)
00183     {
00184         FlowSet in = (FlowSet) inValue, out = (FlowSet) outValue;
00185 
00186         // Perform kill
00187             in.intersection((FlowSet) stmtToPreserveSet.get(stmt), out);
00188 
00189         // Perform generation
00190             out.union((FlowSet) stmtToGenerateSet.get(stmt), out);
00191     }
00192     protected void merge(Object in1, Object in2, Object out)
00193     {
00194         FlowSet inSet1 = (FlowSet) in1,
00195             inSet2 = (FlowSet) in2;
00196 
00197         FlowSet outSet = (FlowSet) out;
00198 
00199         inSet1.union(inSet2, outSet);
00200     }
00201     protected Object newInitialFlow()
00202     {
00203         return emptySet.clone();
00204     }
00205 }

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