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

--- 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:7b815107f403c526b7e201ca00494f06d1c20768

commit r15-6881-g7b815107f403c526b7e201ca00494f06d1c20768
Author: Robin Dapp <rdapp....@gmail.com>
Date:   Mon Jan 13 17:09:35 2025 -0700

    RISC-V: Disallow negative step for interleaving [PR117682]

    Hi,

    in PR117682 we build an interleaving pattern

      { 1, 201, 209, 25, 161, 105, 113, 185, 65, 9,
        17, 89, 225, 169, 177, 249, 129, 73, 81, 153,
        33, 233, 241, 57, 193, 137, 145, 217, 97, 41,
        49, 121 };

    with negative step expecting wraparound semantics due to -fwrapv.

    For building interleaved patterns we have an optimization that
    does e.g.
      {1, 209, ...} = { 1, 0, 209, 0, ...}
    and
      {201, 25, ...} >> 8 = { 0, 201, 0, 25, ...}
    and IORs those.

    The optimization only works if the lowpart bits are zero.  When
    overflowing e.g. with a negative step we cannot guarantee this.

    This patch makes us fall back to the generic merge handling for negative
    steps.

    I'm not 100% certain we're good even for positive steps.  If the
    step or the vector length is large enough we'd still overflow and
    have non-zero lower bits.  I haven't seen this happen during my
    testing, though and the patch doesn't make things worse, so...

    Regtested on rv64gcv_zvl512b.  Let's see what the CI says.

    Regards
     Robin

            PR target/117682

    gcc/ChangeLog:

            * config/riscv/riscv-v.cc (expand_const_vector): Fall back to
            merging if either step is negative.

    gcc/testsuite/ChangeLog:

            * gcc.target/riscv/rvv/autovec/pr117682.c: New test.
  • [Bug target/117682] [15 Regress... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to