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

--- Comment #4 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-14 branch has been updated by Kito Cheng <k...@gcc.gnu.org>:

https://gcc.gnu.org/g:86b0f63adb0815b407050514333384dcb7ac640d

commit r14-11569-g86b0f63adb0815b407050514333384dcb7ac640d
Author: Jeff Law <j...@ventanamicro.com>
Date:   Thu Aug 8 07:42:26 2024 -0600

    [RISC-V][PR target/116240] Ensure object is a comparison before extracting
arguments

    This was supposed to go out the door yesterday, but I kept getting
interrupted.

    The target bits for rtx costing can't assume the rtl they're given actually
    matches a target pattern.   It's just kind of inherent in how the costing
    routines get called in various places.

    In this particular case we're trying to cost a conditional move:

    (set (dest) (if_then_else (cond) (true) (false))

    On the RISC-V port the backend only allows actual conditionals for COND. 
So
    something like (eq (reg) (const_int 0)).  In the costing code for
if-then-else
    we did something like

    (XEXP (XEXP (cond, 0), 0)))

    Which fails miserably if COND is a terminal node like (reg) rather than (ne
    (reg) (const_int 0)

    So this patch tightens up the RTL scanning to ensure that we have a
comparison
    before we start looking at the comparison's arguments.

    Run through my tester without incident, but I'll wait for the pre-commit
tester
    to run through a cycle before pushing to the trunk.

    Jeff

    ps.   We probably could support a naked REG for the condition and
internally convert it to (ne (reg) (const_int 0)), but I don't think it likely
happens with any regularity.

            PR target/116240
    gcc/
            * config/riscv/riscv.cc (riscv_rtx_costs): Ensure object is a
            comparison before looking at its arguments.

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

Reply via email to