]> gcc.gnu.org Git - gcc.git/commitdiff
re PR lto/59326 (FAIL: gcc.dg/vect/vect-simd-clone-*.c)
authorJakub Jelinek <jakub@redhat.com>
Fri, 29 Nov 2013 10:36:10 +0000 (11:36 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 29 Nov 2013 10:36:10 +0000 (11:36 +0100)
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

gcc/ChangeLog
gcc/lto-streamer-out.c
gcc/lto/ChangeLog
gcc/lto/lto.c
gcc/tree-core.h
gcc/tree-streamer-in.c
gcc/tree-streamer-out.c

index 414e88822567dc9527c05206bfc5f0ed6043c2b4..791eaef31642cefcf4ef8b745217a4ae77ed5a99 100644 (file)
@@ -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
index b4b92c72628e584991be1df5fec04e3d21d75705..2821001aa0e079a0bee0afcceec08d9adee80396 100644 (file)
@@ -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
 }
 
index 5beccad89aae626ff6eefa0e0ccfdb206dc3add7..3ce3a32c16474127961970933b31558871289572 100644 (file)
@@ -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.
index 8f2f1b0f0c898b2183c705dc1f8d837a1ebef622..26084bf7d4119e0bf2a5aceb843458d0c91cb46d 100644 (file)
@@ -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))
index f90bae7c35f0649fd67ee7beb26ed6dd6857c618..6d23d979f72899198b0cc2d983f032295b9a2e13 100644 (file)
@@ -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 {
index a43106d9fe47fa4c721f948920113f108da07666..af7549f65ab899a2b4824f7b7903585943fff6c8 100644 (file)
@@ -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);
 }
 
 
index 51a2c2b5203a88c330c788aa0506afa978d676e1..b86092aef4ef11702ed5bbe41ba5f5bdcc2abf65 100644 (file)
@@ -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));
 }
 
 
This page took 0.114966 seconds and 5 git commands to generate.