------- Comment #4 from olga at gcc dot gnu dot org 2007-12-19 18:57 ------- Thank you for debugging! Now I see approximately where it fails. Although I am not sure that the following patch solves the issue, please try it, and let me know whether it helps.
Thank you a lot, Olga Index: ipa-struct-reorg.c =================================================================== --- ipa-struct-reorg.c (revision 130906) +++ ipa-struct-reorg.c (working copy) @@ -3068,6 +3068,17 @@ dump_access_sites (str->accs); } +/* Auxiliary data structure for safe_cond_expr_check callback function. */ +struct cond_check_data +{ + /* Structure declaration. */ + tree type; + + /* Vector of unsuitable types. If the type participates in unsafe + conditional expression, it will be added to this vector. */ + VEC (tree, heap) **unsuitable_types; +}; + /* 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 @@ -3077,6 +3088,7 @@ safe_cond_expr_check (void **slot, void *data) { struct access_site *acc = *(struct access_site **) slot; + struct cond_check_data dt = *(struct cond_check_data *) data; if (TREE_CODE (acc->stmt) == COND_EXPR) { @@ -3087,7 +3099,7 @@ fprintf (dump_file, "\nUnsafe conditional statement "); print_generic_stmt (dump_file, acc->stmt, 0); } - remove_structure (*(unsigned *) data); + add_unsuitable_type (dt.unsuitable_types, dt.type); } } return 1; @@ -3541,10 +3553,23 @@ { d_str str; unsigned i; + VEC (tree, heap) *unsuitable_types = VEC_alloc (tree, heap, + VEC_length (structure, + structures)); + struct cond_check_data data; + data.type = NULL_TREE; + data.unsuitable_types = &unsuitable_types; + for (i = 0; VEC_iterate (structure, structures, i, str); i++) if (str->accs) - htab_traverse (str->accs, safe_cond_expr_check, &i); + { + data.type = str->decl; + htab_traverse (str->accs, safe_cond_expr_check, &data); + } + + remove_unsuitable_types (unsuitable_types); + VEC_free (tree, heap, unsuitable_types); } /* We exclude from non-field accesses of the structure @@ -3848,6 +3873,9 @@ gcov_type hotest = 0; unsigned i; d_str str; + VEC (tree, heap) *unsuitable_types = VEC_alloc (tree, heap, + VEC_length (structure, + structures)); /* We summarize counts of fields of a structure into the structure count. */ for (i = 0; VEC_iterate (structure, structures, i, str); i++) @@ -3863,8 +3891,11 @@ print_generic_expr (dump_file, str->decl, 0); fprintf (dump_file, " is cold."); } - remove_structure (i); + add_unsuitable_type (&unsuitable_types, str->decl); } + + remove_unsuitable_types (unsuitable_types); + VEC_free (tree, heap, unsuitable_types); } /* This function decomposes original structure into substructures, -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34472