diff options
-rw-r--r-- | gcc/regclass.c | 13 | ||||
-rw-r--r-- | gcc/toplev.c | 2 |
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 (); |