OSDN Git Service

PR tree-optimization/55238
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 11 Nov 2012 19:35:27 +0000 (19:35 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 11 Nov 2012 19:35:27 +0000 (19:35 +0000)
* 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

gcc/ChangeLog
gcc/ipa-cp.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr55238.c [new file with mode: 0644]

index 8149a85..3e9c017 100644 (file)
@@ -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
index 764c931..85d549a 100644 (file)
@@ -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
index d20dd7b..d1d3389 100644 (file)
@@ -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 (file)
index 0000000..40aafc6
--- /dev/null
@@ -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);
+}