diff options
author | Jakub Jelinek <jakub@redhat.com> | 2013-11-29 11:36:10 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-11-29 11:36:10 +0100 |
commit | c193f58b676e48bd96c62864a2da7843419e22e8 (patch) | |
tree | 03e83d5dac4b9d1257c9b47f47f7a4c745098503 | |
parent | fad7652e6e9077252612963bc5a0e35015df3753 (diff) | |
download | gcc-c193f58b676e48bd96c62864a2da7843419e22e8.zip gcc-c193f58b676e48bd96c62864a2da7843419e22e8.tar.gz gcc-c193f58b676e48bd96c62864a2da7843419e22e8.tar.bz2 |
re PR lto/59326 (FAIL: gcc.dg/vect/vect-simd-clone-*.c)
PR lto/59326
* tree-core.h (enum omp_clause_schedule_kind): Add
OMP_CLAUSE_SCHEDULE_LAST.
(enum omp_clause_default_kind): Add OMP_CLAUSE_DEFAULT_LAST.
(enum omp_clause_depend_kind): Add OMP_CLAUSE_DEPEND_LAST.
(enum omp_clause_map_kind): Add OMP_CLAUSE_MAP_LAST.
(enum omp_clause_proc_bind_kind): Add OMP_CLAUSE_PROC_BIND_LAST.
* lto-streamer-out.c (lto_is_streamable): Allow streaming
OMP_CLAUSE.
(DFS_write_tree_body): Handle OMP_CLAUSE.
* tree-streamer-out.c (pack_ts_omp_clause_value_fields): New
function.
(streamer_pack_tree_bitfields): Call it for OMP_CLAUSE.
(write_ts_omp_clause_tree_pointers): New function.
(streamer_write_tree_body): Call it for OMP_CLAUSE.
(streamer_write_tree_header): For OMP_CLAUSE stream OMP_CLAUSE_CODE.
* tree-streamer-in.c (unpack_ts_omp_clause_value_fields): New
function.
(unpack_value_fields): Call it for OMP_CLAUSE.
(streamer_alloc_tree): Handle OMP_CLAUSE.
(lto_input_ts_omp_clause_tree_pointers): New function.
(streamer_read_tree_body): Call it for OMP_CLAUSE.
lto/
* lto.c (mentions_vars_p_omp_clause): New function.
(mentions_vars_p): Call it for OMP_CLAUSE. Remove break;
after return stmts.
From-SVN: r205512
-rw-r--r-- | gcc/ChangeLog | 25 | ||||
-rw-r--r-- | gcc/lto-streamer-out.c | 9 | ||||
-rw-r--r-- | gcc/lto/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/lto/lto.c | 24 | ||||
-rw-r--r-- | gcc/tree-core.h | 15 | ||||
-rw-r--r-- | gcc/tree-streamer-in.c | 70 | ||||
-rw-r--r-- | gcc/tree-streamer-out.c | 71 |
7 files changed, 207 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 414e888..791eaef 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,28 @@ +2013-11-29 Jakub Jelinek <jakub@redhat.com> + + PR lto/59326 + * tree-core.h (enum omp_clause_schedule_kind): Add + OMP_CLAUSE_SCHEDULE_LAST. + (enum omp_clause_default_kind): Add OMP_CLAUSE_DEFAULT_LAST. + (enum omp_clause_depend_kind): Add OMP_CLAUSE_DEPEND_LAST. + (enum omp_clause_map_kind): Add OMP_CLAUSE_MAP_LAST. + (enum omp_clause_proc_bind_kind): Add OMP_CLAUSE_PROC_BIND_LAST. + * lto-streamer-out.c (lto_is_streamable): Allow streaming + OMP_CLAUSE. + (DFS_write_tree_body): Handle OMP_CLAUSE. + * tree-streamer-out.c (pack_ts_omp_clause_value_fields): New + function. + (streamer_pack_tree_bitfields): Call it for OMP_CLAUSE. + (write_ts_omp_clause_tree_pointers): New function. + (streamer_write_tree_body): Call it for OMP_CLAUSE. + (streamer_write_tree_header): For OMP_CLAUSE stream OMP_CLAUSE_CODE. + * tree-streamer-in.c (unpack_ts_omp_clause_value_fields): New + function. + (unpack_value_fields): Call it for OMP_CLAUSE. + (streamer_alloc_tree): Handle OMP_CLAUSE. + (lto_input_ts_omp_clause_tree_pointers): New function. + (streamer_read_tree_body): Call it for OMP_CLAUSE. + 2013-11-29 Joseph Myers <joseph@codesourcery.com> * doc/implement-c.texi: Document C11 implementation-defined diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index b4b92c7..2821001 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -299,7 +299,6 @@ lto_is_streamable (tree expr) && code != BIND_EXPR && code != WITH_CLEANUP_EXPR && code != STATEMENT_LIST - && code != OMP_CLAUSE && (code == CASE_LABEL_EXPR || code == DECL_EXPR || TREE_CODE_CLASS (code) != tcc_statement); @@ -669,6 +668,14 @@ DFS_write_tree_body (struct output_block *ob, } } + if (code == OMP_CLAUSE) + { + int i; + for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++) + DFS_follow_tree_edge (OMP_CLAUSE_OPERAND (expr, i)); + DFS_follow_tree_edge (OMP_CLAUSE_CHAIN (expr)); + } + #undef DFS_follow_tree_edge } diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 5beccad..3ce3a32 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,10 @@ +2013-11-29 Jakub Jelinek <jakub@redhat.com> + + PR lto/59326 + * lto.c (mentions_vars_p_omp_clause): New function. + (mentions_vars_p): Call it for OMP_CLAUSE. Remove break; + after return stmts. + 2013-11-22 Andrew MacLeod <amacleod@redhat.com> * lto.c: Add required include files from gimple.h. diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index 8f2f1b0f..26084bf 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -904,6 +904,19 @@ mentions_vars_p_expr (tree t) return false; } +/* Check presence of pointers to decls in fields of an OMP_CLAUSE T. */ + +static bool +mentions_vars_p_omp_clause (tree t) +{ + int i; + if (mentions_vars_p_common (t)) + return true; + for (i = omp_clause_num_ops[OMP_CLAUSE_CODE (t)] - 1; i >= 0; --i) + CHECK_VAR (OMP_CLAUSE_OPERAND (t, i)); + return false; +} + /* Check presence of pointers to decls that needs later fixup in T. */ static bool @@ -922,7 +935,6 @@ mentions_vars_p (tree t) case FIELD_DECL: return mentions_vars_p_field_decl (t); - break; case LABEL_DECL: case CONST_DECL: @@ -931,27 +943,21 @@ mentions_vars_p (tree t) case IMPORTED_DECL: case NAMESPACE_DECL: return mentions_vars_p_decl_common (t); - break; case VAR_DECL: return mentions_vars_p_decl_with_vis (t); - break; case TYPE_DECL: return mentions_vars_p_decl_non_common (t); - break; case FUNCTION_DECL: return mentions_vars_p_function (t); - break; case TREE_BINFO: return mentions_vars_p_binfo (t); - break; case PLACEHOLDER_EXPR: return mentions_vars_p_common (t); - break; case BLOCK: case TRANSLATION_UNIT_DECL: @@ -961,7 +967,9 @@ mentions_vars_p (tree t) case CONSTRUCTOR: return mentions_vars_p_constructor (t); - break; + + case OMP_CLAUSE: + return mentions_vars_p_omp_clause (t); default: if (TYPE_P (t)) diff --git a/gcc/tree-core.h b/gcc/tree-core.h index f90bae7..6d23d97 100644 --- a/gcc/tree-core.h +++ b/gcc/tree-core.h @@ -350,7 +350,8 @@ enum omp_clause_schedule_kind { OMP_CLAUSE_SCHEDULE_DYNAMIC, OMP_CLAUSE_SCHEDULE_GUIDED, OMP_CLAUSE_SCHEDULE_AUTO, - OMP_CLAUSE_SCHEDULE_RUNTIME + OMP_CLAUSE_SCHEDULE_RUNTIME, + OMP_CLAUSE_SCHEDULE_LAST }; enum omp_clause_default_kind { @@ -358,7 +359,8 @@ enum omp_clause_default_kind { OMP_CLAUSE_DEFAULT_SHARED, OMP_CLAUSE_DEFAULT_NONE, OMP_CLAUSE_DEFAULT_PRIVATE, - OMP_CLAUSE_DEFAULT_FIRSTPRIVATE + OMP_CLAUSE_DEFAULT_FIRSTPRIVATE, + OMP_CLAUSE_DEFAULT_LAST }; /* There is a TYPE_QUAL value for each type qualifier. They can be @@ -1110,7 +1112,8 @@ enum omp_clause_depend_kind { OMP_CLAUSE_DEPEND_IN, OMP_CLAUSE_DEPEND_OUT, - OMP_CLAUSE_DEPEND_INOUT + OMP_CLAUSE_DEPEND_INOUT, + OMP_CLAUSE_DEPEND_LAST }; enum omp_clause_map_kind @@ -1122,7 +1125,8 @@ enum omp_clause_map_kind /* The following kind is an internal only map kind, used for pointer based array sections. OMP_CLAUSE_SIZE for these is not the pointer size, which is implicitly POINTER_SIZE / BITS_PER_UNIT, but the bias. */ - OMP_CLAUSE_MAP_POINTER + OMP_CLAUSE_MAP_POINTER, + OMP_CLAUSE_MAP_LAST }; enum omp_clause_proc_bind_kind @@ -1132,7 +1136,8 @@ enum omp_clause_proc_bind_kind OMP_CLAUSE_PROC_BIND_TRUE = 1, OMP_CLAUSE_PROC_BIND_MASTER = 2, OMP_CLAUSE_PROC_BIND_CLOSE = 3, - OMP_CLAUSE_PROC_BIND_SPREAD = 4 + OMP_CLAUSE_PROC_BIND_SPREAD = 4, + OMP_CLAUSE_PROC_BIND_LAST }; struct GTY(()) tree_exp { diff --git a/gcc/tree-streamer-in.c b/gcc/tree-streamer-in.c index a43106d..af7549f 100644 --- a/gcc/tree-streamer-in.c +++ b/gcc/tree-streamer-in.c @@ -425,6 +425,48 @@ unpack_ts_optimization (struct bitpack_d *bp, tree expr) } +/* Unpack all the non-pointer fields of the TS_OMP_CLAUSE + structure of expression EXPR from bitpack BP. */ + +static void +unpack_ts_omp_clause_value_fields (struct data_in *data_in, + struct bitpack_d *bp, tree expr) +{ + OMP_CLAUSE_LOCATION (expr) = stream_input_location (bp, data_in); + switch (OMP_CLAUSE_CODE (expr)) + { + case OMP_CLAUSE_DEFAULT: + OMP_CLAUSE_DEFAULT_KIND (expr) + = bp_unpack_enum (bp, omp_clause_default_kind, + OMP_CLAUSE_DEFAULT_LAST); + break; + case OMP_CLAUSE_SCHEDULE: + OMP_CLAUSE_SCHEDULE_KIND (expr) + = bp_unpack_enum (bp, omp_clause_schedule_kind, + OMP_CLAUSE_SCHEDULE_LAST); + break; + case OMP_CLAUSE_DEPEND: + OMP_CLAUSE_DEPEND_KIND (expr) + = bp_unpack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST); + break; + case OMP_CLAUSE_MAP: + OMP_CLAUSE_MAP_KIND (expr) + = bp_unpack_enum (bp, omp_clause_map_kind, OMP_CLAUSE_MAP_LAST); + break; + case OMP_CLAUSE_PROC_BIND: + OMP_CLAUSE_PROC_BIND_KIND (expr) + = bp_unpack_enum (bp, omp_clause_proc_bind_kind, + OMP_CLAUSE_PROC_BIND_LAST); + break; + case OMP_CLAUSE_REDUCTION: + OMP_CLAUSE_REDUCTION_CODE (expr) + = bp_unpack_enum (bp, tree_code, MAX_TREE_CODES); + break; + default: + break; + } +} + /* Unpack all the non-pointer fields in EXPR into a bit pack. */ static void @@ -493,6 +535,9 @@ unpack_value_fields (struct data_in *data_in, struct bitpack_d *bp, tree expr) if (length > 0) vec_safe_grow (CONSTRUCTOR_ELTS (expr), length); } + + if (code == OMP_CLAUSE) + unpack_ts_omp_clause_value_fields (data_in, bp, expr); } @@ -578,6 +623,12 @@ streamer_alloc_tree (struct lto_input_block *ib, struct data_in *data_in, unsigned HOST_WIDE_INT nargs = streamer_read_uhwi (ib); return build_vl_exp (CALL_EXPR, nargs + 3); } + else if (code == OMP_CLAUSE) + { + enum omp_clause_code subcode + = (enum omp_clause_code) streamer_read_uhwi (ib); + return build_omp_clause (UNKNOWN_LOCATION, subcode); + } else { /* For all other nodes, materialize the tree with a raw @@ -960,6 +1011,22 @@ lto_input_ts_constructor_tree_pointers (struct lto_input_block *ib, } +/* Read all pointer fields in the TS_OMP_CLAUSE structure of EXPR from + input block IB. DATA_IN contains tables and descriptors for the + file being read. */ + +static void +lto_input_ts_omp_clause_tree_pointers (struct lto_input_block *ib, + struct data_in *data_in, tree expr) +{ + int i; + + for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++) + OMP_CLAUSE_OPERAND (expr, i) = stream_read_tree (ib, data_in); + OMP_CLAUSE_CHAIN (expr) = stream_read_tree (ib, data_in); +} + + /* Read all pointer fields in EXPR from input block IB. DATA_IN contains tables and descriptors for the file being read. */ @@ -1021,6 +1088,9 @@ streamer_read_tree_body (struct lto_input_block *ib, struct data_in *data_in, if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR)) lto_input_ts_constructor_tree_pointers (ib, data_in, expr); + + if (code == OMP_CLAUSE) + lto_input_ts_omp_clause_tree_pointers (ib, data_in, expr); } diff --git a/gcc/tree-streamer-out.c b/gcc/tree-streamer-out.c index 51a2c2b..b86092a 100644 --- a/gcc/tree-streamer-out.c +++ b/gcc/tree-streamer-out.c @@ -390,6 +390,46 @@ pack_ts_optimization (struct bitpack_d *bp, tree expr) } +/* Pack all the non-pointer fields of the TS_OMP_CLAUSE structure + of expression EXPR into bitpack BP. */ + +static void +pack_ts_omp_clause_value_fields (struct output_block *ob, + struct bitpack_d *bp, tree expr) +{ + stream_output_location (ob, bp, OMP_CLAUSE_LOCATION (expr)); + switch (OMP_CLAUSE_CODE (expr)) + { + case OMP_CLAUSE_DEFAULT: + bp_pack_enum (bp, omp_clause_default_kind, OMP_CLAUSE_DEFAULT_LAST, + OMP_CLAUSE_DEFAULT_KIND (expr)); + break; + case OMP_CLAUSE_SCHEDULE: + bp_pack_enum (bp, omp_clause_schedule_kind, OMP_CLAUSE_SCHEDULE_LAST, + OMP_CLAUSE_SCHEDULE_KIND (expr)); + break; + case OMP_CLAUSE_DEPEND: + bp_pack_enum (bp, omp_clause_depend_kind, OMP_CLAUSE_DEPEND_LAST, + OMP_CLAUSE_DEPEND_KIND (expr)); + break; + case OMP_CLAUSE_MAP: + bp_pack_enum (bp, omp_clause_map_kind, OMP_CLAUSE_MAP_LAST, + OMP_CLAUSE_MAP_KIND (expr)); + break; + case OMP_CLAUSE_PROC_BIND: + bp_pack_enum (bp, omp_clause_proc_bind_kind, OMP_CLAUSE_PROC_BIND_LAST, + OMP_CLAUSE_PROC_BIND_KIND (expr)); + break; + case OMP_CLAUSE_REDUCTION: + bp_pack_enum (bp, tree_code, MAX_TREE_CODES, + OMP_CLAUSE_REDUCTION_CODE (expr)); + break; + default: + break; + } +} + + /* Pack all the bitfields in EXPR into a bit pack. */ void @@ -451,6 +491,9 @@ streamer_pack_tree_bitfields (struct output_block *ob, if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR)) bp_pack_var_len_unsigned (bp, CONSTRUCTOR_NELTS (expr)); + + if (code == OMP_CLAUSE) + pack_ts_omp_clause_value_fields (ob, bp, expr); } @@ -853,6 +896,29 @@ write_ts_constructor_tree_pointers (struct output_block *ob, tree expr, } } + +/* Write all pointer fields in the TS_OMP_CLAUSE structure of EXPR + to output block OB. If REF_P is true, write a reference to EXPR's + pointer fields. */ + +static void +write_ts_omp_clause_tree_pointers (struct output_block *ob, tree expr, + bool ref_p) +{ + int i; + for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (expr)]; i++) + stream_write_tree (ob, OMP_CLAUSE_OPERAND (expr, i), ref_p); + if (OMP_CLAUSE_CODE (expr) == OMP_CLAUSE_REDUCTION) + { + /* We don't stream these right now, handle it if streaming + of them is needed. */ + gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (expr) == NULL); + gcc_assert (OMP_CLAUSE_REDUCTION_GIMPLE_MERGE (expr) == NULL); + } + stream_write_tree (ob, OMP_CLAUSE_CHAIN (expr), ref_p); +} + + /* Write all pointer fields in EXPR to output block OB. If REF_P is true, the leaves of EXPR are emitted as references. */ @@ -915,6 +981,9 @@ streamer_write_tree_body (struct output_block *ob, tree expr, bool ref_p) if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR)) write_ts_constructor_tree_pointers (ob, expr, ref_p); + + if (code == OMP_CLAUSE) + write_ts_omp_clause_tree_pointers (ob, expr, ref_p); } @@ -963,6 +1032,8 @@ streamer_write_tree_header (struct output_block *ob, tree expr) streamer_write_uhwi (ob, BINFO_N_BASE_BINFOS (expr)); else if (TREE_CODE (expr) == CALL_EXPR) streamer_write_uhwi (ob, call_expr_nargs (expr)); + else if (TREE_CODE (expr) == OMP_CLAUSE) + streamer_write_uhwi (ob, OMP_CLAUSE_CODE (expr)); } |