diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-07-14 10:50:46 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-07-14 10:50:46 +0000 |
commit | 2b5ad3014026d772a18c12f907a852a5ee62786d (patch) | |
tree | 5f0ec3e7aa038ab7102aea97cac2074fee30395f /gcc/tree-ssa-dom.c | |
parent | aa9568ddd8d63107e4a8917a12f290ee2cce46d8 (diff) | |
download | gcc-2b5ad3014026d772a18c12f907a852a5ee62786d.tar.gz |
2014-07-14 Richard Biener <rguenther@suse.de>
PR tree-optimization/61757
PR tree-optimization/61783
PR tree-optimization/61787
* tree-ssa-dom.c (record_equality): Revert canonicalization
change and add comment.
(propagate_rhs_into_lhs): Revert previous fix, removing
loop depth restriction again.
* gcc.dg/torture/pr61757.c: New testcase.
* gcc.dg/torture/pr61787.c: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@212513 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r-- | gcc/tree-ssa-dom.c | 62 |
1 files changed, 32 insertions, 30 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 4c0c276a62d..c4ec4e5415c 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -1589,6 +1589,33 @@ record_const_or_copy (tree x, tree y) record_const_or_copy_1 (x, y, prev_x); } +/* 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. */ @@ -1608,7 +1635,10 @@ record_equality (tree x, tree y) long as we canonicalize on one value. */ if (is_gimple_min_invariant (y)) ; - else if (is_gimple_min_invariant (x)) + 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))) 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; @@ -2638,33 +2668,6 @@ get_lhs_or_phi_result (gimple stmt) gcc_unreachable (); } -/* 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); -} - /* Propagate RHS into all uses of LHS (when possible). RHS and LHS are derived from STMT, which is passed in solely so @@ -2680,8 +2683,7 @@ static void propagate_rhs_into_lhs (gimple stmt, tree lhs, tree rhs, bitmap interesting_names) { /* First verify that propagation is valid. */ - if (may_propagate_copy (lhs, rhs) - && loop_depth_of_name (lhs) >= loop_depth_of_name (rhs)) + if (may_propagate_copy (lhs, rhs)) { use_operand_p use_p; imm_use_iterator iter; |