[gcc r13-7484] Mark asm goto with outputs as volatile
Andrew Pinski
pinskia@gcc.gnu.org
Tue Jun 27 16:46:20 GMT 2023
https://gcc.gnu.org/g:81fa6dfe1691e93664ef3b4fa66c1e057acea281
commit r13-7484-g81fa6dfe1691e93664ef3b4fa66c1e057acea281
Author: Andrew Pinski <apinski@marvell.com>
Date: Mon Jun 26 17:14:06 2023 -0700
Mark asm goto with outputs as volatile
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.
(cherry picked from commit 478840a2ca491fbff44371caee4983d1e7b7b7cf)
Diff:
---
gcc/gimplify.cc | 7 ++++++-
gcc/testsuite/gcc.c-torture/compile/asmgoto-6.c | 26 +++++++++++++++++++++++++
2 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index aece89a3e9b..afaff18ef15 100644
--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -6915,7 +6915,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 are 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 " } } */
More information about the Gcc-cvs
mailing list