[Bug rtl-optimization/104814] [10/11/12 Regression] ifcvt: Deleting live variable in IF-CASE-2

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Mar 15 08:14:36 GMT 2022


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

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

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

commit r12-7651-ga2645cd8fb33b36d737b310e26f4c47401305c7b
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Tue Mar 15 09:12:03 2022 +0100

    ifcvt: Punt if not onlyjump_p for find_if_case_{1,2} [PR104814]

    find_if_case_{1,2} implicitly assumes conditional jumps and rewrites them,
    so if they have extra side-effects or are say asm goto, things don't work
    well, either the side-effects are lost or we could ICE.
    In particular, the testcase below on s390x has there a doloop instruction
    that decrements a register in addition to testing it for non-zero and
    conditionally jumping based on that.

    The following patch fixes that by punting for !onlyjump_p case, i.e.
    if there are side-effects in the jump instruction or it isn't a plain PC
    setter.

    Also, it assumes BB_END (test_bb) will be always non-NULL, because basic
    blocks with 2 non-abnormal successor edges should always have some
instruction
    at the end that determines which edge to take.

    2022-03-15  Jakub Jelinek  <jakub@redhat.com>

            PR rtl-optimization/104814
            * ifcvt.cc (find_if_case_1, find_if_case_2): Punt if test_bb
doesn't
            end with onlyjump_p.  Assume BB_END (test_bb) is always non-NULL.

            * gcc.c-torture/execute/pr104814.c: New test.


More information about the Gcc-bugs mailing list