[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