From e7eac36391cbfe80a8d3ec227c7fb1f32efc4e09 Mon Sep 17 00:00:00 2001 From: Florian Liekweg Date: Sat, 12 Jun 2004 17:09:46 +0000 Subject: [PATCH] RTA works, outedges breaks. "Yay." --flo [r3062] --- ir/ana/rta.c | 211 +++++++++++++++++++++++++-------------------------- ir/ana/rta.h | 22 +----- 2 files changed, 107 insertions(+), 126 deletions(-) diff --git a/ir/ana/rta.c b/ir/ana/rta.c index bfc143c68..7f5d2e671 100644 --- a/ir/ana/rta.c +++ b/ir/ana/rta.c @@ -18,94 +18,39 @@ * bestimmt. */ +#ifdef HAVE_CONFIG_H +# include +#endif + #include "rta.h" -# define TRUE 1 -# define FALSE 0 +#include +#include "cgana.h" /* get_implementation */ -/* # define RTA_SET */ -# ifdef RTA_SET -typedef struct rta_set_elt -{ - struct rta_set_elt *_next; - void *_obj; -} rta_set_elt_t; +#include "irnode_t.h" +#include "irprog.h" -typedef struct rta_set -{ - rta_set_elt_t *_list; -} rta_set_t; +#include "eset.h" +/* #include "pmap.h" */ +/* #include "array.h" */ +#include "irgwalk.h" +/* #include "ircons.h" */ +/* #include "irgmod.h" */ +/* #include "irflag_t.h" */ -# define SET_T rta_set_t +/* #include "dbginfo_t.h" */ -# else /* if defined RTA_SET */ -# define SET_T eset -# define new_set eset_create -# define delete_set(SET) eset_destroy(SET) -# define set_insert(SET,ELT) eset_insert(SET,ELT) -# define set_contains(SET,ELT) eset_contains(SET,ELT) -# endif /* defined RTA_SET */ +# define TRUE 1 +# define FALSE 0 -static SET_T *_live_classes = NULL; -static SET_T *_live_fields = NULL; -static SET_T *_called_methods = NULL; +/* base data */ +static eset *_live_classes = NULL; +static eset *_live_fields = NULL; +static eset *_called_methods = NULL; /* cache computed results */ -static SET_T *_live_graphs = NULL; -static SET_T *_dead_graphs = NULL; - -# ifdef RTA_SET -/* Reinvent the wheel, err, set. */ -/* eset uses obstacks, which fucks up the graph somehow */ -static rta_set_t *new_set () -{ - rta_set_t *set = (rta_set_t*) xmalloc (sizeof (rta_set_t)); - - set->_list = NULL; - - return (set); -} - -static void delete_set (rta_set_t *set) -{ - rta_set_elt_t *elt = set->_list; - - while (NULL != elt) { - rta_set_elt_t *old = elt; - elt = elt->_next; - - old->_next = NULL; - old->_obj = NULL; - free (old); - } - - free (set); -} - -static void set_insert (rta_set_t *set, void *obj) -{ - rta_set_elt_t *elt = (rta_set_elt_t*) xmalloc (sizeof (rta_set_elt_t)); - - elt->_obj = obj; - elt->_next = set->_list; - set->_list = elt; -} - -static int set_contains (rta_set_t *set, void *obj) -{ - rta_set_elt_t *elt = set->_list; - - while (NULL != elt) { - if (elt->_obj == obj) { - return (TRUE); - } - - elt = elt->_next; - } - - return (FALSE); -} -# endif /* defined RTA_SET */ +static eset *_live_graphs = NULL; +static eset *_dead_graphs = NULL; /* now the meat */ @@ -124,7 +69,7 @@ static void rta_act (ir_node *node, void *env) } if (ent) { - set_insert (_called_methods, ent); + eset_insert (_called_methods, ent); } } else if (iro_Load == op) { ir_node *ptr = get_Load_ptr (node); @@ -134,7 +79,7 @@ static void rta_act (ir_node *node, void *env) ent = get_Sel_entity (ptr); } if (ent) { - set_insert (_live_fields, ent); + eset_insert (_live_fields, ent); } } else if (iro_Store == op) { ir_node *ptr = get_Store_ptr (node); @@ -144,31 +89,55 @@ static void rta_act (ir_node *node, void *env) ent = get_Sel_entity (ptr); } if (ent) { - set_insert (_live_fields, ent); + eset_insert (_live_fields, ent); } } else if (iro_Alloc == op) { type *type = get_Alloc_type (node); - set_insert (_live_classes, type); + eset_insert (_live_classes, type); } } static void rta_fill_graph (ir_graph* graph) { - irg_walk (get_irg_end_block (graph), rta_act, NULL, NULL); + if (NULL != graph) { + if (NULL != get_irg_end_block (graph)) { + irg_walk (get_irg_end_block (graph), rta_act, NULL, NULL); + } + } } static void rta_fill_all () { int i; + int old_ip_view = interprocedural_view; + interprocedural_view = 0; for (i = 0; i < get_irp_n_irgs(); i++) { rta_fill_graph (get_irp_irg (i)); } + interprocedural_view = old_ip_view; } static int is_call_target (entity *method) { - return (TRUE); + int is_target = FALSE; + int i; + int n_over; + + /* The method could be the target of a polymorphic call if it is + called or if it overrides a method that is called. */ + + if (eset_contains (_called_methods, method)) { + return (TRUE); + } + + n_over = get_entity_n_overwrittenby (method); + for (i = 0; !is_target && (i < n_over); i ++) { + entity *over = get_entity_overwrittenby (method, i); + is_target |= is_call_target (over); + } + + return (is_target); } @@ -219,7 +188,7 @@ static int has_graph (type *clazz, ir_graph *graph) int i; int n_sub; - if (set_contains (_live_classes, clazz)) { + if (eset_contains (_live_classes, clazz)) { int n_meth = get_class_n_members (clazz); for (i = 0; i < n_meth; i ++) { @@ -269,79 +238,102 @@ static int has_live_class (entity *method, ir_graph *graph) return (has_class); } - -void rta_init () +static int rta_check (ir_graph *graph) { - fprintf (stdout, "BEGIN %s(%i): %s\n", __FILE__, __LINE__, __FUNCTION__); + return (rta_is_alive_graph (graph)); +} - _live_classes = new_set (); - _live_fields = new_set (); - _called_methods = new_set (); - _live_graphs = new_set (); - _dead_graphs = new_set (); +void rta_init () +{ + _live_classes = eset_create (); + _live_fields = eset_create (); + _called_methods = eset_create (); - fprintf (stdout, "FILL %s(%i): %s\n", __FILE__, __LINE__, __FUNCTION__); - rta_fill_all (); - fprintf (stdout, "DONE %s(%i): %s\n", __FILE__, __LINE__, __FUNCTION__); + _live_graphs = eset_create (); + _dead_graphs = eset_create (); /* * shold be: * rta_fill_queue () */ + if (get_irp_main_irg ()) { + eset_insert (_live_graphs, get_irp_main_irg ()); + } + + rta_fill_all (); } void rta_cleanup () { + int i; + int n_live_graphs = 0; + int n_graphs = get_irp_n_irgs(); + + for (i = 0; i < n_graphs; i++) { + ir_graph *graph = get_irp_irg(i); + + if (rta_check (graph)) { + char *name = NULL; + + n_live_graphs ++; + name = get_entity_name (get_irg_ent (graph)); + + fprintf (stdout, "LIVE %s\n", name); + } + } + + fprintf (stdout, "RES %s: %i graphs, %i live\n", __FUNCTION__, n_graphs, n_live_graphs); + if (_live_classes) { - delete_set (_live_classes); + eset_destroy (_live_classes); _live_classes = NULL; } if (_live_fields) { - delete_set (_live_fields); + eset_destroy (_live_fields); _live_fields = NULL; } if (_called_methods) { - delete_set (_called_methods); + eset_destroy (_called_methods); _called_methods = NULL; } if (_live_graphs) { - delete_set (_live_graphs); + eset_destroy (_live_graphs); _live_graphs = NULL; } if (_dead_graphs) { - delete_set (_dead_graphs); + eset_destroy (_dead_graphs); _dead_graphs = NULL; } } int rta_is_alive_class (type *clazz) { - return (set_contains (_live_classes, clazz)); + return (eset_contains (_live_classes, clazz)); } int rta_is_alive_graph (ir_graph *graph) { - if (set_contains (_live_graphs, graph)) { + if (eset_contains (_live_graphs, graph)) { return (TRUE); } - if (set_contains (_dead_graphs, graph)) { + if (eset_contains (_dead_graphs, graph)) { return (FALSE); } entity *meth = get_irg_ent (graph); if (has_live_call (meth, graph) && has_live_class (meth, graph)) { - set_insert (_live_graphs, graph); + eset_insert (_live_graphs, graph); return (TRUE); } else { - set_insert (_dead_graphs, graph); + eset_insert (_dead_graphs, graph); return (FALSE); } @@ -349,13 +341,16 @@ int rta_is_alive_graph (ir_graph *graph) int rta_is_alive_field (entity *field) { - return (set_contains (_live_fields, field)); + return (eset_contains (_live_fields, field)); } /* * $Log$ + * Revision 1.3 2004/06/12 17:09:46 liekweg + * RTA works, outedges breaks. "Yay." --flo + * * Revision 1.2 2004/06/11 18:25:39 liekweg * Added todo * diff --git a/ir/ana/rta.h b/ir/ana/rta.h index 4a5319c44..eea9ebe52 100644 --- a/ir/ana/rta.h +++ b/ir/ana/rta.h @@ -3,24 +3,7 @@ #ifndef _RTA_H_ #define _RTA_H_ -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include "cgana.h" /* get_implementation */ - -#include "eset.h" -/* #include "pmap.h" */ -/* #include "array.h" */ -#include "irprog.h" -#include "irgwalk.h" -/* #include "ircons.h" */ -/* #include "irgmod.h" */ -#include "irnode_t.h" -/* #include "irflag_t.h" */ - -/* #include "dbginfo_t.h" */ +# include "entity.h" void rta_init (void); void rta_cleanup (void); @@ -33,6 +16,9 @@ int rta_is_alive_field (entity*); /* * $Log$ + * Revision 1.2 2004/06/12 17:09:46 liekweg + * RTA works, outedges breaks. "Yay." --flo + * * Revision 1.1 2004/06/11 18:24:18 liekweg * Added RTA --flo * -- 2.20.1