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
This commit is contained in:
parent
ebbcbc2ed3
commit
324e93f12e
4 changed files with 94 additions and 17 deletions
|
@ -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
|
||||
|
|
53
gcc/ipa-cp.c
53
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
|
||||
|
|
|
@ -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.
|
||||
|
|
44
gcc/testsuite/gcc.dg/torture/pr55238.c
Normal file
44
gcc/testsuite/gcc.dg/torture/pr55238.c
Normal file
|
@ -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);
|
||||
}
|
Loading…
Add table
Reference in a new issue