From fef511b5a64d7b3730a782173135c42bfda0629b Mon Sep 17 00:00:00 2001 From: Sandra Loosemore Date: Thu, 30 Aug 2007 23:25:02 -0400 Subject: [PATCH] re PR middle-end/33211 (FAIL: gcc.target/spu/fixed-range.c scan-assembler lqd.*21) 2007-08-30 Sandra Loosemore PR middle-end/33211 gcc/ * regclass.c (initial_fixed_regs): Revert previous change and make it const again. (initial_call_used_regs): Likewise. (initial_call_really_used_regs): Delete, reverting previous addition. (initial_reg_names): Likewise. (init_reg_sets): Revert previous change. (saved_fixed_regs): New. (saved_call_used_regs): New. (saved_call_really_used_regs): New. (saved_reg_names): New. (save_register_info): New. (restore_register_info): New. (init_reg_sets_1): Replace reset of register info with call to restore_register_info. * rtl.h (save_register_info): Declare. * toplev.c (backend_init): Call save_register_info. From-SVN: r127951 --- gcc/ChangeLog | 21 +++++++++++ gcc/regclass.c | 97 +++++++++++++++++++++++++++++++++----------------- gcc/rtl.h | 1 + gcc/toplev.c | 1 + 4 files changed, 87 insertions(+), 33 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 03ee167ce30..fa6bec8dcd8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,24 @@ +2007-08-30 Sandra Loosemore + + PR middle-end/33211 + + * regclass.c (initial_fixed_regs): Revert previous change and make + it const again. + (initial_call_used_regs): Likewise. + (initial_call_really_used_regs): Delete, reverting previous addition. + (initial_reg_names): Likewise. + (init_reg_sets): Revert previous change. + (saved_fixed_regs): New. + (saved_call_used_regs): New. + (saved_call_really_used_regs): New. + (saved_reg_names): New. + (save_register_info): New. + (restore_register_info): New. + (init_reg_sets_1): Replace reset of register info with call to + restore_register_info. + * rtl.h (save_register_info): Declare. + * toplev.c (backend_init): Call save_register_info. + 2007-08-30 Laurynas Biveinis * tree-ssa-propagate.c (set_rhs): Remove the copied annotation diff --git a/gcc/regclass.c b/gcc/regclass.c index 689f91ebf75..e54196c7368 100644 --- a/gcc/regclass.c +++ b/gcc/regclass.c @@ -81,7 +81,7 @@ HARD_REG_SET fixed_reg_set; /* Data for initializing the above. */ -static char initial_fixed_regs[] = FIXED_REGISTERS; +static const char initial_fixed_regs[] = FIXED_REGISTERS; /* Indexed by hard register number, contains 1 for registers that are fixed use or are clobbered by function calls. @@ -100,7 +100,7 @@ HARD_REG_SET losing_caller_save_reg_set; /* Data for initializing the above. */ -static char initial_call_used_regs[] = CALL_USED_REGISTERS; +static const char initial_call_used_regs[] = CALL_USED_REGISTERS; /* This is much like call_used_regs, except it doesn't have to be a superset of FIXED_REGISTERS. This vector indicates @@ -108,8 +108,7 @@ static char initial_call_used_regs[] = CALL_USED_REGISTERS; regs_invalidated_by_call. */ #ifdef CALL_REALLY_USED_REGISTERS -static char initial_call_really_used_regs[] = CALL_REALLY_USED_REGISTERS; -char call_really_used_regs[FIRST_PSEUDO_REGISTER]; +char call_really_used_regs[] = CALL_REALLY_USED_REGISTERS; #endif #ifdef CALL_REALLY_USED_REGISTERS @@ -193,11 +192,7 @@ enum reg_class reg_class_superunion[N_REG_CLASSES][N_REG_CLASSES]; /* Array containing all of the register names. */ -const char * reg_names[FIRST_PSEUDO_REGISTER]; - -/* Data for initializing the above. */ - -const char * initial_reg_names[] = REGISTER_NAMES; +const char * reg_names[] = REGISTER_NAMES; /* Array containing all of the register class names. */ @@ -306,12 +301,14 @@ init_reg_sets (void) SET_HARD_REG_BIT (reg_class_contents[i], j); } - memset (global_regs, 0, sizeof global_regs); + /* Sanity check: make sure the target macros FIXED_REGISTERS and + CALL_USED_REGISTERS had the right number of initializers. */ + gcc_assert (sizeof fixed_regs == sizeof initial_fixed_regs); + gcc_assert (sizeof call_used_regs == sizeof initial_call_used_regs); - /* Processing of command-line options like -ffixed needs to know the - initial set of register names, so initialize that now. */ - gcc_assert (sizeof reg_names == sizeof initial_reg_names); - memcpy (reg_names, initial_reg_names, sizeof reg_names); + memcpy (fixed_regs, initial_fixed_regs, sizeof fixed_regs); + memcpy (call_used_regs, initial_call_used_regs, sizeof call_used_regs); + memset (global_regs, 0, sizeof global_regs); } /* Initialize may_move_cost and friends for mode M. */ @@ -403,34 +400,68 @@ init_move_cost (enum machine_mode m) } } -/* After switches have been processed, which perhaps alter - `fixed_regs' and `call_used_regs', convert them to HARD_REG_SETs. */ +/* We need to save copies of some of the register information which + can be munged by command-line switches so we can restore it during + subsequent back-end reinitialization. */ -static void -init_reg_sets_1 (void) -{ - unsigned int i, j; - unsigned int /* enum machine_mode */ m; +static char saved_fixed_regs[FIRST_PSEUDO_REGISTER]; +static char saved_call_used_regs[FIRST_PSEUDO_REGISTER]; +#ifdef CALL_REALLY_USED_REGISTERS +static char saved_call_really_used_regs[FIRST_PSEUDO_REGISTER]; +#endif +static const char *saved_reg_names[FIRST_PSEUDO_REGISTER]; + +/* Save the register information. */ +void +save_register_info (void) +{ /* Sanity check: make sure the target macros FIXED_REGISTERS and CALL_USED_REGISTERS had the right number of initializers. */ - gcc_assert (sizeof fixed_regs == sizeof initial_fixed_regs); - gcc_assert (sizeof call_used_regs == sizeof initial_call_used_regs); - - memcpy (fixed_regs, initial_fixed_regs, sizeof fixed_regs); - memcpy (call_used_regs, initial_call_used_regs, sizeof call_used_regs); + gcc_assert (sizeof fixed_regs == sizeof saved_fixed_regs); + gcc_assert (sizeof call_used_regs == sizeof saved_call_used_regs); + memcpy (saved_fixed_regs, fixed_regs, sizeof fixed_regs); + memcpy (saved_call_used_regs, call_used_regs, sizeof call_used_regs); /* Likewise for call_really_used_regs. */ #ifdef CALL_REALLY_USED_REGISTERS gcc_assert (sizeof call_really_used_regs - == sizeof initial_call_really_used_regs); - memcpy (call_really_used_regs, initial_call_really_used_regs, + == sizeof saved_call_really_used_regs); + memcpy (saved_call_really_used_regs, call_really_used_regs, sizeof call_really_used_regs); #endif /* And similarly for reg_names. */ - gcc_assert (sizeof reg_names == sizeof initial_reg_names); - memcpy (reg_names, initial_reg_names, sizeof reg_names); + gcc_assert (sizeof reg_names == sizeof saved_reg_names); + memcpy (saved_reg_names, reg_names, sizeof reg_names); +} + +/* Restore the register information. */ + +static void +restore_register_info (void) +{ + memcpy (fixed_regs, saved_fixed_regs, sizeof fixed_regs); + memcpy (call_used_regs, saved_call_used_regs, sizeof call_used_regs); + +#ifdef CALL_REALLY_USED_REGISTERS + memcpy (call_really_used_regs, saved_call_really_used_regs, + sizeof call_really_used_regs); +#endif + + memcpy (reg_names, saved_reg_names, sizeof reg_names); +} + +/* After switches have been processed, which perhaps alter + `fixed_regs' and `call_used_regs', convert them to HARD_REG_SETs. */ + +static void +init_reg_sets_1 (void) +{ + unsigned int i, j; + unsigned int /* enum machine_mode */ m; + + restore_register_info (); #ifdef REG_ALLOC_ORDER for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) @@ -846,11 +877,11 @@ fix_register (const char *name, int fixed, int call_used) } else { - initial_fixed_regs[i] = fixed; - initial_call_used_regs[i] = call_used; + fixed_regs[i] = fixed; + call_used_regs[i] = call_used; #ifdef CALL_REALLY_USED_REGISTERS if (fixed == 0) - initial_call_really_used_regs[i] = call_used; + call_really_used_regs[i] = call_used; #endif } } diff --git a/gcc/rtl.h b/gcc/rtl.h index 85996585848..5484df11a3c 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -2190,6 +2190,7 @@ extern void globalize_reg (int); extern void init_reg_modes_target (void); extern void init_regs (void); extern void init_fake_stack_mems (void); +extern void save_register_info (void); extern void init_reg_sets (void); extern void regclass (rtx, int); extern void reg_scan (rtx, unsigned int); diff --git a/gcc/toplev.c b/gcc/toplev.c index fe7918fd736..31d8c5f1ab6 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -2064,6 +2064,7 @@ backend_init (void) init_rtlanal (); init_inline_once (); init_varasm_once (); + save_register_info (); /* Initialize the target-specific back end pieces. */ backend_init_target (); -- 2.30.2