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

--- Comment #7 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Andrew Pinski <pins...@gcc.gnu.org>:

https://gcc.gnu.org/g:6ece2d7274059265468833fb491db44bd90de72a

commit r16-3286-g6ece2d7274059265468833fb491db44bd90de72a
Author: Andrew Pinski <andrew.pin...@oss.qualcomm.com>
Date:   Mon Aug 18 13:33:59 2025 -0700

    middle-end: Fix malloc like functions when calling with void "return"
[PR120024]

    When expanding malloc like functions, we copy the return register into a
temporary
    and then mark that temporary register with a noalias regnote and the
alignment.
    This works fine unless you are calling the function with a return type of
void.
    At this point then the valreg will be null and a crash will happen.

    A few cleanups are included in this patch because it was easier to do the
fix
    with the cleanups added.
    The start_sequence/end_sequence for ECF_MALLOC is no longer needed; I can't
tell
    if it was ever needed.
    The emit_move_insn function returns the last emitted instruction anyways so
    there is no reason to call get_last_insn as we can just use the return
value
    of emit_move_insn. This has been true since this code was originally added
    so I don't understand why it was done that way beforehand.

    Bootstrapped and tested on x86_64-linux-gnu.

            PR middle-end/120024

    gcc/ChangeLog:

            * calls.cc (expand_call): Remove start_sequence/end_sequence
            for ECF_MALLOC.
            Check valreg before deferencing it when it comes to malloc like
            functions. Use the return value of emit_move_insn instead of
            calling get_last_insn.

    gcc/testsuite/ChangeLog:

            * gcc.dg/torture/malloc-1.c: New test.
            * gcc.dg/torture/malloc-2.c: New test.

    Signed-off-by: Andrew Pinski <andrew.pin...@oss.qualcomm.com>

Reply via email to