]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Avoid extraneous remapping in copy_gimple_seq_and_replace_locals
authorMartin Jambor <mjambor@suse.cz>
Fri, 15 Jan 2016 12:43:49 +0000 (13:43 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Fri, 15 Jan 2016 12:43:49 +0000 (13:43 +0100)
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

gcc/ChangeLog
gcc/tree-inline.c
gcc/tree-inline.h

index 76f6bbe5daaceab20422ec88eab9470bcbc477b6..fcb6dcdcbbef5949b31399a53ed219dbf5f26565 100644 (file)
@@ -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.
index 6bf24675ce0ba7922fb558b54178e03b1db61a37..106e07a09567709276e17c585d27a2f7ff06894c 100644 (file)
@@ -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.  */
index d3e5229e209325a5f7edc583c8666c4c658c1e47..4cc1f19223a3d93cb7acf9b4349199a5e6ee3c03 100644 (file)
@@ -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.  */