Commit 3e452a28 by Martin Jambor Committed by Martin Jambor

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
parent d10e419b
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>
......@@ -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;
......
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
......
/* { 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;
}
/* { 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 ();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment