diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-11-11 19:35:27 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-11-11 19:35:27 +0000 |
commit | e3f929edd89dcfe56903b10e2e741075d6032041 (patch) | |
tree | d3c3d92c626c4d6c6991b65bf3eb6d345c5c5c85 /gcc | |
parent | 3f3e0adc3f48f86249de1b26294d91e172b2fcba (diff) | |
download | gcc-e3f929edd89dcfe56903b10e2e741075d6032041.tar.gz |
PR tree-optimization/55238
* ipa-cp.c (agg_pass_through_permissible_p): New function.
(propagate_aggs_accross_jump_function): Use it.
(find_aggregate_values_for_callers_subset): Likewise and relax an
assert.
* testsuite/gcc.dg/torture/pr55238.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@193410 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/ipa-cp.c | 53 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr55238.c | 44 |
4 files changed, 94 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8149a85288e..3e9c0174963 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2012-11-11 Martin Jambor <mjambor@suse.cz> + + PR tree-optimization/55238 + * ipa-cp.c (agg_pass_through_permissible_p): New function. + (propagate_aggs_accross_jump_function): Use it. + (find_aggregate_values_for_callers_subset): Likewise and relax an + assert. + 2012-11-10 Uros Bizjak <ubizjak@gmail.com> PR target/47440 diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 764c931439c..85d549aad89 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -1312,6 +1312,19 @@ merge_aggregate_lattices (struct cgraph_edge *cs, return ret; } +/* Determine whether there is anything to propagate FROM SRC_PLATS through a + pass-through JFUNC and if so, whether it has conform and conforms to the + rules about propagating values passed by reference. */ + +static bool +agg_pass_through_permissible_p (struct ipcp_param_lattices *src_plats, + struct ipa_jump_func *jfunc) +{ + return src_plats->aggs + && (!src_plats->aggs_by_ref + || ipa_get_jf_pass_through_agg_preserved (jfunc)); +} + /* Propagate scalar values across jump function JFUNC that is associated with edge CS and put the values into DEST_LAT. */ @@ -1333,9 +1346,7 @@ propagate_aggs_accross_jump_function (struct cgraph_edge *cs, struct ipcp_param_lattices *src_plats; src_plats = ipa_get_parm_lattices (caller_info, src_idx); - if (src_plats->aggs - && (!src_plats->aggs_by_ref - || ipa_get_jf_pass_through_agg_preserved (jfunc))) + if (agg_pass_through_permissible_p (src_plats, jfunc)) { /* Currently we do not produce clobber aggregate jump functions, replace with merging when we do. */ @@ -2893,23 +2904,33 @@ find_aggregate_values_for_callers_subset (struct cgraph_node *node, if (caller_info->ipcp_orig_node) { - if (!inter) - inter = agg_replacements_to_vector (cs->caller, 0); - else - intersect_with_agg_replacements (cs->caller, src_idx, - &inter, 0); + struct cgraph_node *orig_node = caller_info->ipcp_orig_node; + struct ipcp_param_lattices *orig_plats; + orig_plats = ipa_get_parm_lattices (IPA_NODE_REF (orig_node), + src_idx); + if (agg_pass_through_permissible_p (orig_plats, jfunc)) + { + if (!inter) + inter = agg_replacements_to_vector (cs->caller, 0); + else + intersect_with_agg_replacements (cs->caller, src_idx, + &inter, 0); + } } else { struct ipcp_param_lattices *src_plats; src_plats = ipa_get_parm_lattices (caller_info, src_idx); - /* Currently we do not produce clobber aggregate jump - functions, adjust when we do. */ - gcc_checking_assert (!jfunc->agg.items); - if (!inter) - inter = copy_plats_to_inter (src_plats, 0); - else - intersect_with_plats (src_plats, &inter, 0); + if (agg_pass_through_permissible_p (src_plats, jfunc)) + { + /* Currently we do not produce clobber aggregate jump + functions, adjust when we do. */ + gcc_checking_assert (!jfunc->agg.items); + if (!inter) + inter = copy_plats_to_inter (src_plats, 0); + else + intersect_with_plats (src_plats, &inter, 0); + } } } else if (jfunc->type == IPA_JF_ANCESTOR @@ -2933,7 +2954,7 @@ find_aggregate_values_for_callers_subset (struct cgraph_node *node, src_plats = ipa_get_parm_lattices (caller_info, src_idx);; /* Currently we do not produce clobber aggregate jump functions, adjust when we do. */ - gcc_checking_assert (!jfunc->agg.items); + gcc_checking_assert (!src_plats->aggs || !jfunc->agg.items); if (!inter) inter = copy_plats_to_inter (src_plats, delta); else diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d20dd7b38cc..d1d33896cd7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ -2012-11-11 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> +2012-11-11 Martin Jambor <mjambor@suse.cz> + + PR tree-optimization/55238 + * testsuite/gcc.dg/torture/pr55238.c: New test. +2012-11-11 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> * gcc.dg/torture/pr54920.c: Add "-fno-common" option on hppa*-*-hpux*. * c-c++-common/torture/vector-subscript-1.c: Likewise. * c-c++-common/torture/vector-subscript-2.c: Likewise. diff --git a/gcc/testsuite/gcc.dg/torture/pr55238.c b/gcc/testsuite/gcc.dg/torture/pr55238.c new file mode 100644 index 00000000000..40aafc6619c --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr55238.c @@ -0,0 +1,44 @@ +/* { dg-do compile } */ + +typedef void * gzFile; +typedef struct +{ + int mode; + int direct; + int seek; + int err; + char *msg; +} +gz_state; + +void gz_error (gz_state *state, int err, char *msg); + +static void +gz_reset (gz_state *state) +{ + if (state->mode == 7247) + { + state->direct = 1; + } + state->seek = 0; + gz_error (state, 0, 0); +} + +int +gzbuffer (void *file, int size) +{ + gz_state *state; + gz_reset (state); +} + +void __attribute__ ((visibility ("hidden"))) gz_error (gz_state *state, int err, char *msg) +{ + if (state->msg != 0) + { + if (state->err != -4) + foo (state->msg); + } + if (msg == 0) + return; + bar (state->msg, msg); +} |