1 pnkfelix 1.1.2.1 // BackwardDataFlowBasicBlockVisitor.java, created Wed May 26 16:33:58 1999 by pnkfelix
 2 cananian 1.1.2.5 // Copyright (C) 1999 Felix S. Klock II <pnkfelix@mit.edu>
 3 pnkfelix 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 pnkfelix 1.1.2.1 package harpoon.Analysis.DataFlow;
 5 pnkfelix 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.1 
10 pnkfelix 1.1.2.1 /**
11 pnkfelix 1.1.2.1  * <code>BackwardDataFlowBasicBlockVisitor</code>
12 pnkfelix 1.1.2.1  * 
13 cananian 1.1.2.5  * @author  Felix S. Klock II <pnkfelix@mit.edu>
14 cananian 1.6      * @version $Id: BackwardDataFlowBasicBlockVisitor.java,v 1.6 2004/02/08 03:19:21 cananian Exp $
15 pnkfelix 1.1.2.1  */
16 pnkfelix 1.1.2.2 public abstract class BackwardDataFlowBasicBlockVisitor 
17 pnkfelix 1.1.2.2     extends DataFlowBasicBlockVisitor {
18 pnkfelix 1.1.2.2 
19 pnkfelix 1.1.2.2     private static final boolean DEBUG = false;
20 pnkfelix 1.1.2.1 
21 pnkfelix 1.1.2.4     /** Performs the <i>merge</i> operation between <code>q</code> and
22 pnkfelix 1.1.2.4         its predecessors, readding <code>BasicBlock</code>s to
23 pnkfelix 1.1.2.4         <code>W</code> where necessary.
24 pnkfelix 1.1.2.4         <BR> <B>effects:</B> Runs <code>merge(q, p)</code> for all
25 pnkfelix 1.1.2.4              <code>p</code> element of Predecessors(<code>q</code>).
26 pnkfelix 1.1.2.4              If the <code>merge(q, p)</code> operation returns
27 pnkfelix 1.1.2.4              <code>true</code> for a given <code>p</code>, adds
28 pnkfelix 1.1.2.4              <code>p</code> to <code>W</code>, indicating that
29 pnkfelix 1.1.2.4              <code>p</code> must be revisited by <code>this</code>.
30 cananian 1.3            @see #merge(BasicBlock, BasicBlock)
31 pnkfelix 1.1.2.1     */
32 cananian 1.5         public void addSuccessors(WorkSet W, BasicBlockInterf q) {
33 cananian 1.6             for (Object parentO : q.prevSet()) {
34 cananian 1.6                 BasicBlockInterf parent = (BasicBlockInterf) parentO;
35 pnkfelix 1.1.2.2             if (DEBUG) 
36 pnkfelix 1.1.2.2                 System.out.println
37 pnkfelix 1.1.2.2                     ("addSucc: merging from: " + q + 
38 pnkfelix 1.1.2.2                      " to: " + parent);
39 pnkfelix 1.1.2.2             if (merge(q, parent)) {
40 cananian 1.5                     W.add(parent);
41 pnkfelix 1.1.2.1             }
42 pnkfelix 1.1.2.2             if (DEBUG) 
43 pnkfelix 1.1.2.2                 System.out.println
44 pnkfelix 1.1.2.2                     ("addSucc: worklist: " + W);
45 pnkfelix 1.1.2.1         }
46 pnkfelix 1.1.2.1     }
47 pnkfelix 1.1.2.1     
48 cananian 1.2     }