summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/regclass.c13
-rw-r--r--gcc/toplev.c2
2 files changed, 13 insertions, 2 deletions
diff --git a/gcc/regclass.c b/gcc/regclass.c
index 2c2c36ff5d3..bef30abe539 100644
--- a/gcc/regclass.c
+++ b/gcc/regclass.c
@@ -402,7 +402,18 @@ init_reg_modes ()
register int i;
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
- reg_raw_mode[i] = choose_hard_reg_mode (i, 1);
+ {
+ reg_raw_mode[i] = choose_hard_reg_mode (i, 1);
+
+ /* If we couldn't find a valid mode, fall back to `word_mode'.
+ ??? We assume `word_mode' has already been initialized.
+ ??? One situation in which we need to do this is on the mips where
+ HARD_REGNO_NREGS (fpreg, [SD]Fmode) returns 2. Ideally we'd like
+ to use DF mode for the even registers and VOIDmode for the odd
+ (for the cpu models where the odd ones are inaccessable). */
+ if (reg_raw_mode[i] == VOIDmode)
+ reg_raw_mode[i] = word_mode;
+ }
}
/* Finish initializing the register sets and
diff --git a/gcc/toplev.c b/gcc/toplev.c
index ec0baa4abdd..2a759574b7a 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -2026,9 +2026,9 @@ compile_file (name)
/* Some of these really don't need to be called when generating bytecode,
but the options would have to be parsed first to know that. -bson */
init_rtl ();
- init_regs ();
init_emit_once (debug_info_level == DINFO_LEVEL_NORMAL
|| debug_info_level == DINFO_LEVEL_VERBOSE);
+ init_regs ();
init_decl_processing ();
init_optabs ();
init_stmt ();