re PR c++/87229 (ICE: tree code 'call_expr' is not supported in LTO streams)
authorRichard Biener <rguenther@suse.de>
Thu, 22 Nov 2018 09:54:14 +0000 (09:54 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 22 Nov 2018 09:54:14 +0000 (09:54 +0000)
2018-11-22  Richard Biener  <rguenther@suse.de>

PR lto/87229
PR lto/88112
* lto-streamer-out.c (lto_is_streamable): Allow CALL_EXPRs
which can appear in size expressions.
* tree-streamer-in.c (unpack_ts_base_value_fields): Stream
CALL_EXPR_BY_DESCRIPTOR.
(streamer_read_tree_bitfields): Stream CALL_EXPR_IFN.
* tree-streamer-out.c (pack_ts_base_value_fields): Stream
CALL_EXPR_BY_DESCRIPTOR.
(streamer_write_tree_bitfields): Stream CALL_EXPR_IFN.

Revert
PR lto/87229
* tree.c (free_lang_data_in_one_sizepos): Free non-gimple-val
sizepos values.

From-SVN: r266372

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

index f1f6b8339501349d3a2c3ca5d9a414c802272d46..b54ecfc1306ce50402a6280f3434f36695c2ac7b 100644 (file)
@@ -1,3 +1,21 @@
+2018-11-22  Richard Biener  <rguenther@suse.de>
+
+       PR lto/87229
+       PR lto/88112
+       * lto-streamer-out.c (lto_is_streamable): Allow CALL_EXPRs
+       which can appear in size expressions.
+       * tree-streamer-in.c (unpack_ts_base_value_fields): Stream
+       CALL_EXPR_BY_DESCRIPTOR.
+       (streamer_read_tree_bitfields): Stream CALL_EXPR_IFN.
+       * tree-streamer-out.c (pack_ts_base_value_fields): Stream
+       CALL_EXPR_BY_DESCRIPTOR.
+       (streamer_write_tree_bitfields): Stream CALL_EXPR_IFN.
+
+       Revert
+       PR lto/87229
+       * tree.c (free_lang_data_in_one_sizepos): Free non-gimple-val
+       sizepos values.
+
 2018-11-22  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/88069
index 2cb04029862c898dcddb561464180dc81ed8cd8a..01193390cab4a7130d6414694037e44ea700ba8c 100644 (file)
@@ -306,7 +306,6 @@ lto_is_streamable (tree expr)
      name version in lto_output_tree_ref (see output_ssa_names).  */
   return !is_lang_specific (expr)
         && code != SSA_NAME
-        && code != CALL_EXPR
         && code != LANG_TYPE
         && code != MODIFY_EXPR
         && code != INIT_EXPR
index 811d673bf2e2f7b1e34d2d824defc3736ae60786..09ea70b1cbadbba3810d1d7a64e172a1bf2a8675 100644 (file)
@@ -158,6 +158,11 @@ unpack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
       SSA_NAME_IS_DEFAULT_DEF (expr) = (unsigned) bp_unpack_value (bp, 1);
       bp_unpack_value (bp, 8);
     }
+  else if (TREE_CODE (expr) == CALL_EXPR)
+    {
+      CALL_EXPR_BY_DESCRIPTOR (expr) = (unsigned) bp_unpack_value (bp, 1);
+      bp_unpack_value (bp, 8);
+    }
   else
     bp_unpack_value (bp, 9);
 }
@@ -521,6 +526,8 @@ streamer_read_tree_bitfields (struct lto_input_block *ib,
            MR_DEPENDENCE_BASE (expr)
              = (unsigned)bp_unpack_value (&bp, sizeof (short) * 8);
        }
+      else if (code == CALL_EXPR)
+       CALL_EXPR_IFN (expr) = bp_unpack_enum (&bp, internal_fn, IFN_LAST);
     }
 
   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
index ac798a3e9344e6bb349773f68e14f85d966cc487..4e7c7429561f139003ca28fc85bc3480d747aa4c 100644 (file)
@@ -129,6 +129,11 @@ pack_ts_base_value_fields (struct bitpack_d *bp, tree expr)
       bp_pack_value (bp, SSA_NAME_IS_DEFAULT_DEF (expr), 1);
       bp_pack_value (bp, 0, 8);
     }
+  else if (TREE_CODE (expr) == CALL_EXPR)
+    {
+      bp_pack_value (bp, CALL_EXPR_BY_DESCRIPTOR (expr), 1);
+      bp_pack_value (bp, 0, 8);
+    }
   else
     bp_pack_value (bp, 0, 9);
 }
@@ -457,6 +462,8 @@ streamer_write_tree_bitfields (struct output_block *ob, tree expr)
          if (MR_DEPENDENCE_CLIQUE (expr) != 0)
            bp_pack_value (&bp, MR_DEPENDENCE_BASE (expr), sizeof (short) * 8);
        }
+      else if (code == CALL_EXPR)
+       bp_pack_enum (&bp, internal_fn, IFN_LAST, CALL_EXPR_IFN (expr));
     }
 
   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
index 8264e9c7f141f1ab9149196de2a34b7822d80e70..39a924644144498726c5cf0f07da8cacb6d6e18c 100644 (file)
@@ -5347,13 +5347,6 @@ free_lang_data_in_one_sizepos (tree *expr_p)
   tree expr = *expr_p;
   if (CONTAINS_PLACEHOLDER_P (expr))
     *expr_p = build0 (PLACEHOLDER_EXPR, TREE_TYPE (expr));
-  /* ???  We have to reset all non-GIMPLE sizepos because those eventually
-     refer to trees we cannot stream.  See for example PR87229 which
-     shows an example with non-gimplified abstract origins in C++.
-     Note this should only happen for abstract copies so setting sizes
-     to NULL is OK (but we cannot easily assert this).  */
-  else if (expr && !is_gimple_val (expr))
-    *expr_p = NULL_TREE;
 }