From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1314) id F07F13858D28; Tue, 27 Jun 2023 17:21:37 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F07F13858D28 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1687886497; bh=/nRHrqdasnwDNXI0wHSJuIyD8WMsxnwnaNxGLGBBWFU=; h=From:To:Subject:Date:From; b=nNq67OjvUmThkjtZvDwze5haEbJV62SYsUN3VWjdJBdS56IGCymtOSkIIGXVx30vx 92wZYuZsBe5qYIpDtQpt4MhmQIDeIdPsS1CKY5Cm4rs042wYgtBkFYNZQGwRP6Q3hE fhducA+PinahQFNr6plZdIUYnuoxXZKLUoZgkA7w= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Andrew Pinski To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-9732] Mark asm goto with outputs as volatile X-Act-Checkin: gcc X-Git-Author: Andrew Pinski X-Git-Refname: refs/heads/releases/gcc-12 X-Git-Oldrev: 41cc784882428922c73691ed6811be41cdb4a583 X-Git-Newrev: ee3bb7cb5d2ecfc64adcfd61afb390e72cc08661 Message-Id: <20230627172137.F07F13858D28@sourceware.org> Date: Tue, 27 Jun 2023 17:21:37 +0000 (GMT) List-Id: https://gcc.gnu.org/g:ee3bb7cb5d2ecfc64adcfd61afb390e72cc08661 commit r12-9732-gee3bb7cb5d2ecfc64adcfd61afb390e72cc08661 Author: Andrew Pinski 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 a551c574a2d..947fe570e1e 100644 --- a/gcc/gimplify.cc +++ b/gcc/gimplify.cc @@ -6847,7 +6847,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 " } } */