diff options
author | Richard Biener <rguenther@suse.de> | 2015-04-27 12:46:58 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-04-27 12:46:58 +0000 |
commit | 05b7b5a4a1e9916e2f40e2d9d5c1bfb59ad06aaa (patch) | |
tree | 912db8bb1bb006f1037a916c025b4ce337b48a91 /gcc/tree-ssa-dom.c | |
parent | 991607ab258cae68d0f1fff0de15a15583892f15 (diff) | |
download | gcc-05b7b5a4a1e9916e2f40e2d9d5c1bfb59ad06aaa.zip gcc-05b7b5a4a1e9916e2f40e2d9d5c1bfb59ad06aaa.tar.gz gcc-05b7b5a4a1e9916e2f40e2d9d5c1bfb59ad06aaa.tar.bz2 |
tree-ssa-dom.c (record_equivalences_from_phis): Valueize PHI arg.
2015-04-27 Richard Biener <rguenther@suse.de>
* tree-ssa-dom.c (record_equivalences_from_phis): Valueize PHI arg.
(record_equivalences_from_stmt): Valueize rhs.
(record_equality): Canonicalize x and y order via
tree_swap_operands_p. Do not swap operands for same loop depth.
* gcc.target/i386/pr65217.c: XFAIL.
From-SVN: r222463
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r-- | gcc/tree-ssa-dom.c | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 355c84c..a67b4e4 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -1519,6 +1519,13 @@ record_equivalences_from_phis (basic_block bb) if (lhs == t) continue; + /* Valueize t. */ + if (TREE_CODE (t) == SSA_NAME) + { + tree tmp = SSA_NAME_VALUE (t); + t = tmp ? tmp : t; + } + /* If we have not processed an alternative yet, then set RHS to this alternative. */ if (rhs == NULL) @@ -1752,6 +1759,9 @@ record_equality (tree x, tree y) { tree prev_x = NULL, prev_y = NULL; + if (tree_swap_operands_p (x, y, false)) + std::swap (x, y); + if (TREE_CODE (x) == SSA_NAME) prev_x = SSA_NAME_VALUE (x); if (TREE_CODE (y) == SSA_NAME) @@ -1766,7 +1776,7 @@ record_equality (tree x, tree y) else if (is_gimple_min_invariant (x) /* ??? When threading over backedges the following is important for correctness. See PR61757. */ - || (loop_depth_of_name (x) <= loop_depth_of_name (y))) + || (loop_depth_of_name (x) < loop_depth_of_name (y))) prev_x = x, x = y, y = prev_x, prev_x = prev_y; else if (prev_x && is_gimple_min_invariant (prev_x)) x = y, y = prev_x, prev_x = prev_y; @@ -2128,18 +2138,25 @@ record_equivalences_from_stmt (gimple stmt, int may_optimize_p) if (may_optimize_p && (TREE_CODE (rhs) == SSA_NAME || is_gimple_min_invariant (rhs))) - { - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, "==== ASGN "); - print_generic_expr (dump_file, lhs, 0); - fprintf (dump_file, " = "); - print_generic_expr (dump_file, rhs, 0); - fprintf (dump_file, "\n"); - } + { + /* Valueize rhs. */ + if (TREE_CODE (rhs) == SSA_NAME) + { + tree tmp = SSA_NAME_VALUE (rhs); + rhs = tmp ? tmp : rhs; + } - set_ssa_name_value (lhs, rhs); - } + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, "==== ASGN "); + print_generic_expr (dump_file, lhs, 0); + fprintf (dump_file, " = "); + print_generic_expr (dump_file, rhs, 0); + fprintf (dump_file, "\n"); + } + + set_ssa_name_value (lhs, rhs); + } } /* Make sure we can propagate &x + CST. */ |