diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-04-27 12:46:58 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-04-27 12:46:58 +0000 |
commit | 83617aa2bed0a6ac21010ba3b960d087bcb66f9b (patch) | |
tree | 912db8bb1bb006f1037a916c025b4ce337b48a91 /gcc/tree-ssa-dom.c | |
parent | c980b76c17aa74615244b9f68cc0a21e410728ff (diff) | |
download | gcc-83617aa2bed0a6ac21010ba3b960d087bcb66f9b.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@222463 138bc75d-0d04-0410-961f-82ee72b054a4
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 355c84c076f..a67b4e447ac 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. */ |