On Tue, Aug 26, 2025 at 10:42 PM Stefan Schulze Frielinghaus
<stefa...@linux.ibm.com> wrote:
>
> Bootstrapped and regtested on x86_64 and s390.  Ok for mainline?
>
> -- >8 --
>
> In case an asm operand is an error node, constraints etc. are still
> validated.  Furthermore, all other operands are gimplified, although an
> error is returned in the end anyway.  For hard register constraints an
> operand is required in order to determine the mode from which the number
> of registers follows.  Therefore, instead of adding extra guards, bail
> out early.
>
> gcc/ChangeLog:
>
>         PR 121391
>         * gimplify.cc (gimplify_asm_expr): In case an asm operand is an
>         error node, bail out early.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/pr121391-1.c: New test.
>         * gcc.dg/pr121391-2.c: New test.
> ---
>  gcc/gimplify.cc                   | 4 ++++
>  gcc/testsuite/gcc.dg/pr121391-1.c | 9 +++++++++
>  gcc/testsuite/gcc.dg/pr121391-2.c | 9 +++++++++
>  3 files changed, 22 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.dg/pr121391-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/pr121391-2.c
>
> diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
> index ca1fa2189cb..2b790923fa1 100644
> --- a/gcc/gimplify.cc
> +++ b/gcc/gimplify.cc
> @@ -7930,6 +7930,8 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, 
> gimple_seq *post_p)
>        bool ok;
>        size_t constraint_len;
>
> +      if (TREE_VALUE (link) == error_mark_node)
> +       return GS_ERROR;

Maybe use error_operand_p instead of a direct comparison to error_mark_node.

Otherwise this is almost obvious.

Thanks,
Andrew

>        link_next = TREE_CHAIN (link);
>
>        oconstraints[i]
> @@ -8155,6 +8157,8 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, 
> gimple_seq *post_p)
>    int input_num = 0;
>    for (link = ASM_INPUTS (expr); link; ++input_num, ++i, link = link_next)
>      {
> +      if (TREE_VALUE (link) == error_mark_node)
> +       return GS_ERROR;
>        link_next = TREE_CHAIN (link);
>        constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
>        reg_info.operand = TREE_VALUE (link);
> diff --git a/gcc/testsuite/gcc.dg/pr121391-1.c 
> b/gcc/testsuite/gcc.dg/pr121391-1.c
> new file mode 100644
> index 00000000000..6a015210ef9
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr121391-1.c
> @@ -0,0 +1,9 @@
> +/* { dg-do compile { target aarch64*-*-* arm*-*-* powerpc*-*-* s390*-*-* 
> x86_64-*-* } } */
> +
> +/* For the non existing variable we are faced with an error mark node during
> +   gimplify_asm_expr().  */
> +
> +void test (void)
> +{
> +  __asm__ __volatile__ ("" : "={2}" (non_existing_var)); /* { dg-error 
> {'non_existing_var' undeclared} } */
> +}
> diff --git a/gcc/testsuite/gcc.dg/pr121391-2.c 
> b/gcc/testsuite/gcc.dg/pr121391-2.c
> new file mode 100644
> index 00000000000..c03f0ab283b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr121391-2.c
> @@ -0,0 +1,9 @@
> +/* { dg-do compile { target aarch64*-*-* arm*-*-* powerpc*-*-* s390*-*-* 
> x86_64-*-* } } */
> +
> +/* For the non existing variable we are faced with an error mark node during
> +   gimplify_asm_expr().  */
> +
> +void test (void)
> +{
> +  __asm__ __volatile__ ("" :: "{2}" (non_existing_var)); /* { dg-error 
> {'non_existing_var' undeclared} } */
> +}
> --
> 2.49.0
>

Reply via email to