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

--- Comment #7 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Hans-Peter Nilsson <h...@gcc.gnu.org>:

https://gcc.gnu.org/g:0e6c51de8ec47bf5f0dfaabfd1898c722d0485b4

commit r11-2814-g0e6c51de8ec47bf5f0dfaabfd1898c722d0485b4
Author: Hans-Peter Nilsson <h...@axis.com>
Date:   Mon Aug 24 03:15:21 2020 +0200

    reorg.c (fill_slots_from_thread): Improve for TARGET_FLAGS_REGNUM

    This handles TARGET_FLAGS_REGNUM clobbering insns as delay-slot
    fillers using a method similar to that in commit 33c2207d3fda,
    where care was taken for fill_simple_delay_slots to allow such
    insns when scanning for delay-slot fillers *backwards* (before
    the insn).

    A TARGET_FLAGS_REGNUM target is typically a former cc0 target.
    For cc0 targets, insns don't mention clobbering cc0, so the
    clobbers are mentioned in the "resources" only as a special
    entity and only for compare-insns and branches, where the cc0
    value matters.

    In contrast, with TARGET_FLAGS_REGNUM, most insns clobber it and
    the register liveness detection in reorg.c / resource.c treats
    that as a blocker (for other insns mentioning it, i.e. most)
    when looking for delay-slot-filling candidates.  This means that
    when comparing core and performance for a delay-slot cc0 target
    before and after the de-cc0 conversion, the inability to fill a
    delay slot after conversion manifests as a regression.  This was
    one such case, for CRIS, with random_bitstring in
    gcc.c-torture/execute/arith-rand-ll.c as well as the target
    libgcc division function.

    After this, all known performance regressions compared to cc0
    are fixed.

    gcc:
            PR target/93372
            * reorg.c (fill_slots_from_thread): Allow trial insns that clobber
            TARGET_FLAGS_REGNUM as delay-slot fillers.

    gcc/testsuite:
            PR target/93372
            * gcc.target/cris/pr93372-47.c: New test.

Reply via email to