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.