On Mon, 15 Jan 2018, Jakub Jelinek wrote:

> Hi!
> 
> On the testcase in the PR (too large and creduce not making sufficient
> progress) we ICE because i386.md:
> ;; Combining simple memory jump instruction
> 
> (define_peephole2
>   [(set (match_operand:W 0 "register_operand")
>         (match_operand:W 1 "memory_operand"))
>    (set (pc) (match_dup 0))]
>   "!TARGET_X32
>    && !ix86_indirect_branch_thunk_register
>    && peep2_reg_dead_p (2, operands[0])"
>   [(set (pc) (match_dup 1))])
> 
> peephole2 triggers on a CROSSING_JUMP_P jump, but nothing actually
> copies that bit over from the old to the new JUMP_INSN.
> 
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
> trunk?

Ok.

Richard.

> 2018-01-15  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR rtl-optimization/83213
>       * recog.c (peep2_attempt): Copy over CROSSING_JUMP_P from peepinsn
>       to last if both are JUMP_INSNs.
> 
> --- gcc/recog.c.jj    2018-01-09 08:58:14.594002069 +0100
> +++ gcc/recog.c       2018-01-15 16:37:13.279196178 +0100
> @@ -3446,6 +3446,8 @@ peep2_attempt (basic_block bb, rtx_insn
>    last = emit_insn_after_setloc (attempt,
>                                peep2_insn_data[i].insn,
>                                INSN_LOCATION (peepinsn));
> +  if (JUMP_P (peepinsn) && JUMP_P (last))
> +    CROSSING_JUMP_P (last) = CROSSING_JUMP_P (peepinsn);
>    before_try = PREV_INSN (insn);
>    delete_insn_chain (insn, peep2_insn_data[i].insn, false);
>  
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to