This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PR 55238] More careful pass-through handling in find_aggregate_values_for_callers_subset
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, Jan Hubicka <hubicka at ucw dot cz>
- Date: Fri, 9 Nov 2012 12:35:39 +0100
- Subject: Re: [PR 55238] More careful pass-through handling in find_aggregate_values_for_callers_subset
- References: <20121108225909.GE24044@virgil.arch.suse.de>
> Hi,
>
> when writing find_aggregate_values_for_callers_subset, I omitted a
> test that is present in propagate_aggs_accross_jump_function and that
> lead to triggering an assert in the former.
>
> Fixed by moving the test into a separate predicate function in the
> following patch.
>
> Bootstrapped and tested on x86_64-linux. OK for trunk?
MThis patch looks OK. i will re-test and commit it on the afernoon.
Honza
>
> Thanks,
>
> Martin
>
>
> 2012-11-08 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.
>
> * testsuite/gcc.dg/torture/pr55238.c: New test.
>
> Index: src/gcc/ipa-cp.c
> ===================================================================
> --- src.orig/gcc/ipa-cp.c
> +++ src/gcc/ipa-cp.c
> @@ -1312,6 +1312,19 @@ merge_aggregate_lattices (struct cgraph_
> 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 (st
> 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
>
> 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
> 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
> Index: src/gcc/testsuite/gcc.dg/torture/pr55238.c
> ===================================================================
> --- /dev/null
> +++ src/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);
> +}