gimple-walk.h (struct walk_stmt_info): Add stmt member.
authorRichard Biener <rguenther@suse.de>
Tue, 19 Apr 2016 12:13:04 +0000 (12:13 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 19 Apr 2016 12:13:04 +0000 (12:13 +0000)
2016-04-19  Richard Biener  <rguenther@suse.de>

* gimple-walk.h (struct walk_stmt_info): Add stmt member.
* gimple-walk.c (walk_gimple_op): Initialize it.
(walk_gimple_asm): Set wi->is_lhs before each callback invocation.
* tree-inline.c (remap_gimple_op_r): Set SSA_NAME_DEF_STMT when
remapping SSA names of defs.
(copy_bb): Remove walk over all SSA defs and SSA_NAME_DEF_STMT
adjustment.

From-SVN: r235190

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

index 458f2cd338d49c66fd3edd0ef21223c684b9337a..39bbca2e1c8fc8a8faa9d1259da39cee1314b71a 100644 (file)
@@ -1,3 +1,13 @@
+2016-04-19  Richard Biener  <rguenther@suse.de>
+
+       * gimple-walk.h (struct walk_stmt_info): Add stmt member.
+       * gimple-walk.c (walk_gimple_op): Initialize it.
+       (walk_gimple_asm): Set wi->is_lhs before each callback invocation.
+       * tree-inline.c (remap_gimple_op_r): Set SSA_NAME_DEF_STMT when
+       remapping SSA names of defs.
+       (copy_bb): Remove walk over all SSA defs and SSA_NAME_DEF_STMT
+       adjustment.
+
 2016-04-18  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR middle-end/70689
index 15cd84209042927fe9a577d1210e8726c720a7af..be501c5cecbd9f666d2cf92bacc4cae7d0fc49ff 100644 (file)
@@ -100,9 +100,6 @@ walk_gimple_asm (gasm *stmt, walk_tree_fn callback_op,
   noutputs = gimple_asm_noutputs (stmt);
   oconstraints = (const char **) alloca ((noutputs) * sizeof (const char *));
 
-  if (wi)
-    wi->is_lhs = true;
-
   for (i = 0; i < noutputs; i++)
     {
       op = gimple_asm_output_op (stmt, i);
@@ -114,6 +111,8 @@ walk_gimple_asm (gasm *stmt, walk_tree_fn callback_op,
                                       &allows_reg, &is_inout))
            wi->val_only = (allows_reg || !allows_mem);
        }
+      if (wi)
+       wi->is_lhs = true;
       ret = walk_tree (&TREE_VALUE (op), callback_op, wi, NULL);
       if (ret)
        return ret;
@@ -182,6 +181,9 @@ walk_gimple_op (gimple *stmt, walk_tree_fn callback_op,
   unsigned i;
   tree ret = NULL_TREE;
 
+  if (wi)
+    wi->stmt = stmt;
+
   switch (gimple_code (stmt))
     {
     case GIMPLE_ASSIGN:
index d5d1a824c6e134a803ecc824d048782ce01a5853..3ef868a647ff519ca1c97cff400bfbfbd171c449 100644 (file)
@@ -28,6 +28,7 @@ struct walk_stmt_info
 {
   /* Points to the current statement being walked.  */
   gimple_stmt_iterator gsi;
+  gimple *stmt;
 
   /* Additional data that the callback functions may want to carry
      through the recursion.  */
index a4e044c611b26f97e4230d0da118a630018f474d..015a9074b787a0e39f6b23efb99ff16b00de45c9 100644 (file)
@@ -863,10 +863,16 @@ remap_gimple_op_r (tree *tp, int *walk_subtrees, void *data)
   copy_body_data *id = (copy_body_data *) wi_p->info;
   tree fn = id->src_fn;
 
+  /* For recursive invocations this is no longer the LHS itself.  */
+  bool is_lhs = wi_p->is_lhs;
+  wi_p->is_lhs = false;
+
   if (TREE_CODE (*tp) == SSA_NAME)
     {
       *tp = remap_ssa_name (*tp, id);
       *walk_subtrees = 0;
+      if (is_lhs)
+       SSA_NAME_DEF_STMT (*tp) = wi_p->stmt;
       return NULL;
     }
   else if (auto_var_in_fn_p (*tp, fn))
@@ -2095,16 +2101,6 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale,
          maybe_duplicate_eh_stmt_fn (cfun, stmt, id->src_cfun, orig_stmt,
                                      id->eh_map, id->eh_lp_nr);
 
-         if (gimple_in_ssa_p (cfun) && !is_gimple_debug (stmt))
-           {
-             ssa_op_iter i;
-             tree def;
-
-             FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
-               if (TREE_CODE (def) == SSA_NAME)
-                 SSA_NAME_DEF_STMT (def) = stmt;
-           }
-
          gsi_next (&copy_gsi);
        }
       while (!gsi_end_p (copy_gsi));