aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2016-01-15 13:43:49 +0100
committerMartin Jambor <jamborm@gcc.gnu.org>2016-01-15 13:43:49 +0100
commit8f634fb4f1becd81e712775512f26888c4e6900d (patch)
tree4e93e8a68ee3c2eba698a0a56e941ce8e240c2c7
parentaa189aee2e2c2602bf2eef67291c1f56273252b5 (diff)
downloadgcc-8f634fb4f1becd81e712775512f26888c4e6900d.zip
gcc-8f634fb4f1becd81e712775512f26888c4e6900d.tar.gz
gcc-8f634fb4f1becd81e712775512f26888c4e6900d.tar.bz2
Avoid extraneous remapping in copy_gimple_seq_and_replace_locals
2016-01-15 Martin Jambor <mjambor@suse.cz> * 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. From-SVN: r232419
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/tree-inline.c28
-rw-r--r--gcc/tree-inline.h11
3 files changed, 42 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 76f6bbe..fcb6dcd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2016-01-15 Martin Jambor <mjambor@suse.cz>
+
+ * 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 <vogt@linux.vnet.ibm.com>
* config/s390/s390.opt (mmvcle): More verbose help text.
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 6bf2467..106e07a 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 d3e5229..4cc1f19 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<tree, tree> *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_hash, unsigned short> *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. */