diff options
author | Martin Jambor <mjambor@suse.cz> | 2014-09-03 16:16:54 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2014-09-03 16:16:54 +0200 |
commit | 6f9549ee682082ec99fac4d73626fc8fc6f5f73b (patch) | |
tree | ec00253dce4e388b8c159005e098a36d3a0baf5a /gcc/ipa-cp.c | |
parent | 2b3ae5d12a3f6cdb9008d77eb18fddb1344ce1bb (diff) | |
download | gcc-6f9549ee682082ec99fac4d73626fc8fc6f5f73b.zip gcc-6f9549ee682082ec99fac4d73626fc8fc6f5f73b.tar.gz gcc-6f9549ee682082ec99fac4d73626fc8fc6f5f73b.tar.bz2 |
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
Diffstat (limited to 'gcc/ipa-cp.c')
-rw-r--r-- | gcc/ipa-cp.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 44d4c9a..58121d4 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -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; } |