Skip to content

Commit

Permalink
After creating SSA, create the SSA-web (def-use chains and use-def ch…
Browse files Browse the repository at this point in the history
…ains). The SSA_edges arent so much edges as destinations, however.
  • Loading branch information
pbiggar committed Sep 9, 2008
1 parent 4a8f289 commit 529e23d
Show file tree
Hide file tree
Showing 13 changed files with 371 additions and 56 deletions.
2 changes: 2 additions & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,8 @@ libphc_la_SOURCES= \
src/optimize/Dead_code_elimination.h \
src/optimize/Def_use.cpp \
src/optimize/Def_use.h \
src/optimize/Edge.cpp \
src/optimize/Edge.h \
src/optimize/Fix_point.cpp \
src/optimize/Fix_point.h \
src/optimize/Flow_visitor.cpp \
Expand Down
12 changes: 11 additions & 1 deletion Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ am_libphc_la_OBJECTS = getopt1.lo getopt.lo AST_annotate.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 \
Fix_point.lo Flow_visitor.lo Lattice.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 \
Expand Down Expand Up @@ -695,6 +695,8 @@ libphc_la_SOURCES = \
src/optimize/Dead_code_elimination.h \
src/optimize/Def_use.cpp \
src/optimize/Def_use.h \
src/optimize/Edge.cpp \
src/optimize/Edge.h \
src/optimize/Fix_point.cpp \
src/optimize/Fix_point.h \
src/optimize/Flow_visitor.cpp \
Expand Down Expand Up @@ -1248,6 +1250,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Desugar.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Early_lower_control_flow.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Echo_split.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Edge.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Expand_includes.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Fix_point.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Flow_visitor.Plo@am__quote@
Expand Down Expand Up @@ -1743,6 +1746,13 @@ Def_use.lo: src/optimize/Def_use.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 Def_use.lo `test -f 'src/optimize/Def_use.cpp' || echo '$(srcdir)/'`src/optimize/Def_use.cpp

Edge.lo: src/optimize/Edge.cpp
@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Edge.lo -MD -MP -MF $(DEPDIR)/Edge.Tpo -c -o Edge.lo `test -f 'src/optimize/Edge.cpp' || echo '$(srcdir)/'`src/optimize/Edge.cpp
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/Edge.Tpo $(DEPDIR)/Edge.Plo
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/optimize/Edge.cpp' object='Edge.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 Edge.lo `test -f 'src/optimize/Edge.cpp' || echo '$(srcdir)/'`src/optimize/Edge.cpp

Fix_point.lo: src/optimize/Fix_point.cpp
@am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Fix_point.lo -MD -MP -MF $(DEPDIR)/Fix_point.Tpo -c -o Fix_point.lo `test -f 'src/optimize/Fix_point.cpp' || echo '$(srcdir)/'`src/optimize/Fix_point.cpp
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/Fix_point.Tpo $(DEPDIR)/Fix_point.Plo
Expand Down
10 changes: 5 additions & 5 deletions src/optimize/Address_taken.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ Address_taken::Address_taken ()
}

// Transfer functions not required
void Address_taken::transfer_in (Basic_block* bb, list<Basic_block*>*) {}
void Address_taken::transfer_in (Basic_block*, list<Basic_block*>*) {}
void Address_taken::transfer_out (Basic_block*, list<Basic_block*>*) {}

void Address_taken::visit_branch_block (Branch_block* bb) {}
void Address_taken::visit_branch_block (Branch_block*) {}
void Address_taken::visit_entry_block (Entry_block* bb)
{
// All variables in the global scope are aliased.
Expand Down Expand Up @@ -181,17 +181,17 @@ Address_taken::visit_eval_expr (Statement_block* bb, MIR::Eval_expr* in)
}

void
Address_taken::visit_foreach_end (Statement_block* bb, MIR::Foreach_end* in)
Address_taken::visit_foreach_end (Statement_block*, MIR::Foreach_end*)
{
}

void
Address_taken::visit_foreach_next (Statement_block* bb, MIR::Foreach_next* in)
Address_taken::visit_foreach_next (Statement_block*, MIR::Foreach_next*)
{
}

void
Address_taken::visit_foreach_reset (Statement_block* bb, MIR::Foreach_reset* in)
Address_taken::visit_foreach_reset (Statement_block*, MIR::Foreach_reset*)
{
}

Expand Down
4 changes: 4 additions & 0 deletions src/optimize/CFG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

#include "CFG.h"
#include "SSA.h"
#include "Def_use.h"
#include "process_ast/DOT_unparser.h"
#include "process_ir/General.h"

Expand Down Expand Up @@ -547,8 +548,11 @@ void CFG::convert_to_ssa_form ()
i++;
}

duw = new Def_use_web (this);

SSA_renaming sr(this);
sr.rename_vars (get_entry_bb ());

}


Expand Down
3 changes: 3 additions & 0 deletions src/optimize/CFG.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ typedef List<Edge*> Edge_list;

class Dominance;
class Phi;
class Def_use_web;

// Property for BB*
enum vertex_bb_t { vertex_bb };
Expand Down Expand Up @@ -138,6 +139,8 @@ class CFG
void convert_to_ssa_form ();
void convert_out_of_ssa_form ();

Def_use_web* duw;

private:
Graph bs; // backing store

Expand Down
170 changes: 170 additions & 0 deletions src/optimize/Def_use.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@ class Def_use_visitor : public MIR::Visitor
}
};

/* There return the uses and defs to turn into SSA form. They are not useful
* for SSA webs (SSA def-use or use-edf chains).
*/
Set*
Def_use::get_defs (Statement* in)
{
Expand All @@ -111,3 +114,170 @@ Def_use::get_uses (Statement* in)
in->visit (duv);
return duv->uses;
}

/*
* Def-use chains. These are slightly different def-use chains, since they
* work on SSA form.
*/

Def_use_web::Def_use_web (CFG* cfg)
: Flow_visitor (FORWARD_FLOW)
{
visit (cfg);
}

SSA_edge_list*
Def_use_web::get_def_use_edges (MIR::VARIABLE_NAME* def)
{
// Its possible to have defs without uses.
if (def_use_chains.find (def) == def_use_chains.end ())
return new SSA_edge_list ();

return def_use_chains[def];
}

SSA_edge*
Def_use_web::get_use_def_edges (MIR::VARIABLE_NAME* use)
{
assert (use_def_chains[use]); // every use must have a def
return use_def_chains[use];
}


void
Def_use_web::add_def_use_edge (MIR::VARIABLE_NAME* var_name, SSA_edge* use)
{
if (def_use_chains[var_name] == NULL)
def_use_chains[var_name] = new SSA_edge_list (use);
else
def_use_chains[var_name]->push_back (use);
}

void
Def_use_web::visit_entry_block (Entry_block*)
{
}

void
Def_use_web::visit_empty_block (Empty_block*)
{
assert (0);
}

void
Def_use_web::visit_exit_block (Exit_block*)
{
}

void
Def_use_web::visit_branch_block (Branch_block* bb)
{
add_def_use_edge (bb->branch->variable_name, new SSA_edge (bb));
}

void
Def_use_web::visit_assign_array (Statement_block*, MIR::Assign_array* in)
{
assert (0);
}
void
Def_use_web::visit_assign_field (Statement_block*, MIR::Assign_field * in)
{
assert (0);
}


class Def_use_web_visitor : public MIR::Visitor
{
VARIABLE_NAME_list* uses;
public:
Def_use_web_visitor (VARIABLE_NAME_list* uses) : uses (uses){}

void pre_variable_name (VARIABLE_NAME* in)
{
uses->push_back (in);
}
};
void
Def_use_web::visit_assign_var (Statement_block* bb, MIR::Assign_var* in)
{
use_def_chains[in->lhs] = new SSA_edge (bb);
VARIABLE_NAME_list* uses = new VARIABLE_NAME_list;
(new Def_use_web_visitor (uses))->visit_expr (in->rhs);
foreach (VARIABLE_NAME* use, *uses)
add_def_use_edge (use, new SSA_edge (bb));
}
void
Def_use_web::visit_assign_var_var (Statement_block*, MIR::Assign_var_var* in)
{
assert (0);
}
void
Def_use_web::visit_eval_expr (Statement_block* bb, MIR::Eval_expr* in)
{
VARIABLE_NAME_list* uses = new VARIABLE_NAME_list;
(new Def_use_web_visitor (uses))->visit_expr (in->expr);
foreach (VARIABLE_NAME* use, *uses)
add_def_use_edge (use, new SSA_edge (bb));
}
void
Def_use_web::visit_foreach_end (Statement_block*, MIR::Foreach_end* in)
{
assert (0);
}
void
Def_use_web::visit_foreach_next (Statement_block*, MIR::Foreach_next* in)
{
assert (0);
}
void
Def_use_web::visit_foreach_reset (Statement_block*, MIR::Foreach_reset* in)
{
assert (0);
}
void
Def_use_web::visit_global (Statement_block*, MIR::Global* in)
{
// Is this a use or a def?
// TODO dont need this now, come back later.
}
void
Def_use_web::visit_param_is_ref (Statement_block*, MIR::Param_is_ref* in)
{
assert (0);
}
void
Def_use_web::visit_pre_op (Statement_block*, MIR::Pre_op* in)
{
assert (0);
}
void
Def_use_web::visit_push_array (Statement_block*, MIR::Push_array* in)
{
assert (0);
}
void
Def_use_web::visit_return (Statement_block*, MIR::Return* in)
{
assert (0);
}
void
Def_use_web::visit_static_declaration (Statement_block*, MIR::Static_declaration* in)
{
assert (0);
}
void
Def_use_web::visit_throw (Statement_block*, MIR::Throw* in)
{
assert (0);
}
void
Def_use_web::visit_try (Statement_block*, MIR::Try* in)
{
assert (0);
}
void
Def_use_web::visit_unset (Statement_block*, MIR::Unset* in)
{
assert (0);
}
39 changes: 39 additions & 0 deletions src/optimize/Def_use.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@

#include "MIR.h"
#include "Set.h"
#include "Flow_visitor.h"

class CFG;

// We dont want to put this into mir.tea. Its a long way from where its used.
class Def_use
Expand All @@ -12,4 +15,40 @@ class Def_use
static Set* get_uses (MIR::Statement* statement);
};

class Def_use_web : public Flow_visitor
{
public:
Def_use_web (CFG* cfg);

map<MIR::VARIABLE_NAME*, SSA_edge_list*> def_use_chains;
map<MIR::VARIABLE_NAME*, SSA_edge*> use_def_chains;

SSA_edge_list* get_def_use_edges (MIR::VARIABLE_NAME* def);
SSA_edge* get_use_def_edges (MIR::VARIABLE_NAME* use);
void add_def_use_edge (MIR::VARIABLE_NAME* use, SSA_edge* edge);

void visit_entry_block (Entry_block*);
void visit_empty_block (Empty_block*);
void visit_exit_block (Exit_block*);
void visit_branch_block (Branch_block* bb);

void visit_assign_array (Statement_block*, MIR::Assign_array*);
void visit_assign_field (Statement_block*, MIR::Assign_field *);
void visit_assign_var (Statement_block*, MIR::Assign_var*);
void visit_assign_var_var (Statement_block*, MIR::Assign_var_var*);
void visit_eval_expr (Statement_block*, MIR::Eval_expr*);
void visit_foreach_end (Statement_block*, MIR::Foreach_end*);
void visit_foreach_next (Statement_block*, MIR::Foreach_next*);
void visit_foreach_reset (Statement_block*, MIR::Foreach_reset*);
void visit_global (Statement_block*, MIR::Global* in);
void visit_param_is_ref (Statement_block*, MIR::Param_is_ref*);
void visit_pre_op (Statement_block*, MIR::Pre_op*);
void visit_push_array (Statement_block*, MIR::Push_array*);
void visit_return (Statement_block*, MIR::Return*);
void visit_static_declaration (Statement_block*, MIR::Static_declaration*);
void visit_throw (Statement_block*, MIR::Throw*);
void visit_try (Statement_block*, MIR::Try*);
void visit_unset (Statement_block*, MIR::Unset*);
};

#endif // PHC_DEF_USE
Loading

0 comments on commit 529e23d

Please sign in to comment.