* @author Beyhan Veliev
* @version $Id$
*/
-#ifdef HAVE_CONFIG_H
#include "config.h"
-#endif
-#ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-#endif
+#include <stdlib.h>
#include "irouts.h"
#include "irnode_t.h"
#include "array_t.h"
#include "irprog.h"
#include "entity_t.h"
-#include "xmalloc.h"
#include "analyze_irg_args.h"
-static char v;
-static void *VISITED = &v;
-
/**
* Walk recursive the successors of a graph argument
* with mode reference and mark if it will be read,
* @param arg The graph argument with mode reference,
* that must be checked.
*/
-static unsigned analyze_arg(ir_node *arg, unsigned bits) {
+static unsigned analyze_arg(ir_node *arg, unsigned bits)
+{
int i, p;
ir_node *succ;
/* We must visit a node once to avoid endless recursion.*/
- set_irn_link(arg, VISITED);
+ mark_irn_visited(arg);
for (i = get_irn_n_outs(arg) - 1; i >= 0; --i) {
succ = get_irn_out(arg, i);
/* We was here.*/
- if (get_irn_link(succ) == VISITED)
+ if (irn_visited(succ))
continue;
/* We should not walk over the memory edge.*/
*
* @param irg The ir graph to analyze.
*/
-static void analyze_ent_args(ir_entity *ent) {
+static void analyze_ent_args(ir_entity *ent)
+{
ir_graph *irg;
ir_node *irg_args, *arg;
ir_mode *arg_mode;
*
* @param irg The ir graph to analyze.
*/
-void analyze_irg_args(ir_graph *irg) {
+void analyze_irg_args(ir_graph *irg)
+{
ir_entity *ent;
if (irg == get_const_code_irg())
*
* @param arg The parameter them weight muss be computed.
*/
-static unsigned calc_method_param_weight(ir_node *arg) {
+static unsigned calc_method_param_weight(ir_node *arg)
+{
int i, j, k;
ir_node *succ, *op;
unsigned weight = null_weight;
/* We mark the nodes to avoid endless recursion */
- set_irn_link(arg, VISITED);
+ mark_irn_visited(arg);
for (i = get_irn_n_outs(arg) - 1; i >= 0; i--) {
succ = get_irn_out(arg, i);
/* We was here.*/
- if (get_irn_link(succ) == VISITED)
+ if (irn_visited(succ))
continue;
/* We should not walk over the memory edge.*/
*
* @param ent The entity of the ir_graph.
*/
-static void analyze_method_params_weight(ir_entity *ent) {
+static void analyze_method_params_weight(ir_entity *ent)
+{
ir_type *mtp;
ir_graph *irg;
int nparams, i, proj_nr;
proj_nr = get_Proj_proj(arg);
ent->attr.mtd_attr.param_weight[proj_nr] += calc_method_param_weight(arg);
}
-
-#if 0
- printf("\n%s:\n", get_entity_name(ent));
- for (i = nparams - 1; i >= 0; --i)
- printf("The weight of argument %i is %f \n", i, ent->param_weight[i]);
-#endif
}
/*
*
* @param irg The ir graph to analyze.
*/
-void analyze_irg_args_weight(ir_graph *irg) {
- ir_entity *ent;
+void analyze_irg_args_weight(ir_graph *irg)
+{
+ ir_entity *entity = get_irg_entity(irg);
+ if (entity == NULL)
+ return;
- ent = get_irg_entity(irg);
- if (ent == NULL)
+ assert(is_method_entity(entity));
+ if (entity->attr.mtd_attr.param_weight != NULL)
return;
- if (! ent->attr.mtd_attr.param_weight)
- analyze_method_params_weight(ent);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED);
+ inc_irg_visited(irg);
+ analyze_method_params_weight(entity);
+ ir_free_resources(irg, IR_RESOURCE_IRN_VISITED);
}