aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSandra Loosemore <sandra@codesourcery.com>2007-08-30 23:25:02 -0400
committerSandra Loosemore <sandra@gcc.gnu.org>2007-08-30 23:25:02 -0400
commitfef511b5a64d7b3730a782173135c42bfda0629b (patch)
tree5b61bc7329222fa4cbaaab88e715220d730418e1 /gcc
parent828fa4991b46098e284197199362dac703d2d620 (diff)
downloadgcc-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/ChangeLog21
-rw-r--r--gcc/regclass.c97
-rw-r--r--gcc/rtl.h1
-rw-r--r--gcc/toplev.c1
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
}
}
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 8599658..5484df1 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 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 ();