> I've found it is good to have also one mode to invalidate a register for > all uses; it seems natural to use VOIDmode for that, and then we can use > BLKmode for all but the first hard register of a multi-hard-reg register.
OK, that sounds sensible. > I have attached the patch that makes the reload_cse_move2add sub-pass work > the way it think it should be; it'll take some time to test this properly, > though. Thanks for your efforts. Here's a preliminary review: +/* Record that REG is being set to a value with the mode of REG. */ + +static void +move2add_record_mode (rtx reg) [...] + for (i = nregs; --i > 0; ) + reg_mode[regno + i] = BLKmode; +/* Check if REGNO contains a valid value in MODE. */ + +static bool +move2add_valid_value_p (int regno, enum machine_mode mode) [...] + for (i = hard_regno_nregs[regno][mode] - 1; i > 0; i--) + if (reg_mode[i] != BLKmode) + return false; I think that a 'regno' is missing in the second hunk. And can you use the same idiom for the loop in both cases (same initial value and iteration)? @@ -1787,8 +1848,7 @@ move2add_use_add3_insn (rtx reg, rtx sym SET_SRC (pat) = plus_expr; for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) - if (reg_set_luid[i] > move2add_last_label_luid - && reg_mode[i] == GET_MODE (reg) + if (move2add_valid_value_p (i, GET_MODE (reg)) && reg_base_reg[i] < 0 && reg_symbol_ref[i] != NULL_RTX && rtx_equal_p (sym, reg_symbol_ref[i])) Note that you're weakening the mode equality test here. @@ -2045,7 +2099,10 @@ reload_cse_move2add (rtx first) /* Reset the information about this register. */ int regno = REGNO (XEXP (note, 0)); if (regno < FIRST_PSEUDO_REGISTER) - reg_set_luid[regno] = 0; + { + move2add_record_mode (XEXP (note, 0)); + reg_set_luid[regno] = 0; + } } } note_stores (PATTERN (insn), move2add_note_store, insn); @@ -2082,7 +2139,7 @@ reload_cse_move2add (rtx first) { if (call_used_regs[i]) /* Reset the information about this register. */ - reg_set_luid[i] = 0; + reg_mode[i] = VOIDmode; } } @@ -2262,17 +2288,17 @@ move2add_note_store (rtx dst, const_rtx [...] + invalidate: + /* Invalidate the contents of the register. */ + reg_set_luid[regno] = 0; + move2add_record_mode (dst); The intent is the same, why don't we have the same code? -- Eric Botcazou