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

--- Comment #4 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jeff Law <l...@gcc.gnu.org>:

https://gcc.gnu.org/g:4371f656288f461335c47e98b8c038937a89764a

commit r15-3415-g4371f656288f461335c47e98b8c038937a89764a
Author: Jeff Law <j...@ventanamicro.com>
Date:   Tue Sep 3 06:45:30 2024 -0600

    [PR target/115921] Improve reassociation for rv64

    As Jovan pointed out in pr115921, we're not reassociating expressions like
this
    on rv64:

    (x & 0x3e) << 12

    It generates something like this:

            li      a5,258048
            slli    a0,a0,12
            and     a0,a0,a5

    We have a pattern that's designed to clean this up.  Essentially
reassociating
    the operations so that we don't need to load the constant resulting in
    something like this:

            andi    a0,a0,63
            slli    a0,a0,12

    That pattern wasn't working for certain constants due to its condition. The
    condition is trying to avoid cases where this kind of reassociation would
    hinder shadd generation on rv64.  That condition was just written poorly.

    This patch tightens up that condition in a few ways.  First, there's no
need to
    worry about shadd cases if ZBA is not enabled.  Second we can't use shadd
if
    the shift value isn't 1, 2 or 3.  Finally rather than open-coding one of
the
    tests, we can use an existing operand predicate.

    The net is we'll start performing this transformation in more cases on rv64
    while still avoiding reassociation if it would spoil shadd generation.

            PR target/115921
    gcc/
            * config/riscv/riscv.md (reassociate bitwise ops): Tighten test for
            cases we do not want reassociate.

    gcc/testsuite/
            * gcc.target/riscv/pr115921.c: New test.

Reply via email to