diff options
author | Martin Jambor <mjambor@suse.cz> | 2012-11-13 19:56:24 +0100 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2012-11-13 19:56:24 +0100 |
commit | 3e452a2871fda4d89e4eb11f7e5cb42de2f7c27a (patch) | |
tree | 2e4305eb8f869415fd2d6f9a8ac881faca13b49e | |
parent | d10e419bebe07f5506836ea65ab7638321305305 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ipa-cp.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr55253.c | 48 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr55305.c | 151 |
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 (); +} |