On Thu, Feb 12, 2015 at 3:14 PM, Ilya Enkovich <enkovich....@gmail.com> wrote:
> Hi,
>
> PR65002 is the second issue caused by SRA for functions wrongly marked as 
> read-only.  Previous fix for PR64353 doesn't work for this case because SSA 
> update happens too late.  Here is a patch to disable SRA for such functions 
> to avoid inconsistent SSA issues.
>
> Bootstrapped and tested on x86_64-unknown-linux-gnu.  OK for trunk?

Ok.  I'm not entirely happy with this but I guess any other solution has to wait
for GCC 6.

Thanks,
Richard.

> Thanks,
> Ilya
> --
> gcc/
>
> 2015-02-12  Ilya Enkovich  <ilya.enkov...@intel.com>
>
>         PR tree-optimization/65002
>         * tree-cfg.c (pass_data_fixup_cfg): Don't update
>         SSA on start.
>         * tree-sra.c (some_callers_have_no_vuse_p): New.
>         (ipa_early_sra): Reject functions whose callers
>         assume funciton is read only.
>
> gcc/testsuite/
>
> 2015-02-12  Ilya Enkovich  <ilya.enkov...@intel.com>
>
>         PR tree-optimization/65002
>         * gcc.dg/pr65002.C: New.
>
>
> diff --git a/gcc/testsuite/gcc.dg/pr65002.C b/gcc/testsuite/gcc.dg/pr65002.C
> new file mode 100644
> index 0000000..ac7c66b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr65002.C
> @@ -0,0 +1,26 @@
> +/* PR tree-optimization/65002 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +namespace fastmath {
> +  template <typename T> float floor(const T &) __attribute__((const));
> +  template <typename T> float floor(const T &p1) { return p1; }
> +}
> +using fastmath::floor;
> +class A {
> +public:
> +  A(int, int);
> +  virtual int m_fn1(float) const;
> +};
> +class B : A {
> +public:
> +  B(int, int p2) : A(entity, p2) {}
> +  int m_fn1(float p1) const { long b(floor(p1)); }
> +  int entity;
> +};
> +
> +int a;
> +void Convert() {
> +  if (int *c = 0)
> +    B(*c, a);
> +}
> diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
> index 2e23553..006bc08 100644
> --- a/gcc/tree-cfg.c
> +++ b/gcc/tree-cfg.c
> @@ -8754,7 +8754,7 @@ const pass_data pass_data_fixup_cfg =
>    PROP_cfg, /* properties_required */
>    0, /* properties_provided */
>    0, /* properties_destroyed */
> -  TODO_update_ssa_only_virtuals, /* todo_flags_start */
> +  0, /* todo_flags_start */
>    0, /* todo_flags_finish */
>  };
>
> diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
> index ad9584e..7f78e68 100644
> --- a/gcc/tree-sra.c
> +++ b/gcc/tree-sra.c
> @@ -4890,6 +4890,20 @@ some_callers_have_mismatched_arguments_p (struct 
> cgraph_node *node,
>    return false;
>  }
>
> +/* Return false if all callers have vuse attached to a call statement.  */
> +
> +static bool
> +some_callers_have_no_vuse_p (struct cgraph_node *node,
> +                            void *data ATTRIBUTE_UNUSED)
> +{
> +  struct cgraph_edge *cs;
> +  for (cs = node->callers; cs; cs = cs->next_caller)
> +    if (!cs->call_stmt || !gimple_vuse (cs->call_stmt))
> +      return true;
> +
> +  return false;
> +}
> +
>  /* Convert all callers of NODE.  */
>
>  static bool
> @@ -5116,6 +5130,15 @@ ipa_early_sra (void)
>        goto simple_out;
>      }
>
> +  if (node->call_for_symbol_thunks_and_aliases
> +       (some_callers_have_no_vuse_p, NULL, true))
> +    {
> +      if (dump_file)
> +       fprintf (dump_file, "There are callers with no VUSE attached "
> +                "to a call stmt.\n");
> +      goto simple_out;
> +    }
> +
>    bb_dereferences = XCNEWVEC (HOST_WIDE_INT,
>                                  func_param_count
>                                  * last_basic_block_for_fn (cfun));

Reply via email to