public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PR102988] harden cond: detach without decls
@ 2021-11-19 13:37 Alexandre Oliva
  2021-11-19 14:08 ` Richard Biener
  0 siblings, 1 reply; 2+ messages in thread
From: Alexandre Oliva @ 2021-11-19 13:37 UTC (permalink / raw)
  To: gcc-patches


When we create copies of SSA_NAMEs to hold "detached" copies of the
values for the hardening tests, we end up with assignments to
SSA_NAMEs that refer to the same decls.  That would be generally
desirable, since it enables the variable to be recognized in dumps,
and makes coalescing more likely if the original variable dies at that
point.  When the decl is a DECL_BY_REFERENCE, the SSA_NAME holds the
address of a parm or result, and it's read-only, so we shouldn't
create assignments to it.  Gimple checkers flag at least the case of
results.

This patch arranges for us to avoid referencing the same decls, which
cures the problem, but retaining the visible association between the
SSA_NAMEs, by using the same identifier for the copy.

Regstrapped on x86_64-linux-gnu, also bootstrapped with both
-fharden-compares and -fharden-conditional-branches enabled by default.
Ok to install?


for  gcc/ChangeLog

	PR tree-optimization/102988
	* gimple-harden-conditionals.cc (detach_value): Copy SSA_NAME
	without decl sharing.

for  gcc/testsuite/ChangeLog

	PR tree-optimization/102988
	* g++.dg/pr102988.C: New.
---
 gcc/gimple-harden-conditionals.cc |    9 ++++++++-
 gcc/testsuite/g++.dg/pr102988.C   |   17 +++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/pr102988.C

diff --git a/gcc/gimple-harden-conditionals.cc b/gcc/gimple-harden-conditionals.cc
index 8916420d7dfe9..cfa2361d65be0 100644
--- a/gcc/gimple-harden-conditionals.cc
+++ b/gcc/gimple-harden-conditionals.cc
@@ -123,7 +123,14 @@ detach_value (location_t loc, gimple_stmt_iterator *gsip, tree val)
       return val;
     }
 
-  tree ret = copy_ssa_name (val);
+  /* Create a SSA "copy" of VAL.  This could be an anonymous
+     temporary, but it's nice to have it named after the corresponding
+     variable.  Alas, when VAL is a DECL_BY_REFERENCE RESULT_DECL,
+     setting (a copy of) it would be flagged by checking, so we don't
+     use copy_ssa_name: we create an anonymous SSA name, and then give
+     it the same identifier (rather than decl) as VAL.  */
+  tree ret = make_ssa_name (TREE_TYPE (val));
+  SET_SSA_NAME_VAR_OR_IDENTIFIER (ret, SSA_NAME_IDENTIFIER (val));
 
   /* Output asm ("" : "=g" (ret) : "0" (val));  */
   vec<tree, va_gc> *inputs = NULL;
diff --git a/gcc/testsuite/g++.dg/pr102988.C b/gcc/testsuite/g++.dg/pr102988.C
new file mode 100644
index 0000000000000..05a1a8f67ed9b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr102988.C
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fharden-conditional-branches -fchecking=1" } */
+
+/* DECL_BY_REFERENCE RESULT_DECL is read-only, we can't create a copy
+   of its (address) default def and set it.  */
+
+void ll();
+struct k {
+  ~k();
+};
+k ice(k *a)
+{
+  k v;
+  if (&v!= a)
+    ll();
+  return v;
+}


-- 
Alexandre Oliva, happy hacker                https://FSFLA.org/blogs/lxo/
   Free Software Activist                       GNU Toolchain Engineer
Disinformation flourishes because many people care deeply about injustice
but very few check the facts.  Ask me about <https://stallmansupport.org>

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

* Re: [PR102988] harden cond: detach without decls
  2021-11-19 13:37 [PR102988] harden cond: detach without decls Alexandre Oliva
@ 2021-11-19 14:08 ` Richard Biener
  0 siblings, 0 replies; 2+ messages in thread
From: Richard Biener @ 2021-11-19 14:08 UTC (permalink / raw)
  To: Alexandre Oliva; +Cc: GCC Patches

On Fri, Nov 19, 2021 at 2:38 PM Alexandre Oliva via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
>
> When we create copies of SSA_NAMEs to hold "detached" copies of the
> values for the hardening tests, we end up with assignments to
> SSA_NAMEs that refer to the same decls.  That would be generally
> desirable, since it enables the variable to be recognized in dumps,
> and makes coalescing more likely if the original variable dies at that
> point.  When the decl is a DECL_BY_REFERENCE, the SSA_NAME holds the
> address of a parm or result, and it's read-only, so we shouldn't
> create assignments to it.  Gimple checkers flag at least the case of
> results.
>
> This patch arranges for us to avoid referencing the same decls, which
> cures the problem, but retaining the visible association between the
> SSA_NAMEs, by using the same identifier for the copy.
>
> Regstrapped on x86_64-linux-gnu, also bootstrapped with both
> -fharden-compares and -fharden-conditional-branches enabled by default.
> Ok to install?

OK.

>
> for  gcc/ChangeLog
>
>         PR tree-optimization/102988
>         * gimple-harden-conditionals.cc (detach_value): Copy SSA_NAME
>         without decl sharing.
>
> for  gcc/testsuite/ChangeLog
>
>         PR tree-optimization/102988
>         * g++.dg/pr102988.C: New.
> ---
>  gcc/gimple-harden-conditionals.cc |    9 ++++++++-
>  gcc/testsuite/g++.dg/pr102988.C   |   17 +++++++++++++++++
>  2 files changed, 25 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/g++.dg/pr102988.C
>
> diff --git a/gcc/gimple-harden-conditionals.cc b/gcc/gimple-harden-conditionals.cc
> index 8916420d7dfe9..cfa2361d65be0 100644
> --- a/gcc/gimple-harden-conditionals.cc
> +++ b/gcc/gimple-harden-conditionals.cc
> @@ -123,7 +123,14 @@ detach_value (location_t loc, gimple_stmt_iterator *gsip, tree val)
>        return val;
>      }
>
> -  tree ret = copy_ssa_name (val);
> +  /* Create a SSA "copy" of VAL.  This could be an anonymous
> +     temporary, but it's nice to have it named after the corresponding
> +     variable.  Alas, when VAL is a DECL_BY_REFERENCE RESULT_DECL,
> +     setting (a copy of) it would be flagged by checking, so we don't
> +     use copy_ssa_name: we create an anonymous SSA name, and then give
> +     it the same identifier (rather than decl) as VAL.  */
> +  tree ret = make_ssa_name (TREE_TYPE (val));
> +  SET_SSA_NAME_VAR_OR_IDENTIFIER (ret, SSA_NAME_IDENTIFIER (val));
>
>    /* Output asm ("" : "=g" (ret) : "0" (val));  */
>    vec<tree, va_gc> *inputs = NULL;
> diff --git a/gcc/testsuite/g++.dg/pr102988.C b/gcc/testsuite/g++.dg/pr102988.C
> new file mode 100644
> index 0000000000000..05a1a8f67ed9b
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/pr102988.C
> @@ -0,0 +1,17 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O -fharden-conditional-branches -fchecking=1" } */
> +
> +/* DECL_BY_REFERENCE RESULT_DECL is read-only, we can't create a copy
> +   of its (address) default def and set it.  */
> +
> +void ll();
> +struct k {
> +  ~k();
> +};
> +k ice(k *a)
> +{
> +  k v;
> +  if (&v!= a)
> +    ll();
> +  return v;
> +}
>
>
> --
> Alexandre Oliva, happy hacker                https://FSFLA.org/blogs/lxo/
>    Free Software Activist                       GNU Toolchain Engineer
> Disinformation flourishes because many people care deeply about injustice
> but very few check the facts.  Ask me about <https://stallmansupport.org>

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

end of thread, other threads:[~2021-11-19 14:08 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-19 13:37 [PR102988] harden cond: detach without decls Alexandre Oliva
2021-11-19 14:08 ` Richard Biener

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).