diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite index 2450045b018234d01cd470491f3ef6483348b74b..4f077da488d8529c4f2d3ef8223334b72283427b 100644 --- a/gcc/ChangeLog.graphite +++ b/gcc/ChangeLog.graphite @@ -1,3 +1,13 @@ +2009-10-22 Sebastian Pop <sebastian.pop@amd.com> + + * graphite-poly.c (new_scop): Initialize SCOP_ORIGINAL_SCHEDULE, + SCOP_TRANSFORMED_SCHEDULE, and SCOP_SAVED_SCHEDULE. + (free_scop): Call free_lst on SCOP_ORIGINAL_SCHEDULE, + SCOP_TRANSFORMED_SCHEDULE, and SCOP_SAVED_SCHEDULE. + * graphite-poly.h (free_lst): New. + (store_lst_schedule): Free SCOP_SAVED_SCHEDULE. + (restore_lst_schedule): Free SCOP_TRANSFORMED_SCHEDULE. + 2009-10-22 Sebastian Pop <sebastian.pop@amd.com> * graphite-poly.h (struct scop): Add a field saved_schedule. diff --git a/gcc/graphite-poly.c b/gcc/graphite-poly.c index bed662aaf0052aec4b47cce641c24abaf2583de0..d76397a13d310404bc11efdb8f2bb3673f1ebbfc 100644 --- a/gcc/graphite-poly.c +++ b/gcc/graphite-poly.c @@ -463,6 +463,9 @@ new_scop (void *region) SCOP_BBS (scop) = VEC_alloc (poly_bb_p, heap, 3); SCOP_ORIGINAL_PDDRS (scop) = htab_create (10, hash_poly_ddr_p, eq_poly_ddr_p, free_poly_ddr); + SCOP_ORIGINAL_SCHEDULE (scop) = NULL; + SCOP_TRANSFORMED_SCHEDULE (scop) = NULL; + SCOP_SAVED_SCHEDULE (scop) = NULL; return scop; } @@ -483,6 +486,9 @@ free_scop (scop_p scop) ppl_delete_Pointset_Powerset_C_Polyhedron (SCOP_CONTEXT (scop)); htab_delete (SCOP_ORIGINAL_PDDRS (scop)); + free_lst (SCOP_ORIGINAL_SCHEDULE (scop)); + free_lst (SCOP_TRANSFORMED_SCHEDULE (scop)); + free_lst (SCOP_SAVED_SCHEDULE (scop)); XDELETE (scop); } diff --git a/gcc/graphite-poly.h b/gcc/graphite-poly.h index 3782c788463e706c93db108337bdccf60e40c8ad..0de58ba519dded8544b61db031da93f6b8617d52 100644 --- a/gcc/graphite-poly.h +++ b/gcc/graphite-poly.h @@ -670,6 +670,28 @@ new_lst_stmt (poly_bb_p pbb) return lst; } +/* Frees the memory used by LST. */ + +static inline void +free_lst (lst_p lst) +{ + if (!lst) + return; + + if (LST_LOOP_P (lst)) + { + int i; + lst_p l; + + for (i = 0; VEC_iterate (lst_p, LST_SEQ (lst), i, l); i++) + free_lst (l); + + VEC_free (lst_p, heap, LST_SEQ (lst)); + } + + free (lst); +} + /* Returns a copy of LST. */ static inline lst_p @@ -945,6 +967,9 @@ store_scattering_pbb (poly_bb_p pbb) static inline void store_lst_schedule (scop_p scop) { + if (SCOP_SAVED_SCHEDULE (scop)) + free_lst (SCOP_SAVED_SCHEDULE (scop)); + SCOP_SAVED_SCHEDULE (scop) = copy_lst (SCOP_TRANSFORMED_SCHEDULE (scop)); } @@ -953,6 +978,9 @@ store_lst_schedule (scop_p scop) static inline void restore_lst_schedule (scop_p scop) { + if (SCOP_TRANSFORMED_SCHEDULE (scop)) + free_lst (SCOP_TRANSFORMED_SCHEDULE (scop)); + SCOP_TRANSFORMED_SCHEDULE (scop) = copy_lst (SCOP_SAVED_SCHEDULE (scop)); }