[phc-internals] [phc commit] r1472 - branches/dataflow/src/optimize

codesite-noreply at google.com codesite-noreply at google.com
Thu Jul 31 18:46:22 IST 2008


Author: paul.biggar
Date: Fri Jul 25 04:40:13 2008
New Revision: 1472

Modified:
   branches/dataflow/src/optimize/Backwards_flow_visitor.cpp
   branches/dataflow/src/optimize/Basic_block.cpp
   branches/dataflow/src/optimize/Live_variable_analysis.cpp
   branches/dataflow/src/optimize/Set.cpp
   branches/dataflow/src/optimize/Set.h

Log:
The worklist was being incorrectly generated. It still is, but it works 
for simple cases.

The transfer_in function used the wrong equation. It was also never 
called if the CFG node was a statement. Fixed.

Dumping the set contents to graphviz confused head properties and tail 
properties. Fixed.










Modified: branches/dataflow/src/optimize/Backwards_flow_visitor.cpp
==============================================================================
--- branches/dataflow/src/optimize/Backwards_flow_visitor.cpp	(original)
+++ branches/dataflow/src/optimize/Backwards_flow_visitor.cpp	Fri Jul 
25 04:40:13 2008
@@ -1,5 +1,5 @@
 #include "Backwards_flow_visitor.h"
-#include <boost/foreach.hpp>
+#include <process_ir/General.h>
 #include "MIR.h"

 using namespace MIR;
@@ -7,7 +7,7 @@
 void
 Backwards_flow_visitor::run (CFG* cfg)
 {
-	BOOST_FOREACH (Basic_block* bb, *cfg->get_all_bbs ())
+	foreach (Basic_block* bb, *cfg->get_all_bbs ())
 	{
 		bb->init_df ();
 	}
@@ -23,16 +23,14 @@
 		Basic_block* bb = worklist.front ();
 		worklist.pop_front ();

+		cdebug << "process BB " << bb->vertex << endl;
 		process_bb (bb, cfg);

-		// If
+		foreach (Basic_block* pred, *cfg->get_predecessors (bb))
+			worklist.push_back (pred);
+
 		if (bb->should_reiterate ())
-		{
-			BOOST_FOREACH (Basic_block* pred, *cfg->get_predecessors (bb))
-			{
-				worklist.push_front (pred);
-			}
-		}
+			worklist.push_back (bb);
 	}
 }

@@ -60,39 +58,57 @@
 		switch (sb->statement->classid ())
 		{
 			case Assign_array::ID:
-				return process_assign_array(sb, dyc<Assign_array>(sb->statement));
+				process_assign_array(sb, dyc<Assign_array>(sb->statement));
+				break;
 			case Assign_target::ID:
-				return process_assign_target(sb, dyc<Assign_target>(sb->statement));
+				process_assign_target(sb, dyc<Assign_target>(sb->statement));
+				break;
 			case Assign_var::ID:
-				return process_assign_var(sb, dyc<Assign_var>(sb->statement));
+				process_assign_var(sb, dyc<Assign_var>(sb->statement));
+				break;
 			case Assign_var_var::ID:
-				return process_assign_var_var(sb, dyc<Assign_var_var>(sb->statement));
+				process_assign_var_var(sb, dyc<Assign_var_var>(sb->statement));
+				break;
 			case Eval_expr::ID:
-				return process_eval_expr(sb, dyc<Eval_expr>(sb->statement));
+				process_eval_expr(sb, dyc<Eval_expr>(sb->statement));
+				break;
 			case Foreach_end::ID:
-				return process_foreach_end(sb, dyc<Foreach_end>(sb->statement));
+				process_foreach_end(sb, dyc<Foreach_end>(sb->statement));
+				break;
 			case Foreach_next::ID:
-				return process_foreach_next(sb, dyc<Foreach_next>(sb->statement));
+				process_foreach_next(sb, dyc<Foreach_next>(sb->statement));
+				break;
 			case Foreach_reset::ID:
-				return process_foreach_reset(sb, dyc<Foreach_reset>(sb->statement));
+				process_foreach_reset(sb, dyc<Foreach_reset>(sb->statement));
+				break;
 			case Global::ID:
-				return process_global(sb, dyc<Global>(sb->statement));
+				process_global(sb, dyc<Global>(sb->statement));
+				break;
 			case Pre_op::ID:
-				return process_pre_op(sb, dyc<Pre_op>(sb->statement));
+				process_pre_op(sb, dyc<Pre_op>(sb->statement));
+				break;
 			case Push_array::ID:
-				return process_push_array(sb, dyc<Push_array>(sb->statement));
+				process_push_array(sb, dyc<Push_array>(sb->statement));
+				break;
 			case Return::ID:
-				return process_return(sb, dyc<Return>(sb->statement));
+				process_return(sb, dyc<Return>(sb->statement));
+				break;
 			case Static_declaration::ID:
-				return process_static_declaration(sb, dyc<Static_declaration>(sb->statement));
+				process_static_declaration(sb, dyc<Static_declaration>(sb->statement));
+				break;
 			case Throw::ID:
-				return process_throw(sb, dyc<Throw>(sb->statement));
+				process_throw(sb, dyc<Throw>(sb->statement));
+				break;
 			case Try::ID:
-				return process_try(sb, dyc<Try>(sb->statement));
+				process_try(sb, dyc<Try>(sb->statement));
+				break;
 			default:
 				assert (0);
 		}
 	}
+
+	// TODO we only need to calculate the results once. after that its all
+	// transfer functions.

 	// Calculate the IN solution from the local results
 	transfer_in (bb, cfg->get_predecessors (bb));

Modified: branches/dataflow/src/optimize/Basic_block.cpp
==============================================================================
--- branches/dataflow/src/optimize/Basic_block.cpp	(original)
+++ branches/dataflow/src/optimize/Basic_block.cpp	Fri Jul 25 04:40:13 2008
@@ -80,7 +80,7 @@
 bool
 Basic_block::should_reiterate ()
 {
-	return solution_changed;
+	return false;
 }

 void
@@ -111,8 +111,8 @@
 Basic_block::get_graphviz_head_properties ()
 {
  	list<std::pair<String*,Set*> >* result = new 
list<std::pair<String*,Set*> >;
-	if (live_out)
-		result->push_back (pair<String*, Set*> (s("OUT"), live_out));
+	if (live_in)
+		result->push_back (pair<String*, Set*> (s("IN"), live_in));
 	return result;
 }

@@ -120,7 +120,7 @@
 Basic_block::get_graphviz_tail_properties ()
 {
  	list<std::pair<String*,Set*> >* result = new 
list<std::pair<String*,Set*> >;
-	if (live_in)
-		result->push_back (pair<String*, Set*> (s("IN"), live_in));
+	if (live_out)
+		result->push_back (pair<String*, Set*> (s("OUT"), live_out));
 	return result;
 }

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	Fri Jul 
25 04:40:13 2008
@@ -46,7 +46,7 @@
 Live_variable_analysis::transfer_in (Basic_block* bb, list<Basic_block*>*)
 {
 	// IN = (OUT / DEFS) U USES
-	bb->live_in = bb->live_out->set_union (bb->defs)->set_union (bb->live_out);
+	bb->live_in = bb->live_out->set_difference (bb->defs)->set_union (bb->uses);
 }

 void
@@ -54,7 +54,7 @@
 {
 	// OUT = \/ IN (s), where s in Succs (BB).
 	bb->live_out = new Set;
-	BOOST_FOREACH (Basic_block* succ, *succs)
+	foreach (Basic_block* succ, *succs)
 	{
 		bb->live_out = bb->live_out->set_union (succ->live_in);
 	}

Modified: branches/dataflow/src/optimize/Set.cpp
==============================================================================
--- branches/dataflow/src/optimize/Set.cpp	(original)
+++ branches/dataflow/src/optimize/Set.cpp	Fri Jul 25 04:40:13 2008
@@ -2,6 +2,7 @@
 #include <iterator>
 #include "assert.h"

+#include "process_ir/General.h"
 #include "Set.h"

 Set::Set()
@@ -53,5 +54,15 @@
 Set::insert (String* string)
 {
 	bs.insert (*string);
+}
+
+void
+Set::dump(ostream& out)
+{
+	foreach (string str, bs)
+	{
+		out << str << ", ";
+	}
+	out << "\n";
 }


Modified: branches/dataflow/src/optimize/Set.h
==============================================================================
--- branches/dataflow/src/optimize/Set.h	(original)
+++ branches/dataflow/src/optimize/Set.h	Fri Jul 25 04:40:13 2008
@@ -16,7 +16,7 @@
 public:
 	// Out-of-place operations return new sets. We only consider out-of-place
 	// versions since the STL includes only out-of-place versions. In-place
-	// versions can be created in a lot of cases, however, possibly with lower
+	// versions could be created in some cases, however, possibly with lower
 	// complexity.
 	Set* set_union (Set* other);
 	Set* set_intersection (Set* other);
@@ -24,6 +24,7 @@
 	
 public:
 	void insert (String* string);
+	void dump(ostream&);
 };




More information about the phc-internals mailing list