On Wed, 21 Nov 2018, Richard Biener wrote:

> 
> My previous fix for PR87229 was too aggressive.  The following
> simply teaches the LTO streamer to deal with CALL_EXPRs, support
> for which was already in place.  I've amended it with two
> missing pieces, streaming of CALL_EXPR_BY_DESCRIPTOR and CALL_EXPR_IFN.
> 
> LTO bootstrapped and tested on x86_64-unknown-linux-gnu with Ada enabled.
> 
> Any objections?  As said elsewhere I'm looking for sth that is
> reasonably safe for GCC 8 as well given the PR is a regression there.

Now applied.

Richard.

> Richard.
> 
> 2018-11-21  Richard Biener  <rguent...@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.
> 
> 
> Index: gcc/lto-streamer-out.c
> ===================================================================
> --- gcc/lto-streamer-out.c    (revision 266308)
> +++ gcc/lto-streamer-out.c    (working copy)
> @@ -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: gcc/tree-streamer-in.c
> ===================================================================
> --- gcc/tree-streamer-in.c    (revision 266308)
> +++ gcc/tree-streamer-in.c    (working copy)
> @@ -158,6 +158,11 @@ unpack_ts_base_value_fields (struct bitp
>        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
>           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: gcc/tree-streamer-out.c
> ===================================================================
> --- gcc/tree-streamer-out.c   (revision 266308)
> +++ gcc/tree-streamer-out.c   (working copy)
> @@ -129,6 +129,11 @@ pack_ts_base_value_fields (struct bitpac
>        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 ou
>         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: gcc/tree.c
> ===================================================================
> --- gcc/tree.c        (revision 266308)
> +++ gcc/tree.c        (working copy)
> @@ -5254,13 +5254,6 @@ free_lang_data_in_one_sizepos (tree *exp
>    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;
>  }
>  
>  
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to