[phc-internals] [phc commit] r1463 - in branches/dataflow: . src/optimize test/framework

codesite-noreply at google.com codesite-noreply at google.com
Wed Jul 23 16:14:47 IST 2008


Author: paul.biggar
Date: Wed Jul 23 08:13:01 2008
New Revision: 1463

Added:
   branches/dataflow/src/optimize/Backwards_flow_visitor.cpp
   branches/dataflow/src/optimize/Backwards_flow_visitor.h
Modified:
   branches/dataflow/Makefile.am
   branches/dataflow/Makefile.in
   branches/dataflow/src/optimize/Basic_block.cpp
   branches/dataflow/src/optimize/Basic_block.h
   branches/dataflow/src/optimize/CFG.cpp
   branches/dataflow/src/optimize/CFG.h
   branches/dataflow/src/optimize/Live_variable_analysis.cpp
   branches/dataflow/src/optimize/Live_variable_analysis.h
   branches/dataflow/test/framework/compile_optimized.php

Log:
Add Backwards_flow_visitor, which is intended to be the base class for 
liveness and other backwards-flow problems. It doesn't work yet, but it 
compiles, which is good enough for now.


Modified: branches/dataflow/Makefile.am
==============================================================================
--- branches/dataflow/Makefile.am	(original)
+++ branches/dataflow/Makefile.am	Wed Jul 23 08:13:01 2008
@@ -40,8 +40,6 @@
 # and we dont want this feature anyway
 src_phc_LDADD = @gc_lib@ $(LIBLTDL) libphc.la

-src_phc_DEPENDENCIES = $(LIBLTDL)
-
 bin_SCRIPTS = src/phc_compile_plugin
 libexec_SCRIPTS = libtool
 # pkgdata_DATA = phc-1.0.xsd
@@ -148,10 +146,12 @@
 	src/lib/Object.h											\
 	src/lib/String.cpp										\
 	src/lib/String.h											\
+	src/optimize/Backwards_flow_visitor.cpp			\
+	src/optimize/Backwards_flow_visitor.h				\
 	src/optimize/Basic_block.cpp							\
 	src/optimize/Basic_block.h								\
-	src/optimize/CFG.h										\
 	src/optimize/CFG.cpp										\
+	src/optimize/CFG.h										\
 	src/optimize/Copy_propagation.cpp					\
 	src/optimize/Copy_propagation.h						\
 	src/optimize/Dead_code_elimination.cpp				\

Modified: branches/dataflow/Makefile.in
==============================================================================
--- branches/dataflow/Makefile.in	(original)
+++ branches/dataflow/Makefile.in	Wed Jul 23 08:13:01 2008
@@ -98,8 +98,8 @@
 	MIR_transform.lo MIR_visitor.lo php_parser.tab.lo \
 	HIR_lower_expr.lo Lower_control_flow.lo AttrMap.lo base64.lo \
 	Boolean.lo demangle.lo error.lo Integer.lo Object.lo String.lo \
-	Basic_block.lo CFG.lo Copy_propagation.lo \
-	Dead_code_elimination.lo Fix_point.lo \
+	Backwards_flow_visitor.lo Basic_block.lo CFG.lo \
+	Copy_propagation.lo Dead_code_elimination.lo Fix_point.lo \
 	Live_variable_analysis.lo Prune_symbol_table.lo \
 	Use_def_counter.lo Parse_buffer.lo parse.lo PHP_context.lo \
 	XML_parser.lo Pass_manager.lo Plugin_pass.lo AST_unparser.lo \
@@ -304,6 +304,7 @@
 am_src_phc_OBJECTS = phc.$(OBJEXT)
 src_phc_OBJECTS = $(am_src_phc_OBJECTS)
 am__DEPENDENCIES_1 =
+src_phc_DEPENDENCIES = $(am__DEPENDENCIES_1) libphc.la
 src_phc_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
 	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
 	$(src_phc_LDFLAGS) $(LDFLAGS) -o $@
@@ -570,7 +571,6 @@
 # We leave out -dlopen" self "-dlopen" since its built-in to later automakes,
 # and we dont want this feature anyway
 src_phc_LDADD = @gc_lib@ $(LIBLTDL) libphc.la
-src_phc_DEPENDENCIES = $(LIBLTDL)
 bin_SCRIPTS = src/phc_compile_plugin
 libexec_SCRIPTS = libtool
 # pkgdata_DATA = phc-1.0.xsd
@@ -676,10 +676,12 @@
 	src/lib/Object.h											\
 	src/lib/String.cpp										\
 	src/lib/String.h											\
+	src/optimize/Backwards_flow_visitor.cpp			\
+	src/optimize/Backwards_flow_visitor.h				\
 	src/optimize/Basic_block.cpp							\
 	src/optimize/Basic_block.h								\
-	src/optimize/CFG.h										\
 	src/optimize/CFG.cpp										\
+	src/optimize/CFG.h										\
 	src/optimize/Copy_propagation.cpp					\
 	src/optimize/Copy_propagation.h						\
 	src/optimize/Dead_code_elimination.cpp				\
@@ -1197,6 +1199,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/AST_unparser.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/AST_visitor.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/AttrMap.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Backwards_flow_visitor.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Basic_block.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Boolean.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/CFG.Plo at am__quote@
@@ -1655,6 +1658,13 @@
  @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='src/lib/String.cpp' 
object='String.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 
String.lo `test -f 'src/lib/String.cpp' || echo '$(srcdir)/'`src/lib/String.cpp
+
+Backwards_flow_visitor.lo: src/optimize/Backwards_flow_visitor.cpp
+ at am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) 
$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT 
Backwards_flow_visitor.lo -MD -MP -MF 
$(DEPDIR)/Backwards_flow_visitor.Tpo -c -o Backwards_flow_visitor.lo 
`test -f 'src/optimize/Backwards_flow_visitor.cpp' || echo '$(srcdir)/'`src/optimize/Backwards_flow_visitor.cpp
+ at am__fastdepCXX_TRUE@	mv -f $(DEPDIR)/Backwards_flow_visitor.Tpo $(DEPDIR)/Backwards_flow_visitor.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	
source='src/optimize/Backwards_flow_visitor.cpp' 
object='Backwards_flow_visitor.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) 
$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o 
Backwards_flow_visitor.lo `test 
-f 'src/optimize/Backwards_flow_visitor.cpp' || echo '$(srcdir)/'`src/optimize/Backwards_flow_visitor.cpp

 Basic_block.lo: src/optimize/Basic_block.cpp
  @am__fastdepCXX_TRUE@	$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) 
$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT 
Basic_block.lo -MD -MP -MF $(DEPDIR)/Basic_block.Tpo -c -o 
Basic_block.lo `test -f 'src/optimize/Basic_block.cpp' || echo '$(srcdir)/'`src/optimize/Basic_block.cpp

Added: branches/dataflow/src/optimize/Backwards_flow_visitor.cpp
==============================================================================
--- (empty file)
+++ branches/dataflow/src/optimize/Backwards_flow_visitor.cpp	Wed Jul 
23 08:13:01 2008
@@ -0,0 +1,85 @@
+#include "Backwards_flow_visitor.h"
+#include <boost/foreach.hpp>
+#include "MIR.h"
+
+using namespace MIR;
+
+void
+Backwards_flow_visitor::run (CFG* cfg)
+{
+	// Add the exit block the worklist
+	list<Basic_block*> worklist;
+	worklist.push_back (cfg->get_exit_bb ());
+
+	// iterate until the worklist is no more
+	while (not worklist.empty ())
+	{
+		// Process the front block
+		Basic_block* bb = worklist.front ();
+		worklist.pop_front ();
+
+		// if you return true, re-add the node to the worklist.
+		if (bb->process (this))
+		{
+			BOOST_FOREACH (Basic_block* pred, *cfg->get_predecessors (bb))
+			{
+				worklist.push_front (pred);
+			}
+		}
+	}
+}
+
+void
+Backwards_flow_visitor::process_bb (Basic_block* bb)
+{
+	if (Entry_block* eb = dynamic_cast<Entry_block*> (bb))
+		process_entry (eb);
+
+	else if (Empty_block* eb = dynamic_cast<Empty_block*> (bb))
+		process_empty (eb);
+
+	else if (Exit_block* eb = dynamic_cast<Exit_block*> (bb))
+		process_exit (eb);
+
+	else if (Branch_block* brb = dynamic_cast<Branch_block*> (bb))
+		process_branch (brb);
+
+	else if (Statement_block* sb = dynamic_cast<Statement_block*> (bb))
+	{
+		switch (sb->statement->classid ())
+		{
+			case Return::ID:
+				process_return(sb, dyc<Return>(sb->statement));
+			case Static_declaration::ID:
+				process_static_declaration(sb, dyc<Static_declaration>(sb->statement));
+			case Global::ID:
+				process_global(sb, dyc<Global>(sb->statement));
+			case Try::ID:
+				process_try(sb, dyc<Try>(sb->statement));
+			case Throw::ID:
+				process_throw(sb, dyc<Throw>(sb->statement));
+			case Foreach_next::ID:
+				process_foreach_next(sb, dyc<Foreach_next>(sb->statement));
+			case Foreach_reset::ID:
+				process_foreach_reset(sb, dyc<Foreach_reset>(sb->statement));
+			case Foreach_end::ID:
+				process_foreach_end(sb, dyc<Foreach_end>(sb->statement));
+			case Assign_var::ID:
+				process_assign_var(sb, dyc<Assign_var>(sb->statement));
+			case Assign_var_var::ID:
+				process_assign_var_var(sb, dyc<Assign_var_var>(sb->statement));
+			case Assign_array::ID:
+				process_assign_array(sb, dyc<Assign_array>(sb->statement));
+			case Push_array::ID:
+				process_push_array(sb, dyc<Push_array>(sb->statement));
+			case Assign_target::ID:
+				process_assign_target(sb, dyc<Assign_target>(sb->statement));
+			case Eval_expr::ID:
+				process_eval_expr(sb, dyc<Eval_expr>(sb->statement));
+			case Pre_op::ID:
+				process_pre_op(sb, dyc<Pre_op>(sb->statement));
+			default:
+				assert (0);
+		}
+	}
+}

Added: branches/dataflow/src/optimize/Backwards_flow_visitor.h
==============================================================================
--- (empty file)
+++ branches/dataflow/src/optimize/Backwards_flow_visitor.h	Wed Jul 23 
08:13:01 2008
@@ -0,0 +1,35 @@
+#ifndef PHC_BACKWARDS_FLOW_VISITOR
+#define PHC_BACKWARDS_FLOW_VISITOR
+
+#include "CFG.h"
+#include "Basic_block.h"
+
+class Backwards_flow_visitor
+{
+public:
+	void run (CFG* cfg);
+	void process_bb (Basic_block* bb);
+public:
+	virtual void process_entry (Entry_block*) = 0;
+	virtual void process_empty (Empty_block*) = 0;
+	virtual void process_exit (Exit_block*) = 0;
+	virtual void process_branch (Branch_block*) = 0;
+	virtual void process_return (Statement_block* sb, MIR::Return*) = 0;
+	virtual void process_static_declaration (Statement_block* sb, 
MIR::Static_declaration*) = 0;
+	virtual void process_global (Statement_block* sb, MIR::Global*) = 0;
+	virtual void process_try (Statement_block* sb, MIR::Try*) = 0;
+	virtual void process_throw (Statement_block* sb, MIR::Throw*) = 0;
+	virtual void process_foreach_next (Statement_block* sb, 
MIR::Foreach_next*) = 0;
+	virtual void process_foreach_reset (Statement_block* sb, 
MIR::Foreach_reset*) = 0;
+	virtual void process_foreach_end (Statement_block* sb, 
MIR::Foreach_end*) = 0;
+	virtual void process_assign_var (Statement_block* sb, 
MIR::Assign_var*) = 0;
+	virtual void process_assign_var_var (Statement_block* sb, 
MIR::Assign_var_var*) = 0;
+	virtual void process_assign_array (Statement_block* sb, 
MIR::Assign_array*) = 0;
+	virtual void process_push_array (Statement_block* sb, 
MIR::Push_array*) = 0;
+	virtual void process_assign_target (Statement_block* sb, 
MIR::Assign_target*) = 0;
+	virtual void process_eval_expr (Statement_block* sb, MIR::Eval_expr*) 
= 0;
+	virtual void process_pre_op (Statement_block* sb, MIR::Pre_op*) = 0;
+};
+
+
+#endif // PHC_BACKWARDS_FLOW_VISITOR

Modified: branches/dataflow/src/optimize/Basic_block.cpp
==============================================================================
--- branches/dataflow/src/optimize/Basic_block.cpp	(original)
+++ branches/dataflow/src/optimize/Basic_block.cpp	Wed Jul 23 08:13:01 2008
@@ -1,4 +1,6 @@
 #include "Basic_block.h"
+#include "Backwards_flow_visitor.h"
+#include "process_ir/General.h"

 Branch_block::Branch_block (MIR::Branch* b)
 : branch (b)
@@ -51,4 +53,22 @@
 Branch_block::get_graphviz_properties ()
 {
 	return s("shape=\"rectangle\"");
+}
+
+
+bool
+Basic_block::process (Backwards_flow_visitor* analysis)
+{
+	bool changed;
+
+//	old_solution = solution;
+	analysis->process_bb (this);
+
+	// We regard it to be changed the first time its run.
+//	if (solution != old_solution || iteration_count == 0)
+//		changed = true;
+
+	iteration_count++;
+
+	return changed;
 }

Modified: branches/dataflow/src/optimize/Basic_block.h
==============================================================================
--- branches/dataflow/src/optimize/Basic_block.h	(original)
+++ branches/dataflow/src/optimize/Basic_block.h	Wed Jul 23 08:13:01 2008
@@ -1,7 +1,12 @@
+#ifndef PHC_BASIC_BLOCK
+#define PHC_BASIC_BLOCK
+
 #include <boost/graph/properties.hpp>
 #include "MIR.h"
-#include "process_ir/General.h"
+#include "CFG.h"
+

+class Backwards_flow_visitor;

 /* Basic blocks */
 class Basic_block
@@ -9,6 +14,7 @@
 public:
 	// Indicate to BGL that this represents a vertex internal property.
 	typedef boost::vertex_property_tag kind;
+	vertex_t vertex;

 	// Labels for graphviz
 	virtual String* get_graphviz_label () = 0;
@@ -16,6 +22,14 @@
 	// Override if there are extra properties for this block.
 	virtual String* get_graphviz_properties ();

+	// Process this block using the passed analysis
+	bool process (Backwards_flow_visitor*);
+
+	// Dataflow solution
+public:
+	int iteration_count;
+	
+
 };

 class Entry_block : public Basic_block
@@ -52,4 +66,4 @@
 };


-
+#endif // PHC_BASIC_BLOCK

Modified: branches/dataflow/src/optimize/CFG.cpp
==============================================================================
--- branches/dataflow/src/optimize/CFG.cpp	(original)
+++ branches/dataflow/src/optimize/CFG.cpp	Wed Jul 23 08:13:01 2008
@@ -5,11 +5,12 @@
  * Control-flow Graph
  */

-#include "CFG.h"
-#include "process_ir/General.h"
+#include "boost/foreach.hpp"
 #include "boost/graph/graphviz.hpp"
+
+#include "CFG.h"
 #include "process_ast/DOT_unparser.h"
-#include "boost/foreach.hpp"
+#include "process_ir/General.h"

 using namespace boost;
 using namespace std;
@@ -19,14 +20,18 @@
 : bs()
 {
 	bb = get(vertex_bb_t(), bs);
+
+	// Initialize the entry and exit blocks
+	entry = add_vertex (bs);
+	bb[entry] = new Entry_block;
+
+	exit = add_vertex (bs);
+	bb[exit] = new Exit_block;
 }

 void
 CFG::add_statements (List<Statement*>* statements)
 {
-	vertex_t entry = add_vertex (bs);
-	bb[entry] = new Entry_block;
-
 	// Keep track of labels, for edges between gotos and branches.
 	map <string, vertex_t> labels;

@@ -95,9 +100,6 @@
 		}
 	}
 	
-	vertex_t exit = add_vertex (bs);
-	bb[exit] = new Exit_block;
-
 	assert (use_parent);
 	add_edge (parent, exit, bs);

@@ -109,6 +111,30 @@
 	}

 }
+
+Basic_block*
+CFG::get_entry_bb ()
+{
+	return bb[entry];
+}
+
+Basic_block*
+CFG::get_exit_bb ()
+{
+	return bb[exit];
+}
+
+list<Basic_block*>*
+CFG::get_predecessors (Basic_block* bb)
+{
+	list<Basic_block*>* result = new list<Basic_block*>;
+
+	assert (0);
+	// TODO
+
+	return result;
+}
+

 // Dump to graphviz
 struct BB_property_functor

Modified: branches/dataflow/src/optimize/CFG.h
==============================================================================
--- branches/dataflow/src/optimize/CFG.h	(original)
+++ branches/dataflow/src/optimize/CFG.h	Wed Jul 23 08:13:01 2008
@@ -10,27 +10,24 @@

 #include <boost/graph/adjacency_list.hpp>
 #include <boost/graph/properties.hpp>
-#include "MIR.h"
-#include "Basic_block.h"


+class Basic_block;

 /* Add a property for Basic blocks */
 enum vertex_bb_t { vertex_bb };

-// TODO: Remove. If phc is beign used as a library, this isn't very polite,
+// TODO: Remove. If phc is being used as a library, this isn't very polite,
 // and could lead to the same problems as monkey-patching in Ruby.
 namespace boost {
   BOOST_INSTALL_PROPERTY(vertex, bb);
 }
-
 typedef boost::property<vertex_bb_t, Basic_block*> BB;

-
-/* Internal properties for Graph */
+// Graph Internal properties
 typedef boost::property<
-	boost::vertex_index_t, int, // required for write_graphwiz
-	BB	// make BB an internal property
+	boost::vertex_index_t, int,	// required for write_graphwiz
+	BB										// make Basic_block an internal property
 > Vertex_property;

 typedef boost::adjacency_list<
@@ -40,10 +37,17 @@
 	Vertex_property
 > Graph;

+
+// Vertex and Edge types
 typedef Graph::vertex_descriptor vertex_t;
 typedef Graph::edge_descriptor edge_t;


+
+class CFG;
+#include "Basic_block.h"
+#include "MIR.h"
+
  /* Boost::Graph is a nice library for graphs, but a little difficult 
to use,
  * so we don't use it directly. */
 class CFG
@@ -51,19 +55,25 @@
 public:
 	// Accessor for bb property. Access using bb[vertex].
 	boost::property_map<Graph, vertex_bb_t>::type bb;
-	static const int DEFAULT_SIZE = 50;

 public:

 	CFG ();
 	void add_statements (List<MIR::Statement*>* statements);
-	void add_block (MIR::Statement* statement);

 public:
 	void dump_graphviz ();

+public:
+	Basic_block* get_entry_bb ();
+	Basic_block* get_exit_bb ();
+	list<Basic_block*>* get_predecessors (Basic_block*);
+	list<Basic_block*>* get_successors (Basic_block*);
+
 private:
 	Graph bs; // backing store
+	vertex_t entry;
+	vertex_t exit;
 };

 #endif // PHC_CFG

Modified: branches/dataflow/src/optimize/Live_variable_analysis.cpp
==============================================================================
--- branches/dataflow/src/optimize/Live_variable_analysis.cpp	(original)
+++ branches/dataflow/src/optimize/Live_variable_analysis.cpp	Wed Jul 
23 08:13:01 2008
@@ -35,8 +35,84 @@
 		Method* method = dyc<Method> (*i);
 		CFG* cfg = new CFG ();
 		cfg->add_statements (method->statements);
-//		cfg->dump_graphviz ();
+		cfg->dump_graphviz ();
 	}
 }

+void
+Live_variable_analysis::process_entry (Entry_block*)
+{
+}
+void
+Live_variable_analysis::process_empty (Empty_block*)
+{
+}
+void
+Live_variable_analysis::process_exit (Exit_block*)
+{
+}
+void
+Live_variable_analysis::process_branch (Branch_block*)
+{
+}
+void
+Live_variable_analysis::process_return (Statement_block* sb, MIR::Return*)
+{
+}
+void
+Live_variable_analysis::process_static_declaration (Statement_block* 
sb, MIR::Static_declaration*)
+{
+}
+void
+Live_variable_analysis::process_global (Statement_block* sb, MIR::Global*)
+{
+}
+void
+Live_variable_analysis::process_try (Statement_block* sb, MIR::Try*)
+{
+}
+void
+Live_variable_analysis::process_throw (Statement_block* sb, MIR::Throw*)
+{
+}
+void
+Live_variable_analysis::process_foreach_next (Statement_block* sb, MIR::Foreach_next*)
+{
+}
+void
+Live_variable_analysis::process_foreach_reset (Statement_block* sb, MIR::Foreach_reset*)
+{
+}
+void
+Live_variable_analysis::process_foreach_end (Statement_block* sb, MIR::Foreach_end*)
+{
+}
+void
+Live_variable_analysis::process_assign_var (Statement_block* sb, MIR::Assign_var*)
+{
+}
+void
+Live_variable_analysis::process_assign_var_var (Statement_block* sb, MIR::Assign_var_var*)
+{
+}
+void
+Live_variable_analysis::process_assign_array (Statement_block* sb, MIR::Assign_array*)
+{
+}
+void
+Live_variable_analysis::process_push_array (Statement_block* sb, MIR::Push_array*)
+{
+}
+void
+Live_variable_analysis::process_assign_target (Statement_block* sb, MIR::Assign_target*)
+{
+}
+void
+Live_variable_analysis::process_eval_expr (Statement_block* sb, MIR::Eval_expr*)
+{
+}
+void
+Live_variable_analysis::process_pre_op (Statement_block* sb, MIR::Pre_op*)
+{
+}


Modified: branches/dataflow/src/optimize/Live_variable_analysis.h
==============================================================================
--- branches/dataflow/src/optimize/Live_variable_analysis.h	(original)
+++ branches/dataflow/src/optimize/Live_variable_analysis.h	Wed Jul 23 
08:13:01 2008
@@ -6,13 +6,37 @@
  */

 #include "pass_manager/Pass_manager.h"
+#include "Backwards_flow_visitor.h"

-class Live_variable_analysis : public Pass
+#ifndef LIVE_VARIABLE_ANALYSIS
+#define LIVE_VARIABLE_ANALYSIS
+
+class Live_variable_analysis : public Pass, public Backwards_flow_visitor
 {
 public:
 	Live_variable_analysis ();
 	bool pass_is_enabled (Pass_manager* pm);
 	void run (IR::PHP_script* ir_script, Pass_manager* pm);
+public:
+	void process_entry (Entry_block*);
+	void process_empty (Empty_block*);
+	void process_exit (Exit_block*);
+	void process_branch (Branch_block*);
+	void process_return (Statement_block* sb, MIR::Return*);
+	void process_static_declaration (Statement_block* sb, MIR::Static_declaration*);
+	void process_global (Statement_block* sb, MIR::Global*);
+	void process_try (Statement_block* sb, MIR::Try*);
+	void process_throw (Statement_block* sb, MIR::Throw*);
+	void process_foreach_next (Statement_block* sb, MIR::Foreach_next*);
+	void process_foreach_reset (Statement_block* sb, MIR::Foreach_reset*);
+	void process_foreach_end (Statement_block* sb, MIR::Foreach_end*);
+	void process_assign_var (Statement_block* sb, MIR::Assign_var*);
+	void process_assign_var_var (Statement_block* sb, MIR::Assign_var_var*);
+	void process_assign_array (Statement_block* sb, MIR::Assign_array*);
+	void process_push_array (Statement_block* sb, MIR::Push_array*);
+	void process_assign_target (Statement_block* sb, MIR::Assign_target*);
+	void process_eval_expr (Statement_block* sb, MIR::Eval_expr*);
+	void process_pre_op (Statement_block* sb, MIR::Pre_op*);
 };

-
+#endif // LIVE_VARIABLE_ANALYSIS

Modified: branches/dataflow/test/framework/compile_optimized.php
==============================================================================
--- branches/dataflow/test/framework/compile_optimized.php	(original)
+++ branches/dataflow/test/framework/compile_optimized.php	Wed Jul 23 
08:13:01 2008
@@ -20,13 +20,13 @@
 	function get_phc_command ($subject, $exe_name)
 	{
 		global $phc;
-		return "$phc -c -O $subject -o $exe_name";
+		return "$phc -c -O0 $subject -o $exe_name";
 	}

 	function get_php_command ($subject)
 	{
 		global $phc;
-		return "$phc -O --dump=sua $subject | ". get_php_command_line ("");
+		return "$phc -O0 --dump=sua $subject | ". get_php_command_line ("");
 	}
 }



More information about the phc-internals mailing list