diff options
author | Sandra Loosemore <sandra@codesourcery.com> | 2007-08-30 23:25:02 -0400 |
---|---|---|
committer | Sandra Loosemore <sandra@gcc.gnu.org> | 2007-08-30 23:25:02 -0400 |
commit | fef511b5a64d7b3730a782173135c42bfda0629b (patch) | |
tree | 5b61bc7329222fa4cbaaab88e715220d730418e1 /gcc | |
parent | 828fa4991b46098e284197199362dac703d2d620 (diff) | |
download | gcc-fef511b5a64d7b3730a782173135c42bfda0629b.zip gcc-fef511b5a64d7b3730a782173135c42bfda0629b.tar.gz gcc-fef511b5a64d7b3730a782173135c42bfda0629b.tar.bz2 |
re PR middle-end/33211 (FAIL: gcc.target/spu/fixed-range.c scan-assembler lqd.*21)
2007-08-30 Sandra Loosemore <sandra@codesourcery.com>
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 21 | ||||
-rw-r--r-- | gcc/regclass.c | 97 | ||||
-rw-r--r-- | gcc/rtl.h | 1 | ||||
-rw-r--r-- | gcc/toplev.c | 1 |
4 files changed, 87 insertions, 33 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 03ee167..fa6bec8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,24 @@ +2007-08-30 Sandra Loosemore <sandra@codesourcery.com> + + 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 <laurynas.biveinis@gmail.com> * tree-ssa-propagate.c (set_rhs): Remove the copied annotation diff --git a/gcc/regclass.c b/gcc/regclass.c index 689f91e..e54196c 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 } } @@ -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 fe7918f..31d8c5f 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 (); |