re PR ipa/61986 (ICE on valid code at -O3 on x86_64-linux-gnu indecide_about_value, at ipa-cp.c:3480)

2014-09-03  Martin Jambor  <mjambor@suse.cz>
    
	PR ipa/61986
	* ipa-cp.c (find_aggregate_values_for_callers_subset): Chain
	created replacements in ascending order of offsets.
	(known_aggs_to_agg_replacement_list): Likewise.
    
gcc/testsuite/
	* gcc.dg/ipa/pr61986.c: New test.

From-SVN: r214877
This commit is contained in:
Martin Jambor 2014-09-03 16:16:54 +02:00 committed by Martin Jambor
parent 2b3ae5d12a
commit 6f9549ee68
4 changed files with 70 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2014-09-03 Martin Jambor <mjambor@suse.cz>
PR ipa/61986
* ipa-cp.c (find_aggregate_values_for_callers_subset): Chain
created replacements in ascending order of offsets.
(known_aggs_to_agg_replacement_list): Likewise.
2014-09-03 Martin Liska <mliska@suse.cz>
* tree-ssa-sccvn.c (vn_reference_lookup_call): default (NULL) value

View File

@ -3146,7 +3146,8 @@ find_aggregate_values_for_callers_subset (struct cgraph_node *node,
vec<cgraph_edge *> callers)
{
struct ipa_node_params *dest_info = IPA_NODE_REF (node);
struct ipa_agg_replacement_value *res = NULL;
struct ipa_agg_replacement_value *res;
struct ipa_agg_replacement_value **tail = &res;
struct cgraph_edge *cs;
int i, j, count = ipa_get_param_count (dest_info);
@ -3190,14 +3191,15 @@ find_aggregate_values_for_callers_subset (struct cgraph_node *node,
v->offset = item->offset;
v->value = item->value;
v->by_ref = plats->aggs_by_ref;
v->next = res;
res = v;
*tail = v;
tail = &v->next;
}
next_param:
if (inter.exists ())
inter.release ();
}
*tail = NULL;
return res;
}
@ -3206,7 +3208,8 @@ find_aggregate_values_for_callers_subset (struct cgraph_node *node,
static struct ipa_agg_replacement_value *
known_aggs_to_agg_replacement_list (vec<ipa_agg_jump_function> known_aggs)
{
struct ipa_agg_replacement_value *res = NULL;
struct ipa_agg_replacement_value *res;
struct ipa_agg_replacement_value **tail = &res;
struct ipa_agg_jump_function *aggjf;
struct ipa_agg_jf_item *item;
int i, j;
@ -3220,9 +3223,10 @@ known_aggs_to_agg_replacement_list (vec<ipa_agg_jump_function> known_aggs)
v->offset = item->offset;
v->value = item->value;
v->by_ref = aggjf->by_ref;
v->next = res;
res = v;
*tail = v;
tail = &v->next;
}
*tail = NULL;
return res;
}

View File

@ -1,3 +1,8 @@
2014-09-03 Martin Jambor <mjambor@suse.cz>
PR ipa/61986
* gcc.dg/ipa/pr61986.c: New test.
2014-09-03 Marek Polacek <polacek@redhat.com>
PR c/62294

View File

@ -0,0 +1,48 @@
/* { dg-do compile } */
/* { dg-options "-O3" } */
int a, b, c;
struct S
{
int f0;
int f1;
} d;
static int fn2 (struct S);
void fn3 (struct S);
void
fn1 (struct S p)
{
struct S h = { 0, 0 };
fn3 (p);
fn2 (h);
}
int
fn2 (struct S p)
{
struct S j = { 0, 0 };
fn3 (p);
fn2 (j);
return 0;
}
void
fn3 (struct S p)
{
for (; b; a++)
c = p.f0;
fn1 (d);
}
void
fn4 ()
{
for (;;)
{
struct S f = { 0, 0 };
fn1 (f);
}
}