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