> gcc/
>       * reload1.c (reload_regs_reach_end_p): Replace with...
>       (reload_reg_rtx_reaches_end_p): ...this function.
>       (new_spill_reg_store): Update commentary.
>       (emit_input_reload_insns): Don't clear new_spill_reg_store here.
>       (emit_output_reload_insns): Check reload_reg_rtx_reaches_end_p
>       before setting new_spill_reg_store.
>       (emit_reload_insns): Use a separate loop to clear new_spill_reg_store.
>       Use reload_reg_rtx_reaches_end_p instead of reload_regs_reach_end_p.
>       Also use reload_reg_rtx_reaches_end_p when recording inheritance
>       information for non-spill reload registers.

Just an update to say that based on our discussion I think the general
approach is OK, but I'm still trying to figure out what exactly this
piece of code is doing, and whether the changes to it make sense:

> @@ -8329,30 +8329,33 @@ emit_reload_insns (struct insn_chain *ch
>                the storing insn so that we may delete this insn with
>                delete_output_reload.  */
>             src_reg = reload_reg_rtx_for_output[r];
> -
> -           /* If this is an optional reload, try to find the source reg
> -              from an input reload.  */
> -           if (! src_reg)
> +           if (src_reg
> +               && reload_reg_rtx_reaches_end_p (src_reg, r))
> +             store_insn = new_spill_reg_store[REGNO (src_reg)];
> +           else
>               {
> +               /* If this is an optional reload, try to find the
> +                  source reg from an input reload.  */
>                 rtx set = single_set (insn);
>                 if (set && SET_DEST (set) == rld[r].out)
>                   {
>                     int k;
> +                   rtx cand;
>  
>                     src_reg = SET_SRC (set);
>                     store_insn = insn;
>                     for (k = 0; k < n_reloads; k++)
> -                     {
> -                       if (rld[k].in == src_reg)
> -                         {
> -                           src_reg = reload_reg_rtx_for_input[k];
> -                           break;
> -                         }
> -                     }
> +                     if (rld[k].in == src_reg)
> +                       {
> +                         cand = reload_reg_rtx_for_input[k];
> +                         if (reload_reg_rtx_reaches_end_p (cand, k))
> +                           {
> +                             src_reg = cand;
> +                             break;
> +                           }
> +                       }
>                   }
>               }
> -           else
> -             store_insn = new_spill_reg_store[REGNO (src_reg)];
>             if (src_reg && REG_P (src_reg)
>                 && REGNO (src_reg) < FIRST_PSEUDO_REGISTER)
>               {


Bernd

Reply via email to