Message ID | ZEJ42eT5TXmuBzia@kam.mff.cuni.cz |
---|---|
State | New |
Headers | show |
Series | Stabilize temporary variable names | expand |
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 --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;