From 73c7d6bc25d9bb86bdb81283d237a5b94607ac8c Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 26 Jun 2014 11:29:34 +0000 Subject: [PATCH] re PR tree-optimization/61607 (DOM missed jump threading and destroyed loops) 2014-06-26 Richard Biener PR tree-optimization/61607 * tree-ssa-copy.c (copy_prop_visit_phi_node): Adjust comment explaining why we restrict copies on loop depth. * tree-ssa-dom.c (cprop_operand): Remove restriction on on loop depth. (record_equivalences_from_phis): Instead add it here. * gcc.dg/tree-ssa/ssa-dom-thread-5.c: New testcase. From-SVN: r212026 --- gcc/ChangeLog | 9 ++++++++ gcc/testsuite/ChangeLog | 5 ++++ .../gcc.dg/tree-ssa/ssa-dom-thread-5.c | 23 +++++++++++++++++++ gcc/tree-ssa-copy.c | 7 ++---- gcc/tree-ssa-dom.c | 16 ++++++------- 5 files changed, 46 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-5.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e3a5b77c0bd..e7ced0c4532 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2014-06-26 Richard Biener + + PR tree-optimization/61607 + * tree-ssa-copy.c (copy_prop_visit_phi_node): Adjust comment + explaining why we restrict copies on loop depth. + * tree-ssa-dom.c (cprop_operand): Remove restriction on + on loop depth. + (record_equivalences_from_phis): Instead add it here. + 2014-06-26 Bernd Schmidt * Makefile.in (COLLECT2_OBJS): Add collect-utils.o. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3b5cd4f9bc9..5266253595b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-06-26 Richard Biener + + PR tree-optimization/61607 + * gcc.dg/tree-ssa/ssa-dom-thread-5.c: New testcase. + 2014-06-26 Vidya Praveen * gcc.dg/inline-22.c: Add bind_pic_locally. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-5.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-5.c new file mode 100644 index 00000000000..9a984d4d558 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-5.c @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-Os -fno-tree-fre -fdump-tree-dom1-details" } */ + +void foo(int *); +void f2(int dst[3], int R) +{ + int i, inter[2]; + _Bool inter0p = 0; + _Bool inter1p = 0; + for (i = 1; i < R; i++) + { + inter0p = 1; + inter1p = 1; + } + if (inter0p) + inter[0] = 1; + if (inter1p) + inter[1] = 1; + foo(inter); +} + +/* { dg-final { scan-tree-dump "Threaded jump" "dom1" } } */ +/* { dg-final { cleanup-tree-dump "dom1" } } */ diff --git a/gcc/tree-ssa-copy.c b/gcc/tree-ssa-copy.c index 1d404d27b14..0ba665bbe91 100644 --- a/gcc/tree-ssa-copy.c +++ b/gcc/tree-ssa-copy.c @@ -401,11 +401,8 @@ copy_prop_visit_phi_node (gimple phi) arg_value = valueize_val (arg); /* Avoid copy propagation from an inner into an outer loop. - Otherwise, this may move loop variant variables outside of - their loops and prevent coalescing opportunities. If the - value was loop invariant, it will be hoisted by LICM and - exposed for copy propagation. - ??? The value will be always loop invariant. + Otherwise, this may introduce uses of loop variant variables + outside of their loops and prevent coalescing opportunities. In loop-closed SSA form do not copy-propagate through PHI nodes in blocks with a loop exit edge predecessor. */ if (TREE_CODE (arg_value) == SSA_NAME diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 62444b262de..795ed09ae86 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -1234,7 +1234,13 @@ record_equivalences_from_phis (basic_block bb) this, since this is a true assignment and not an equivalence inferred from a comparison. All uses of this ssa name are dominated by this assignment, so unwinding just costs time and space. */ - if (i == gimple_phi_num_args (phi) && may_propagate_copy (lhs, rhs)) + if (i == gimple_phi_num_args (phi) + && may_propagate_copy (lhs, rhs) + /* Do not propagate copies if the propagated value is at a deeper loop + depth than the propagatee. Otherwise, this may introduce uses + of loop variant variables outside of their loops and prevent + coalescing opportunities. */ + && !(loop_depth_of_name (rhs) > loop_depth_of_name (lhs))) set_ssa_name_value (lhs, rhs); } } @@ -2247,14 +2253,6 @@ cprop_operand (gimple stmt, use_operand_p op_p) if (!may_propagate_copy (op, val)) return; - /* Do not propagate copies if the propagated value is at a deeper loop - depth than the propagatee. Otherwise, this may move loop variant - variables outside of their loops and prevent coalescing - opportunities. If the value was loop invariant, it will be hoisted - by LICM and exposed for copy propagation. */ - if (loop_depth_of_name (val) > loop_depth_of_name (op)) - return; - /* Do not propagate copies into simple IV increment statements. See PR23821 for how this can disturb IV analysis. */ if (TREE_CODE (val) != INTEGER_CST -- 2.30.2