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

--- Comment #5 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:c23c899aedf11069e992eed7358802b262d62f98

commit r10-7607-gc23c899aedf11069e992eed7358802b262d62f98
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Tue Apr 7 21:30:12 2020 +0200

    combine: Fix split_i2i3 ICE [PR94291]

    The following testcase ICEs on armv7hl-linux-gnueabi.
    try_combine is called on:
    (gdb) p debug_rtx (i3)
    (insn 20 12 22 2 (set (mem/c:SI (plus:SI (reg/f:SI 102 sfp)
                    (const_int -4 [0xfffffffffffffffc])) [1 x+0 S4 A32])
            (reg:SI 125)) "pr94291.c":7:8 241 {*arm_movsi_insn}
         (expr_list:REG_DEAD (reg:SI 125)
            (nil)))
    (gdb) p debug_rtx (i2)
    (insn 12 7 20 2 (parallel [
                (set (reg:CC 100 cc)
                    (compare:CC (reg:SI 121 [ <retval> ])
                        (const_int 0 [0])))
                (set (reg:SI 125)
                    (reg:SI 121 [ <retval> ]))
            ]) "pr94291.c":7:8 248 {*movsi_compare0}
         (expr_list:REG_UNUSED (reg:CC 100 cc)
            (nil)))
    and tries to recognize cc = r121 cmp 0; [sfp-4] = r121 parallel,
    but that isn't recognized, so it splits it into two: split_i2i3
    [sfp-4] = r121 followed by cc = r121 cmp 0 which is recognized, but
    ICEs because the code below insist that the SET_DEST of newi2pat
    (or first set in PARALLEL thereof) must be a REG or SUBREG of REG,
    but it is a MEM in this case.  I don't see any condition that would
    guarantee that, perhaps for the swap_i2i3 case it was somehow guaranteed.

    As the code just wants to update LOG_LINKS and LOG_LINKS are only for
    registers, not for MEM or anything else, the patch just doesn't update
those
    if it isn't a REG or SUBREG of REG.

    2020-04-07  Jakub Jelinek  <ja...@redhat.com>

            PR rtl-optimization/94291
            PR rtl-optimization/84169
            * combine.c (try_combine): For split_i2i3, don't assume SET_DEST
            must be a REG or SUBREG of REG; if it is not one of these, don't
            update LOG_LINKs.

            * gcc.dg/pr94291.c: New test.

Reply via email to