re PR tree-optimization/50287 (FAIL: gcc.c-torture/execute/builtins/vsnprintf-chk...
authorMartin Jambor <mjambor@suse.cz>
Thu, 8 Sep 2011 13:09:38 +0000 (15:09 +0200)
committerMartin Jambor <jamborm@gcc.gnu.org>
Thu, 8 Sep 2011 13:09:38 +0000 (15:09 +0200)
2011-09-08  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.

From-SVN: r178688

gcc/ChangeLog
gcc/ipa-split.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr50287.c [new file with mode: 0644]

index 561c3dbecc1b36ca46539a35dd77ef8596c1417f..938aede5fb8f738a20f85d2d4b0193fc031cf954 100644 (file)
@@ -1,3 +1,9 @@
+2011-09-08  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/50287
+       * ipa-split.c (split_function): Do not create SSA names for
+       non-gimple-registers.
+
 2011-09-08  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/19831
index d5e5c69b5d85ce3940caa275d421bbd52dd67c22..b16cfb34a972519de09a61ee6cff2ebb8a699310 100644 (file)
@@ -985,15 +985,20 @@ split_function (struct split_point *split_point)
       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)))
index c6109a6e52585955eedd99fb20f0fc9f89a714c5..fecb2f4e12bad75b820b963e52c65f6288a92d53 100644 (file)
@@ -1,3 +1,8 @@
+2011-09-08  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/50287
+       * gcc.dg/torture/pr50287.c: New test.
+
 2011-09-08  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/19831
diff --git a/gcc/testsuite/gcc.dg/torture/pr50287.c b/gcc/testsuite/gcc.dg/torture/pr50287.c
new file mode 100644 (file)
index 0000000..1f61293
--- /dev/null
@@ -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);
+}
+