Publishing


Subject: Publishing
From: Sorin Lerner (lerns@cs.washington.edu)
Date: Thu Jan 18 2001 - 21:33:21 PST


I am publishing my changes to whirlwind (the most significant stuff
is at the top, and it gets less significant/more specific going down
the list):

*) Added several analyses, which are on by default for optimizing
   compiles. Each analysis has an option to turn it on or off, and an
   option to spill its guts out to the screen when running.
      
      - constant propagation (optimizations/constant-prop.cecil):
        replaces value nodes in the DFG that are determined to produce a
        constant value.

      - unused value elimination, aka dead assignment elimination
        (optimizations/unused-value-elim.cecil): removes value nodes
        in the DFG that are not used anymore.

      - unreachable code elimination, aka dead code elimination
        (optimizations/unreachable-code-elim.cecil): removes nodes in
        the CFG that are not reachable, and replaces those nodes with
        TopDefNode in the DFG.

      - phi node elimination (optimizations/phi-elim.cecil): Removes
        phi nodes that have all of their incoming edges originating
        from the same node.

*) Added a generic binary lattice (optimizations/lattice.cecil), which
   is used for unused value elim and unreachable code elim.

*) Added an abstract object WindIRGraphSlice, to be used as the base
   for slices that are graphs (ir/graph/graph-slice.cecil). The CFG,
   DFG, CDFG and AST slices now inherit from WindIRGraphSlice.
   WindIRGraphSlice has incoming/outgoing edges, and roots. The roots
   of a graph slice are a set of nodes having the property that
   starting a traversal with this set guarantees that all nodes will
   be visited. The WindIRGraphSlice also provides a default
   implementation of replace_node_with_graph.

*) Added the remove_succ_edge and remove_pred_edge signatures. These
   methods just remove the given edge from the succ/pred list of a
   node, and do any other processing that this entails (for example
   removing a control merge node predecessor requires removing the
   corresponding dataflow merge predecessor).

*) Changed the implementation of transformations so the method
   begin_transform(@WindIR) is called on each slice before a set of
   transformations is applied, and end_transform(@WindIR) is called
   after. The default version of these methods don't do
   anything. However, the WindIRGraphSlice versions are used to do pre
   and post-processing of the graph.

*) Changed the CFG, DFG and CDFG topological numbering code so that
   incoming and outgoing edges are numbered correctly, regardless of
   whether or not they are reached by node traversal (eg: some
   incoming/outgoing edges have null nodes as both src and dst, and
   thus are not reached by node traversal)

*) CFGs now have roots again, a property inherited from
   WindIRGraphSlice. The top level CFG (ie: not a replacement CFG), as
   before, has one unique incoming edge. The dest of this incoming
   edge is the only reachable root of the CFG. All other roots are
   unreachable, but necessary as part of the root set in order to visit
   them.

*) Added a merge_node_map field to the DFG. This field stores, for
   each control merge node, the set of corresponding dataflow merge
   nodes. It is used to remove the phi node predecessors corresponding
   to a removed CFG merge node predecessor. DFG transformations
   automatically update this map.

*) Changed the CFG construction code so that the predecessor of the
   root is correctly set to the CFG incoming edge.

*) Changed the CDFG construction code so that the CDFG contains all
   the incoming/outgoing edges of the CFG and the DFG. Also changed
   the call into the analysis framework for the lower analysis to
   include information for the incoming edges of the CDFG.

*) Changed verify_graph so that it handles incoming/outgoing edges
   properly.



This archive was generated by hypermail 2b25 : Thu Jan 18 2001 - 21:33:26 PST