aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimplify.cc
diff options
context:
space:
mode:
authorAndrew Pinski <apinski@marvell.com>2023-06-26 17:14:06 -0700
committerAndrew Pinski <apinski@marvell.com>2023-06-27 09:26:22 -0700
commit478840a2ca491fbff44371caee4983d1e7b7b7cf (patch)
treed7b5322a5098c5f77e5a4c4c263ba6eb39550546 /gcc/gimplify.cc
parent4a48a38fa99f067b8f3a3d1a5dc7a1e602db351f (diff)
downloadgcc-478840a2ca491fbff44371caee4983d1e7b7b7cf.zip
gcc-478840a2ca491fbff44371caee4983d1e7b7b7cf.tar.gz
gcc-478840a2ca491fbff44371caee4983d1e7b7b7cf.tar.bz2
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.
Diffstat (limited to 'gcc/gimplify.cc')
-rw-r--r--gcc/gimplify.cc7
1 files changed, 6 insertions, 1 deletions
diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index 0e24b91..36e5df0 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 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));