re PR middle-end/64412 (ICE in offload compiler: in extract_insn, at recog.c:2327)
authorBernd Schmidt <bernds@codesourcery.com>
Fri, 9 Jan 2015 21:38:00 +0000 (21:38 +0000)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 9 Jan 2015 21:38:00 +0000 (22:38 +0100)
PR middle-end/64412
* lto-streamer.h (lto_stream_offload_p): New declaration.
* lto-streamer.c (lto_stream_offload_p): New variable.
* cgraphunit.c (ipa_passes): Set lto_stream_offload_p
at the same time as section_name_prefix.
* lto-streamer-out.c (hash_tree): Don't hash TREE_TARGET_OPTION
if lto_stream_offload_p.
* tree-streamer-out.c (streamer_pack_tree_bitfields): Don't
stream TREE_TARGET_OPTION if lto_stream_offload_p.
(write_ts_function_decl_tree_pointers): Don't
stream DECL_FUNCTION_SPECIFIC_TARGET if lto_stream_offload_p.
* tree-streamer-in.c (unpack_value_fields): Don't stream
TREE_TARGET_OPTION in if ACCEL_COMPILER.
(lto_input_ts_function_decl_tree_pointers): Don't stream
DECL_FUNCTION_SPECIFIC_TARGET in if ACCEL_COMPILER.
* lto-opts.c (lto_write_options): Use lto_stream_offload_p
instead of section_name_prefix string comparisons.
lto/
* lto.c (read_cgraph_and_symbols): Set lto_stream_offload_p
if ACCEL_COMPILER.

Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r219410

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

index 01f1335fcde2c52fb4144191275aa6863c826533..8ad86033fdc12b9166a7b140e6529821fb49f697 100644 (file)
@@ -1,3 +1,24 @@
+2015-01-09  Bernd Schmidt  <bernds@codesourcery.com>
+           Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/64412
+       * lto-streamer.h (lto_stream_offload_p): New declaration.
+       * lto-streamer.c (lto_stream_offload_p): New variable.
+       * cgraphunit.c (ipa_passes): Set lto_stream_offload_p
+       at the same time as section_name_prefix.
+       * lto-streamer-out.c (hash_tree): Don't hash TREE_TARGET_OPTION
+       if lto_stream_offload_p.
+       * tree-streamer-out.c (streamer_pack_tree_bitfields): Don't
+       stream TREE_TARGET_OPTION if lto_stream_offload_p.
+       (write_ts_function_decl_tree_pointers): Don't
+       stream DECL_FUNCTION_SPECIFIC_TARGET if lto_stream_offload_p.
+       * tree-streamer-in.c (unpack_value_fields): Don't stream
+       TREE_TARGET_OPTION in if ACCEL_COMPILER.
+       (lto_input_ts_function_decl_tree_pointers): Don't stream
+       DECL_FUNCTION_SPECIFIC_TARGET in if ACCEL_COMPILER.
+       * lto-opts.c (lto_write_options): Use lto_stream_offload_p
+       instead of section_name_prefix string comparisons.
+
 2015-01-09  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/64536
index e3be36090f7fc11e8e5ed0a84025058fbe8c59ae..149f4474e3d51434c6b6bcf7ffe19ac00f1f7df7 100644 (file)
@@ -2114,11 +2114,14 @@ ipa_passes (void)
       if (g->have_offload)
        {
          section_name_prefix = OFFLOAD_SECTION_NAME_PREFIX;
+         lto_stream_offload_p = true;
          ipa_write_summaries (true);
+         lto_stream_offload_p = false;
        }
       if (flag_lto)
        {
          section_name_prefix = LTO_SECTION_NAME_PREFIX;
+         lto_stream_offload_p = false;
          ipa_write_summaries (false);
        }
     }
index 9a635b157a044dbca3ab47fe5ec4eed1bb6c5429..026b323b46f66558028c68c65f64a724253c6ca5 100644 (file)
@@ -167,7 +167,7 @@ lto_write_options (void)
                               "-fno-strict-overflow");
 
   /* Append options from target hook and store them to offload_lto section.  */
-  if (strcmp (section_name_prefix, OFFLOAD_SECTION_NAME_PREFIX) == 0)
+  if (lto_stream_offload_p)
     {
       char *offload_opts = targetm.offload_options ();
       char *offload_ptr = offload_opts;
@@ -208,7 +208,7 @@ lto_write_options (void)
 
       /* Do not store target-specific options in offload_lto section.  */
       if ((cl_options[option->opt_index].flags & CL_TARGET)
-        && strcmp (section_name_prefix, OFFLOAD_SECTION_NAME_PREFIX) == 0)
+         && lto_stream_offload_p)
        continue;
 
       /* Drop options created from the gcc driver that will be rejected
@@ -221,8 +221,7 @@ lto_write_options (void)
         We do not need those.  The only exception is -foffload option, if we
         write it in offload_lto section.  Also drop all diagnostic options.  */
       if ((cl_options[option->opt_index].flags & (CL_DRIVER|CL_WARNING))
-         && (strcmp (section_name_prefix, OFFLOAD_SECTION_NAME_PREFIX) != 0
-             || option->opt_index != OPT_foffload_))
+         && (!lto_stream_offload_p || option->opt_index != OPT_foffload_))
        continue;
 
       for (j = 0; j < option->canonical_option_num_elements; ++j)
index 6be260fd5152915f57fa13829d3c1cfde3c55126..21a78bb77aa92a29e361ea84d3cf771f521e7c98 100644 (file)
@@ -949,7 +949,9 @@ hash_tree (struct streamer_tree_cache_d *cache, hash_map<tree, hashval_t> *map,
     hstate.add (TRANSLATION_UNIT_LANGUAGE (t),
                        strlen (TRANSLATION_UNIT_LANGUAGE (t)));
 
-  if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
+  if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
+      /* We don't stream these when passing things to a different target.  */
+      && !lto_stream_offload_p)
     hstate.add_wide_int (cl_target_option_hash (TREE_TARGET_OPTION (t)));
 
   if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
index 26b26c295fcfee947f1306bfbb8218e1663c29e5..6b4e0f279ae6be925531d6f38fef4c751dcd5847 100644 (file)
@@ -67,6 +67,8 @@ static bitmap_obstack lto_obstack;
 static bool lto_obstack_initialized;
 
 const char *section_name_prefix = LTO_SECTION_NAME_PREFIX;
+/* Set when streaming LTO for offloading compiler.  */
+bool lto_stream_offload_p;
 
 /* Return a string representing LTO tag TAG.  */
 
index b661a27f5ee6a05ed7ee892baadb5301131a64b9..853630f1931a3e74e3e049145540c7dc603e45de 100644 (file)
@@ -744,6 +744,10 @@ extern void lto_append_block (struct lto_output_stream *);
 
 
 /* In lto-streamer.c.  */
+
+/* Set when streaming LTO for offloading compiler.  */
+extern bool lto_stream_offload_p;
+
 extern const char *lto_tag_name (enum LTO_tags);
 extern bitmap lto_bitmap_alloc (void);
 extern void lto_bitmap_free (bitmap);
index dc3354b7ee93b729ede9809a7863405244a6dcda..7bcb7dd1c5d2d646a71533fa79a75410a6f3260b 100644 (file)
@@ -1,3 +1,10 @@
+2015-01-09  Bernd Schmidt  <bernds@codesourcery.com>
+           Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/64412
+       * lto.c (read_cgraph_and_symbols): Set lto_stream_offload_p
+       if ACCEL_COMPILER.
+
 2015-01-09  Michael Collison  <michael.collison@linaro.org>
 
        * lto.c: Include hash-set.h, machmode.h, vec.h, double-int.h,
index ed69c74a712897c39b6d228c08bd792bb22024c0..96e5fd18ac134fb67c05c51818f2a24991bf82a5 100644 (file)
@@ -2909,7 +2909,8 @@ read_cgraph_and_symbols (unsigned nfiles, const char **fnames)
   timevar_push (TV_IPA_LTO_DECL_IN);
 
 #ifdef ACCEL_COMPILER
-    section_name_prefix = OFFLOAD_SECTION_NAME_PREFIX;
+  section_name_prefix = OFFLOAD_SECTION_NAME_PREFIX;
+  lto_stream_offload_p = true;
 #endif
 
   real_file_decl_data
index a717fe278fea4eca9ab3d27effa9eae043acf547..c43685259decadd00b922cea643466d9ba30e773 100644 (file)
@@ -529,8 +529,10 @@ unpack_value_fields (struct data_in *data_in, struct bitpack_d *bp, tree expr)
        vec_safe_grow (CONSTRUCTOR_ELTS (expr), length);
     }
 
+#ifndef ACCEL_COMPILER
   if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
     cl_target_option_stream_in (data_in, bp, TREE_TARGET_OPTION (expr));
+#endif
 
   if (code == OMP_CLAUSE)
     unpack_ts_omp_clause_value_fields (data_in, bp, expr);
@@ -794,7 +796,9 @@ lto_input_ts_function_decl_tree_pointers (struct lto_input_block *ib,
   DECL_VINDEX (expr) = stream_read_tree (ib, data_in);
   /* DECL_STRUCT_FUNCTION is loaded on demand by cgraph_get_body.  */
   DECL_FUNCTION_PERSONALITY (expr) = stream_read_tree (ib, data_in);
+#ifndef ACCEL_COMPILER
   DECL_FUNCTION_SPECIFIC_TARGET (expr) = stream_read_tree (ib, data_in);
+#endif
   DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr) = stream_read_tree (ib, data_in);
 
   /* If the file contains a function with an EH personality set,
index 84ea21ef25d548508796f158fabde8aa2042f146..480fb1e272cbf12a2be097a94955b90784d46cf7 100644 (file)
@@ -480,7 +480,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_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
+  if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
+      /* Don't stream these when passing things to a different target.  */
+      && !lto_stream_offload_p)
     cl_target_option_stream_out (ob, bp, TREE_TARGET_OPTION (expr));
 
   if (code == OMP_CLAUSE)
@@ -695,7 +697,9 @@ write_ts_function_decl_tree_pointers (struct output_block *ob, tree expr,
   stream_write_tree (ob, DECL_VINDEX (expr), ref_p);
   /* DECL_STRUCT_FUNCTION is handled by lto_output_function.  */
   stream_write_tree (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p);
-  stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
+  /* Don't stream these when passing things to a different target.  */
+  if (!lto_stream_offload_p)
+    stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
   stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr), ref_p);
 }