aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2011-09-08 15:09:38 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2011-09-08 15:09:38 +0200
commit868141900a1c1c7a76c5a48625dbfa1e81d8051c (patch)
treef04b056a88255c575796a452750ba92f920e65c7 /gcc
parent996e1de5e6bced0c6b6b0cbacee11ccc720ccdf4 (diff)
downloadgcc-868141900a1c1c7a76c5a48625dbfa1e81d8051c.zip
gcc-868141900a1c1c7a76c5a48625dbfa1e81d8051c.tar.gz
gcc-868141900a1c1c7a76c5a48625dbfa1e81d8051c.tar.bz2
re PR tree-optimization/50287 (FAIL: gcc.c-torture/execute/builtins/vsnprintf-chk.c compilation, -O2 -flto)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-split.c19
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr50287.c109
4 files changed, 132 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 561c3db..938aede 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c
index d5e5c69..b16cfb3 100644
--- a/gcc/ipa-split.c
+++ b/gcc/ipa-split.c
@@ -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)))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c6109a6..fecb2f4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..1f61293
--- /dev/null
+++ b/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);
+}
+