On Wed, Apr 28, 2021 at 12:04:45PM +0100, Richard Earnshaw wrote:
> init_regs_for_mode iterates over all hard regs for the machine to test if
> the reg is OK for the mode, but an arithmetic overflow can lead to testing
> elements beyond the end of the arrays allocated for fixed and global
> registers.  Clearly, if a mode requiring multiple hard regs needs one beyond
> the hard reg set, it can't be valid for that mode.
> 
> gcc:
>       PR rtl-optimization/100311
>       * sel-sched.c (init_regs_for_mode): Skip iteration if multiple hard
>       regs are needed and they extend beyond the hard reg set.
> 
> OK for master?  What about back-ports?

Shouldn't targetm.hard_regno_mode_ok (cur_reg, mode) be false for such regs?
At least, code where something calls hard_regno_nregs after checking
targetm.hard_regno_mode_ok and then handling the regs is quite common.

Anyway, it is ok for backports if somebody approves it for trunk.

> diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c
> index 3e0265daf28..5e68fd5fda5 100644
> --- a/gcc/sel-sched.c
> +++ b/gcc/sel-sched.c
> @@ -1076,6 +1076,9 @@ init_regs_for_mode (machine_mode mode)
>  
>        nregs = hard_regno_nregs (cur_reg, mode);
>  
> +      if (cur_reg + nregs - 1 >= FIRST_PSEUDO_REGISTER)
> +     continue;
> +
>        for (i = nregs - 1; i >= 0; --i)
>          if (fixed_regs[cur_reg + i]
>                  || global_regs[cur_reg + i]


        Jakub

Reply via email to