------- Comment #11 from rakdver at atrey dot karlin dot mff dot cuni dot cz 2006-06-16 08:15 ------- Subject: Re: [4.2 Regression] segfault in fold_convert with -ftree-vectorize
> You said that you had a fix in predcom, is that fix in your local > tree, or have you sent a patch to gcc-patches? The patch is in predcom branch. The relevant part (fixing also another similar bug) is below. *** tree-data-ref.c (revision 114118) --- tree-data-ref.c (working copy) *************** create_data_ref (tree memref, tree stmt, *** 1954,1964 **** --- 2009,2031 ---- /* Update access function. */ access_fn = DR_ACCESS_FN (dr, 0); + if (automatically_generated_chrec_p (access_fn)) + { + free_data_ref (dr); + return NULL; + } + new_step = size_binop (TRUNC_DIV_EXPR, fold_convert (ssizetype, step), type_size); init_cond = chrec_convert (chrec_type (access_fn), init_cond, stmt); new_step = chrec_convert (chrec_type (access_fn), new_step, stmt); + if (automatically_generated_chrec_p (init_cond) + || automatically_generated_chrec_p (new_step)) + { + free_data_ref (dr); + return NULL; + } access_fn = chrec_replace_initial_condition (access_fn, init_cond); access_fn = reset_evolution_in_loop (loop->num, access_fn, new_step); *************** free_dependence_relations (VEC (ddr_p, h *** 4364,4369 **** --- 4435,4453 ---- VEC_free (ddr_p, heap, dependence_relations); } + /* Free the memory used by the data reference DR. */ + + static void + free_data_ref (data_reference_p dr) + { + if (DR_TYPE(dr) == ARRAY_REF_TYPE) + VEC_free (tree, heap, dr->object_info.access_fns); + else + VEC_free (tree, heap, dr->first_location.access_fns); + + free (dr); + } + /* Free the memory used by the data references from DATAREFS. */ void *************** free_data_refs (VEC (data_reference_p, h *** 4373,4386 **** struct data_reference *dr; for (i = 0; VEC_iterate (data_reference_p, datarefs, i, dr); i++) ! { ! if (DR_TYPE(dr) == ARRAY_REF_TYPE) ! VEC_free (tree, heap, (dr)->object_info.access_fns); ! else ! VEC_free (tree, heap, (dr)->first_location.access_fns); ! ! free (dr); ! } VEC_free (data_reference_p, heap, datarefs); } --- 4457,4463 ---- struct data_reference *dr; for (i = 0; VEC_iterate (data_reference_p, datarefs, i, dr); i++) ! free_data_ref (dr); VEC_free (data_reference_p, heap, datarefs); } -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27331