aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-data-ref.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2006-10-06 18:57:27 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2006-10-06 18:57:27 +0200
commit3ac571201309b925c13eebe0a140b20f93dbf4b1 (patch)
treeac2555c908e09e415f6469a5dbdd8f4a4c0500b8 /gcc/tree-data-ref.c
parentc66475078ce85978489b9da5a19ebf21697f2b0d (diff)
downloadgcc-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.c31
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);
}