This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PR 34472: Fix use-after-free() and VEC iteration bugs in ipa-struct-reorg


"Richard Guenther" <richard.guenther@gmail.com> writes:
> On Jan 24, 2008 2:05 PM, Olga Golovanevsky <OLGA@il.ibm.com> wrote:
>> Richard Sandiford wrote on 10/01/2008 13:25:55:
>>
>> > The PR is about existing testsuite FAILs that only show up on some
>> > host/target combinations.
>>
>> After the Andreas' patch that solves execution failures
>>
>> http://gcc.gnu.org/ml/gcc-patches/2008-01/msg01081.html
>>
>> this patch is ok for me with the comments below and Eric's comment.
>>
>> Ok for mainline?
>
> Ok.

Thanks.

>> > gcc/
>> >    PR rtl-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.  Do not increase I
>> >    when removing a structure.
>> >    (exclude_cold_structs): Do not increase I when removing a structure.
>>
>> You can unite two functions with the same change:
>>
>>     (check_cond_exprs, exclude_cold_structs): Do not increase I when
>>     removing a structure
...
>> > @@ -3542,9 +3540,17 @@ 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;
>>
>> empty line here.
>>
>> > +      if (str->accs)
>> > +   htab_traverse (str->accs, safe_cond_expr_check, &safe_p);
>> > +      if (!safe_p)
>> > +   remove_structure (i);
>> > +      else
>> > +   i++;
>> > +    }
>> >  }

OK, here's what I applied.

Richard


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.

Index: gcc/ipa-struct-reorg.c
===================================================================
--- gcc/ipa-struct-reorg.c	2008-01-24 17:44:35.000000000 +0000
+++ gcc/ipa-struct-reorg.c	2008-01-24 17:44:45.000000000 +0000
@@ -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, 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]