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 >