diff options
author | Kirill Yukhin <kirill.yukhin@intel.com> | 2014-10-21 07:58:54 +0000 |
---|---|---|
committer | Kirill Yukhin <kyukhin@gcc.gnu.org> | 2014-10-21 07:58:54 +0000 |
commit | 8e6ef852865d824395b89a21b782e52b99349f3c (patch) | |
tree | 33f700c54907a6b1c76c3d4492eea7ff14621731 /gcc | |
parent | 11204b2de523611cf7f1135aa5ff1cfb1bb11001 (diff) | |
download | gcc-8e6ef852865d824395b89a21b782e52b99349f3c.zip gcc-8e6ef852865d824395b89a21b782e52b99349f3c.tar.gz gcc-8e6ef852865d824395b89a21b782e52b99349f3c.tar.bz2 |
Revert r216483.
From-SVN: r216502
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c-family/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/c-family/cilk.c | 112 |
2 files changed, 45 insertions, 71 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index c673a74..7d2878d 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,7 @@ +2014-10-21 Kirill Yukhin <kirill.yukhin@intel.com> + + * cilk.c: Revert previous change. + 2014-10-20 Igor Zamyatin <igor.zamyatin@intel.com> PR c/63307 diff --git a/gcc/c-family/cilk.c b/gcc/c-family/cilk.c index ffcf3b5..20b3432 100644 --- a/gcc/c-family/cilk.c +++ b/gcc/c-family/cilk.c @@ -35,7 +35,6 @@ along with GCC; see the file COPYING3. If not see #include "toplev.h" #include "cgraph.h" #include "diagnostic.h" -#include "vec.h" #include "cilk.h" enum add_variable_type { @@ -333,36 +332,17 @@ create_cilk_helper_decl (struct wrapper_data *wd) return fndecl; } -struct cilk_decls -{ - tree key; - tree *val; -}; - -/* A function used by traversal to fill vector of decls for further work. */ +/* A function used by walk tree to find wrapper parms. */ bool -fill_decls_vec (tree const &key0, tree *val0, auto_vec<struct cilk_decls> *v) -{ - tree t1 = key0; - struct cilk_decls dp; - - dp.key = t1; - dp.val = val0; - v->safe_push (dp); - return true; -} - -/* Function that actually creates necessary parm lists. */ - -static void -create_parm_list (struct wrapper_data *wd, tree *val0, tree arg) +wrapper_parm_cb (tree const &key0, tree *val0, wrapper_data *wd) { + tree arg = key0; tree val = *val0; tree parm; if (val == error_mark_node || val == arg) - return; + return true; if (TREE_CODE (val) == PAREN_EXPR) { @@ -380,7 +360,7 @@ create_parm_list (struct wrapper_data *wd, tree *val0, tree arg) } else arg = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (arg)), arg); - + val = TREE_OPERAND (val, 0); *val0 = val; gcc_assert (TREE_CODE (val) == INDIRECT_REF); @@ -391,24 +371,9 @@ create_parm_list (struct wrapper_data *wd, tree *val0, tree arg) parm = val; TREE_CHAIN (parm) = wd->parms; wd->parms = parm; - wd->argtypes = tree_cons (NULL_TREE, TREE_TYPE (parm), wd->argtypes); - wd->arglist = tree_cons (NULL_TREE, arg, wd->arglist); -} - -/* Sorting decls in a vector. */ - -static int -compare_decls (const void *a, const void *b) -{ - const struct cilk_decls* t1 = (const struct cilk_decls*) a; - const struct cilk_decls* t2 = (const struct cilk_decls*) b; - - if (DECL_UID (t1->key) > DECL_UID (t2->key)) - return 1; - else if (DECL_UID (t1->key) < DECL_UID (t2->key)) - return -1; - else - return 0; + wd->argtypes = tree_cons (NULL_TREE, TREE_TYPE (parm), wd->argtypes); + wd->arglist = tree_cons (NULL_TREE, arg, wd->arglist); + return true; } /* This function is used to build a wrapper of a certain type. */ @@ -416,21 +381,13 @@ compare_decls (const void *a, const void *b) static void build_wrapper_type (struct wrapper_data *wd) { - unsigned int j; - struct cilk_decls * c; - auto_vec<struct cilk_decls> vd; wd->arglist = NULL_TREE; wd->parms = NULL_TREE; wd->argtypes = void_list_node; - wd->decl_map->traverse<auto_vec<struct cilk_decls> *, fill_decls_vec> (&vd); + wd->decl_map->traverse<wrapper_data *, wrapper_parm_cb> (wd); gcc_assert (wd->type != CILK_BLOCK_FOR); - vd.qsort (compare_decls); - - FOR_EACH_VEC_ELT (vd, j, c) - create_parm_list (wd, c->val, c->key); - /* Now build a function. Its return type is void (all side effects are via explicit parameters). Its parameters are WRAPPER_PARMS with type WRAPPER_TYPES. @@ -491,19 +448,41 @@ copy_decl_for_cilk (tree decl, copy_body_data *id) } } +/* Copy all local variables. */ + +bool +for_local_cb (tree const &k, tree *vp, copy_body_data *id) +{ + tree v = *vp; + + if (v == error_mark_node) + *vp = copy_decl_no_change (k, id); + return true; +} + +/* Copy all local declarations from a _Cilk_spawned function's body. */ + +bool +wrapper_local_cb (tree const &key, tree *vp, copy_body_data *id) +{ + tree val = *vp; + + if (val == error_mark_node) + *vp = copy_decl_for_cilk (key, id); + + return true; +} + /* Alter a tree STMT from OUTER_FN to form the body of INNER_FN. */ void cilk_outline (tree inner_fn, tree *stmt_p, void *w) { struct wrapper_data *wd = (struct wrapper_data *) w; - const tree outer_fn = wd->context; + const tree outer_fn = wd->context; const bool nested = (wd->type == CILK_BLOCK_FOR); copy_body_data id; bool throws; - auto_vec<struct cilk_decls> vd; - unsigned int j; - struct cilk_decls * c; DECL_STATIC_CHAIN (outer_fn) = 1; @@ -529,13 +508,11 @@ cilk_outline (tree inner_fn, tree *stmt_p, void *w) insert_decl_map (&id, wd->block, DECL_INITIAL (inner_fn)); - wd->decl_map->traverse<auto_vec<struct cilk_decls> *, fill_decls_vec> (&vd); - vd.qsort (compare_decls); /* We don't want the private variables any more. */ - FOR_EACH_VEC_ELT (vd, j, c) - if (*(c->val) == error_mark_node) - *(c->val) = nested ? copy_decl_no_change (c->key, &id) - : copy_decl_for_cilk (c->key, &id); + if (nested) + wd->decl_map->traverse<copy_body_data *, for_local_cb> (&id); + else + wd->decl_map->traverse<copy_body_data *, wrapper_local_cb> (&id); walk_tree (stmt_p, copy_tree_body_r, (void *) &id, NULL); @@ -640,7 +617,7 @@ free_wd (struct wrapper_data *wd) */ bool -declare_one_free_variable (tree var0, tree *map0) +declare_one_free_variable (tree const &var0, tree *map0, wrapper_data &) { const_tree var = var0; tree map = *map0; @@ -713,9 +690,6 @@ create_cilk_wrapper (tree exp, tree *args_out) { struct wrapper_data wd; tree fndecl; - unsigned int j; - struct cilk_decls * c; - auto_vec<struct cilk_decls> vd; init_wd (&wd, CILK_BLOCK_SPAWN); @@ -736,11 +710,7 @@ create_cilk_wrapper (tree exp, tree *args_out) } else extract_free_variables (exp, &wd, ADD_READ); - wd.decl_map->traverse<auto_vec<struct cilk_decls> *, fill_decls_vec> (&vd); - vd.qsort (compare_decls); - FOR_EACH_VEC_ELT (vd, j, c) - declare_one_free_variable (c->key, c->val); - + wd.decl_map->traverse<wrapper_data &, declare_one_free_variable> (wd); wd.block = TREE_BLOCK (exp); if (!wd.block) wd.block = DECL_INITIAL (current_function_decl); |