From patchwork Wed Jul 7 21:11:56 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [17/27] Use target structures for init_set_costs Date: Wed, 07 Jul 2010 11:11:56 -0000 From: Richard Sandiford X-Patchwork-Id: 58182 Message-Id: <871vbft2sj.fsf@firetop.home> To: gcc-patches@gcc.gnu.org The next call from lang_dependent_init_target: /* Do the target-specific parts of expr initialization. */ init_expr_target (); /* Although the actions of these functions are language-independent, they use optabs, so we cannot call them from backend_init. */ ==> init_set_costs (); ira_init (); expand_dummy_function_end (); init_set_costs is actually a cfgloop routine. Richard gcc/ * Makefile.in (target-globals.o): Depend on $(CFGLOOP_H). * cfgloop.h (target_cfgloop): New structure. (default_target_cfgloop): Declare. (this_target_cfgloop): Declare as a variable or define as a macro. (target_avail_regs, target_res_regs, target_reg_cost) (target_spill_cost): Redefine as macros. * cfgloopanal.c (default_target_cfgloop): New variable. (this_target_cfgloop): New conditional variable. (target_avail_regs, target_res_regs, target_reg_cost) (target_spill_cost): Delete. * target-globals.h (this_target_cfgloop): Declare. (target_globals): Add a cfgloop field. (restore_target_globals): Copy the cfgloop field to this_target_cfgloop. * target-globals.c: Include cfgloop.h. (default_target_globals): Initialize the cfgloop field. (save_target_globals): Likewise. Index: gcc/Makefile.in =================================================================== --- gcc/Makefile.in 2010-07-07 22:07:59.000000000 +0100 +++ gcc/Makefile.in 2010-07-07 22:10:30.000000000 +0100 @@ -3479,7 +3479,7 @@ lower-subreg.o : lower-subreg.c $(CONFIG target-globals.o : target-globals.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ $(TM_H) insn-config.h $(MACHMODE_H) $(GGC_H) $(TOPLEV_H) target-globals.h \ $(FLAGS_H) $(REGS_H) $(RTL_H) reload.h expmed.h $(EXPR_H) $(OPTABS_H) \ - $(LIBFUNCS_H) + $(LIBFUNCS_H) $(CFGLOOP_H) $(out_object_file): $(out_file) $(CONFIG_H) coretypes.h $(TM_H) $(TREE_H) \ $(RTL_H) $(REGS_H) hard-reg-set.h insn-config.h conditions.h \ Index: gcc/cfgloop.h =================================================================== --- gcc/cfgloop.h 2010-07-04 22:48:29.000000000 +0100 +++ gcc/cfgloop.h 2010-07-07 22:10:30.000000000 +0100 @@ -625,11 +625,36 @@ #define FOR_EACH_LOOP_BREAK(LI) \ } /* The properties of the target. */ +struct target_cfgloop { + /* Number of available registers. */ + unsigned x_target_avail_regs; -extern unsigned target_avail_regs; -extern unsigned target_res_regs; -extern unsigned target_reg_cost [2]; -extern unsigned target_spill_cost [2]; + /* Number of registers reserved for temporary expressions. */ + unsigned x_target_res_regs; + + /* The cost for register when there still is some reserve, but we are + approaching the number of available registers. */ + unsigned x_target_reg_cost[2]; + + /* The cost for register when we need to spill. */ + unsigned x_target_spill_cost[2]; +}; + +extern struct target_cfgloop default_target_cfgloop; +#if SWITCHABLE_TARGET +extern struct target_cfgloop *this_target_cfgloop; +#else +#define this_target_cfgloop (&default_target_cfgloop) +#endif + +#define target_avail_regs \ + (this_target_cfgloop->x_target_avail_regs) +#define target_res_regs \ + (this_target_cfgloop->x_target_res_regs) +#define target_reg_cost \ + (this_target_cfgloop->x_target_reg_cost) +#define target_spill_cost \ + (this_target_cfgloop->x_target_spill_cost) /* Register pressure estimation for induction variable optimizations & loop invariant motion. */ Index: gcc/cfgloopanal.c =================================================================== --- gcc/cfgloopanal.c 2010-07-04 22:48:29.000000000 +0100 +++ gcc/cfgloopanal.c 2010-07-07 22:10:30.000000000 +0100 @@ -32,6 +32,11 @@ Software Foundation; either version 3, o #include "graphds.h" #include "params.h" +struct target_cfgloop default_target_cfgloop; +#if SWITCHABLE_TARGET +struct target_cfgloop *this_target_cfgloop = &default_target_cfgloop; +#endif + /* Checks whether BB is executed exactly once in each LOOP iteration. */ bool @@ -317,17 +322,6 @@ seq_cost (const_rtx seq, bool speed) return cost; } -/* The properties of the target. */ - -unsigned target_avail_regs; /* Number of available registers. */ -unsigned target_res_regs; /* Number of registers reserved for temporary - expressions. */ -unsigned target_reg_cost[2]; /* The cost for register when there still - is some reserve, but we are approaching - the number of available registers. */ -unsigned target_spill_cost[2]; /* The cost for register when we need - to spill. */ - /* Initialize the constants for computing set costs. */ void Index: gcc/target-globals.h =================================================================== --- gcc/target-globals.h 2010-07-07 22:07:59.000000000 +0100 +++ gcc/target-globals.h 2010-07-07 22:10:30.000000000 +0100 @@ -29,6 +29,7 @@ #define TARGET_GLOBALS_H 1 extern struct target_expmed *this_target_expmed; extern struct target_optabs *this_target_optabs; extern struct target_libfuncs *this_target_libfuncs; +extern struct target_cfgloop *this_target_cfgloop; struct GTY(()) target_globals { struct target_flag_state *GTY((skip)) flag_state; @@ -39,6 +40,7 @@ struct GTY(()) target_globals { struct target_expmed *GTY((skip)) expmed; struct target_optabs *GTY((skip)) optabs; struct target_libfuncs *libfuncs; + struct target_cfgloop *GTY((skip)) cfgloop; }; extern struct target_globals default_target_globals; @@ -56,6 +58,7 @@ restore_target_globals (struct target_gl this_target_expmed = g->expmed; this_target_optabs = g->optabs; this_target_libfuncs = g->libfuncs; + this_target_cfgloop = g->cfgloop; } #endif Index: gcc/target-globals.c =================================================================== --- gcc/target-globals.c 2010-07-07 22:07:59.000000000 +0100 +++ gcc/target-globals.c 2010-07-07 22:10:30.000000000 +0100 @@ -35,6 +35,7 @@ Software Foundation; either version 3, o #include "expr.h" #include "optabs.h" #include "libfuncs.h" +#include "cfgloop.h" #if SWITCHABLE_TARGET struct target_globals default_target_globals = { @@ -45,7 +46,8 @@ struct target_globals default_target_glo &default_target_reload, &default_target_expmed, &default_target_optabs, - &default_target_libfuncs + &default_target_libfuncs, + &default_target_cfgloop }; struct target_globals * @@ -62,6 +64,7 @@ save_target_globals (void) g->expmed = XCNEW (struct target_expmed); g->optabs = XCNEW (struct target_optabs); g->libfuncs = ggc_alloc_cleared_target_libfuncs (); + g->cfgloop = XCNEW (struct target_cfgloop); restore_target_globals (g); target_reinit (); return g;