tree-ssa-dom.c (dom_valueize): New function.
authorRichard Biener <rguenther@suse.de>
Thu, 16 Jul 2015 07:19:24 +0000 (07:19 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 16 Jul 2015 07:19:24 +0000 (07:19 +0000)
2015-07-16  Richard Biener  <rguenther@suse.de>

* tree-ssa-dom.c (dom_valueize): New function.
(record_temporary_equivalences): Also record equivalences
for dominating stmts that have uses of equivalences we are
about to record.

From-SVN: r225860

gcc/ChangeLog
gcc/tree-ssa-dom.c

index 8e3820597a324ec9082918e0812eff7a7eae087a..47c7c16f6b6738869c96c37d6bd9243a61814400 100644 (file)
@@ -1,3 +1,10 @@
+2015-07-16  Richard Biener  <rguenther@suse.de>
+
+       * tree-ssa-dom.c (dom_valueize): New function.
+       (record_temporary_equivalences): Also record equivalences
+       for dominating stmts that have uses of equivalences we are
+       about to record.
+
 2015-07-16  Bin Cheng  <bin.cheng@arm.com>
 
        * tree-ssa-loop-ivopts.c (add_candidate): Remove call to
index 77f4ac0f72f1112b5b47cef0362e47901d468aa5..3eb003c728a92b6eca2312a483ea37c9dc03f211 100644 (file)
@@ -1401,6 +1401,20 @@ simplify_stmt_for_jump_threading (gimple stmt,
   return lookup_avail_expr (stmt, false);
 }
 
+/* Valueize hook for gimple_fold_stmt_to_constant_1.  */
+
+static tree
+dom_valueize (tree t)
+{
+  if (TREE_CODE (t) == SSA_NAME)
+    {
+      tree tem = SSA_NAME_VALUE (t);
+      if (tem)
+       return tem;
+    }
+  return t;
+}
+
 /* Record into the equivalence tables any equivalences implied by
    traversing edge E (which are cached in E->aux).
 
@@ -1428,7 +1442,6 @@ record_temporary_equivalences (edge e)
         additional equivalences.  */
       if (lhs
          && TREE_CODE (lhs) == SSA_NAME
-         && is_gimple_constant (rhs)
          && TREE_CODE (rhs) == INTEGER_CST)
        {
          gimple defstmt = SSA_NAME_DEF_STMT (lhs);
@@ -1456,6 +1469,41 @@ record_temporary_equivalences (edge e)
            }
        }
 
+      /* If LHS is an SSA_NAME with a new equivalency then try if
+         stmts with uses of that LHS that dominate the edge destination
+        simplify and allow further equivalences to be recorded.  */
+      if (lhs && TREE_CODE (lhs) == SSA_NAME)
+       {
+         use_operand_p use_p;
+         imm_use_iterator iter;
+         FOR_EACH_IMM_USE_FAST (use_p, iter, lhs)
+           {
+             gimple use_stmt = USE_STMT (use_p);
+
+             /* Only bother to record more equivalences for lhs that
+                can be directly used by e->dest.
+                ???  If the code gets re-organized to a worklist to
+                catch more indirect opportunities and it is made to
+                handle PHIs then this should only consider use_stmts
+                in basic-blocks we have already visited.  */
+             if (e->dest == gimple_bb (use_stmt)
+                 || !dominated_by_p (CDI_DOMINATORS,
+                                     e->dest, gimple_bb (use_stmt)))
+               continue;
+             tree lhs2 = gimple_get_lhs (use_stmt);
+             if (lhs2 && TREE_CODE (lhs2) == SSA_NAME)
+               {
+                 tree res
+                   = gimple_fold_stmt_to_constant_1 (use_stmt, dom_valueize,
+                                                     no_follow_ssa_edges);
+                 if (res
+                     && (TREE_CODE (res) == SSA_NAME
+                         || is_gimple_min_invariant (res)))
+                   record_equality (lhs2, res);
+               }
+           }
+       }
+
       /* If we have 0 = COND or 1 = COND equivalences, record them
         into our expression hash tables.  */
       for (i = 0; edge_info->cond_equivalences.iterate (i, &eq); ++i)