diff mbox series

Stabilize temporary variable names

Message ID ZEJ42eT5TXmuBzia@kam.mff.cuni.cz
State New
Headers show
Series Stabilize temporary variable names | expand

Commit Message

Jan Hubicka April 21, 2023, 11:51 a.m. UTC
Hi,
Michal Jires implemented quite well working prototype of cache for WPA which makes
it to re-use partitions from from earlier build when package is rebulit with smaller
changes.  It should be useful to improve edit/compile/debug cycles when one is
forced to debug with LTO enabled but hopefully also avoid duplicated work i.e.
during bootstrap where libbackend is linked into multiple frontends.

To make this work well, it is necessary to avoid local decisions from
one function to leak into others.  This patch fixes a problem he noticed
in create_tmp_var_name.  It has one global id appended after each name.
So calling it with create_tmp_var_name ("pretmp") yields to somehting
like "pretmp.1".  This global counters makes one function body to depend
on number of temporaries produced by another function body. In his
testcase a local change to large function in switch conversion pass
resulted in recompilation of most of partitions since an important
inline (unrelated to the patched function) had ID in it that has changed.

I think that independently on the incremental WPA project it is a good
idea to stabilize temporary names, in similar manner as we stabilized
symbol names of clones couple years back.

I think we want
 1) for local variables use local IDs
    (this is used by gimplifier to produce temporaries, openmp lowering, thunk
     generation and by some passes to make names instead of unnamed SSA names)
 2) for global variables either appends function symbol name when the variable
    exists to lower some construct in its body.
    For example swtich conversion can use CSWITCH.foo.<local id>
    instead of CSWITCH.<global is>
 3) for truly global variables have per-name IDs.

This patch implement only 1 but adds extra parameter separating locals from
globals.

Bootstrapped/regtested x86_64-linux, OK?

gcc/fortran/ChangeLog:

	* trans-array.cc (gfc_build_constant_array_constructor): Update call of
	create_tmp_var_name.
	(gfc_trans_auto_array_allocation): Likewise.
	* trans-decl.cc (gfc_add_assign_aux_vars): Likewise.
	(create_function_arglist): Likewise.
	(generate_coarray_init): Likewise.
	(create_main_function): Likewise.

gcc/ChangeLog:

	* function.h (struct function): Add tmp_var_id_num.
	* gimple-expr.cc (create_tmp_var_name): Add parameter whether name is
	local or global; for local use function local ids.
	(create_tmp_var_raw): Udate.
	* gimple-expr.h (create_tmp_var_name): Udate.
	* gimplify.cc (internal_get_tmp_var): Udate.
	(gimplify_init_constructor): Udate.
	(gimplify_modify_expr): Udate.
	(gimplify_function_tree): Udate.
	* ipa-param-manipulation.cc (ipa_param_body_adjustments::common_initialization): Udate.
	* lto-streamer-in.cc (input_struct_function_base): Udate.
	* lto-streamer-out.cc (hash_tree): Udate.
	* omp-low.cc (scan_omp_parallel): Udate.
	(scan_omp_task): Udate.
	(scan_omp_single): Udate.
	(scan_omp_target): Udate.
	(scan_omp_teams): Udate.
	* omp-oacc-neuter-broadcast.cc (oacc_do_neutering): Udate.
	* symtab-thunks.cc (expand_thunk): Udate.
	* tree-nested.cc (get_chain_decl): Udate.
	* tree-parloops.cc (separate_decls_in_region): Udate.
	* tree-switch-conversion.cc (switch_conversion::build_one_array): Udate.


gcc/testsuite/ChangeLog:

	* gfortran.dg/char_cast_1.f90: Update template.
	* gfortran.dg/vector_subscript_4.f90: Update template.

Comments

Richard Biener April 24, 2023, 7:52 a.m. UTC | #1
On Fri, 21 Apr 2023, Jan Hubicka wrote:

> Hi,
> Michal Jires implemented quite well working prototype of cache for WPA which makes
> it to re-use partitions from from earlier build when package is rebulit with smaller
> changes.  It should be useful to improve edit/compile/debug cycles when one is
> forced to debug with LTO enabled but hopefully also avoid duplicated work i.e.
> during bootstrap where libbackend is linked into multiple frontends.
> 
> To make this work well, it is necessary to avoid local decisions from
> one function to leak into others.  This patch fixes a problem he noticed
> in create_tmp_var_name.  It has one global id appended after each name.
> So calling it with create_tmp_var_name ("pretmp") yields to somehting
> like "pretmp.1".  This global counters makes one function body to depend
> on number of temporaries produced by another function body. In his
> testcase a local change to large function in switch conversion pass
> resulted in recompilation of most of partitions since an important
> inline (unrelated to the patched function) had ID in it that has changed.
> 
> I think that independently on the incremental WPA project it is a good
> idea to stabilize temporary names, in similar manner as we stabilized
> symbol names of clones couple years back.
> 
> I think we want
>  1) for local variables use local IDs
>     (this is used by gimplifier to produce temporaries, openmp lowering, thunk
>      generation and by some passes to make names instead of unnamed SSA names)
>  2) for global variables either appends function symbol name when the variable
>     exists to lower some construct in its body.
>     For example swtich conversion can use CSWITCH.foo.<local id>
>     instead of CSWITCH.<global is>
>  3) for truly global variables have per-name IDs.
> 
> This patch implement only 1 but adds extra parameter separating locals from
> globals.

I think true vs. false in the API makes it not easy to read the code.
Maybe we can pass struct function or a function decl as first argument
and use NULL to mean 3) and non-NULL to mean 1).  To distinguish 2) we'd
need something additional.

I note that a lot of the calls pass the name to build_decl directly,
I wonder if they could use create_tmp_var{,_name,_raw} or a split
out part just doing the build_decl and create_tmp_var_name part with
an appropriate name instead?

Richard.
 
> Bootstrapped/regtested x86_64-linux, OK?
>
> gcc/fortran/ChangeLog:
> 
> 	* trans-array.cc (gfc_build_constant_array_constructor): Update call of
> 	create_tmp_var_name.
> 	(gfc_trans_auto_array_allocation): Likewise.
> 	* trans-decl.cc (gfc_add_assign_aux_vars): Likewise.
> 	(create_function_arglist): Likewise.
> 	(generate_coarray_init): Likewise.
> 	(create_main_function): Likewise.
> 
> gcc/ChangeLog:
> 
> 	* function.h (struct function): Add tmp_var_id_num.
> 	* gimple-expr.cc (create_tmp_var_name): Add parameter whether name is
> 	local or global; for local use function local ids.
> 	(create_tmp_var_raw): Udate.
> 	* gimple-expr.h (create_tmp_var_name): Udate.
> 	* gimplify.cc (internal_get_tmp_var): Udate.
> 	(gimplify_init_constructor): Udate.
> 	(gimplify_modify_expr): Udate.
> 	(gimplify_function_tree): Udate.
> 	* ipa-param-manipulation.cc (ipa_param_body_adjustments::common_initialization): Udate.
> 	* lto-streamer-in.cc (input_struct_function_base): Udate.
> 	* lto-streamer-out.cc (hash_tree): Udate.
> 	* omp-low.cc (scan_omp_parallel): Udate.
> 	(scan_omp_task): Udate.
> 	(scan_omp_single): Udate.
> 	(scan_omp_target): Udate.
> 	(scan_omp_teams): Udate.
> 	* omp-oacc-neuter-broadcast.cc (oacc_do_neutering): Udate.
> 	* symtab-thunks.cc (expand_thunk): Udate.
> 	* tree-nested.cc (get_chain_decl): Udate.
> 	* tree-parloops.cc (separate_decls_in_region): Udate.
> 	* tree-switch-conversion.cc (switch_conversion::build_one_array): Udate.
> 
> 
> gcc/testsuite/ChangeLog:
> 
> 	* gfortran.dg/char_cast_1.f90: Update template.
> 	* gfortran.dg/vector_subscript_4.f90: Update template.
> 
> diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
> index e1725808033..f3de515f6c9 100644
> --- a/gcc/fortran/trans-array.cc
> +++ b/gcc/fortran/trans-array.cc
> @@ -2623,7 +2623,7 @@ gfc_build_constant_array_constructor (gfc_expr * expr, tree type)
>    TREE_CONSTANT (init) = 1;
>    TREE_STATIC (init) = 1;
>  
> -  tmp = build_decl (input_location, VAR_DECL, create_tmp_var_name ("A"),
> +  tmp = build_decl (input_location, VAR_DECL, create_tmp_var_name ("A", true),
>  		    tmptype);
>    DECL_ARTIFICIAL (tmp) = 1;
>    DECL_IGNORED_P (tmp) = 1;
> @@ -6699,7 +6699,7 @@ gfc_trans_auto_array_allocation (tree decl, gfc_symbol * sym,
>      {
>        gcc_assert (TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE);
>        space = build_decl (gfc_get_location (&sym->declared_at),
> -			  VAR_DECL, create_tmp_var_name ("A"),
> +			  VAR_DECL, create_tmp_var_name ("A", false),
>  			  TREE_TYPE (TREE_TYPE (decl)));
>        gfc_trans_vla_type_sizes (sym, &init);
>      }
> diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
> index 299764b08b2..4c59e4dc0f4 100644
> --- a/gcc/fortran/trans-decl.cc
> +++ b/gcc/fortran/trans-decl.cc
> @@ -1417,10 +1417,10 @@ gfc_add_assign_aux_vars (gfc_symbol * sym)
>    gfc_allocate_lang_decl (decl);
>    GFC_DECL_ASSIGN (decl) = 1;
>    length = build_decl (input_location,
> -		       VAR_DECL, create_tmp_var_name (sym->name),
> +		       VAR_DECL, create_tmp_var_name (sym->name, false),
>  		       gfc_charlen_type_node);
>    addr = build_decl (input_location,
> -		     VAR_DECL, create_tmp_var_name (sym->name),
> +		     VAR_DECL, create_tmp_var_name (sym->name, false),
>  		     pvoid_type_node);
>    gfc_finish_var_decl (length, sym);
>    gfc_finish_var_decl (addr, sym);
> @@ -2835,7 +2835,7 @@ create_function_arglist (gfc_symbol * sym)
>  		     : TREE_TYPE (f->sym->backend_decl);
>  
>  	  token = build_decl (input_location, PARM_DECL,
> -			      create_tmp_var_name ("caf_token"),
> +			      create_tmp_var_name ("caf_token", false),
>  			      build_qualified_type (pvoid_type_node,
>  						    TYPE_QUAL_RESTRICT));
>  	  if ((f->sym->ts.type != BT_CLASS
> @@ -2864,7 +2864,7 @@ create_function_arglist (gfc_symbol * sym)
>  	  gfc_finish_decl (token);
>  
>  	  offset = build_decl (input_location, PARM_DECL,
> -			       create_tmp_var_name ("caf_offset"),
> +			       create_tmp_var_name ("caf_offset", false),
>  			       gfc_array_index_type);
>  
>  	  if ((f->sym->ts.type != BT_CLASS
> @@ -5713,7 +5713,7 @@ generate_coarray_init (gfc_namespace * ns __attribute((unused)))
>  
>    tmp = build_function_type_list (void_type_node, NULL_TREE);
>    fndecl = build_decl (input_location, FUNCTION_DECL,
> -		       create_tmp_var_name ("_caf_init"), tmp);
> +		       create_tmp_var_name ("_caf_init", true), tmp);
>  
>    DECL_STATIC_CONSTRUCTOR (fndecl) = 1;
>    SET_DECL_INIT_PRIORITY (fndecl, DEFAULT_INIT_PRIORITY);
> @@ -6395,7 +6395,7 @@ create_main_function (tree fndecl)
>  
>      /* Create a static variable to hold the jump table.  */
>      var = build_decl (input_location, VAR_DECL,
> -		      create_tmp_var_name ("options"), array_type);
> +		      create_tmp_var_name ("options", true), array_type);
>      DECL_ARTIFICIAL (var) = 1;
>      DECL_IGNORED_P (var) = 1;
>      TREE_CONSTANT (var) = 1;
> diff --git a/gcc/function.h b/gcc/function.h
> index d4ce8a7c6c6..dbcfe0bc97e 100644
> --- a/gcc/function.h
> +++ b/gcc/function.h
> @@ -338,6 +338,9 @@ struct GTY(()) function {
>       flags for the actions that they have taken.  */
>    unsigned int pending_TODOs;
>  
> +  /* ID used by create_tmp_var_name.  */
> +  unsigned int tmp_var_id_num;
> +
>    /* Non-null if the function does something that would prevent it from
>       being copied; this applies to both versioning and inlining.  Set to
>       a string describing the reason for failure.  */
> diff --git a/gcc/gimple-expr.cc b/gcc/gimple-expr.cc
> index 83dc340a35d..ddbb2b48bef 100644
> --- a/gcc/gimple-expr.cc
> +++ b/gcc/gimple-expr.cc
> @@ -415,7 +415,7 @@ remove_suffix (char *name, int len)
>  static GTY(()) unsigned int tmp_var_id_num;
>  
>  tree
> -create_tmp_var_name (const char *prefix)
> +create_tmp_var_name (const char *prefix, bool global)
>  {
>    char *tmp_name;
>  
> @@ -429,7 +429,9 @@ create_tmp_var_name (const char *prefix)
>        prefix = preftmp;
>      }
>  
> -  ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix ? prefix : "T", tmp_var_id_num++);
> +  /* During self-tests we create tmp variables cfun being NULL.  */
> +  ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix ? prefix : "T",
> +			   !global && cfun ? cfun->tmp_var_id_num++ : tmp_var_id_num++);
>    return get_identifier (tmp_name);
>  }
>  
> @@ -442,7 +444,7 @@ create_tmp_var_raw (tree type, const char *prefix)
>    tree tmp_var;
>  
>    tmp_var = build_decl (input_location,
> -			VAR_DECL, prefix ? create_tmp_var_name (prefix) : NULL,
> +			VAR_DECL, prefix ? create_tmp_var_name (prefix, false) : NULL,
>  			type);
>  
>    /* The variable was declared by the compiler.  */
> diff --git a/gcc/gimple-expr.h b/gcc/gimple-expr.h
> index e89f7e20fc8..0ac1fc2cfe1 100644
> --- a/gcc/gimple-expr.h
> +++ b/gcc/gimple-expr.h
> @@ -28,7 +28,7 @@ extern gimple_seq gimple_body (tree);
>  extern bool gimple_has_body_p (tree);
>  extern const char *gimple_decl_printable_name (tree, int);
>  extern tree copy_var_decl (tree, tree, tree);
> -extern tree create_tmp_var_name (const char *);
> +extern tree create_tmp_var_name (const char *, bool global);
>  extern tree create_tmp_var_raw (tree, const char * = NULL);
>  extern tree create_tmp_var (tree, const char * = NULL);
>  extern tree create_tmp_reg (tree, const char * = NULL);
> diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
> index 5a8340504d0..241fdc922de 100644
> --- a/gcc/gimplify.cc
> +++ b/gcc/gimplify.cc
> @@ -637,7 +637,7 @@ internal_get_tmp_var (tree val, gimple_seq *pre_p, gimple_seq *post_p,
>  	{
>  	  const char *name = get_name (val);
>  	  if (name)
> -	    SET_SSA_NAME_VAR_OR_IDENTIFIER (t, create_tmp_var_name (name));
> +	    SET_SSA_NAME_VAR_OR_IDENTIFIER (t, create_tmp_var_name (name, false));
>  	}
>      }
>    else
> @@ -5250,7 +5250,7 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
>  	    DECL_INITIAL (object) = ctor;
>  	    TREE_STATIC (object) = 1;
>  	    if (!DECL_NAME (object))
> -	      DECL_NAME (object) = create_tmp_var_name ("C");
> +	      DECL_NAME (object) = create_tmp_var_name ("C", true);
>  	    walk_tree (&DECL_INITIAL (object), force_labels_r, NULL, NULL);
>  
>  	    /* ??? C++ doesn't automatically append a .<number> to the
> @@ -6250,7 +6250,7 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
>      {
>        if (!DECL_NAME (*from_p) && DECL_NAME (*to_p))
>  	DECL_NAME (*from_p)
> -	  = create_tmp_var_name (IDENTIFIER_POINTER (DECL_NAME (*to_p)));
> +	  = create_tmp_var_name (IDENTIFIER_POINTER (DECL_NAME (*to_p)), false);
>        DECL_HAS_DEBUG_EXPR_P (*from_p) = 1;
>        SET_DECL_DEBUG_EXPR (*from_p, *to_p);
>     }
> @@ -17881,7 +17881,7 @@ gimplify_function_tree (tree fndecl)
>  	  tree first_var
>  	    = build_decl (DECL_SOURCE_LOCATION (current_function_decl),
>  			  VAR_DECL,
> -			  create_tmp_var_name ("C"),
> +			  create_tmp_var_name ("C", true),
>  			  boolean_type_node);
>  	  DECL_ARTIFICIAL (first_var) = 1;
>  	  DECL_IGNORED_P (first_var) = 1;
> diff --git a/gcc/ipa-param-manipulation.cc b/gcc/ipa-param-manipulation.cc
> index 42488ee09c3..314a7a5aa20 100644
> --- a/gcc/ipa-param-manipulation.cc
> +++ b/gcc/ipa-param-manipulation.cc
> @@ -1378,7 +1378,7 @@ ipa_param_body_adjustments::common_initialization (tree old_fndecl,
>  	  new_parm = build_decl (UNKNOWN_LOCATION, PARM_DECL, NULL_TREE,
>  				 new_type);
>  	  const char *prefix = ipa_param_prefixes[apm->param_prefix_index];
> -	  DECL_NAME (new_parm) = create_tmp_var_name (prefix);
> +	  DECL_NAME (new_parm) = create_tmp_var_name (prefix, false);
>  	  DECL_ARTIFICIAL (new_parm) = 1;
>  	  DECL_ARG_TYPE (new_parm) = new_type;
>  	  DECL_CONTEXT (new_parm) = m_fndecl;
> diff --git a/gcc/lto-streamer-in.cc b/gcc/lto-streamer-in.cc
> index 03cb41cfa16..5a0f156eb27 100644
> --- a/gcc/lto-streamer-in.cc
> +++ b/gcc/lto-streamer-in.cc
> @@ -1300,6 +1300,8 @@ input_struct_function_base (struct function *fn, class data_in *data_in,
>    /* Input the current IL state of the function.  */
>    fn->curr_properties = streamer_read_uhwi (ib);
>  
> +  fn->tmp_var_id_num = streamer_read_uhwi (ib);
> +
>    /* Read all the attributes for FN.  */
>    bp = streamer_read_bitpack (ib);
>    fn->is_thunk = bp_unpack_value (&bp, 1);
> diff --git a/gcc/lto-streamer-out.cc b/gcc/lto-streamer-out.cc
> index 0bca530313c..27f9edd3fcd 100644
> --- a/gcc/lto-streamer-out.cc
> +++ b/gcc/lto-streamer-out.cc
> @@ -2260,6 +2256,8 @@ output_struct_function_base (struct output_block *ob, struct function *fn)
>    /* Output current IL state of the function.  */
>    streamer_write_uhwi (ob, fn->curr_properties);
>  
> +  streamer_write_uhwi (ob, fn->tmp_var_id_num);
> +
>    /* Write all the attributes for FN.  */
>    bp = bitpack_create (ob->main_stream);
>    bp_pack_value (&bp, fn->is_thunk, 1);
> diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc
> index dddf5b59d8f..5ae35260a28 100644
> --- a/gcc/omp-low.cc
> +++ b/gcc/omp-low.cc
> @@ -2324,7 +2324,7 @@ scan_omp_parallel (gimple_stmt_iterator *gsi, omp_context *outer_ctx)
>      ctx->is_nested = true;
>    ctx->field_map = splay_tree_new (splay_tree_compare_pointers, 0, 0);
>    ctx->record_type = lang_hooks.types.make_type (RECORD_TYPE);
> -  name = create_tmp_var_name (".omp_data_s");
> +  name = create_tmp_var_name (".omp_data_s", false);
>    name = build_decl (gimple_location (stmt),
>  		     TYPE_DECL, name, ctx->record_type);
>    DECL_ARTIFICIAL (name) = 1;
> @@ -2377,7 +2377,7 @@ scan_omp_task (gimple_stmt_iterator *gsi, omp_context *outer_ctx)
>      ctx->is_nested = true;
>    ctx->field_map = splay_tree_new (splay_tree_compare_pointers, 0, 0);
>    ctx->record_type = lang_hooks.types.make_type (RECORD_TYPE);
> -  name = create_tmp_var_name (".omp_data_s");
> +  name = create_tmp_var_name (".omp_data_s", false);
>    name = build_decl (gimple_location (stmt),
>  		     TYPE_DECL, name, ctx->record_type);
>    DECL_ARTIFICIAL (name) = 1;
> @@ -2391,7 +2391,7 @@ scan_omp_task (gimple_stmt_iterator *gsi, omp_context *outer_ctx)
>  
>    if (ctx->srecord_type)
>      {
> -      name = create_tmp_var_name (".omp_data_a");
> +      name = create_tmp_var_name (".omp_data_a", false);
>        name = build_decl (gimple_location (stmt),
>  			 TYPE_DECL, name, ctx->srecord_type);
>        DECL_ARTIFICIAL (name) = 1;
> @@ -3067,7 +3067,7 @@ scan_omp_single (gomp_single *stmt, omp_context *outer_ctx)
>    ctx = new_omp_context (stmt, outer_ctx);
>    ctx->field_map = splay_tree_new (splay_tree_compare_pointers, 0, 0);
>    ctx->record_type = lang_hooks.types.make_type (RECORD_TYPE);
> -  name = create_tmp_var_name (".omp_copy_s");
> +  name = create_tmp_var_name (".omp_copy_s", false);
>    name = build_decl (gimple_location (stmt),
>  		     TYPE_DECL, name, ctx->record_type);
>    TYPE_NAME (ctx->record_type) = name;
> @@ -3094,7 +3094,7 @@ scan_omp_target (gomp_target *stmt, omp_context *outer_ctx)
>    ctx = new_omp_context (stmt, outer_ctx);
>    ctx->field_map = splay_tree_new (splay_tree_compare_pointers, 0, 0);
>    ctx->record_type = lang_hooks.types.make_type (RECORD_TYPE);
> -  name = create_tmp_var_name (".omp_data_t");
> +  name = create_tmp_var_name (".omp_data_t", false);
>    name = build_decl (gimple_location (stmt),
>  		     TYPE_DECL, name, ctx->record_type);
>    DECL_ARTIFICIAL (name) = 1;
> @@ -3156,7 +3156,7 @@ scan_omp_teams (gomp_teams *stmt, omp_context *outer_ctx)
>    gcc_assert (taskreg_nesting_level == 1);
>    ctx->field_map = splay_tree_new (splay_tree_compare_pointers, 0, 0);
>    ctx->record_type = lang_hooks.types.make_type (RECORD_TYPE);
> -  tree name = create_tmp_var_name (".omp_data_s");
> +  tree name = create_tmp_var_name (".omp_data_s", false);
>    name = build_decl (gimple_location (stmt),
>  		     TYPE_DECL, name, ctx->record_type);
>    DECL_ARTIFICIAL (name) = 1;
> diff --git a/gcc/omp-oacc-neuter-broadcast.cc b/gcc/omp-oacc-neuter-broadcast.cc
> index 6328253018e..9b94502671d 100644
> --- a/gcc/omp-oacc-neuter-broadcast.cc
> +++ b/gcc/omp-oacc-neuter-broadcast.cc
> @@ -1647,7 +1647,7 @@ oacc_do_neutering (unsigned HOST_WIDE_INT bounds_lo,
>        if (ws_prop)
>  	{
>  	  tree record_type = lang_hooks.types.make_type (RECORD_TYPE);
> -	  tree name = create_tmp_var_name (".oacc_ws_data_s");
> +	  tree name = create_tmp_var_name (".oacc_ws_data_s", false);
>  	  name = build_decl (UNKNOWN_LOCATION, TYPE_DECL, name, record_type);
>  	  DECL_ARTIFICIAL (name) = 1;
>  	  DECL_NAMELESS (name) = 1;
> diff --git a/gcc/symtab-thunks.cc b/gcc/symtab-thunks.cc
> index 4c04235c41b..d79edb4c5d6 100644
> --- a/gcc/symtab-thunks.cc
> +++ b/gcc/symtab-thunks.cc
> @@ -534,7 +534,7 @@ expand_thunk (cgraph_node *node, bool output_asm_thunks,
>  	  tree p = DECL_STRUCT_FUNCTION (alias)->static_chain_decl;
>  	  tree type = TREE_TYPE (p);
>  	  tree decl = build_decl (DECL_SOURCE_LOCATION (thunk_fndecl),
> -				  PARM_DECL, create_tmp_var_name ("CHAIN"),
> +				  PARM_DECL, create_tmp_var_name ("CHAIN", false),
>  				  type);
>  	  DECL_ARTIFICIAL (decl) = 1;
>  	  DECL_IGNORED_P (decl) = 1;
> diff --git a/gcc/testsuite/gfortran.dg/char_cast_1.f90 b/gcc/testsuite/gfortran.dg/char_cast_1.f90
> index 02e695d2d7b..b5e0aeb6ecb 100644
> --- a/gcc/testsuite/gfortran.dg/char_cast_1.f90
> +++ b/gcc/testsuite/gfortran.dg/char_cast_1.f90
> @@ -27,4 +27,4 @@
>  end
>  ! The sign that all is well is that [S.6][1] appears twice.
>  ! Platform dependent variations are [S$6][1], [__S_6][1], [S___6][1]
> -! { dg-final { scan-tree-dump-times "6\\\]\\\[1\\\]" 2 "original" } }
> +! { dg-final { scan-tree-dump-times "2\\\]\\\[1\\\]" 2 "original" } }
> diff --git a/gcc/testsuite/gfortran.dg/vector_subscript_4.f90 b/gcc/testsuite/gfortran.dg/vector_subscript_4.f90
> index d726d424ab7..382745fbb2c 100644
> --- a/gcc/testsuite/gfortran.dg/vector_subscript_4.f90
> +++ b/gcc/testsuite/gfortran.dg/vector_subscript_4.f90
> @@ -9,4 +9,4 @@
>       integer :: i(-1:1) = 1, j(3) = 1, k(3)
>        k = j((/1,1,1/)+i)
>        end
> -! { dg-final { scan-tree-dump-times "A\.2\\\[3\\\]" 1 "original" } }
> +! { dg-final { scan-tree-dump-times "A\.1\\\[3\\\]" 1 "original" } }
> diff --git a/gcc/tree-nested.cc b/gcc/tree-nested.cc
> index 1418e1f7f56..f6ec2997e61 100644
> --- a/gcc/tree-nested.cc
> +++ b/gcc/tree-nested.cc
> @@ -473,7 +473,7 @@ get_chain_decl (struct nesting_info *info)
>  	 close to the truth, since the initial value does come from
>  	 the caller.  */
>        decl = build_decl (DECL_SOURCE_LOCATION (info->context),
> -			 PARM_DECL, create_tmp_var_name ("CHAIN"), type);
> +			 PARM_DECL, create_tmp_var_name ("CHAIN", false), type);
>        DECL_ARTIFICIAL (decl) = 1;
>        DECL_IGNORED_P (decl) = 1;
>        TREE_USED (decl) = 1;
> diff --git a/gcc/tree-parloops.cc b/gcc/tree-parloops.cc
> index dfb75c369d6..8d0ea9fb941 100644
> --- a/gcc/tree-parloops.cc
> +++ b/gcc/tree-parloops.cc
> @@ -2109,7 +2109,7 @@ separate_decls_in_region (edge entry, edge exit,
>        /* Create the type for the structure to store the ssa names to.  */
>        type = lang_hooks.types.make_type (RECORD_TYPE);
>        type_name = build_decl (UNKNOWN_LOCATION,
> -			      TYPE_DECL, create_tmp_var_name (".paral_data"),
> +			      TYPE_DECL, create_tmp_var_name (".paral_data", false),
>  			      type);
>        TYPE_NAME (type) = type_name;
>  
> diff --git a/gcc/tree-switch-conversion.cc b/gcc/tree-switch-conversion.cc
> index c08c22039c9..caa1c43bc14 100644
> --- a/gcc/tree-switch-conversion.cc
> +++ b/gcc/tree-switch-conversion.cc
> @@ -671,7 +671,7 @@ switch_conversion::build_one_array (int num, tree arr_index_type,
>        TREE_STATIC (decl) = 1;
>        DECL_INITIAL (decl) = ctor;
>  
> -      DECL_NAME (decl) = create_tmp_var_name ("CSWTCH");
> +      DECL_NAME (decl) = create_tmp_var_name ("CSWTCH", true);
>        DECL_ARTIFICIAL (decl) = 1;
>        DECL_IGNORED_P (decl) = 1;
>        TREE_CONSTANT (decl) = 1;
>
diff mbox series

Patch

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index e1725808033..f3de515f6c9 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -2623,7 +2623,7 @@  gfc_build_constant_array_constructor (gfc_expr * expr, tree type)
   TREE_CONSTANT (init) = 1;
   TREE_STATIC (init) = 1;
 
-  tmp = build_decl (input_location, VAR_DECL, create_tmp_var_name ("A"),
+  tmp = build_decl (input_location, VAR_DECL, create_tmp_var_name ("A", true),
 		    tmptype);
   DECL_ARTIFICIAL (tmp) = 1;
   DECL_IGNORED_P (tmp) = 1;
@@ -6699,7 +6699,7 @@  gfc_trans_auto_array_allocation (tree decl, gfc_symbol * sym,
     {
       gcc_assert (TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE);
       space = build_decl (gfc_get_location (&sym->declared_at),
-			  VAR_DECL, create_tmp_var_name ("A"),
+			  VAR_DECL, create_tmp_var_name ("A", false),
 			  TREE_TYPE (TREE_TYPE (decl)));
       gfc_trans_vla_type_sizes (sym, &init);
     }
diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index 299764b08b2..4c59e4dc0f4 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -1417,10 +1417,10 @@  gfc_add_assign_aux_vars (gfc_symbol * sym)
   gfc_allocate_lang_decl (decl);
   GFC_DECL_ASSIGN (decl) = 1;
   length = build_decl (input_location,
-		       VAR_DECL, create_tmp_var_name (sym->name),
+		       VAR_DECL, create_tmp_var_name (sym->name, false),
 		       gfc_charlen_type_node);
   addr = build_decl (input_location,
-		     VAR_DECL, create_tmp_var_name (sym->name),
+		     VAR_DECL, create_tmp_var_name (sym->name, false),
 		     pvoid_type_node);
   gfc_finish_var_decl (length, sym);
   gfc_finish_var_decl (addr, sym);
@@ -2835,7 +2835,7 @@  create_function_arglist (gfc_symbol * sym)
 		     : TREE_TYPE (f->sym->backend_decl);
 
 	  token = build_decl (input_location, PARM_DECL,
-			      create_tmp_var_name ("caf_token"),
+			      create_tmp_var_name ("caf_token", false),
 			      build_qualified_type (pvoid_type_node,
 						    TYPE_QUAL_RESTRICT));
 	  if ((f->sym->ts.type != BT_CLASS
@@ -2864,7 +2864,7 @@  create_function_arglist (gfc_symbol * sym)
 	  gfc_finish_decl (token);
 
 	  offset = build_decl (input_location, PARM_DECL,
-			       create_tmp_var_name ("caf_offset"),
+			       create_tmp_var_name ("caf_offset", false),
 			       gfc_array_index_type);
 
 	  if ((f->sym->ts.type != BT_CLASS
@@ -5713,7 +5713,7 @@  generate_coarray_init (gfc_namespace * ns __attribute((unused)))
 
   tmp = build_function_type_list (void_type_node, NULL_TREE);
   fndecl = build_decl (input_location, FUNCTION_DECL,
-		       create_tmp_var_name ("_caf_init"), tmp);
+		       create_tmp_var_name ("_caf_init", true), tmp);
 
   DECL_STATIC_CONSTRUCTOR (fndecl) = 1;
   SET_DECL_INIT_PRIORITY (fndecl, DEFAULT_INIT_PRIORITY);
@@ -6395,7 +6395,7 @@  create_main_function (tree fndecl)
 
     /* Create a static variable to hold the jump table.  */
     var = build_decl (input_location, VAR_DECL,
-		      create_tmp_var_name ("options"), array_type);
+		      create_tmp_var_name ("options", true), array_type);
     DECL_ARTIFICIAL (var) = 1;
     DECL_IGNORED_P (var) = 1;
     TREE_CONSTANT (var) = 1;
diff --git a/gcc/function.h b/gcc/function.h
index d4ce8a7c6c6..dbcfe0bc97e 100644
--- a/gcc/function.h
+++ b/gcc/function.h
@@ -338,6 +338,9 @@  struct GTY(()) function {
      flags for the actions that they have taken.  */
   unsigned int pending_TODOs;
 
+  /* ID used by create_tmp_var_name.  */
+  unsigned int tmp_var_id_num;
+
   /* Non-null if the function does something that would prevent it from
      being copied; this applies to both versioning and inlining.  Set to
      a string describing the reason for failure.  */
diff --git a/gcc/gimple-expr.cc b/gcc/gimple-expr.cc
index 83dc340a35d..ddbb2b48bef 100644
--- a/gcc/gimple-expr.cc
+++ b/gcc/gimple-expr.cc
@@ -415,7 +415,7 @@  remove_suffix (char *name, int len)
 static GTY(()) unsigned int tmp_var_id_num;
 
 tree
-create_tmp_var_name (const char *prefix)
+create_tmp_var_name (const char *prefix, bool global)
 {
   char *tmp_name;
 
@@ -429,7 +429,9 @@  create_tmp_var_name (const char *prefix)
       prefix = preftmp;
     }
 
-  ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix ? prefix : "T", tmp_var_id_num++);
+  /* During self-tests we create tmp variables cfun being NULL.  */
+  ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix ? prefix : "T",
+			   !global && cfun ? cfun->tmp_var_id_num++ : tmp_var_id_num++);
   return get_identifier (tmp_name);
 }
 
@@ -442,7 +444,7 @@  create_tmp_var_raw (tree type, const char *prefix)
   tree tmp_var;
 
   tmp_var = build_decl (input_location,
-			VAR_DECL, prefix ? create_tmp_var_name (prefix) : NULL,
+			VAR_DECL, prefix ? create_tmp_var_name (prefix, false) : NULL,
 			type);
 
   /* The variable was declared by the compiler.  */
diff --git a/gcc/gimple-expr.h b/gcc/gimple-expr.h
index e89f7e20fc8..0ac1fc2cfe1 100644
--- a/gcc/gimple-expr.h
+++ b/gcc/gimple-expr.h
@@ -28,7 +28,7 @@  extern gimple_seq gimple_body (tree);
 extern bool gimple_has_body_p (tree);
 extern const char *gimple_decl_printable_name (tree, int);
 extern tree copy_var_decl (tree, tree, tree);
-extern tree create_tmp_var_name (const char *);
+extern tree create_tmp_var_name (const char *, bool global);
 extern tree create_tmp_var_raw (tree, const char * = NULL);
 extern tree create_tmp_var (tree, const char * = NULL);
 extern tree create_tmp_reg (tree, const char * = NULL);
diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index 5a8340504d0..241fdc922de 100644
--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -637,7 +637,7 @@  internal_get_tmp_var (tree val, gimple_seq *pre_p, gimple_seq *post_p,
 	{
 	  const char *name = get_name (val);
 	  if (name)
-	    SET_SSA_NAME_VAR_OR_IDENTIFIER (t, create_tmp_var_name (name));
+	    SET_SSA_NAME_VAR_OR_IDENTIFIER (t, create_tmp_var_name (name, false));
 	}
     }
   else
@@ -5250,7 +5250,7 @@  gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
 	    DECL_INITIAL (object) = ctor;
 	    TREE_STATIC (object) = 1;
 	    if (!DECL_NAME (object))
-	      DECL_NAME (object) = create_tmp_var_name ("C");
+	      DECL_NAME (object) = create_tmp_var_name ("C", true);
 	    walk_tree (&DECL_INITIAL (object), force_labels_r, NULL, NULL);
 
 	    /* ??? C++ doesn't automatically append a .<number> to the
@@ -6250,7 +6250,7 @@  gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
     {
       if (!DECL_NAME (*from_p) && DECL_NAME (*to_p))
 	DECL_NAME (*from_p)
-	  = create_tmp_var_name (IDENTIFIER_POINTER (DECL_NAME (*to_p)));
+	  = create_tmp_var_name (IDENTIFIER_POINTER (DECL_NAME (*to_p)), false);
       DECL_HAS_DEBUG_EXPR_P (*from_p) = 1;
       SET_DECL_DEBUG_EXPR (*from_p, *to_p);
    }
@@ -17881,7 +17881,7 @@  gimplify_function_tree (tree fndecl)
 	  tree first_var
 	    = build_decl (DECL_SOURCE_LOCATION (current_function_decl),
 			  VAR_DECL,
-			  create_tmp_var_name ("C"),
+			  create_tmp_var_name ("C", true),
 			  boolean_type_node);
 	  DECL_ARTIFICIAL (first_var) = 1;
 	  DECL_IGNORED_P (first_var) = 1;
diff --git a/gcc/ipa-param-manipulation.cc b/gcc/ipa-param-manipulation.cc
index 42488ee09c3..314a7a5aa20 100644
--- a/gcc/ipa-param-manipulation.cc
+++ b/gcc/ipa-param-manipulation.cc
@@ -1378,7 +1378,7 @@  ipa_param_body_adjustments::common_initialization (tree old_fndecl,
 	  new_parm = build_decl (UNKNOWN_LOCATION, PARM_DECL, NULL_TREE,
 				 new_type);
 	  const char *prefix = ipa_param_prefixes[apm->param_prefix_index];
-	  DECL_NAME (new_parm) = create_tmp_var_name (prefix);
+	  DECL_NAME (new_parm) = create_tmp_var_name (prefix, false);
 	  DECL_ARTIFICIAL (new_parm) = 1;
 	  DECL_ARG_TYPE (new_parm) = new_type;
 	  DECL_CONTEXT (new_parm) = m_fndecl;
diff --git a/gcc/lto-streamer-in.cc b/gcc/lto-streamer-in.cc
index 03cb41cfa16..5a0f156eb27 100644
--- a/gcc/lto-streamer-in.cc
+++ b/gcc/lto-streamer-in.cc
@@ -1300,6 +1300,8 @@  input_struct_function_base (struct function *fn, class data_in *data_in,
   /* Input the current IL state of the function.  */
   fn->curr_properties = streamer_read_uhwi (ib);
 
+  fn->tmp_var_id_num = streamer_read_uhwi (ib);
+
   /* Read all the attributes for FN.  */
   bp = streamer_read_bitpack (ib);
   fn->is_thunk = bp_unpack_value (&bp, 1);
diff --git a/gcc/lto-streamer-out.cc b/gcc/lto-streamer-out.cc
index 0bca530313c..27f9edd3fcd 100644
--- a/gcc/lto-streamer-out.cc
+++ b/gcc/lto-streamer-out.cc
@@ -2260,6 +2256,8 @@  output_struct_function_base (struct output_block *ob, struct function *fn)
   /* Output current IL state of the function.  */
   streamer_write_uhwi (ob, fn->curr_properties);
 
+  streamer_write_uhwi (ob, fn->tmp_var_id_num);
+
   /* Write all the attributes for FN.  */
   bp = bitpack_create (ob->main_stream);
   bp_pack_value (&bp, fn->is_thunk, 1);
diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc
index dddf5b59d8f..5ae35260a28 100644
--- a/gcc/omp-low.cc
+++ b/gcc/omp-low.cc
@@ -2324,7 +2324,7 @@  scan_omp_parallel (gimple_stmt_iterator *gsi, omp_context *outer_ctx)
     ctx->is_nested = true;
   ctx->field_map = splay_tree_new (splay_tree_compare_pointers, 0, 0);
   ctx->record_type = lang_hooks.types.make_type (RECORD_TYPE);
-  name = create_tmp_var_name (".omp_data_s");
+  name = create_tmp_var_name (".omp_data_s", false);
   name = build_decl (gimple_location (stmt),
 		     TYPE_DECL, name, ctx->record_type);
   DECL_ARTIFICIAL (name) = 1;
@@ -2377,7 +2377,7 @@  scan_omp_task (gimple_stmt_iterator *gsi, omp_context *outer_ctx)
     ctx->is_nested = true;
   ctx->field_map = splay_tree_new (splay_tree_compare_pointers, 0, 0);
   ctx->record_type = lang_hooks.types.make_type (RECORD_TYPE);
-  name = create_tmp_var_name (".omp_data_s");
+  name = create_tmp_var_name (".omp_data_s", false);
   name = build_decl (gimple_location (stmt),
 		     TYPE_DECL, name, ctx->record_type);
   DECL_ARTIFICIAL (name) = 1;
@@ -2391,7 +2391,7 @@  scan_omp_task (gimple_stmt_iterator *gsi, omp_context *outer_ctx)
 
   if (ctx->srecord_type)
     {
-      name = create_tmp_var_name (".omp_data_a");
+      name = create_tmp_var_name (".omp_data_a", false);
       name = build_decl (gimple_location (stmt),
 			 TYPE_DECL, name, ctx->srecord_type);
       DECL_ARTIFICIAL (name) = 1;
@@ -3067,7 +3067,7 @@  scan_omp_single (gomp_single *stmt, omp_context *outer_ctx)
   ctx = new_omp_context (stmt, outer_ctx);
   ctx->field_map = splay_tree_new (splay_tree_compare_pointers, 0, 0);
   ctx->record_type = lang_hooks.types.make_type (RECORD_TYPE);
-  name = create_tmp_var_name (".omp_copy_s");
+  name = create_tmp_var_name (".omp_copy_s", false);
   name = build_decl (gimple_location (stmt),
 		     TYPE_DECL, name, ctx->record_type);
   TYPE_NAME (ctx->record_type) = name;
@@ -3094,7 +3094,7 @@  scan_omp_target (gomp_target *stmt, omp_context *outer_ctx)
   ctx = new_omp_context (stmt, outer_ctx);
   ctx->field_map = splay_tree_new (splay_tree_compare_pointers, 0, 0);
   ctx->record_type = lang_hooks.types.make_type (RECORD_TYPE);
-  name = create_tmp_var_name (".omp_data_t");
+  name = create_tmp_var_name (".omp_data_t", false);
   name = build_decl (gimple_location (stmt),
 		     TYPE_DECL, name, ctx->record_type);
   DECL_ARTIFICIAL (name) = 1;
@@ -3156,7 +3156,7 @@  scan_omp_teams (gomp_teams *stmt, omp_context *outer_ctx)
   gcc_assert (taskreg_nesting_level == 1);
   ctx->field_map = splay_tree_new (splay_tree_compare_pointers, 0, 0);
   ctx->record_type = lang_hooks.types.make_type (RECORD_TYPE);
-  tree name = create_tmp_var_name (".omp_data_s");
+  tree name = create_tmp_var_name (".omp_data_s", false);
   name = build_decl (gimple_location (stmt),
 		     TYPE_DECL, name, ctx->record_type);
   DECL_ARTIFICIAL (name) = 1;
diff --git a/gcc/omp-oacc-neuter-broadcast.cc b/gcc/omp-oacc-neuter-broadcast.cc
index 6328253018e..9b94502671d 100644
--- a/gcc/omp-oacc-neuter-broadcast.cc
+++ b/gcc/omp-oacc-neuter-broadcast.cc
@@ -1647,7 +1647,7 @@  oacc_do_neutering (unsigned HOST_WIDE_INT bounds_lo,
       if (ws_prop)
 	{
 	  tree record_type = lang_hooks.types.make_type (RECORD_TYPE);
-	  tree name = create_tmp_var_name (".oacc_ws_data_s");
+	  tree name = create_tmp_var_name (".oacc_ws_data_s", false);
 	  name = build_decl (UNKNOWN_LOCATION, TYPE_DECL, name, record_type);
 	  DECL_ARTIFICIAL (name) = 1;
 	  DECL_NAMELESS (name) = 1;
diff --git a/gcc/symtab-thunks.cc b/gcc/symtab-thunks.cc
index 4c04235c41b..d79edb4c5d6 100644
--- a/gcc/symtab-thunks.cc
+++ b/gcc/symtab-thunks.cc
@@ -534,7 +534,7 @@  expand_thunk (cgraph_node *node, bool output_asm_thunks,
 	  tree p = DECL_STRUCT_FUNCTION (alias)->static_chain_decl;
 	  tree type = TREE_TYPE (p);
 	  tree decl = build_decl (DECL_SOURCE_LOCATION (thunk_fndecl),
-				  PARM_DECL, create_tmp_var_name ("CHAIN"),
+				  PARM_DECL, create_tmp_var_name ("CHAIN", false),
 				  type);
 	  DECL_ARTIFICIAL (decl) = 1;
 	  DECL_IGNORED_P (decl) = 1;
diff --git a/gcc/testsuite/gfortran.dg/char_cast_1.f90 b/gcc/testsuite/gfortran.dg/char_cast_1.f90
index 02e695d2d7b..b5e0aeb6ecb 100644
--- a/gcc/testsuite/gfortran.dg/char_cast_1.f90
+++ b/gcc/testsuite/gfortran.dg/char_cast_1.f90
@@ -27,4 +27,4 @@ 
 end
 ! The sign that all is well is that [S.6][1] appears twice.
 ! Platform dependent variations are [S$6][1], [__S_6][1], [S___6][1]
-! { dg-final { scan-tree-dump-times "6\\\]\\\[1\\\]" 2 "original" } }
+! { dg-final { scan-tree-dump-times "2\\\]\\\[1\\\]" 2 "original" } }
diff --git a/gcc/testsuite/gfortran.dg/vector_subscript_4.f90 b/gcc/testsuite/gfortran.dg/vector_subscript_4.f90
index d726d424ab7..382745fbb2c 100644
--- a/gcc/testsuite/gfortran.dg/vector_subscript_4.f90
+++ b/gcc/testsuite/gfortran.dg/vector_subscript_4.f90
@@ -9,4 +9,4 @@ 
      integer :: i(-1:1) = 1, j(3) = 1, k(3)
       k = j((/1,1,1/)+i)
       end
-! { dg-final { scan-tree-dump-times "A\.2\\\[3\\\]" 1 "original" } }
+! { dg-final { scan-tree-dump-times "A\.1\\\[3\\\]" 1 "original" } }
diff --git a/gcc/tree-nested.cc b/gcc/tree-nested.cc
index 1418e1f7f56..f6ec2997e61 100644
--- a/gcc/tree-nested.cc
+++ b/gcc/tree-nested.cc
@@ -473,7 +473,7 @@  get_chain_decl (struct nesting_info *info)
 	 close to the truth, since the initial value does come from
 	 the caller.  */
       decl = build_decl (DECL_SOURCE_LOCATION (info->context),
-			 PARM_DECL, create_tmp_var_name ("CHAIN"), type);
+			 PARM_DECL, create_tmp_var_name ("CHAIN", false), type);
       DECL_ARTIFICIAL (decl) = 1;
       DECL_IGNORED_P (decl) = 1;
       TREE_USED (decl) = 1;
diff --git a/gcc/tree-parloops.cc b/gcc/tree-parloops.cc
index dfb75c369d6..8d0ea9fb941 100644
--- a/gcc/tree-parloops.cc
+++ b/gcc/tree-parloops.cc
@@ -2109,7 +2109,7 @@  separate_decls_in_region (edge entry, edge exit,
       /* Create the type for the structure to store the ssa names to.  */
       type = lang_hooks.types.make_type (RECORD_TYPE);
       type_name = build_decl (UNKNOWN_LOCATION,
-			      TYPE_DECL, create_tmp_var_name (".paral_data"),
+			      TYPE_DECL, create_tmp_var_name (".paral_data", false),
 			      type);
       TYPE_NAME (type) = type_name;
 
diff --git a/gcc/tree-switch-conversion.cc b/gcc/tree-switch-conversion.cc
index c08c22039c9..caa1c43bc14 100644
--- a/gcc/tree-switch-conversion.cc
+++ b/gcc/tree-switch-conversion.cc
@@ -671,7 +671,7 @@  switch_conversion::build_one_array (int num, tree arr_index_type,
       TREE_STATIC (decl) = 1;
       DECL_INITIAL (decl) = ctor;
 
-      DECL_NAME (decl) = create_tmp_var_name ("CSWTCH");
+      DECL_NAME (decl) = create_tmp_var_name ("CSWTCH", true);
       DECL_ARTIFICIAL (decl) = 1;
       DECL_IGNORED_P (decl) = 1;
       TREE_CONSTANT (decl) = 1;