From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1666) id 4A8383857354; Tue, 17 Oct 2023 06:26:38 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4A8383857354 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1697523998; bh=6Iq+ucjqY5jFYGmAFPANovKgnQq0DZ3T9T2rjB2FV88=; h=From:To:Subject:Date:From; b=o0Af4wOWDOnBjfC8LIcBEYSBa/gnhBigrjfQmefrG74vLcIjd0YJx4bVLsA2vODGf hcN7N4hKteaf5vjDUThkJ5sWFq/hE8fFoIB0XoZ97M0TlZa3iYnSN9hu72MYmkGSmJ D60ZTda/AobBsvaC+YKWn7UdVSzs/ebBPvQ7EfQU= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Richard Biener To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-4678] middle-end/111818 - failed DECL_NOT_GIMPLE_REG_P setting of volatile X-Act-Checkin: gcc X-Git-Author: Richard Biener X-Git-Refname: refs/heads/master X-Git-Oldrev: 3aaf704bca3e01c72d9fe6de01ae5416dba6b5db X-Git-Newrev: ce55521bcd149fdc431f1d78e706b66d470210ae Message-Id: <20231017062638.4A8383857354@sourceware.org> Date: Tue, 17 Oct 2023 06:26:38 +0000 (GMT) List-Id: https://gcc.gnu.org/g:ce55521bcd149fdc431f1d78e706b66d470210ae commit r14-4678-gce55521bcd149fdc431f1d78e706b66d470210ae Author: Richard Biener Date: Mon Oct 16 12:50:46 2023 +0200 middle-end/111818 - failed DECL_NOT_GIMPLE_REG_P setting of volatile The following addresses a missed DECL_NOT_GIMPLE_REG_P setting of a volatile declared parameter which causes inlining to substitute a constant parameter into a context where its address is required. The main issue is in update_address_taken which clears DECL_NOT_GIMPLE_REG_P from the parameter but fails to rewrite it because is_gimple_reg returns false for volatiles. The following changes maybe_optimize_var to make the 1:1 correspondence between clearing DECL_NOT_GIMPLE_REG_P of a register typed decl and actually rewriting it to SSA. PR middle-end/111818 * tree-ssa.cc (maybe_optimize_var): When clearing DECL_NOT_GIMPLE_REG_P always rewrite into SSA. * gcc.dg/torture/pr111818.c: New testcase. Diff: --- gcc/testsuite/gcc.dg/torture/pr111818.c | 11 +++++++++++ gcc/tree-ssa.cc | 17 +++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/gcc/testsuite/gcc.dg/torture/pr111818.c b/gcc/testsuite/gcc.dg/torture/pr111818.c new file mode 100644 index 000000000000..a7a91111d717 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr111818.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ + +static void foo(const volatile unsigned int x, void *p) +{ + __builtin_memcpy(p, (void *)&x, sizeof x); +} + +void bar(void *number) +{ + foo(0, number); +} diff --git a/gcc/tree-ssa.cc b/gcc/tree-ssa.cc index ebba02b84496..2f3210fcf616 100644 --- a/gcc/tree-ssa.cc +++ b/gcc/tree-ssa.cc @@ -1788,15 +1788,20 @@ maybe_optimize_var (tree var, bitmap addresses_taken, bitmap not_reg_needs, maybe_reg = true; DECL_NOT_GIMPLE_REG_P (var) = 0; } - if (maybe_reg && is_gimple_reg (var)) + if (maybe_reg) { - if (dump_file) + if (is_gimple_reg (var)) { - fprintf (dump_file, "Now a gimple register: "); - print_generic_expr (dump_file, var); - fprintf (dump_file, "\n"); + if (dump_file) + { + fprintf (dump_file, "Now a gimple register: "); + print_generic_expr (dump_file, var); + fprintf (dump_file, "\n"); + } + bitmap_set_bit (suitable_for_renaming, DECL_UID (var)); } - bitmap_set_bit (suitable_for_renaming, DECL_UID (var)); + else + DECL_NOT_GIMPLE_REG_P (var) = 1; } } }