Patchwork use a VEC in gfc_trans_omp_critical

login
register
mail settings
Submitter Nathan Froyd
Date June 27, 2010, 7:50 p.m.
Message ID <20100627195049.GW22606@codesourcery.com>
Download mbox | patch
Permalink /patch/57100/
State New
Headers show

Comments

Nathan Froyd - June 27, 2010, 7:50 p.m.
The patch below converts a TREE_LIST used for accumulating bits about
OMP DO variables into a VEC.  The only unusual part is the vec.h
changes, since gfortran poisons bare uses of free().  (I think the vec.h
change is obvious, so I am only asking for approval for the Fortran
bits.)

Tested on x86_64-unknown-linux-gnu.  OK to commit?

-Nathan

gcc/
	* vec.h (vec_heap_free): Add parenthesis around free.

gcc/fortran/
	* trans-openmp.c (dovar_init): Define.  Define VECs containing it.
	(gfc_trans_omp_do): Use a VEC to accumulate variables and their
	initializers.
Jakub Jelinek - June 28, 2010, 11:34 a.m.
On Sun, Jun 27, 2010 at 12:50:49PM -0700, Nathan Froyd wrote:
> gcc/fortran/
> 	* trans-openmp.c (dovar_init): Define.  Define VECs containing it.
> 	(gfc_trans_omp_do): Use a VEC to accumulate variables and their
> 	initializers.

Ok.

	Jakub
Nathan Froyd - June 28, 2010, 12:05 p.m.
On Mon, Jun 28, 2010 at 01:34:23PM +0200, Jakub Jelinek wrote:
> On Sun, Jun 27, 2010 at 12:50:49PM -0700, Nathan Froyd wrote:
> > gcc/fortran/
> > 	* trans-openmp.c (dovar_init): Define.  Define VECs containing it.
> > 	(gfc_trans_omp_do): Use a VEC to accumulate variables and their
> > 	initializers.
> 
> Ok.

Thanks, committed as r161486.

-Nathan

Patch

diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c
index a5d5ba1..7a7d330 100644
--- a/gcc/fortran/trans-openmp.c
+++ b/gcc/fortran/trans-openmp.c
@@ -1150,6 +1150,14 @@  gfc_trans_omp_critical (gfc_code *code)
   return build2 (OMP_CRITICAL, void_type_node, stmt, name);
 }
 
+typedef struct dovar_init_d {
+  tree var;
+  tree init;
+} dovar_init;
+
+DEF_VEC_O(dovar_init);
+DEF_VEC_ALLOC_O(dovar_init,heap);
+
 static tree
 gfc_trans_omp_do (gfc_code *code, stmtblock_t *pblock,
 		  gfc_omp_clauses *do_clauses, tree par_clauses)
@@ -1161,7 +1169,9 @@  gfc_trans_omp_do (gfc_code *code, stmtblock_t *pblock,
   stmtblock_t body;
   gfc_omp_clauses *clauses = code->ext.omp_clauses;
   int i, collapse = clauses->collapse;
-  tree dovar_init = NULL_TREE;
+  VEC(dovar_init,heap) *inits = NULL;
+  dovar_init *di;
+  unsigned ix;
 
   if (collapse <= 0)
     collapse = 1;
@@ -1276,7 +1286,9 @@  gfc_trans_omp_do (gfc_code *code, stmtblock_t *pblock,
 	  /* Initialize DOVAR.  */
 	  tmp = fold_build2 (MULT_EXPR, type, count, step);
 	  tmp = fold_build2 (PLUS_EXPR, type, from, tmp);
-	  dovar_init = tree_cons (dovar, tmp, dovar_init);
+	  di = VEC_safe_push (dovar_init, heap, inits, NULL);
+	  di->var = dovar;
+	  di->init = tmp;
 	}
 
       if (!dovar_found)
@@ -1345,13 +1357,9 @@  gfc_trans_omp_do (gfc_code *code, stmtblock_t *pblock,
 
   gfc_start_block (&body);
 
-  dovar_init = nreverse (dovar_init);
-  while (dovar_init)
-    {
-      gfc_add_modify (&body, TREE_PURPOSE (dovar_init),
-			   TREE_VALUE (dovar_init));
-      dovar_init = TREE_CHAIN (dovar_init);
-    }
+  for (ix = 0; VEC_iterate (dovar_init, inits, ix, di); ix++)
+    gfc_add_modify (&body, di->var, di->init);
+  VEC_free (dovar_init, heap, inits);
 
   /* Cycle statement is implemented with a goto.  Exit statement must not be
      present for this loop.  */
diff --git a/gcc/vec.h b/gcc/vec.h
index c32bf88..93a432d 100644
--- a/gcc/vec.h
+++ b/gcc/vec.h
@@ -436,7 +436,8 @@  extern void dump_vec_loc_statistics (void);
 #ifdef GATHER_STATISTICS
 void vec_heap_free (void *);
 #else
-#define vec_heap_free(V) free (V)
+/* Avoid problems with frontends that #define free(x).  */
+#define vec_heap_free(V) (free) (V)
 #endif
 
 #if ENABLE_CHECKING