aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2012-11-13 19:56:24 +0100
committerMartin Jambor <jamborm@gcc.gnu.org>2012-11-13 19:56:24 +0100
commit3e452a2871fda4d89e4eb11f7e5cb42de2f7c27a (patch)
tree2e4305eb8f869415fd2d6f9a8ac881faca13b49e
parentd10e419bebe07f5506836ea65ab7638321305305 (diff)
downloadgcc-3e452a2871fda4d89e4eb11f7e5cb42de2f7c27a.zip
gcc-3e452a2871fda4d89e4eb11f7e5cb42de2f7c27a.tar.gz
gcc-3e452a2871fda4d89e4eb11f7e5cb42de2f7c27a.tar.bz2
re PR tree-optimization/55253 (Revision 193298 miscompiles sqlite with -Os)
2012-11-13 Martin Jambor <mjambor@suse.cz> PR tree-optimization/55253 * ipa-cp.c (merge_aggregate_lattices): Propagate aggs_contain_variable flag. * testsuite/gcc.dg/torture/pr55253.c: New test. * testsuite/gcc.dg/torture/pr55305.c: Likewise. From-SVN: r193484
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-cp.c2
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr55253.c48
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr55305.c151
5 files changed, 213 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c39b9f2..32b0102 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-11-13 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/55253
+ * ipa-cp.c (merge_aggregate_lattices): Propagate aggs_contain_variable
+ flag.
+
2012-11-13 Eric Botcazou <ebotcazou@adacore.com>
H.J. Lu <hongjiu.lu@intel.com>
diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
index 85d549a..82b0b53 100644
--- a/gcc/ipa-cp.c
+++ b/gcc/ipa-cp.c
@@ -1276,6 +1276,8 @@ merge_aggregate_lattices (struct cgraph_edge *cs,
return true;
if (src_plats->aggs_bottom)
return set_agg_lats_contain_variable (dest_plats);
+ if (src_plats->aggs_contain_variable)
+ ret |= set_agg_lats_contain_variable (dest_plats);
dst_aglat = &dest_plats->aggs;
for (struct ipcp_agg_lattice *src_aglat = src_plats->aggs;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b8923e7..41a91af 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2012-11-13 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/55253
+ * gcc.dg/torture/pr55253.c: New test.
+ * gcc.dg/torture/pr55305.c: Likewise.
+
2012-11-13 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/55142
diff --git a/gcc/testsuite/gcc.dg/torture/pr55253.c b/gcc/testsuite/gcc.dg/torture/pr55253.c
new file mode 100644
index 0000000..9f6491d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr55253.c
@@ -0,0 +1,48 @@
+/* { dg-do run } */
+
+struct
+{
+ int mallocFailed;
+}
+*a;
+
+struct StrAccum
+{
+ int useMalloc;
+}
+b, c;
+
+static void
+fn1 (struct StrAccum *p1, int p2)
+{
+ if (p2 == 0)
+ return;
+ if (p1->useMalloc)
+ a->mallocFailed = 0;
+}
+
+void
+fn2 (struct StrAccum *p1)
+{
+ fn1 (p1, 1);
+}
+
+void
+fn3 (struct StrAccum *p1)
+{
+ fn1 (p1, 1);
+}
+
+void
+fn4 ()
+{
+ c.useMalloc = 1;
+ fn1 (&c, 0);
+}
+
+int
+main ()
+{
+ fn3 (&b);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr55305.c b/gcc/testsuite/gcc.dg/torture/pr55305.c
new file mode 100644
index 0000000..fb61447
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr55305.c
@@ -0,0 +1,151 @@
+/* { dg-do run } */
+
+extern void exit (int) __attribute__ ((noreturn));
+extern void abort (void) __attribute__ ((noreturn));
+
+struct t
+{
+ char dummy;
+};
+
+struct m
+{
+ const struct t *t;
+ void (*m)(void);
+};
+
+struct s
+{
+ const struct m *m;
+ void *o;
+};
+
+struct e
+{
+ const struct t *t;
+ void *o;
+};
+
+struct ret
+{
+ struct s s;
+ _Bool b;
+};
+
+const struct t t1 = { 1 };
+const struct t t2 = { 2 };
+const struct t t3 = { 3 };
+const struct t t4 = { 4 };
+const struct t t5 = { 5 };
+
+void
+pass (void)
+{
+ exit (0);
+}
+
+void
+fail (void)
+{
+ abort ();
+}
+
+const struct m m1 = { &t4, fail };
+const struct m m2 = { &t5, pass };
+
+static struct e f2 (struct s s2, void *p);
+static struct e f3 (struct s, void *) __attribute__ ((noinline));
+static void f4 (struct s, void *) __attribute__ ((noinline));
+
+struct ret c (struct s, const struct t *) __attribute__ ((noinline));
+
+struct ret
+c (struct s s1, const struct t *t)
+{
+ struct ret r;
+
+ if (s1.m->t == t)
+ {
+ r.s.m = &m2;
+ r.s.o = s1.o;
+ r.b = 1;
+ }
+ else
+ {
+ r.s.m = 0;
+ r.s.o = 0;
+ r.b = 0;
+ }
+ return r;
+}
+
+void *m (void) __attribute__ ((noinline));
+
+void *
+m (void)
+{
+ return 0;
+}
+
+struct e
+f1 (struct s s1, void *p)
+{
+ struct ret r;
+ void *a;
+ struct s a2;
+
+ r = c (s1, &t5);
+ if (r.b)
+ return f2 (r.s, p);
+ a = m ();
+ a2.m = &m1;
+ a2.o = a;
+ return f2 (a2, p);
+}
+
+static struct e
+f2 (struct s s2, void *p)
+{
+ struct e e1;
+
+ e1 = f3 (s2, p);
+ if (e1.t == &t2 && e1.o == 0)
+ {
+ e1.t = 0;
+ e1.o = 0;
+ }
+ return e1;
+}
+
+static struct e
+f3 (struct s s1, void *p)
+{
+ struct e r;
+
+ f4 (s1, p);
+ r.t = &t3;
+ r.o = 0;
+ return r;
+}
+
+struct s g1;
+void *g2;
+
+static void
+f4 (struct s s1, void *p)
+{
+ g1 = s1;
+ g2 = p;
+ s1.m->m ();
+}
+
+int
+main ()
+{
+ struct s s1;
+
+ s1.m = &m2;
+ s1.o = 0;
+ f1 (s1, 0);
+ abort ();
+}