1 cananian 1.1.2.6 // ForwardDataFlowBasicBlockVisitor.java, created Wed Mar 10  9:00:53 1999 by jwhaley
 2 cananian 1.1.2.9 // Copyright (C) 1998 John Whaley <jwhaley@alum.mit.edu>
 3 cananian 1.1.2.5 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 jwhaley  1.1.2.1 package harpoon.Analysis.DataFlow;
 5 jwhaley  1.1.2.1 
 6 salcianu 1.4     import harpoon.Analysis.BasicBlockInterf;
 7 salcianu 1.4     import java.util.Iterator;
 8 cananian 1.5     import net.cscott.jutil.WorkSet;
 9 pnkfelix 1.1.2.3 
10 jwhaley  1.1.2.1 /**
11 jwhaley  1.1.2.1  * ForwardDataFlowBasicBlockVisitor
12 jwhaley  1.1.2.1  *
13 cananian 1.1.2.9  * @author  John Whaley <jwhaley@alum.mit.edu>
14 cananian 1.6      * @version $Id: ForwardDataFlowBasicBlockVisitor.java,v 1.6 2004/02/08 03:19:21 cananian Exp $
15 jwhaley  1.1.2.1  */
16 jwhaley  1.1.2.1 
17 jwhaley  1.1.2.1 public abstract class ForwardDataFlowBasicBlockVisitor extends DataFlowBasicBlockVisitor {
18 pnkfelix 1.1.2.4     
19 pnkfelix 1.1.2.4     private static final boolean DEBUG = false;
20 jwhaley  1.1.2.1 
21 pnkfelix 1.1.2.8   /** Performs the <i>merge</i> operation between <code>q</code> and
22 pnkfelix 1.1.2.8       its successors, readding <code>BasicBlock</code>s to
23 pnkfelix 1.1.2.8       <code>W</code> where necessary. 
24 pnkfelix 1.1.2.8       <BR> <B>effects:</B> Runs <code>merge(q, s)</code> for all
25 pnkfelix 1.1.2.8            <code>s</code> element of Successors(<code>q</code>).  
26 pnkfelix 1.1.2.8            If the <code>merge(q, s)</code> operation returns
27 pnkfelix 1.1.2.8            <code>true</code> for a given <code>s</code>, adds
28 pnkfelix 1.1.2.8            <code>s</code> to <code>W</code>, indicating that
29 pnkfelix 1.1.2.8            <code>s</code> must be revisited by <code>this</code>.
30 cananian 1.3            @see #merge(BasicBlock, BasicBlock)
31 pnkfelix 1.1.2.2    */
32 cananian 1.5       public void addSuccessors(WorkSet W, BasicBlockInterf q) {
33 salcianu 1.4         if (DEBUG) db("adding successors of " + q + " to worklist");
34 pnkfelix 1.1.2.2 
35 cananian 1.6         for (Object qnO : q.nextSet()) {
36 cananian 1.6             BasicBlockInterf qn = (BasicBlockInterf) qnO;
37 pnkfelix 1.1.2.2 
38 salcianu 1.4             if (DEBUG) db("looking at " + q + " -> " + qn);
39 salcianu 1.4             
40 salcianu 1.4             if (merge(q, qn)) {
41 salcianu 1.4                 
42 salcianu 1.4                 if (DEBUG) db("added " + qn + " to the work queue");
43 salcianu 1.4                 
44 cananian 1.5                 W.add(qn); // in set changed -- need to revisit target node
45 salcianu 1.4             }
46 jwhaley  1.1.2.1     }
47 jwhaley  1.1.2.1   }
48 jwhaley  1.1.2.1 
49 jwhaley  1.1.2.1 }
50 cananian 1.2