From 986d97ed88e7abef3addb0d867dc20378f5dd290 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 24 Jan 2008 17:46:31 +0000 Subject: [PATCH] re PR tree-optimization/34472 (gcc.dg/struct/wo_prof_malloc_size_var.c doesn't work) 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 | 10 ++++++++++ gcc/ipa-struct-reorg.c | 40 +++++++++++++++++++++++++--------------- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6b4689aeb54..d4d310cd488 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2008-01-24 Richard Sandiford + + 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 PR target/34856 diff --git a/gcc/ipa-struct-reorg.c b/gcc/ipa-struct-reorg.c index 3c90f44b6d1..04948a33c09 100644 --- a/gcc/ipa-struct-reorg.c +++ b/gcc/ipa-struct-reorg.c @@ -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, -- 2.11.4.GIT