https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116781

--- Comment #3 from Denis Chertykov <denisc at gcc dot gnu.org> ---
(In reply to Georg-Johann Lay from comment #2)
> Created attachment 59602 [details]
> pr116781-gjl.diff
> 
> (In reply to Denis Chertykov from comment #1)
> > Probably we have a wring definition of "*tablejump_split" 
> > 
> > The patch:
> > 
> > diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md
> > index aae8a696a63..a26309650f2 100644
> > --- a/gcc/config/avr/avr.md
> > +++ b/gcc/config/avr/avr.md
> > @@ -7653,7 +7653,7 @@
> >          (unspec:HI [(match_operand:HI 0 "register_operand" "!z,*r,z")]
> >                     UNSPEC_INDEX_JMP))
> >     (use (label_ref (match_operand 1 "" "")))
> > -   (clobber (match_dup 0))
> > +   (clobber (match_scratch:HI 2 "=X,X,0"))
> >     (clobber (const_int 0))]
> >    "!AVR_HAVE_EIJMP_EICALL"
> >    "#"
> > @@ -7759,7 +7759,7 @@
> >     (parallel [(set (pc)
> >                     (unspec:HI [(match_dup 7)] UNSPEC_INDEX_JMP))
> >                (use (label_ref (match_dup 3)))
> > -              (clobber (match_dup 7))
> > +              (clobber (scratch:HI))
> >                (clobber (match_dup 8))])]
> >    ""
> >    {
> 
> I am not sure whether that is expressing what is being clobbered (operand 0).
> 
> The casesi expander must clobber the registers for operand 7 which it is
> cooking up, so the casesi expander looks correct to me.
> 
> The tablejump insn for the 2-byte PC case would go something like:
> 
> diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md
> index 550b01b36fb..7ba43030570 100644
> --- a/gcc/config/avr/avr.md
> +++ b/gcc/config/avr/avr.md
> @@ -7713,7 +7713,7 @@ (define_insn_and_split "*tablejump_split"
>          (unspec:HI [(match_operand:HI 0 "register_operand" "!z,*r,z")]
>                     UNSPEC_INDEX_JMP))
>     (use (label_ref (match_operand 1 "" "")))
> -   (clobber (match_dup 0))
> +   (clobber (match_operand:HI 2 "register_operand" "=0,0,0"))
>     (clobber (const_int 0))]
>    "!AVR_HAVE_EIJMP_EICALL"
>    "#"
> @@ -7722,7 +7722,7 @@ (define_insn_and_split "*tablejump_split"
>                     (unspec:HI [(match_dup 0)]
>                                UNSPEC_INDEX_JMP))
>                (use (label_ref (match_dup 1)))
> -              (clobber (match_dup 0))
> +              (clobber (match_dup 2))

IMHO: here we can have a `(clobber (match_dup 0))' because reload_completed
(as you mentioned at the end of message).

>                (clobber (const_int 0))
>                (clobber (reg:CC REG_CC))])]
>    ""
> @@ -7733,7 +7733,7 @@ (define_insn "*tablejump"
>          (unspec:HI [(match_operand:HI 0 "register_operand" "!z,*r,z")]
>                     UNSPEC_INDEX_JMP))
>     (use (label_ref (match_operand 1 "" "")))
> -   (clobber (match_dup 0))
> +   (clobber (match_operand:HI 2 "register_operand" "=0,0,0"))
>     (clobber (const_int 0))
>     (clobber (reg:CC REG_CC))]
>    "!AVR_HAVE_EIJMP_EICALL && reload_completed"
> 
> The reason is that it has to clobber regs it already has; the regs are NOT
> provided by reload.
> 
> For the split pattern it should not matter whether (match_dup 0) or
> (match_dup 2) is used because they must be the same.

I'm agree with your patch.

Reply via email to