diff options
author | Jeff Law <law@redhat.com> | 2016-02-08 01:17:32 -0700 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2016-02-08 01:17:32 -0700 |
commit | 0b604d2dfcb7090d505f61926d52a3120d2a8ae6 (patch) | |
tree | a0b8a7032a204ba54d4ba93707fd009cc159e7f2 /gcc/tree-ssa-dom.c | |
parent | 0992653dafae6e1f1da30565549bf60a830d3514 (diff) | |
download | gcc-0b604d2dfcb7090d505f61926d52a3120d2a8ae6.zip gcc-0b604d2dfcb7090d505f61926d52a3120d2a8ae6.tar.gz gcc-0b604d2dfcb7090d505f61926d52a3120d2a8ae6.tar.bz2 |
re PR tree-optimization/65917 (XFAIL: gcc.dg/tree-ssa/20030922-2.c scan-tree-dump-times dom1 "if " 2)
PR tree-optimization/65917
* tree-ssa-dom.c (record_temporary_equivalences): Record both
equivalences from if (x == y) style conditionals.
(loop_depth_of_name): Remove.
(record_equality): Remove loop depth check.
* tree-ssa-scopedtables.h (const_and_copies): Refine comments.
(const_and_copies::record_const_or_copy_raw): New member function.
* tree-ssa-scopedtables.c
(const_and_copies::record_const_or_copy_raw): New, factored out of
(const_and_copies::record_const_or_copy): Call new member function.
PR tree-optimization/65917
* gcc.dg/tree-ssa/20030922-2.c: No longer xfailed.
From-SVN: r233207
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r-- | gcc/tree-ssa-dom.c | 41 |
1 files changed, 10 insertions, 31 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index b690d92..f44ac13 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -917,6 +917,15 @@ record_temporary_equivalences (edge e, tree rhs = edge_info->rhs; record_equality (lhs, rhs, const_and_copies); + /* We already recorded that LHS = RHS, with canonicalization, + value chain following, etc. + + We also want to return RHS = LHS, but without any canonicalization + or value chain following. */ + if (TREE_CODE (rhs) == SSA_NAME) + const_and_copies->record_const_or_copy_raw (rhs, lhs, + SSA_NAME_VALUE (rhs)); + /* If LHS is an SSA_NAME and RHS is a constant integer and LHS was set via a widening type conversion, then we may be able to record additional equivalences. */ @@ -1161,33 +1170,6 @@ record_cond (cond_equivalence *p, delete element; } -/* Return the loop depth of the basic block of the defining statement of X. - This number should not be treated as absolutely correct because the loop - information may not be completely up-to-date when dom runs. However, it - will be relatively correct, and as more passes are taught to keep loop info - up to date, the result will become more and more accurate. */ - -static int -loop_depth_of_name (tree x) -{ - gimple *defstmt; - basic_block defbb; - - /* If it's not an SSA_NAME, we have no clue where the definition is. */ - if (TREE_CODE (x) != SSA_NAME) - return 0; - - /* Otherwise return the loop depth of the defining statement's bb. - Note that there may not actually be a bb for this statement, if the - ssa_name is live on entry. */ - defstmt = SSA_NAME_DEF_STMT (x); - defbb = gimple_bb (defstmt); - if (!defbb) - return 0; - - return bb_loop_depth (defbb); -} - /* Similarly, but assume that X and Y are the two operands of an EQ_EXPR. This constrains the cases in which we may treat this as assignment. */ @@ -1224,10 +1206,7 @@ record_equality (tree x, tree y, class const_and_copies *const_and_copies) long as we canonicalize on one value. */ if (is_gimple_min_invariant (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))) + else if (is_gimple_min_invariant (x)) 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; |