> On 2014.02.04 at 17:48 +0100, Martin Jambor wrote:
> > PR 55260 has been reopened because there is still one use of wrong
> > info, this time in cgraph_edge_brings_all_agg_vals_for_node when
> > checking whether aggregate lattices are set to bottom which can lead
> > to index out of bounds assert failures or even potentially ignoring
> > bottom lattices.
> >
> > Fixed thusly. Bootstrapped and tested on trunk on x86_64-linux,
> > bootstrap is still underway on the 4.8 branch where this exact fix is
> > also necessary. OK for both?
>
> Ping.
>
> Libreoffice LTO build also fails right now because of this issue.
>
> Honza, can you take a look at this patch?
>
> Thanks.
>
> > 2014-02-03 Martin Jambor <[email protected]>
> >
> > PR ipa/55260
> > * ipa-cp.c (cgraph_edge_brings_all_agg_vals_for_node): Uce correct
> > info when checking whether lattices are bottom.
> >
> > testsuite/
> > * gcc.dg/ipa/pr55260.c: New test.
OK, thanks!
Honza
> >
> > diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
> > index 10fa4b6..70bb33f 100644
> > --- a/gcc/ipa-cp.c
> > +++ b/gcc/ipa-cp.c
> > @@ -3178,6 +3178,7 @@ cgraph_edge_brings_all_agg_vals_for_node (struct
> > cgraph_edge *cs,
> > struct cgraph_node *node)
> > {
> > struct ipa_node_params *orig_caller_info = IPA_NODE_REF (cs->caller);
> > + struct ipa_node_params *orig_node_info;
> > struct ipa_agg_replacement_value *aggval;
> > int i, ec, count;
> >
> > @@ -3192,6 +3193,7 @@ cgraph_edge_brings_all_agg_vals_for_node (struct
> > cgraph_edge *cs,
> > if (aggval->index >= ec)
> > return false;
> >
> > + orig_node_info = IPA_NODE_REF (IPA_NODE_REF (node)->ipcp_orig_node);
> > if (orig_caller_info->ipcp_orig_node)
> > orig_caller_info = IPA_NODE_REF (orig_caller_info->ipcp_orig_node);
> >
> > @@ -3209,7 +3211,7 @@ cgraph_edge_brings_all_agg_vals_for_node (struct
> > cgraph_edge *cs,
> > if (!interesting)
> > continue;
> >
> > - plats = ipa_get_parm_lattices (orig_caller_info, aggval->index);
> > + plats = ipa_get_parm_lattices (orig_node_info, aggval->index);
> > if (plats->aggs_bottom)
> > return false;
> >
> > diff --git a/gcc/testsuite/gcc.dg/ipa/pr55260.c
> > b/gcc/testsuite/gcc.dg/ipa/pr55260.c
> > new file mode 100644
> > index 0000000..ef151b0
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.dg/ipa/pr55260.c
> > @@ -0,0 +1,38 @@
> > +/* { dg-do compile } */
> > +/* { dg-options "-O2 -fno-inline -fipa-cp-clone" } */
> > +
> > +typedef struct {
> > + int *ptr;
> > + int len;
> > +} string;
> > +typedef struct {
> > + string nantstr;
> > + int *nant;
> > +} malv;
> > +typedef struct {
> > + int *nor;
> > +} list_heads;
> > +int b;
> > +list_heads *fn1(string, int *, unsigned);
> > +void fn2(malv *p1, list_heads *p2, unsigned p3) {
> > + string a = p1->nantstr;
> > + fn1(a, p1->nant, p3);
> > +}
> > +
> > +void fn3(unsigned p1) { fn2(0, 0, p1); }
> > +
> > +list_heads *fn1(string p1, int *p2, unsigned p3) {
> > + while (1) {
> > + if (p3)
> > + fn3(1);
> > + if (b)
> > + return 0;
> > + fn3(1);
> > + }
> > +}
> > +
> > +void fn5() {
> > + list_heads c;
> > + c.nor = 0;
> > + fn2(0, &c, 1);
> > +}
> >
>
> --
> Markus