This makes the SSA def stmt update during inlining cheaper by adjusting
it after remapping a SSA def instead of via an extra walk over all stmt
defs (which incidentially is not possible with FOR_EACH_SSA_* during
"early SSA" as we don't have SSA operands there).

I've tested this independently of the
[RFC] Delayed folding, match-and-simplify and early GIMPLE
patch.

This exposes that the walk_gimple_* stuff is somewhat awkward and
needs some refactoring (can't re-construct wi->gsi as gsi_for_stmt
only works for stmts in a BB and thus when we have a CFG).  Need to
think about sth (simplest is require a gsi for walk_gimple_op, like
we do for walk_gimple_stmt).

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Queued for GCC 7.

Richard.

2016-01-21  Richard Biener  <rguent...@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.

Index: gcc/gimple-walk.c
===================================================================
*** gcc/gimple-walk.c   (revision 232670)
--- gcc/gimple-walk.c   (working copy)
*************** walk_gimple_asm (gasm *stmt, walk_tree_f
*** 100,108 ****
    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);
--- 100,105 ----
*************** walk_gimple_asm (gasm *stmt, walk_tree_f
*** 114,119 ****
--- 111,118 ----
                                       &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;
*************** walk_gimple_op (gimple *stmt, walk_tree_
*** 182,187 ****
--- 181,189 ----
    unsigned i;
    tree ret = NULL_TREE;
  
+   if (wi)
+     wi->stmt = stmt;
+ 
    switch (gimple_code (stmt))
      {
      case GIMPLE_ASSIGN:
Index: gcc/gimple-walk.h
===================================================================
*** gcc/gimple-walk.h   (revision 232670)
--- gcc/gimple-walk.h   (working copy)
*************** struct walk_stmt_info
*** 28,33 ****
--- 28,34 ----
  {
    /* 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: gcc/tree-inline.c
===================================================================
*** gcc/tree-inline.c   (revision 232670)
--- gcc/tree-inline.c   (working copy)
*************** remap_gimple_op_r (tree *tp, int *walk_s
*** 862,871 ****
--- 862,877 ----
    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))
*************** copy_bb (copy_body_data *id, basic_block
*** 2089,2104 ****
          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));
--- 2095,2100 ----

Reply via email to