diff options
author | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2006-06-20 10:26:45 +0000 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2006-06-20 10:26:45 +0000 |
commit | 8fdbc9c6eb3bea037982fba616d96c6288f177f9 (patch) | |
tree | 8accfb5818191f82ed0722bcd3e7a5510b332100 /gcc/tree-data-ref.c | |
parent | fe5568e99010574916f5b2607a173a34f2340891 (diff) | |
download | gcc-8fdbc9c6eb3bea037982fba616d96c6288f177f9.zip gcc-8fdbc9c6eb3bea037982fba616d96c6288f177f9.tar.gz gcc-8fdbc9c6eb3bea037982fba616d96c6288f177f9.tar.bz2 |
re PR tree-optimization/27331 (segfault in fold_convert with -ftree-vectorize)
PR tree-optimization/27331
* tree-data-ref.c (free_data_ref): New function.
(create_data_ref): Fail if the data reference has unknown access
function.
(free_data_refs): Use free_data_ref.
* gcc.dg/pr27331.c: New test.
From-SVN: r114810
Diffstat (limited to 'gcc/tree-data-ref.c')
-rw-r--r-- | gcc/tree-data-ref.c | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index 57b1ac0..d3758ef 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -1854,6 +1854,18 @@ analyze_offset (tree offset, tree *invariant, tree *constant) *invariant = invariant_0 ? invariant_0 : invariant_1; } +/* 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); +} /* Function create_data_ref. @@ -1954,11 +1966,23 @@ create_data_ref (tree memref, tree stmt, bool is_read) /* 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); @@ -4373,14 +4397,7 @@ free_data_refs (VEC (data_reference_p, heap) *datarefs) 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); - } + free_data_ref (dr); VEC_free (data_reference_p, heap, datarefs); } |