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

--- Comment #6 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jeff Law <[email protected]>:

https://gcc.gnu.org/g:090baea02d768ff884d1b326d6bf7d57cfcc1231

commit r17-3273-g090baea02d768ff884d1b326d6bf7d57cfcc1231
Author: Jeff Law <[email protected]>
Date:   Thu Aug 13 18:34:48 2026 -0600

    [PR rtl-optimization/126426] Handle vector mode uses conservatively in
ext-dce

    So ext-dce isn't terribly vector aware, it mostly tries to stay out of the
way
    and stay conservatively correct when vector modes are encountered.

    When that code was added in 2023/2024 it goofed a very important case that
has
    now reared its ugly head.

    Consider a use of V2HI.  What bits are live as a result of such a use? 
Right
    now we record 0xffff as the bits potentially live.  But that's badly wrong.
 We
    have 2 HI objects, so there's actually 32 bits of live data, so 0xffffffff.

    With the bits live being incorrect we can incorrectly remove an extension
    because we think the bits are never read.  That's precisely what happens in
    this PR.

    Not much motivation was given for using GET_MODE_INNER rather than GET_MODE
    other than it works better for vector/complex.  I should have caught this
when
    it was introduced.

    For a destination, GET_MODE_INNER is safe.  The worst case is we'll fail to
    mark bits as dead which in turn will inhibit optimization.  For a source
    operand it's a completely different story.  By failing to mark some bits as
    live we can (as this pr showed) erroneously remove an extension.

    While reviewing all the uses of GET_MODE_INNER, I've become convinced the
    vector handling in carry_backpropagate is broken.  If it's going to support
    vector, it needs to do what it's doing now with the GET_MODE_INNER stuff
which
    gives us liveness of an element, then broadcast the liveness state across
all
    the elements of the vector.  It seems like it should be possible to support
    this case, but having not seen anything even close to it in practice, I'm
    punting it for now and returning a conservatively correct state when
presented
    with vector modes in carry_backpropagate.

    This has been bootstrapped and regression tested on riscv64, x86_64,
aarch64,
    alpha, hppa and others.  It's also been tested without regressions on the
    various *-elf targets.  Pushing to the trunk.

            PR rtl-optimization/126426

    gcc/
            * ext-dce.cc (carry_backpropagate): Return a conservatively
            correct mask when presented with vector modes.
            (ext_dce_process_uses): Don't use GET_MODE_INNER, we need to
            know the full extent of the bits for vector and complex modes.

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

Reply via email to