Commit 324e93f1 by Martin Jambor Committed by Jan Hubicka

re PR tree-optimization/55238 (ICE in find_aggregate_values_for_callers_subset,…

re PR tree-optimization/55238 (ICE in find_aggregate_values_for_callers_subset, at ipa-cp.c:2908 building zlib)

	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.

From-SVN: r193410
parent ebbcbc2e
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> 2012-11-10 Uros Bizjak <ubizjak@gmail.com>
PR target/47440 PR target/47440
...@@ -1312,6 +1312,19 @@ merge_aggregate_lattices (struct cgraph_edge *cs, ...@@ -1312,6 +1312,19 @@ merge_aggregate_lattices (struct cgraph_edge *cs,
return ret; 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 /* Propagate scalar values across jump function JFUNC that is associated with
edge CS and put the values into DEST_LAT. */ edge CS and put the values into DEST_LAT. */
...@@ -1333,9 +1346,7 @@ propagate_aggs_accross_jump_function (struct cgraph_edge *cs, ...@@ -1333,9 +1346,7 @@ propagate_aggs_accross_jump_function (struct cgraph_edge *cs,
struct ipcp_param_lattices *src_plats; struct ipcp_param_lattices *src_plats;
src_plats = ipa_get_parm_lattices (caller_info, src_idx); src_plats = ipa_get_parm_lattices (caller_info, src_idx);
if (src_plats->aggs if (agg_pass_through_permissible_p (src_plats, jfunc))
&& (!src_plats->aggs_by_ref
|| ipa_get_jf_pass_through_agg_preserved (jfunc)))
{ {
/* Currently we do not produce clobber aggregate jump /* Currently we do not produce clobber aggregate jump
functions, replace with merging when we do. */ functions, replace with merging when we do. */
...@@ -2893,23 +2904,33 @@ find_aggregate_values_for_callers_subset (struct cgraph_node *node, ...@@ -2893,23 +2904,33 @@ find_aggregate_values_for_callers_subset (struct cgraph_node *node,
if (caller_info->ipcp_orig_node) if (caller_info->ipcp_orig_node)
{ {
if (!inter) struct cgraph_node *orig_node = caller_info->ipcp_orig_node;
inter = agg_replacements_to_vector (cs->caller, 0); struct ipcp_param_lattices *orig_plats;
else orig_plats = ipa_get_parm_lattices (IPA_NODE_REF (orig_node),
intersect_with_agg_replacements (cs->caller, src_idx, src_idx);
&inter, 0); 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 else
{ {
struct ipcp_param_lattices *src_plats; struct ipcp_param_lattices *src_plats;
src_plats = ipa_get_parm_lattices (caller_info, src_idx); src_plats = ipa_get_parm_lattices (caller_info, src_idx);
/* Currently we do not produce clobber aggregate jump if (agg_pass_through_permissible_p (src_plats, jfunc))
functions, adjust when we do. */ {
gcc_checking_assert (!jfunc->agg.items); /* Currently we do not produce clobber aggregate jump
if (!inter) functions, adjust when we do. */
inter = copy_plats_to_inter (src_plats, 0); gcc_checking_assert (!jfunc->agg.items);
else if (!inter)
intersect_with_plats (src_plats, &inter, 0); inter = copy_plats_to_inter (src_plats, 0);
else
intersect_with_plats (src_plats, &inter, 0);
}
} }
} }
else if (jfunc->type == IPA_JF_ANCESTOR else if (jfunc->type == IPA_JF_ANCESTOR
...@@ -2933,7 +2954,7 @@ find_aggregate_values_for_callers_subset (struct cgraph_node *node, ...@@ -2933,7 +2954,7 @@ find_aggregate_values_for_callers_subset (struct cgraph_node *node,
src_plats = ipa_get_parm_lattices (caller_info, src_idx);; src_plats = ipa_get_parm_lattices (caller_info, src_idx);;
/* Currently we do not produce clobber aggregate jump /* Currently we do not produce clobber aggregate jump
functions, adjust when we do. */ functions, adjust when we do. */
gcc_checking_assert (!jfunc->agg.items); gcc_checking_assert (!src_plats->aggs || !jfunc->agg.items);
if (!inter) if (!inter)
inter = copy_plats_to_inter (src_plats, delta); inter = copy_plats_to_inter (src_plats, delta);
else else
......
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*. * 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-1.c: Likewise.
* c-c++-common/torture/vector-subscript-2.c: Likewise. * c-c++-common/torture/vector-subscript-2.c: Likewise.
......
/* { 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment