diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 76f6bbe5daac..fcb6dcdcbbef 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2016-01-15 Martin Jambor + + * tree-inline.c (remap_decl): Use existing dclarations if + remapping a type and prevent_decl_creation_for_types. + (replace_locals_stmt): Do an initial remapping of non-VLA typed + decls first. Do real remapping with + prevent_decl_creation_for_types set. + * tree-inline.h (copy_body_data): New field + prevent_decl_creation_for_types, moved remap_var_for_cilk to avoid + padding. + 2016-01-15 Dominik Vogt * config/s390/s390.opt (mmvcle): More verbose help text. diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 6bf24675ce0b..106e07a09567 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -340,8 +340,17 @@ remap_decl (tree decl, copy_body_data *id) return decl; } - /* If we didn't already have an equivalent for this declaration, - create one now. */ + /* When remapping a type within copy_gimple_seq_and_replace_locals, all + necessary DECLs have already been remapped and we do not want to duplicate + a decl coming from outside of the sequence we are copying. */ + if (!n + && id->prevent_decl_creation_for_types + && id->remapping_type_depth > 0 + && (VAR_P (decl) || TREE_CODE (decl) == PARM_DECL)) + return decl; + + /* If we didn't already have an equivalent for this declaration, create one + now. */ if (!n) { /* Make a copy of the variable or label. */ @@ -5225,8 +5234,19 @@ replace_locals_stmt (gimple_stmt_iterator *gsip, /* This will remap a lot of the same decls again, but this should be harmless. */ if (gimple_bind_vars (stmt)) - gimple_bind_set_vars (stmt, remap_decls (gimple_bind_vars (stmt), - NULL, id)); + { + tree old_var, decls = gimple_bind_vars (stmt); + + for (old_var = decls; old_var; old_var = DECL_CHAIN (old_var)) + if (!can_be_nonlocal (old_var, id) + && ! variably_modified_type_p (TREE_TYPE (old_var), id->src_fn)) + remap_decl (old_var, id); + + gcc_checking_assert (!id->prevent_decl_creation_for_types); + id->prevent_decl_creation_for_types = true; + gimple_bind_set_vars (stmt, remap_decls (decls, NULL, id)); + id->prevent_decl_creation_for_types = false; + } } /* Keep iterating. */ diff --git a/gcc/tree-inline.h b/gcc/tree-inline.h index d3e5229e2093..4cc1f19223a3 100644 --- a/gcc/tree-inline.h +++ b/gcc/tree-inline.h @@ -140,14 +140,17 @@ struct copy_body_data the originals have been mapped to a value rather than to a variable. */ hash_map *debug_map; - - /* Cilk keywords currently need to replace some variables that - ordinary nested functions do not. */ - bool remap_var_for_cilk; /* A map from the inlined functions dependence info cliques to equivalents in the function into which it is being inlined. */ hash_map *dependence_map; + + /* Cilk keywords currently need to replace some variables that + ordinary nested functions do not. */ + bool remap_var_for_cilk; + + /* Do not create new declarations when within type remapping. */ + bool prevent_decl_creation_for_types; }; /* Weights of constructions for estimate_num_insns. */