On Tue, Aug 26, 2025 at 10:42 PM Stefan Schulze Frielinghaus
<[email protected]> 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
>