]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR pch/53880
authorsteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 31 Jul 2012 09:20:56 +0000 (09:20 +0000)
committersteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 31 Jul 2012 09:20:56 +0000 (09:20 +0000)
* gengtype.c (struct walk_type_data): Add have_this_obj field.
(walk_type): For functions that take a this_obj argument and
that process fields with a GTY((length)) argument, write the
test that write_types_local_process_field will write also at the
head of the loop, effectively unswitching the loop.
(write_func_for_structure, write_local_func_for_structure): Clear
have_this_obj before calling walk_type.
(write_local_func_for_structure): Set have_this_obj before walk_type.
(write_array): Set have_this_obj for output of local pointer walking
functions but not for marker functions.
(write_types_local_process_field): Assert have_this_obj is set.

* rtl.h (simplify_using_condition): Adjust prototype using bitmap
from coretypes.h.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@189999 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gengtype.c
gcc/rtl.h

index 6dd21ec6b55337ecf0d4c19d9fad7c13a05be2fe..4229a2255f80644e74723c3248dbf72d78ac4f07 100644 (file)
@@ -1,3 +1,21 @@
+2012-07-31  Steven Bosscher  <steven@gcc.gnu.org>
+
+       PR pch/53880
+       * gengtype.c (struct walk_type_data): Add have_this_obj field.
+       (walk_type): For functions that take a this_obj argument and
+       that process fields with a GTY((length)) argument, write the
+       test that write_types_local_process_field will write also at the
+       head of the loop, effectively unswitching the loop.
+       (write_func_for_structure, write_local_func_for_structure): Clear
+       have_this_obj before calling walk_type.
+       (write_local_func_for_structure): Set have_this_obj before walk_type.
+       (write_array): Set have_this_obj for output of local pointer walking
+       functions but not for marker functions.
+       (write_types_local_process_field): Assert have_this_obj is set.
+
+       * rtl.h (simplify_using_condition): Adjust prototype using bitmap
+       from coretypes.h.
+
 2012-07-30  Nathan Froyd  <froydnj@gcc.gnu.org>
 
 
index ecb8378207ebb0b7f5ca15e26821a17a4d1c4b75..a4aa72554bed719fe2b178c40bba12b2245c76ab 100644 (file)
@@ -2303,6 +2303,7 @@ struct walk_type_data
   bool fn_wants_lvalue;
   bool in_record_p;
   int loopcounter;
+  bool have_this_obj;
 };
 
 /* Print a mangled name representing T to OF.  */
@@ -2618,6 +2619,9 @@ walk_type (type_p t, struct walk_type_data *d)
              output_escaped_param (d, length, "length");
            else
              oprintf (d->of, "l%d", loopcounter);
+           if (d->have_this_obj)
+             /* Try to unswitch loops (see PR53880).  */
+             oprintf (d->of, ") && ((void *)%s == this_obj", oldval);
            oprintf (d->of, "); i%d++) {\n", loopcounter);
            d->indent += 2;
            d->val = newval = xasprintf ("%s[i%d]", oldval, loopcounter);
@@ -3105,6 +3109,7 @@ write_func_for_structure (type_p orig_s, type_p s, type_p *param,
   d.prev_val[1] = "not valid postage"; /* Guarantee an error.  */
   d.prev_val[3] = "x";
   d.val = "(*x)";
+  d.have_this_obj = false;
 
   oprintf (d.of, "\n");
   oprintf (d.of, "void\n");
@@ -3400,6 +3405,7 @@ static const struct write_types_data pch_wtd = {
 static void
 write_types_local_process_field (type_p f, const struct walk_type_data *d)
 {
+  gcc_assert (d->have_this_obj);
   switch (f->kind)
     {
     case TYPE_POINTER:
@@ -3458,6 +3464,7 @@ write_local_func_for_structure (const_type_p orig_s, type_p s, type_p *param)
           s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag,
           s->kind == TYPE_UNION ? "union" : "struct", s->u.s.tag);
   d.indent = 2;
+  d.have_this_obj = true;
   walk_type (s, &d);
   oprintf (d.of, "}\n");
 }
@@ -3967,6 +3974,7 @@ write_array (outf_p f, pair_p v, const struct write_types_data *wtd)
       oprintf (d.of, "{\n");
       d.prev_val[0] = d.prev_val[1] = d.prev_val[2] = d.val = v->name;
       d.process_field = write_types_local_process_field;
+      d.have_this_obj = true;
       walk_type (v->type, &d);
       oprintf (f, "}\n\n");
     }
@@ -3978,6 +3986,7 @@ write_array (outf_p f, pair_p v, const struct write_types_data *wtd)
   oprintf (f, "{\n");
   d.prev_val[0] = d.prev_val[1] = d.prev_val[2] = d.val = v->name;
   d.process_field = write_types_process_field;
+  d.have_this_obj = false;
   walk_type (v->type, &d);
   free (prevval3);
   oprintf (f, "}\n\n");
index f942c5903b7cb3c70fd84d0cce160e2d28d47cd4..b611fbeda5e42167e87da8cb2f3cc6630099b5b1 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2620,7 +2620,7 @@ extern rtx compare_and_jump_seq (rtx, rtx, enum rtx_code, rtx, int, rtx);
 
 /* In loop-iv.c  */
 extern rtx canon_condition (rtx);
-extern void simplify_using_condition (rtx, rtx *, struct bitmap_head_def *);
+extern void simplify_using_condition (rtx, rtx *, bitmap);
 
 /* In final.c  */
 extern unsigned int compute_alignments (void);