Skip to content

Commit

Permalink
Abstract the actual visiting into CFG_visitor. The various users of C…
Browse files Browse the repository at this point in the history
…FG_visitor decide when it is visited. visit_once just does a single pass. SCCP and Flow_visitor use their standard algorithms.

Fix replacing a BB with a list of BBs. The old algorithm added a node from the predecessor and successor to each node in the chain, instead of to just the front and back, respectively.
  • Loading branch information
pbiggar committed Sep 10, 2008
1 parent 1fbaaf2 commit 8e40ffe
Show file tree
Hide file tree
Showing 15 changed files with 1,275 additions and 700 deletions.
4 changes: 4 additions & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,8 @@ libphc_la_SOURCES= \
src/optimize/Basic_block.h \
src/optimize/CFG.cpp \
src/optimize/CFG.h \
src/optimize/CFG_visitor.cpp \
src/optimize/CFG_visitor.h \
src/optimize/Copy_propagation.cpp \
src/optimize/Copy_propagation.h \
src/optimize/Dead_code_elimination.cpp \
Expand Down Expand Up @@ -180,6 +182,8 @@ libphc_la_SOURCES= \
src/optimize/SSA.h \
src/optimize/Use_def_counter.cpp \
src/optimize/Use_def_counter.h \
src/optimize/Visit_once.cpp \
src/optimize/Visit_once.h \
src/parsing/Parse_buffer.cpp \
src/parsing/Parse_buffer.h \
src/parsing/parse.cpp \
Expand Down
35 changes: 28 additions & 7 deletions Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -99,13 +99,14 @@ am_libphc_la_OBJECTS = getopt1.lo getopt.lo AST_annotate.lo \
Lower_dynamic_definitions.lo Lower_method_invocations.lo \
AttrMap.lo base64.lo Boolean.lo demangle.lo error.lo \
Integer.lo Object.lo String.lo Address_taken.lo Basic_block.lo \
CFG.lo Copy_propagation.lo Dead_code_elimination.lo Def_use.lo \
Edge.lo Fix_point.lo Flow_visitor.lo Lattice.lo \
Live_variable_analysis.lo Prune_symbol_table.lo SCCP.lo Set.lo \
SSA.lo Use_def_counter.lo Parse_buffer.lo parse.lo \
PHP_context.lo XML_parser.lo Optimization_pass.lo \
Pass_manager.lo Plugin_pass.lo AST_unparser.lo \
Constant_folding.lo DOT_unparser.lo Invalid_check.lo \
CFG.lo CFG_visitor.lo Copy_propagation.lo \
Dead_code_elimination.lo Def_use.lo Edge.lo Fix_point.lo \
Flow_visitor.lo Lattice.lo Live_variable_analysis.lo \
Prune_symbol_table.lo SCCP.lo Set.lo SSA.lo Use_def_counter.lo \
Visit_once.lo Parse_buffer.lo parse.lo PHP_context.lo \
XML_parser.lo Optimization_pass.lo Pass_manager.lo \
Plugin_pass.lo AST_unparser.lo Constant_folding.lo \
DOT_unparser.lo Invalid_check.lo \
Note_top_level_declarations.lo Process_includes.lo \
Remove_concat_null.lo Remove_parser_temporaries.lo \
Strip_unparser_attributes.lo Token_conversion.lo \
Expand Down Expand Up @@ -689,6 +690,8 @@ libphc_la_SOURCES = \
src/optimize/Basic_block.h \
src/optimize/CFG.cpp \
src/optimize/CFG.h \
src/optimize/CFG_visitor.cpp \
src/optimize/CFG_visitor.h \
src/optimize/Copy_propagation.cpp \
src/optimize/Copy_propagation.h \
src/optimize/Dead_code_elimination.cpp \
Expand Down Expand Up @@ -717,6 +720,8 @@ libphc_la_SOURCES = \
src/optimize/SSA.h \
src/optimize/Use_def_counter.cpp \
src/optimize/Use_def_counter.h \
src/optimize/Visit_once.cpp \
src/optimize/Visit_once.h \
src/parsing/Parse_buffer.cpp \
src/parsing/Parse_buffer.h \
src/parsing/parse.cpp \
Expand Down Expand Up @@ -1239,6 +1244,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Basic_block.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Boolean.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CFG.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CFG_visitor.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Clarify.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Comment_ifs.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Compile_C.Plo@am__quote@
Expand Down Expand Up @@ -1306,6 +1312,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Strip_unparser_attributes.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Token_conversion.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Use_def_counter.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Visit_once.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XML_parser.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XML_unparser.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add_comment.Plo@am__quote@
Expand Down Expand Up @@ -1725,6 +1732,13 @@ CFG.lo: src/optimize/CFG.cpp
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CFG.lo `test -f 'src/optimize/CFG.cpp' || echo '$(srcdir)/'`src/optimize/CFG.cpp

CFG_visitor.lo: src/optimize/CFG_visitor.cpp
@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT CFG_visitor.lo -MD -MP -MF $(DEPDIR)/CFG_visitor.Tpo -c -o CFG_visitor.lo `test -f 'src/optimize/CFG_visitor.cpp' || echo '$(srcdir)/'`src/optimize/CFG_visitor.cpp
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/CFG_visitor.Tpo $(DEPDIR)/CFG_visitor.Plo
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/optimize/CFG_visitor.cpp' object='CFG_visitor.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CFG_visitor.lo `test -f 'src/optimize/CFG_visitor.cpp' || echo '$(srcdir)/'`src/optimize/CFG_visitor.cpp

Copy_propagation.lo: src/optimize/Copy_propagation.cpp
@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Copy_propagation.lo -MD -MP -MF $(DEPDIR)/Copy_propagation.Tpo -c -o Copy_propagation.lo `test -f 'src/optimize/Copy_propagation.cpp' || echo '$(srcdir)/'`src/optimize/Copy_propagation.cpp
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/Copy_propagation.Tpo $(DEPDIR)/Copy_propagation.Plo
Expand Down Expand Up @@ -1816,6 +1830,13 @@ Use_def_counter.lo: src/optimize/Use_def_counter.cpp
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Use_def_counter.lo `test -f 'src/optimize/Use_def_counter.cpp' || echo '$(srcdir)/'`src/optimize/Use_def_counter.cpp

Visit_once.lo: src/optimize/Visit_once.cpp
@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Visit_once.lo -MD -MP -MF $(DEPDIR)/Visit_once.Tpo -c -o Visit_once.lo `test -f 'src/optimize/Visit_once.cpp' || echo '$(srcdir)/'`src/optimize/Visit_once.cpp
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/Visit_once.Tpo $(DEPDIR)/Visit_once.Plo
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/optimize/Visit_once.cpp' object='Visit_once.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Visit_once.lo `test -f 'src/optimize/Visit_once.cpp' || echo '$(srcdir)/'`src/optimize/Visit_once.cpp

Parse_buffer.lo: src/parsing/Parse_buffer.cpp
@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Parse_buffer.lo -MD -MP -MF $(DEPDIR)/Parse_buffer.Tpo -c -o Parse_buffer.lo `test -f 'src/parsing/Parse_buffer.cpp' || echo '$(srcdir)/'`src/parsing/Parse_buffer.cpp
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/Parse_buffer.Tpo $(DEPDIR)/Parse_buffer.Plo
Expand Down
9 changes: 9 additions & 0 deletions src/optimize/Basic_block.h
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,15 @@ class Branch_block : public Basic_block
// Assert a block has a two successors, representing true and false
// branches, and return the false branch.
Basic_block* get_false_successor ();


void replace (BB_list* replacements)
{
// TODO
assert (0);
}


};

class Statement_block : public Basic_block
Expand Down
48 changes: 32 additions & 16 deletions src/optimize/CFG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -692,16 +692,16 @@ CFG::add_bb_between (Basic_block* source, Basic_block* target, Basic_block* new_
void
CFG::replace_bb (Basic_block* bb, BB_list* replacements)
{
// If the edge has a T/F label, it is because the predecessor is a Branch.
// Just copy the label from the new predecessor.

if (replacements->size() == 1
&& replacements->front() == bb)
{
// Same BB: do nothing
}
else if (replacements->size() == 0)
{
// If the edge has a T/F label, it is because the predecessor is a
// Branch. Just copy the label from the new predecessor.

// Remove the BB
foreach (Basic_block* pred, *bb->get_predecessors ())
foreach (Basic_block* succ, *bb->get_successors ())
Expand All @@ -714,25 +714,41 @@ CFG::replace_bb (Basic_block* bb, BB_list* replacements)
}
else
{
// TODO This should create a chain, and add an edge to the front and
// back. I suspect this doesnt work.
// Branch blocks need a special interface (unless the last one is a
// branch block, in which case we can allow it).
assert (dynamic_cast<Branch_block*> (bb) == NULL);

// Our current problem is that two nodes are returned. Thats not right.
assert (0);

// First gets all incoming edges added
Basic_block* front = replacements->front ();
replacements->pop_front ();

add_bb (front);
foreach (Basic_block* pred, *front->get_predecessors ())
{
edge_t e = add_edge (pred, front);
ee[e]->direction = get_edge (pred, bb)->direction;
}

// Add edge along the chain
Basic_block* prev = front;
foreach (Basic_block* new_bb, *replacements)
{
add_bb (new_bb);
add_edge (prev, new_bb);
prev = new_bb;
}

// Add edges from predecessors
foreach (Basic_block* pred, *bb->get_predecessors ())
{
add_edge (pred, new_bb);
}

// Add edges from successors
foreach (Basic_block* succ, *bb->get_successors ())
{
add_edge (new_bb, succ);
}
// Add edges to successor nodes to the last node
foreach (Basic_block* succ, *prev->get_successors ())
{
add_edge (prev, succ);
}

// Remove the old block last, so that the edges dont vanish before we
// use them.
remove_bb (bb);
}
}
Expand Down
Loading

0 comments on commit 8e40ffe

Please sign in to comment.