Index: gcc/reginfo.c
===================================================================
--- gcc/reginfo.c	2010-07-07 21:52:27.000000000 +0100
+++ gcc/reginfo.c	2010-07-07 22:32:27.000000000 +0100
@@ -141,8 +141,9 @@ reg_set_to_hard_reg_set (HARD_REG_SET *t
     }
 }
 
-/* Function called only once to initialize the above data on reg usage.
-   Once this is done, various switches may override.  */
+/* Function called only once per target_globals to initialize the
+   target_hard_regs structure.  Once this is done, various switches
+   may override.  */
 void
 init_reg_sets (void)
 {
@@ -185,7 +186,6 @@ init_reg_sets (void)
   memcpy (reg_alloc_order, initial_reg_alloc_order, sizeof reg_alloc_order);
 #endif
   memcpy (reg_names, initial_reg_names, sizeof reg_names);
-  memset (global_regs, 0, sizeof global_regs);
 }
 
 /* Initialize may_move_cost and friends for mode M.  */
Index: gcc/target-globals.c
===================================================================
--- gcc/target-globals.c	2010-07-07 22:30:59.000000000 +0100
+++ gcc/target-globals.c	2010-07-07 22:32:27.000000000 +0100
@@ -80,6 +80,7 @@ save_target_globals (void)
   g->gcse = XCNEW (struct target_gcse);
   g->bb_reorder = XCNEW (struct target_bb_reorder);
   restore_target_globals (g);
+  init_reg_sets ();
   target_reinit ();
   return g;
 }
