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

--- Comment #5 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Robin Dapp <rd...@gcc.gnu.org>:

https://gcc.gnu.org/g:44d4a1086d965fb5280daf65c7c4a253ad6cc8a1

commit r15-7608-g44d4a1086d965fb5280daf65c7c4a253ad6cc8a1
Author: Robin Dapp <rd...@ventanamicro.com>
Date:   Thu Feb 6 14:43:17 2025 +0100

    RISC-V: Fix ratio in vsetvl fuse rule [PR115703].

    In PR115703 we fuse two vsetvls:

        Fuse curr info since prev info compatible with it:
          prev_info: VALID (insn 438, bb 2)
            Demand fields: demand_ge_sew demand_non_zero_avl
            SEW=32, VLMUL=m1, RATIO=32, MAX_SEW=64
            TAIL_POLICY=agnostic, MASK_POLICY=agnostic
            AVL=(reg:DI 0 zero)
            VL=(reg:DI 9 s1 [312])
          curr_info: VALID (insn 92, bb 20)
            Demand fields: demand_ratio_and_ge_sew demand_avl
            SEW=64, VLMUL=m1, RATIO=64, MAX_SEW=64
            TAIL_POLICY=agnostic, MASK_POLICY=agnostic
            AVL=(const_int 4 [0x4])
            VL=(nil)
          prev_info after fused: VALID (insn 438, bb 2)
            Demand fields: demand_ratio_and_ge_sew demand_avl
            SEW=64, VLMUL=mf2, RATIO=64, MAX_SEW=64
            TAIL_POLICY=agnostic, MASK_POLICY=agnostic
            AVL=(const_int 4 [0x4])
            VL=(nil).

    The result is vsetvl zero, zero, e64, mf2, ta, ma.  The previous vsetvl
    set vl = 4 but here we wrongly set it to vl = 2.  As all the following
    vsetvls only ever change the ratio we never recover.

    The issue is quite difficult to trigger because we can often
    deduce the value of d at runtime.  Then very check for the value of
    d will be optimized away.

    The last known bad commit is r15-3458-g5326306e7d9d36.  With that commit
    the output is wrong but -fno-schedule-insns makes it correct.  From the
    next commit on the issue is latent.  I still added the PR's test as scan
    and run check even if they don't trigger right now.  Not sure if the
    run test will ever fail but well.  I verified that the
    patch fixes the issue when applied on top of r15-3458-g5326306e7d9d36.

            PR target/115703

    gcc/ChangeLog:

            * config/riscv/riscv-vsetvl.cc: Use max_sew for calculating the
            new LMUL.

    gcc/testsuite/ChangeLog:

            * gcc.target/riscv/rvv/autovec/pr115703-run.c: New test.
            * gcc.target/riscv/rvv/autovec/pr115703.c: New test.

Reply via email to