diff options
| author | jamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-09-03 16:13:03 +0000 |
|---|---|---|
| committer | jamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-09-03 16:13:03 +0000 |
| commit | 4a0e28ec29aa5eb2f9f01ea04c0c04fa41e0f29b (patch) | |
| tree | 1f998c5b0389b4b51976ab98ce22134dc21ef1c1 | |
| parent | b8afe08b450be237a071024ca732ed39f68d0331 (diff) | |
| download | ppe42-gcc-4a0e28ec29aa5eb2f9f01ea04c0c04fa41e0f29b.tar.gz ppe42-gcc-4a0e28ec29aa5eb2f9f01ea04c0c04fa41e0f29b.zip | |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@214882 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ChangeLog | 7 | ||||
| -rw-r--r-- | gcc/ipa-cp.c | 16 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/gcc.dg/ipa/pr61986.c | 48 |
4 files changed, 70 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a3d3dd30ed5..c3b59ef44ef 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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-02 Kaz Kojima <kkojima@gcc.gnu.org> Backport from mainline diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 52d37fb3bdf..c1c1782e358 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -3130,7 +3130,8 @@ find_aggregate_values_for_callers_subset (struct cgraph_node *node, vec<cgraph_edge_p> 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); @@ -3174,14 +3175,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; } @@ -3190,7 +3192,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; @@ -3204,9 +3207,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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index edb91caa2e0..055a7d27c89 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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> Backport from mainline diff --git a/gcc/testsuite/gcc.dg/ipa/pr61986.c b/gcc/testsuite/gcc.dg/ipa/pr61986.c new file mode 100644 index 00000000000..8d2f658b87c --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/pr61986.c @@ -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); + } +} |

