aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-data-ref.c
diff options
context:
space:
mode:
authorZdenek Dvorak <rakdver@gcc.gnu.org>2006-06-20 10:26:45 +0000
committerZdenek Dvorak <rakdver@gcc.gnu.org>2006-06-20 10:26:45 +0000
commit8fdbc9c6eb3bea037982fba616d96c6288f177f9 (patch)
tree8accfb5818191f82ed0722bcd3e7a5510b332100 /gcc/tree-data-ref.c
parentfe5568e99010574916f5b2607a173a34f2340891 (diff)
downloadgcc-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.c33
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);
}