[PR102988] harden cond: detach without decls

Richard Biener richard.guenther@gmail.com
Fri Nov 19 14:08:24 GMT 2021


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>


More information about the Gcc-patches mailing list