]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/34472 (gcc.dg/struct/wo_prof_malloc_size_var.c doesn't work)
authorRichard Sandiford <rsandifo@nildram.co.uk>
Thu, 24 Jan 2008 17:46:31 +0000 (17:46 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 24 Jan 2008 17:46:31 +0000 (17:46 +0000)
gcc/
PR tree-optimization/34472
* ipa-struct-reorg.c (safe_cond_expr_check): Change the DATA
parameter to a "bool *" and set *DATA to false if there is
an unsafe access.  Do not delete the structure here.
(check_cond_exprs): Delete it here instead.
(check_cond_exprs, exclude_cold_structs): Do not increase
I when removing a structure.

From-SVN: r131798

gcc/ChangeLog
gcc/ipa-struct-reorg.c

index 6b4689aeb5473c6a3dd21d795f93b83258c37842..d4d310cd488764fa85feeb913a6ef05cfd576687 100644 (file)
@@ -1,3 +1,13 @@
+2008-01-24  Richard Sandiford  <rsandifo@nildram.co.uk>
+
+       PR tree-optimization/34472
+       * ipa-struct-reorg.c (safe_cond_expr_check): Change the DATA
+       parameter to a "bool *" and set *DATA to false if there is
+       an unsafe access.  Do not delete the structure here.
+       (check_cond_exprs): Delete it here instead.
+       (check_cond_exprs, exclude_cold_structs): Do not increase
+       I when removing a structure.
+
 2008-01-24  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/34856
index 3c90f44b6d139e2cba0abd7aff51a0bbd4d29201..04948a33c099bd18bb52332868812e12a845b6cf 100644 (file)
@@ -3074,26 +3074,24 @@ dump_accs (d_str str)
 }
 
 /* This function checks whether an access statement, pointed by SLOT,
-   is a condition we are capable to transform. If not, it removes
-   the structure with index, represented by DATA, from the vector
-   of structures.  */
+   is a condition we are capable to transform.  It returns false if not,
+   setting bool *DATA to false.  */
  
 static int
 safe_cond_expr_check (void **slot, void *data)
 {
   struct access_site *acc = *(struct access_site **) slot;
 
-  if (TREE_CODE (acc->stmt) == COND_EXPR)
+  if (TREE_CODE (acc->stmt) == COND_EXPR
+      && !is_safe_cond_expr (acc->stmt))
     {
-      if (!is_safe_cond_expr (acc->stmt))
+      if (dump_file)
        {
-         if (dump_file)
-           {
-             fprintf (dump_file, "\nUnsafe conditional statement ");
-             print_generic_stmt (dump_file, acc->stmt, 0);
-           }
-         remove_structure (*(unsigned *) data);
+         fprintf (dump_file, "\nUnsafe conditional statement ");
+         print_generic_stmt (dump_file, acc->stmt, 0);
        }
+      *(bool *) data = false;
+      return 0;
     }
   return 1;
 }
@@ -3547,9 +3545,18 @@ check_cond_exprs (void)
   d_str str;
   unsigned i;
 
-  for (i = 0; VEC_iterate (structure, structures, i, str); i++)
-    if (str->accs)
-      htab_traverse (str->accs, safe_cond_expr_check, &i);
+  i = 0;
+  while (VEC_iterate (structure, structures, i, str))
+    {
+      bool safe_p = true;
+
+      if (str->accs)
+       htab_traverse (str->accs, safe_cond_expr_check, &safe_p);
+      if (!safe_p)
+       remove_structure (i);
+      else
+       i++;
+    }
 }
 
 /* We exclude from non-field accesses of the structure 
@@ -3859,7 +3866,8 @@ exclude_cold_structs (void)
     sum_counts (str, &hotest);
 
   /* Remove cold structures from structures vector.  */
-  for (i = 0; VEC_iterate (structure, structures, i, str); i++)
+  i = 0;
+  while (VEC_iterate (structure, structures, i, str))
     if (str->count * 100 < (hotest * STRUCT_REORG_COLD_STRUCT_RATIO))
       {
        if (dump_file)
@@ -3870,6 +3878,8 @@ exclude_cold_structs (void)
          }
        remove_structure (i);
       }
+    else
+      i++;
 }
 
 /* This function decomposes original structure into substructures,