diff mbox

Fix PR47127: call cloog_state_malloc and cloog_state_free only once.

Message ID 1299879529-9652-1-git-send-email-sebpop@gmail.com
State New
Headers show

Commit Message

Sebastian Pop March 11, 2011, 9:38 p.m. UTC
Hi,

we currently call cloog_state_malloc and cloog_state_free too many
times.  In CLooG-Parma, these functions contain the init and fini
functions of PPL, and so calling these in the middle of graphite would
finalize all the PPL data structures, leading to memory corruption.

This patch fixes this problem.  It passed make -k check
RUNTESTFLAGS=graphite.exp with CLooG-ISL and CLooG-Parma (with only
one ICE remaining as reported in http://gcc.gnu.org/PR47128 ).  Full
regstrap with CLooG-ISL in progress on amd64-linux.  Ok for trunk?

Thanks,
Sebastian

2011-03-11  Sebastian Pop  <sebastian.pop@amd.com>

	PR tree-optimization/47127
	* graphite-clast-to-gimple.c (build_cloog_prog): Removed state
	parameter.
	(set_cloog_options): Same.
	(scop_to_clast): Same.
	(print_clast_stmt): Do not call cloog_state_malloc and
	cloog_state_free.
	(print_generated_program): Same.
	(gloog): Same.
	* graphite-clast-to-gimple.h (cloog_state): Declared.
	(scop_to_clast): Adjust declaration.
	* graphite.c (cloog_state): Defined here.
	(graphite_initialize): Call cloog_state_malloc.
	(graphite_finalize): Call cloog_state_free.
---
 gcc/ChangeLog                  |   17 +++++++++++++++++
 gcc/graphite-clast-to-gimple.c |   37 +++++++++++++++----------------------
 gcc/graphite-clast-to-gimple.h |    7 +++++--
 gcc/graphite.c                 |    4 ++++
 4 files changed, 41 insertions(+), 24 deletions(-)

Comments

Richard Biener March 12, 2011, 12:18 a.m. UTC | #1
On Fri, Mar 11, 2011 at 10:38 PM, Sebastian Pop <sebpop@gmail.com> wrote:
> Hi,
>
> we currently call cloog_state_malloc and cloog_state_free too many
> times.  In CLooG-Parma, these functions contain the init and fini
> functions of PPL, and so calling these in the middle of graphite would
> finalize all the PPL data structures, leading to memory corruption.
>
> This patch fixes this problem.  It passed make -k check
> RUNTESTFLAGS=graphite.exp with CLooG-ISL and CLooG-Parma (with only
> one ICE remaining as reported in http://gcc.gnu.org/PR47128 ).  Full
> regstrap with CLooG-ISL in progress on amd64-linux.  Ok for trunk?

Ok.

Thanks,
Richard.

> Thanks,
> Sebastian
>
> 2011-03-11  Sebastian Pop  <sebastian.pop@amd.com>
>
>        PR tree-optimization/47127
>        * graphite-clast-to-gimple.c (build_cloog_prog): Removed state
>        parameter.
>        (set_cloog_options): Same.
>        (scop_to_clast): Same.
>        (print_clast_stmt): Do not call cloog_state_malloc and
>        cloog_state_free.
>        (print_generated_program): Same.
>        (gloog): Same.
>        * graphite-clast-to-gimple.h (cloog_state): Declared.
>        (scop_to_clast): Adjust declaration.
>        * graphite.c (cloog_state): Defined here.
>        (graphite_initialize): Call cloog_state_malloc.
>        (graphite_finalize): Call cloog_state_free.
> ---
>  gcc/ChangeLog                  |   17 +++++++++++++++++
>  gcc/graphite-clast-to-gimple.c |   37 +++++++++++++++----------------------
>  gcc/graphite-clast-to-gimple.h |    7 +++++--
>  gcc/graphite.c                 |    4 ++++
>  4 files changed, 41 insertions(+), 24 deletions(-)
>
> diff --git a/gcc/ChangeLog b/gcc/ChangeLog
> index 3f58172..76ebc1a 100644
> --- a/gcc/ChangeLog
> +++ b/gcc/ChangeLog
> @@ -1,3 +1,20 @@
> +2011-03-11  Sebastian Pop  <sebastian.pop@amd.com>
> +
> +       PR tree-optimization/47127
> +       * graphite-clast-to-gimple.c (build_cloog_prog): Removed state
> +       parameter.
> +       (set_cloog_options): Same.
> +       (scop_to_clast): Same.
> +       (print_clast_stmt): Do not call cloog_state_malloc and
> +       cloog_state_free.
> +       (print_generated_program): Same.
> +       (gloog): Same.
> +       * graphite-clast-to-gimple.h (cloog_state): Declared.
> +       (scop_to_clast): Adjust declaration.
> +       * graphite.c (cloog_state): Defined here.
> +       (graphite_initialize): Call cloog_state_malloc.
> +       (graphite_finalize): Call cloog_state_free.
> +
>  2011-03-02  Richard Sandiford  <richard.sandiford@linaro.org>
>
>        PR rtl-optimization/47925
> diff --git a/gcc/graphite-clast-to-gimple.c b/gcc/graphite-clast-to-gimple.c
> index 47a03d5..41356dc 100644
> --- a/gcc/graphite-clast-to-gimple.c
> +++ b/gcc/graphite-clast-to-gimple.c
> @@ -1236,7 +1236,7 @@ init_cloog_input_file (int scop_number)
>
>  static void
>  build_cloog_prog (scop_p scop, CloogProgram *prog,
> -                  CloogOptions *options, CloogState *state ATTRIBUTE_UNUSED)
> +                  CloogOptions *options)
>  {
>   int i;
>   int max_nb_loops = scop_max_loop_depth (scop);
> @@ -1249,7 +1249,7 @@ build_cloog_prog (scop_p scop, CloogProgram *prog,
>
>   cloog_program_set_context
>     (prog, new_Cloog_Domain_from_ppl_Pointset_Powerset (SCOP_CONTEXT (scop),
> -      scop_nb_params (scop), state));
> +      scop_nb_params (scop), cloog_state));
>   nbs = unify_scattering_dimensions (scop);
>   scaldims = (int *) xmalloc (nbs * (sizeof (int)));
>   cloog_program_set_nb_scattdims (prog, nbs);
> @@ -1267,16 +1267,16 @@ build_cloog_prog (scop_p scop, CloogProgram *prog,
>        continue;
>
>       /* Build the new statement and its block.  */
> -      stmt = cloog_statement_alloc (state, pbb_index (pbb));
> +      stmt = cloog_statement_alloc (cloog_state, pbb_index (pbb));
>       dom = new_Cloog_Domain_from_ppl_Pointset_Powerset (PBB_DOMAIN (pbb),
>                                                          scop_nb_params (scop),
> -                                                         state);
> +                                                         cloog_state);
>       block = cloog_block_alloc (stmt, 0, NULL, pbb_dim_iter_domain (pbb));
>       cloog_statement_set_usr (stmt, pbb);
>
>       /* Build loop list.  */
>       {
> -        CloogLoop *new_loop_list = cloog_loop_malloc (state);
> +        CloogLoop *new_loop_list = cloog_loop_malloc (cloog_state);
>         cloog_loop_set_next (new_loop_list, loop_list);
>         cloog_loop_set_domain (new_loop_list, dom);
>         cloog_loop_set_block (new_loop_list, block);
> @@ -1303,7 +1303,7 @@ build_cloog_prog (scop_p scop, CloogProgram *prog,
>        scat = PBB_TRANSFORMED_SCATTERING (pbb);
>         dom = new_Cloog_Scattering_from_ppl_Polyhedron
>           (scat, scop_nb_params (scop), pbb_nb_scattering_transform (pbb),
> -           state);
> +           cloog_state);
>
>         cloog_set_next_scattering (new_scattering, scattering);
>         cloog_set_scattering (new_scattering, dom);
> @@ -1360,9 +1360,9 @@ build_cloog_prog (scop_p scop, CloogProgram *prog,
>  /* Return the options that will be used in GLOOG.  */
>
>  static CloogOptions *
> -set_cloog_options (CloogState *state ATTRIBUTE_UNUSED)
> +set_cloog_options (void)
>  {
> -  CloogOptions *options = cloog_options_malloc (state);
> +  CloogOptions *options = cloog_options_malloc (cloog_state);
>
>   /* Change cloog output language to C.  If we do use FORTRAN instead, cloog
>      will stop e.g. with "ERROR: unbounded loops not allowed in FORTRAN.", if
> @@ -1411,12 +1411,10 @@ set_cloog_options (CloogState *state ATTRIBUTE_UNUSED)
>  void
>  print_clast_stmt (FILE *file, struct clast_stmt *stmt)
>  {
> -  CloogState *state = cloog_state_malloc ();
> -  CloogOptions *options = set_cloog_options (state);
> +  CloogOptions *options = set_cloog_options ();
>
>   clast_pprint (file, stmt, 0, options);
>   cloog_options_free (options);
> -  cloog_state_free (state);
>  }
>
>  /* Prints STMT to STDERR.  */
> @@ -1432,14 +1430,14 @@ debug_clast_stmt (struct clast_stmt *stmt)
>    without a program.  */
>
>  cloog_prog_clast
> -scop_to_clast (scop_p scop, CloogState *state)
> +scop_to_clast (scop_p scop)
>  {
> -  CloogOptions *options = set_cloog_options (state);
> +  CloogOptions *options = set_cloog_options ();
>   cloog_prog_clast pc;
>
>   /* Connect new cloog prog generation to graphite.  */
>   pc.prog = cloog_program_malloc ();
> -  build_cloog_prog (scop, pc.prog, options, state);
> +  build_cloog_prog (scop, pc.prog, options);
>   pc.prog = cloog_program_generate (pc.prog, options);
>   pc.stmt = cloog_clast_create (pc.prog, options);
>
> @@ -1452,10 +1450,9 @@ scop_to_clast (scop_p scop, CloogState *state)
>  void
>  print_generated_program (FILE *file, scop_p scop)
>  {
> -  CloogState *state = cloog_state_malloc ();
> -  CloogOptions *options = set_cloog_options (state);
> +  CloogOptions *options = set_cloog_options ();
>
> -  cloog_prog_clast pc = scop_to_clast (scop, state);
> +  cloog_prog_clast pc = scop_to_clast (scop);
>
>   fprintf (file, "       (prog: \n");
>   cloog_program_print (file, pc.prog);
> @@ -1506,13 +1503,11 @@ gloog (scop_p scop, htab_t bb_pbb_mapping)
>   ifsese if_region = NULL;
>   htab_t newivs_index, params_index;
>   cloog_prog_clast pc;
> -  CloogState *state;
>
> -  state = cloog_state_malloc ();
>   timevar_push (TV_GRAPHITE_CODE_GEN);
>   gloog_error = false;
>
> -  pc = scop_to_clast (scop, state);
> +  pc = scop_to_clast (scop);
>
>   if (dump_file && (dump_flags & TDF_DETAILS))
>     {
> @@ -1577,8 +1572,6 @@ gloog (scop_p scop, htab_t bb_pbb_mapping)
>               num_no_dependency);
>     }
>
> -  cloog_state_free (state);
> -
>   return !gloog_error;
>  }
>  #endif
> diff --git a/gcc/graphite-clast-to-gimple.h b/gcc/graphite-clast-to-gimple.h
> index cd3cbca..9d599d6 100644
> --- a/gcc/graphite-clast-to-gimple.h
> +++ b/gcc/graphite-clast-to-gimple.h
> @@ -22,6 +22,9 @@ along with GCC; see the file COPYING3.  If not see
>  #define GCC_GRAPHITE_CLAST_TO_GIMPLE_H
>
>  #include "graphite-cloog-util.h"
> +
> +extern CloogState *cloog_state;
> +
>  /* Data structure for CLooG program representation.  */
>
>  typedef struct cloog_prog_clast {
> @@ -35,10 +38,10 @@ typedef struct bb_pbb_def
>  {
>   basic_block bb;
>   poly_bb_p pbb;
> -}bb_pbb_def;
> +} bb_pbb_def;
>
>  extern bool gloog (scop_p, htab_t);
> -extern cloog_prog_clast scop_to_clast (scop_p, CloogState *);
> +extern cloog_prog_clast scop_to_clast (scop_p);
>  extern void debug_clast_stmt (struct clast_stmt *);
>  extern void print_clast_stmt (FILE *, struct clast_stmt *);
>
> diff --git a/gcc/graphite.c b/gcc/graphite.c
> index 70c3d46..b013447 100644
> --- a/gcc/graphite.c
> +++ b/gcc/graphite.c
> @@ -54,6 +54,8 @@ along with GCC; see the file COPYING3.  If not see
>  #include "graphite-clast-to-gimple.h"
>  #include "graphite-sese-to-poly.h"
>
> +CloogState *cloog_state;
> +
>  /* Print global statistics to FILE.  */
>
>  static void
> @@ -206,6 +208,7 @@ graphite_initialize (void)
>   ppl_initialized = ppl_initialize ();
>   gcc_assert (ppl_initialized == 0);
>
> +  cloog_state = cloog_state_malloc ();
>   cloog_initialize ();
>
>   if (dump_file && dump_flags)
> @@ -229,6 +232,7 @@ graphite_finalize (bool need_cfg_cleanup_p)
>       tree_estimate_probability ();
>     }
>
> +  cloog_state_free (cloog_state);
>   cloog_finalize ();
>   ppl_finalize ();
>   free_original_copy_tables ();
> --
> 1.7.1
>
>
>
diff mbox

Patch

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3f58172..76ebc1a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,20 @@ 
+2011-03-11  Sebastian Pop  <sebastian.pop@amd.com>
+
+	PR tree-optimization/47127
+	* graphite-clast-to-gimple.c (build_cloog_prog): Removed state
+	parameter.
+	(set_cloog_options): Same.
+	(scop_to_clast): Same.
+	(print_clast_stmt): Do not call cloog_state_malloc and
+	cloog_state_free.
+	(print_generated_program): Same.
+	(gloog): Same.
+	* graphite-clast-to-gimple.h (cloog_state): Declared.
+	(scop_to_clast): Adjust declaration.
+	* graphite.c (cloog_state): Defined here.
+	(graphite_initialize): Call cloog_state_malloc.
+	(graphite_finalize): Call cloog_state_free.
+
 2011-03-02  Richard Sandiford  <richard.sandiford@linaro.org>
 
 	PR rtl-optimization/47925
diff --git a/gcc/graphite-clast-to-gimple.c b/gcc/graphite-clast-to-gimple.c
index 47a03d5..41356dc 100644
--- a/gcc/graphite-clast-to-gimple.c
+++ b/gcc/graphite-clast-to-gimple.c
@@ -1236,7 +1236,7 @@  init_cloog_input_file (int scop_number)
 
 static void
 build_cloog_prog (scop_p scop, CloogProgram *prog,
-                  CloogOptions *options, CloogState *state ATTRIBUTE_UNUSED)
+                  CloogOptions *options)
 {
   int i;
   int max_nb_loops = scop_max_loop_depth (scop);
@@ -1249,7 +1249,7 @@  build_cloog_prog (scop_p scop, CloogProgram *prog,
 
   cloog_program_set_context
     (prog, new_Cloog_Domain_from_ppl_Pointset_Powerset (SCOP_CONTEXT (scop),
-      scop_nb_params (scop), state));
+      scop_nb_params (scop), cloog_state));
   nbs = unify_scattering_dimensions (scop);
   scaldims = (int *) xmalloc (nbs * (sizeof (int)));
   cloog_program_set_nb_scattdims (prog, nbs);
@@ -1267,16 +1267,16 @@  build_cloog_prog (scop_p scop, CloogProgram *prog,
 	continue;
 
       /* Build the new statement and its block.  */
-      stmt = cloog_statement_alloc (state, pbb_index (pbb));
+      stmt = cloog_statement_alloc (cloog_state, pbb_index (pbb));
       dom = new_Cloog_Domain_from_ppl_Pointset_Powerset (PBB_DOMAIN (pbb),
                                                          scop_nb_params (scop),
-                                                         state);
+                                                         cloog_state);
       block = cloog_block_alloc (stmt, 0, NULL, pbb_dim_iter_domain (pbb));
       cloog_statement_set_usr (stmt, pbb);
 
       /* Build loop list.  */
       {
-        CloogLoop *new_loop_list = cloog_loop_malloc (state);
+        CloogLoop *new_loop_list = cloog_loop_malloc (cloog_state);
         cloog_loop_set_next (new_loop_list, loop_list);
         cloog_loop_set_domain (new_loop_list, dom);
         cloog_loop_set_block (new_loop_list, block);
@@ -1303,7 +1303,7 @@  build_cloog_prog (scop_p scop, CloogProgram *prog,
 	scat = PBB_TRANSFORMED_SCATTERING (pbb);
         dom = new_Cloog_Scattering_from_ppl_Polyhedron
           (scat, scop_nb_params (scop), pbb_nb_scattering_transform (pbb),
-           state);
+           cloog_state);
 
         cloog_set_next_scattering (new_scattering, scattering);
         cloog_set_scattering (new_scattering, dom);
@@ -1360,9 +1360,9 @@  build_cloog_prog (scop_p scop, CloogProgram *prog,
 /* Return the options that will be used in GLOOG.  */
 
 static CloogOptions *
-set_cloog_options (CloogState *state ATTRIBUTE_UNUSED)
+set_cloog_options (void)
 {
-  CloogOptions *options = cloog_options_malloc (state);
+  CloogOptions *options = cloog_options_malloc (cloog_state);
 
   /* Change cloog output language to C.  If we do use FORTRAN instead, cloog
      will stop e.g. with "ERROR: unbounded loops not allowed in FORTRAN.", if
@@ -1411,12 +1411,10 @@  set_cloog_options (CloogState *state ATTRIBUTE_UNUSED)
 void
 print_clast_stmt (FILE *file, struct clast_stmt *stmt)
 {
-  CloogState *state = cloog_state_malloc ();
-  CloogOptions *options = set_cloog_options (state);
+  CloogOptions *options = set_cloog_options ();
 
   clast_pprint (file, stmt, 0, options);
   cloog_options_free (options);
-  cloog_state_free (state);
 }
 
 /* Prints STMT to STDERR.  */
@@ -1432,14 +1430,14 @@  debug_clast_stmt (struct clast_stmt *stmt)
    without a program.  */
 
 cloog_prog_clast
-scop_to_clast (scop_p scop, CloogState *state)
+scop_to_clast (scop_p scop)
 {
-  CloogOptions *options = set_cloog_options (state);
+  CloogOptions *options = set_cloog_options ();
   cloog_prog_clast pc;
 
   /* Connect new cloog prog generation to graphite.  */
   pc.prog = cloog_program_malloc ();
-  build_cloog_prog (scop, pc.prog, options, state);
+  build_cloog_prog (scop, pc.prog, options);
   pc.prog = cloog_program_generate (pc.prog, options);
   pc.stmt = cloog_clast_create (pc.prog, options);
 
@@ -1452,10 +1450,9 @@  scop_to_clast (scop_p scop, CloogState *state)
 void
 print_generated_program (FILE *file, scop_p scop)
 {
-  CloogState *state = cloog_state_malloc ();
-  CloogOptions *options = set_cloog_options (state);
+  CloogOptions *options = set_cloog_options ();
 
-  cloog_prog_clast pc = scop_to_clast (scop, state);
+  cloog_prog_clast pc = scop_to_clast (scop);
 
   fprintf (file, "       (prog: \n");
   cloog_program_print (file, pc.prog);
@@ -1506,13 +1503,11 @@  gloog (scop_p scop, htab_t bb_pbb_mapping)
   ifsese if_region = NULL;
   htab_t newivs_index, params_index;
   cloog_prog_clast pc;
-  CloogState *state;
 
-  state = cloog_state_malloc ();
   timevar_push (TV_GRAPHITE_CODE_GEN);
   gloog_error = false;
 
-  pc = scop_to_clast (scop, state);
+  pc = scop_to_clast (scop);
 
   if (dump_file && (dump_flags & TDF_DETAILS))
     {
@@ -1577,8 +1572,6 @@  gloog (scop_p scop, htab_t bb_pbb_mapping)
 	       num_no_dependency);
     }
 
-  cloog_state_free (state);
-
   return !gloog_error;
 }
 #endif
diff --git a/gcc/graphite-clast-to-gimple.h b/gcc/graphite-clast-to-gimple.h
index cd3cbca..9d599d6 100644
--- a/gcc/graphite-clast-to-gimple.h
+++ b/gcc/graphite-clast-to-gimple.h
@@ -22,6 +22,9 @@  along with GCC; see the file COPYING3.  If not see
 #define GCC_GRAPHITE_CLAST_TO_GIMPLE_H
 
 #include "graphite-cloog-util.h"
+
+extern CloogState *cloog_state;
+
 /* Data structure for CLooG program representation.  */
 
 typedef struct cloog_prog_clast {
@@ -35,10 +38,10 @@  typedef struct bb_pbb_def
 {
   basic_block bb;
   poly_bb_p pbb;
-}bb_pbb_def;
+} bb_pbb_def;
 
 extern bool gloog (scop_p, htab_t);
-extern cloog_prog_clast scop_to_clast (scop_p, CloogState *);
+extern cloog_prog_clast scop_to_clast (scop_p);
 extern void debug_clast_stmt (struct clast_stmt *);
 extern void print_clast_stmt (FILE *, struct clast_stmt *);
 
diff --git a/gcc/graphite.c b/gcc/graphite.c
index 70c3d46..b013447 100644
--- a/gcc/graphite.c
+++ b/gcc/graphite.c
@@ -54,6 +54,8 @@  along with GCC; see the file COPYING3.  If not see
 #include "graphite-clast-to-gimple.h"
 #include "graphite-sese-to-poly.h"
 
+CloogState *cloog_state;
+
 /* Print global statistics to FILE.  */
 
 static void
@@ -206,6 +208,7 @@  graphite_initialize (void)
   ppl_initialized = ppl_initialize ();
   gcc_assert (ppl_initialized == 0);
 
+  cloog_state = cloog_state_malloc ();
   cloog_initialize ();
 
   if (dump_file && dump_flags)
@@ -229,6 +232,7 @@  graphite_finalize (bool need_cfg_cleanup_p)
       tree_estimate_probability ();
     }
 
+  cloog_state_free (cloog_state);
   cloog_finalize ();
   ppl_finalize ();
   free_original_copy_tables ();