diff options
author | Jakub Jelinek <jakub@redhat.com> | 2006-10-06 18:57:27 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2006-10-06 18:57:27 +0200 |
commit | 3ac571201309b925c13eebe0a140b20f93dbf4b1 (patch) | |
tree | ac2555c908e09e415f6469a5dbdd8f4a4c0500b8 /gcc/tree-data-ref.c | |
parent | c66475078ce85978489b9da5a19ebf21697f2b0d (diff) | |
download | gcc-3ac571201309b925c13eebe0a140b20f93dbf4b1.zip gcc-3ac571201309b925c13eebe0a140b20f93dbf4b1.tar.gz gcc-3ac571201309b925c13eebe0a140b20f93dbf4b1.tar.bz2 |
re PR tree-optimization/29330 (-O -ftree-loop-linear --> virtual memory exhausted)
PR tree-optimization/29330
* tree-data-ref.c (free_data_ref): Use DR_FREE_ACCESS_FNS macro.
(initialize_data_dependence_relation): Clear DDR_LOOP_NEST pointer
on newly allocated ddrs.
(find_loop_nest_1, find_loop_nest): Change LOOP_NEST to a pointer
to VEC (loop_p, heap) pointer.
(compute_data_dependences_for_loop): Adjust caller.
(free_dependence_relations): Free DDR_LOOP_NEST.
* tree-loop-linear.c (linear_transform_loops): Don't forget to
free DEPENDENCE_RELATIONS and DATAREFS.
* gcc.dg/pr29330.c: New test.
From-SVN: r117509
Diffstat (limited to 'gcc/tree-data-ref.c')
-rw-r--r-- | gcc/tree-data-ref.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index 30d745a..2e47a25 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -1913,11 +1913,7 @@ analyze_offset (tree offset, tree *invariant, tree *constant) 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); - + DR_FREE_ACCESS_FNS (dr); free (dr); } @@ -2171,6 +2167,7 @@ initialize_data_dependence_relation (struct data_reference *a, res = XNEW (struct data_dependence_relation); DDR_A (res) = a; DDR_B (res) = b; + DDR_LOOP_NEST (res) = NULL; if (a == NULL || b == NULL) { @@ -4205,7 +4202,7 @@ find_data_references_in_loop (struct loop *loop, /* Recursive helper function. */ static bool -find_loop_nest_1 (struct loop *loop, VEC (loop_p, heap) *loop_nest) +find_loop_nest_1 (struct loop *loop, VEC (loop_p, heap) **loop_nest) { /* Inner loops of the nest should not contain siblings. Example: when there are two consecutive loops, @@ -4224,7 +4221,7 @@ find_loop_nest_1 (struct loop *loop, VEC (loop_p, heap) *loop_nest) if (loop->next) return false; - VEC_safe_push (loop_p, heap, loop_nest, loop); + VEC_safe_push (loop_p, heap, *loop_nest, loop); if (loop->inner) return find_loop_nest_1 (loop->inner, loop_nest); return true; @@ -4236,9 +4233,9 @@ find_loop_nest_1 (struct loop *loop, VEC (loop_p, heap) *loop_nest) appear in the classic distance vector. */ static bool -find_loop_nest (struct loop *loop, VEC (loop_p, heap) *loop_nest) +find_loop_nest (struct loop *loop, VEC (loop_p, heap) **loop_nest) { - VEC_safe_push (loop_p, heap, loop_nest, loop); + VEC_safe_push (loop_p, heap, *loop_nest, loop); if (loop->inner) return find_loop_nest_1 (loop->inner, loop_nest); return true; @@ -4265,7 +4262,7 @@ compute_data_dependences_for_loop (struct loop *loop, is not computable, give up without spending time to compute other dependences. */ if (!loop_nest - || !find_loop_nest (loop_nest, vloops) + || !find_loop_nest (loop_nest, &vloops) || find_data_references_in_loop (loop, datarefs) == chrec_dont_know) { struct data_dependence_relation *ddr; @@ -4435,10 +4432,22 @@ free_dependence_relations (VEC (ddr_p, heap) *dependence_relations) { unsigned int i; struct data_dependence_relation *ddr; + VEC (loop_p, heap) *loop_nest = NULL; for (i = 0; VEC_iterate (ddr_p, dependence_relations, i, ddr); i++) - free_dependence_relation (ddr); + { + if (ddr == NULL) + continue; + if (loop_nest == NULL) + loop_nest = DDR_LOOP_NEST (ddr); + else + gcc_assert (DDR_LOOP_NEST (ddr) == NULL + || DDR_LOOP_NEST (ddr) == loop_nest); + free_dependence_relation (ddr); + } + if (loop_nest) + VEC_free (loop_p, heap, loop_nest); VEC_free (ddr_p, heap, dependence_relations); } |