public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Mark asm goto with outputs as volatile
@ 2023-06-27  3:24 Andrew Pinski
  2023-06-27  7:13 ` Richard Biener
  2023-06-27  7:36 ` Andreas Schwab
  0 siblings, 2 replies; 5+ messages in thread
From: Andrew Pinski @ 2023-06-27  3:24 UTC (permalink / raw)
  To: gcc-patches; +Cc: Andrew Pinski

The manual references asm goto as being implicitly volatile already
and that was done when asm goto could not have outputs. When outputs
were added to `asm goto`, only asm goto without outputs were still being
marked as volatile. Now some parts of GCC decide, removing the `asm goto`
is ok if the output is not used, though not updating the CFG (this happens
on both the RTL level and the gimple level). Since the biggest user of `asm goto`
is the Linux kernel and they expect them to be volatile (they use them to
copy to/from userspace), we should just mark the inline-asm as volatile.

OK? Bootstrapped and tested on x86_64-linux-gnu.

	PR middle-end/110420
	PR middle-end/103979
	PR middle-end/98619

gcc/ChangeLog:

	* gimplify.cc (gimplify_asm_expr): Mark asm with labels as volatile.

gcc/testsuite/ChangeLog:

	* gcc.c-torture/compile/asmgoto-6.c: New test.
---
 gcc/gimplify.cc                               |  7 ++++-
 .../gcc.c-torture/compile/asmgoto-6.c         | 26 +++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.c-torture/compile/asmgoto-6.c

diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index 0e24b915b8f..dc6a00e8bd9 100644
--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -6935,7 +6935,12 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
       stmt = gimple_build_asm_vec (TREE_STRING_POINTER (ASM_STRING (expr)),
 				   inputs, outputs, clobbers, labels);
 
-      gimple_asm_set_volatile (stmt, ASM_VOLATILE_P (expr) || noutputs == 0);
+      /* asm is volatile if it was marked by the user as volatile or
+	 there is no outputs or this is an asm goto.  */
+      gimple_asm_set_volatile (stmt,
+			       ASM_VOLATILE_P (expr)
+			       || noutputs == 0
+			       || labels);
       gimple_asm_set_input (stmt, ASM_INPUT_P (expr));
       gimple_asm_set_inline (stmt, ASM_INLINE_P (expr));
 
diff --git a/gcc/testsuite/gcc.c-torture/compile/asmgoto-6.c b/gcc/testsuite/gcc.c-torture/compile/asmgoto-6.c
new file mode 100644
index 00000000000..0652bd4e4e1
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/asmgoto-6.c
@@ -0,0 +1,26 @@
+
+/* { dg-do compile } */
+/* PR middle-end/110420 */
+/* PR middle-end/103979 */
+/* PR middle-end/98619 */
+/* Test that the middle-end does not remove the asm goto
+   with an output. */
+
+static int t;
+void g(void);
+
+void f(void)
+{
+  int  __gu_val;
+  asm goto("#my asm "
+     : "=&r"(__gu_val)
+     :
+     :
+     : Efault);
+  t = __gu_val;
+  g();
+Efault:
+}
+
+/* Make sure "my asm " is still in the assembly. */
+/* { dg-final { scan-assembler "my asm " } } */
-- 
2.31.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Mark asm goto with outputs as volatile
  2023-06-27  3:24 [PATCH] Mark asm goto with outputs as volatile Andrew Pinski
@ 2023-06-27  7:13 ` Richard Biener
  2023-06-27 17:23   ` Andrew Pinski
  2023-06-27  7:36 ` Andreas Schwab
  1 sibling, 1 reply; 5+ messages in thread
From: Richard Biener @ 2023-06-27  7:13 UTC (permalink / raw)
  To: Andrew Pinski; +Cc: gcc-patches

On Tue, Jun 27, 2023 at 5:26 AM Andrew Pinski via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> The manual references asm goto as being implicitly volatile already
> and that was done when asm goto could not have outputs. When outputs
> were added to `asm goto`, only asm goto without outputs were still being
> marked as volatile. Now some parts of GCC decide, removing the `asm goto`
> is ok if the output is not used, though not updating the CFG (this happens
> on both the RTL level and the gimple level). Since the biggest user of `asm goto`
> is the Linux kernel and they expect them to be volatile (they use them to
> copy to/from userspace), we should just mark the inline-asm as volatile.
>
> OK? Bootstrapped and tested on x86_64-linux-gnu.

OK.

>         PR middle-end/110420
>         PR middle-end/103979
>         PR middle-end/98619
>
> gcc/ChangeLog:
>
>         * gimplify.cc (gimplify_asm_expr): Mark asm with labels as volatile.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.c-torture/compile/asmgoto-6.c: New test.
> ---
>  gcc/gimplify.cc                               |  7 ++++-
>  .../gcc.c-torture/compile/asmgoto-6.c         | 26 +++++++++++++++++++
>  2 files changed, 32 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/gcc.c-torture/compile/asmgoto-6.c
>
> diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
> index 0e24b915b8f..dc6a00e8bd9 100644
> --- a/gcc/gimplify.cc
> +++ b/gcc/gimplify.cc
> @@ -6935,7 +6935,12 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
>        stmt = gimple_build_asm_vec (TREE_STRING_POINTER (ASM_STRING (expr)),
>                                    inputs, outputs, clobbers, labels);
>
> -      gimple_asm_set_volatile (stmt, ASM_VOLATILE_P (expr) || noutputs == 0);
> +      /* asm is volatile if it was marked by the user as volatile or
> +        there is no outputs or this is an asm goto.  */
> +      gimple_asm_set_volatile (stmt,
> +                              ASM_VOLATILE_P (expr)
> +                              || noutputs == 0
> +                              || labels);
>        gimple_asm_set_input (stmt, ASM_INPUT_P (expr));
>        gimple_asm_set_inline (stmt, ASM_INLINE_P (expr));
>
> diff --git a/gcc/testsuite/gcc.c-torture/compile/asmgoto-6.c b/gcc/testsuite/gcc.c-torture/compile/asmgoto-6.c
> new file mode 100644
> index 00000000000..0652bd4e4e1
> --- /dev/null
> +++ b/gcc/testsuite/gcc.c-torture/compile/asmgoto-6.c
> @@ -0,0 +1,26 @@
> +
> +/* { dg-do compile } */
> +/* PR middle-end/110420 */
> +/* PR middle-end/103979 */
> +/* PR middle-end/98619 */
> +/* Test that the middle-end does not remove the asm goto
> +   with an output. */
> +
> +static int t;
> +void g(void);
> +
> +void f(void)
> +{
> +  int  __gu_val;
> +  asm goto("#my asm "
> +     : "=&r"(__gu_val)
> +     :
> +     :
> +     : Efault);
> +  t = __gu_val;
> +  g();
> +Efault:
> +}
> +
> +/* Make sure "my asm " is still in the assembly. */
> +/* { dg-final { scan-assembler "my asm " } } */
> --
> 2.31.1
>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Mark asm goto with outputs as volatile
  2023-06-27  3:24 [PATCH] Mark asm goto with outputs as volatile Andrew Pinski
  2023-06-27  7:13 ` Richard Biener
@ 2023-06-27  7:36 ` Andreas Schwab
  1 sibling, 0 replies; 5+ messages in thread
From: Andreas Schwab @ 2023-06-27  7:36 UTC (permalink / raw)
  To: Andrew Pinski via Gcc-patches; +Cc: Andrew Pinski

On Jun 26 2023, Andrew Pinski via Gcc-patches wrote:

> diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
> index 0e24b915b8f..dc6a00e8bd9 100644
> --- a/gcc/gimplify.cc
> +++ b/gcc/gimplify.cc
> @@ -6935,7 +6935,12 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
>        stmt = gimple_build_asm_vec (TREE_STRING_POINTER (ASM_STRING (expr)),
>  				   inputs, outputs, clobbers, labels);
>  
> -      gimple_asm_set_volatile (stmt, ASM_VOLATILE_P (expr) || noutputs == 0);
> +      /* asm is volatile if it was marked by the user as volatile or
> +	 there is no outputs or this is an asm goto.  */
               are

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Mark asm goto with outputs as volatile
  2023-06-27  7:13 ` Richard Biener
@ 2023-06-27 17:23   ` Andrew Pinski
  2023-06-28 16:20     ` Jeff Law
  0 siblings, 1 reply; 5+ messages in thread
From: Andrew Pinski @ 2023-06-27 17:23 UTC (permalink / raw)
  To: Richard Biener; +Cc: Andrew Pinski, gcc-patches

On Tue, Jun 27, 2023 at 12:14 AM Richard Biener via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> On Tue, Jun 27, 2023 at 5:26 AM Andrew Pinski via Gcc-patches
> <gcc-patches@gcc.gnu.org> wrote:
> >
> > The manual references asm goto as being implicitly volatile already
> > and that was done when asm goto could not have outputs. When outputs
> > were added to `asm goto`, only asm goto without outputs were still being
> > marked as volatile. Now some parts of GCC decide, removing the `asm goto`
> > is ok if the output is not used, though not updating the CFG (this happens
> > on both the RTL level and the gimple level). Since the biggest user of `asm goto`
> > is the Linux kernel and they expect them to be volatile (they use them to
> > copy to/from userspace), we should just mark the inline-asm as volatile.
> >
> > OK? Bootstrapped and tested on x86_64-linux-gnu.
>
> OK.

Committed to GCC 12 and GCC 13 branches also.

Thanks,
Andrew

>
> >         PR middle-end/110420
> >         PR middle-end/103979
> >         PR middle-end/98619
> >
> > gcc/ChangeLog:
> >
> >         * gimplify.cc (gimplify_asm_expr): Mark asm with labels as volatile.
> >
> > gcc/testsuite/ChangeLog:
> >
> >         * gcc.c-torture/compile/asmgoto-6.c: New test.
> > ---
> >  gcc/gimplify.cc                               |  7 ++++-
> >  .../gcc.c-torture/compile/asmgoto-6.c         | 26 +++++++++++++++++++
> >  2 files changed, 32 insertions(+), 1 deletion(-)
> >  create mode 100644 gcc/testsuite/gcc.c-torture/compile/asmgoto-6.c
> >
> > diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
> > index 0e24b915b8f..dc6a00e8bd9 100644
> > --- a/gcc/gimplify.cc
> > +++ b/gcc/gimplify.cc
> > @@ -6935,7 +6935,12 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
> >        stmt = gimple_build_asm_vec (TREE_STRING_POINTER (ASM_STRING (expr)),
> >                                    inputs, outputs, clobbers, labels);
> >
> > -      gimple_asm_set_volatile (stmt, ASM_VOLATILE_P (expr) || noutputs == 0);
> > +      /* asm is volatile if it was marked by the user as volatile or
> > +        there is no outputs or this is an asm goto.  */
> > +      gimple_asm_set_volatile (stmt,
> > +                              ASM_VOLATILE_P (expr)
> > +                              || noutputs == 0
> > +                              || labels);
> >        gimple_asm_set_input (stmt, ASM_INPUT_P (expr));
> >        gimple_asm_set_inline (stmt, ASM_INLINE_P (expr));
> >
> > diff --git a/gcc/testsuite/gcc.c-torture/compile/asmgoto-6.c b/gcc/testsuite/gcc.c-torture/compile/asmgoto-6.c
> > new file mode 100644
> > index 00000000000..0652bd4e4e1
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.c-torture/compile/asmgoto-6.c
> > @@ -0,0 +1,26 @@
> > +
> > +/* { dg-do compile } */
> > +/* PR middle-end/110420 */
> > +/* PR middle-end/103979 */
> > +/* PR middle-end/98619 */
> > +/* Test that the middle-end does not remove the asm goto
> > +   with an output. */
> > +
> > +static int t;
> > +void g(void);
> > +
> > +void f(void)
> > +{
> > +  int  __gu_val;
> > +  asm goto("#my asm "
> > +     : "=&r"(__gu_val)
> > +     :
> > +     :
> > +     : Efault);
> > +  t = __gu_val;
> > +  g();
> > +Efault:
> > +}
> > +
> > +/* Make sure "my asm " is still in the assembly. */
> > +/* { dg-final { scan-assembler "my asm " } } */
> > --
> > 2.31.1
> >

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Mark asm goto with outputs as volatile
  2023-06-27 17:23   ` Andrew Pinski
@ 2023-06-28 16:20     ` Jeff Law
  0 siblings, 0 replies; 5+ messages in thread
From: Jeff Law @ 2023-06-28 16:20 UTC (permalink / raw)
  To: Andrew Pinski, Richard Biener; +Cc: Andrew Pinski, gcc-patches



On 6/27/23 11:23, Andrew Pinski via Gcc-patches wrote:
> On Tue, Jun 27, 2023 at 12:14 AM Richard Biener via Gcc-patches
> <gcc-patches@gcc.gnu.org> wrote:
>>
>> On Tue, Jun 27, 2023 at 5:26 AM Andrew Pinski via Gcc-patches
>> <gcc-patches@gcc.gnu.org> wrote:
>>>
>>> The manual references asm goto as being implicitly volatile already
>>> and that was done when asm goto could not have outputs. When outputs
>>> were added to `asm goto`, only asm goto without outputs were still being
>>> marked as volatile. Now some parts of GCC decide, removing the `asm goto`
>>> is ok if the output is not used, though not updating the CFG (this happens
>>> on both the RTL level and the gimple level). Since the biggest user of `asm goto`
>>> is the Linux kernel and they expect them to be volatile (they use them to
>>> copy to/from userspace), we should just mark the inline-asm as volatile.
>>>
>>> OK? Bootstrapped and tested on x86_64-linux-gnu.
>>
>> OK.
> 
> Committed to GCC 12 and GCC 13 branches also.
The test should be conditional on target lra since we don't support asm 
goto on the reload targets.

It looks like gcc.dg/pr108095.c needs similar adjustment.  Consider a 
patch to make those adjustments pre-approved.

jeff

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2023-06-28 16:20 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-27  3:24 [PATCH] Mark asm goto with outputs as volatile Andrew Pinski
2023-06-27  7:13 ` Richard Biener
2023-06-27 17:23   ` Andrew Pinski
2023-06-28 16:20     ` Jeff Law
2023-06-27  7:36 ` Andreas Schwab

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).