aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2012-11-11 20:35:27 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2012-11-11 19:35:27 +0000
commit324e93f12ecb6577e789bb6f0ab5abc95fcdb0cc (patch)
treed3c3d92c626c4d6c6991b65bf3eb6d345c5c5c85
parentebbcbc2ed315384e2689ffcaf6141febb9e01765 (diff)
downloadgcc-324e93f12ecb6577e789bb6f0ab5abc95fcdb0cc.zip
gcc-324e93f12ecb6577e789bb6f0ab5abc95fcdb0cc.tar.gz
gcc-324e93f12ecb6577e789bb6f0ab5abc95fcdb0cc.tar.bz2
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
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/ipa-cp.c53
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr55238.c44
4 files changed, 94 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8149a85..3e9c017 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 764c931..85d549a 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 d20dd7b..d1d3389 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 0000000..40aafc6
--- /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);
+}