public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH, PR 50287] Do not create SSA names for unused non-register parameters in IPA-split
@ 2011-09-07 17:21 Martin Jambor
  2011-09-08 12:06 ` Richard Guenther
  0 siblings, 1 reply; 2+ messages in thread
From: Martin Jambor @ 2011-09-07 17:21 UTC (permalink / raw)
  To: GCC Patches; +Cc: Jan Hubicka

Hi,

the patch below should fix PR 50287 (and its many duplicates) by
simply never attempting to create new default-defs for unused
non-register parameters and using their DECL when calling the split
function.  Note that all of this is relevant only in the case when
there is some other reason why we cannot change the function's
signature (typically because there are function attributes).
Otherwise, parameters that are not used or referenced in any way are
not passed on to the split function.

This is correct because it does not really matter what actual value we
pass to the split function for any non-register parameter because all
statements that are going to end up in the split function are checked
by mark_nonssa_use which makes sure it does not use, store or take
address of any such PARM_DECL.

The patch passes bootstrap and testing on x86_64-linux, it has
successfully LTO-built Firefox and I'm LTO-building a few SPEC 2006
benchmarks with it right now.  Of course it fixes the ICE when
compiling the testcase (and I have verified that the 4.6 version also
fixes the ICE when compiling the reduced testcase of PR 50295). OK for
trunk (and then for the 4.6 branch)?

Thanks,

Martin


2011-09-06  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/50287
	* ipa-split.c (split_function): Do not create SSA names for
	non-gimple-registers.

	* testsuite/gcc.dg/torture/pr50287.c: New test.


Index: src/gcc/testsuite/gcc.dg/torture/pr50287.c
===================================================================
--- /dev/null
+++ src/gcc/testsuite/gcc.dg/torture/pr50287.c
@@ -0,0 +1,109 @@
+/* { dg-do compile } */
+
+struct PMC {
+    unsigned flags;
+};
+
+struct PVC {
+  unsigned flags, other_stuff;
+};
+
+
+typedef struct Pcc_cell
+{
+    struct PMC *p;
+    long bla;
+    long type;
+} Pcc_cell;
+
+int gi;
+int cond;
+
+struct PVC g_pvc;
+
+extern void abort ();
+extern void never_ever(int interp, struct PMC *pmc)
+  __attribute__((noinline,noclone));
+
+void never_ever (int interp, struct PMC *pmc)
+{
+  abort ();
+}
+
+static void mark_cell(int * interp, Pcc_cell *c, struct PVC pvc)
+  __attribute__((__nonnull__(1)));
+
+static void
+mark_cell(int * interp, Pcc_cell *c, struct PVC pvc)
+{
+  if (!cond)
+    return;
+
+  if (c && c->type == 4 && c->p
+      && !(c->p->flags & (1<<8)))
+    never_ever(gi + 1, c->p);
+  if (c && c->type == 4 && c->p
+      && !(c->p->flags & (1<<7)))
+    never_ever(gi + 2, c->p);
+  if (c && c->type == 4 && c->p
+      && !(c->p->flags & (1<<6)))
+    never_ever(gi + 3, c->p);
+  if (c && c->type == 4 && c->p
+      && !(c->p->flags & (1<<5)))
+    never_ever(gi + 4, c->p);
+  if (c && c->type == 4 && c->p
+      && !(c->p->flags & (1<<4)))
+    never_ever(gi + 5, c->p);
+  if (c && c->type == 4 && c->p
+      && !(c->p->flags & (1<<3)))
+    never_ever(gi + 6, c->p);
+  if (c && c->type == 4 && c->p
+      && !(c->p->flags & (1<<2)))
+    never_ever(gi + 7, c->p);
+  if (c && c->type == 4 && c->p
+      && !(c->p->flags & (1<<1)))
+    never_ever(gi + 8, c->p);
+  if (c && c->type == 4 && c->p
+      && !(c->p->flags & (1<<9)))
+    never_ever(gi + 9, c->p);
+}
+
+static void
+foo(int * interp, Pcc_cell *c)
+{
+  mark_cell(interp, c, g_pvc);
+}
+
+static struct Pcc_cell *
+__attribute__((noinline,noclone))
+getnull(void)
+{
+  return (struct Pcc_cell *) 0;
+}
+
+
+int main()
+{
+  int i;
+
+  cond = 1;
+  for (i = 0; i < 100; i++)
+    foo (&gi, getnull ());
+  return 0;
+}
+
+
+void
+bar_1 (int * interp, Pcc_cell *c)
+{
+  c->bla += 1;
+  mark_cell(interp, c, g_pvc);
+}
+
+void
+bar_2 (int * interp, Pcc_cell *c, struct PVC pvc)
+{
+  c->bla += 2;
+  mark_cell(interp, c, pvc);
+}
+
Index: src/gcc/ipa-split.c
===================================================================
--- src.orig/gcc/ipa-split.c
+++ src/gcc/ipa-split.c
@@ -985,15 +985,20 @@ split_function (struct split_point *spli
       bitmap_set_bit (args_to_skip, num);
     else
       {
-	arg = gimple_default_def (cfun, parm);
-	if (!arg)
+	/* This parm might not have been used up to now, but is going to be
+	   used, hence register it.  */
+	add_referenced_var (parm);
+	if (is_gimple_reg (parm))
 	  {
-	    /* This parm wasn't used up to now, but is going to be used,
-	       hence register it.  */
-	    add_referenced_var (parm);
-	    arg = make_ssa_name (parm, gimple_build_nop ());
-	    set_default_def (parm, arg);
+	    arg = gimple_default_def (cfun, parm);
+	    if (!arg)
+	      {
+		arg = make_ssa_name (parm, gimple_build_nop ());
+		set_default_def (parm, arg);
+	      }
 	  }
+	else
+	  arg = parm;
 
 	if (TYPE_MAIN_VARIANT (DECL_ARG_TYPE (parm))
 	    != TYPE_MAIN_VARIANT (TREE_TYPE (arg)))

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

* Re: [PATCH, PR 50287] Do not create SSA names for unused non-register parameters in IPA-split
  2011-09-07 17:21 [PATCH, PR 50287] Do not create SSA names for unused non-register parameters in IPA-split Martin Jambor
@ 2011-09-08 12:06 ` Richard Guenther
  0 siblings, 0 replies; 2+ messages in thread
From: Richard Guenther @ 2011-09-08 12:06 UTC (permalink / raw)
  To: GCC Patches, Jan Hubicka

On Wed, Sep 7, 2011 at 7:18 PM, Martin Jambor <mjambor@suse.cz> wrote:
> Hi,
>
> the patch below should fix PR 50287 (and its many duplicates) by
> simply never attempting to create new default-defs for unused
> non-register parameters and using their DECL when calling the split
> function.  Note that all of this is relevant only in the case when
> there is some other reason why we cannot change the function's
> signature (typically because there are function attributes).
> Otherwise, parameters that are not used or referenced in any way are
> not passed on to the split function.
>
> This is correct because it does not really matter what actual value we
> pass to the split function for any non-register parameter because all
> statements that are going to end up in the split function are checked
> by mark_nonssa_use which makes sure it does not use, store or take
> address of any such PARM_DECL.
>
> The patch passes bootstrap and testing on x86_64-linux, it has
> successfully LTO-built Firefox and I'm LTO-building a few SPEC 2006
> benchmarks with it right now.  Of course it fixes the ICE when
> compiling the testcase (and I have verified that the 4.6 version also
> fixes the ICE when compiling the reduced testcase of PR 50295). OK for
> trunk (and then for the 4.6 branch)?

Ok.

Thanks,
Richard.

> Thanks,
>
> Martin
>
>
> 2011-09-06  Martin Jambor  <mjambor@suse.cz>
>
>        PR tree-optimization/50287
>        * ipa-split.c (split_function): Do not create SSA names for
>        non-gimple-registers.
>
>        * testsuite/gcc.dg/torture/pr50287.c: New test.
>
>
> Index: src/gcc/testsuite/gcc.dg/torture/pr50287.c
> ===================================================================
> --- /dev/null
> +++ src/gcc/testsuite/gcc.dg/torture/pr50287.c
> @@ -0,0 +1,109 @@
> +/* { dg-do compile } */
> +
> +struct PMC {
> +    unsigned flags;
> +};
> +
> +struct PVC {
> +  unsigned flags, other_stuff;
> +};
> +
> +
> +typedef struct Pcc_cell
> +{
> +    struct PMC *p;
> +    long bla;
> +    long type;
> +} Pcc_cell;
> +
> +int gi;
> +int cond;
> +
> +struct PVC g_pvc;
> +
> +extern void abort ();
> +extern void never_ever(int interp, struct PMC *pmc)
> +  __attribute__((noinline,noclone));
> +
> +void never_ever (int interp, struct PMC *pmc)
> +{
> +  abort ();
> +}
> +
> +static void mark_cell(int * interp, Pcc_cell *c, struct PVC pvc)
> +  __attribute__((__nonnull__(1)));
> +
> +static void
> +mark_cell(int * interp, Pcc_cell *c, struct PVC pvc)
> +{
> +  if (!cond)
> +    return;
> +
> +  if (c && c->type == 4 && c->p
> +      && !(c->p->flags & (1<<8)))
> +    never_ever(gi + 1, c->p);
> +  if (c && c->type == 4 && c->p
> +      && !(c->p->flags & (1<<7)))
> +    never_ever(gi + 2, c->p);
> +  if (c && c->type == 4 && c->p
> +      && !(c->p->flags & (1<<6)))
> +    never_ever(gi + 3, c->p);
> +  if (c && c->type == 4 && c->p
> +      && !(c->p->flags & (1<<5)))
> +    never_ever(gi + 4, c->p);
> +  if (c && c->type == 4 && c->p
> +      && !(c->p->flags & (1<<4)))
> +    never_ever(gi + 5, c->p);
> +  if (c && c->type == 4 && c->p
> +      && !(c->p->flags & (1<<3)))
> +    never_ever(gi + 6, c->p);
> +  if (c && c->type == 4 && c->p
> +      && !(c->p->flags & (1<<2)))
> +    never_ever(gi + 7, c->p);
> +  if (c && c->type == 4 && c->p
> +      && !(c->p->flags & (1<<1)))
> +    never_ever(gi + 8, c->p);
> +  if (c && c->type == 4 && c->p
> +      && !(c->p->flags & (1<<9)))
> +    never_ever(gi + 9, c->p);
> +}
> +
> +static void
> +foo(int * interp, Pcc_cell *c)
> +{
> +  mark_cell(interp, c, g_pvc);
> +}
> +
> +static struct Pcc_cell *
> +__attribute__((noinline,noclone))
> +getnull(void)
> +{
> +  return (struct Pcc_cell *) 0;
> +}
> +
> +
> +int main()
> +{
> +  int i;
> +
> +  cond = 1;
> +  for (i = 0; i < 100; i++)
> +    foo (&gi, getnull ());
> +  return 0;
> +}
> +
> +
> +void
> +bar_1 (int * interp, Pcc_cell *c)
> +{
> +  c->bla += 1;
> +  mark_cell(interp, c, g_pvc);
> +}
> +
> +void
> +bar_2 (int * interp, Pcc_cell *c, struct PVC pvc)
> +{
> +  c->bla += 2;
> +  mark_cell(interp, c, pvc);
> +}
> +
> Index: src/gcc/ipa-split.c
> ===================================================================
> --- src.orig/gcc/ipa-split.c
> +++ src/gcc/ipa-split.c
> @@ -985,15 +985,20 @@ split_function (struct split_point *spli
>       bitmap_set_bit (args_to_skip, num);
>     else
>       {
> -       arg = gimple_default_def (cfun, parm);
> -       if (!arg)
> +       /* This parm might not have been used up to now, but is going to be
> +          used, hence register it.  */
> +       add_referenced_var (parm);
> +       if (is_gimple_reg (parm))
>          {
> -           /* This parm wasn't used up to now, but is going to be used,
> -              hence register it.  */
> -           add_referenced_var (parm);
> -           arg = make_ssa_name (parm, gimple_build_nop ());
> -           set_default_def (parm, arg);
> +           arg = gimple_default_def (cfun, parm);
> +           if (!arg)
> +             {
> +               arg = make_ssa_name (parm, gimple_build_nop ());
> +               set_default_def (parm, arg);
> +             }
>          }
> +       else
> +         arg = parm;
>
>        if (TYPE_MAIN_VARIANT (DECL_ARG_TYPE (parm))
>            != TYPE_MAIN_VARIANT (TREE_TYPE (arg)))
>

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

end of thread, other threads:[~2011-09-08  8:26 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-09-07 17:21 [PATCH, PR 50287] Do not create SSA names for unused non-register parameters in IPA-split Martin Jambor
2011-09-08 12:06 ` Richard Guenther

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