aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr46177.c18
-rw-r--r--gcc/tree-loop-distribution.c21
4 files changed, 36 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a347b05..e1a18af 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-11-02 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/46177
+ * tree-loop-distribution.c (prop_phis): Use
+ mark_virtual_phi_result_for_renaming.
+
2010-11-02 Martin Jambor <mjambor@suse.cz>
PR middle-end/46120
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 471b009..4f4e486 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-11-02 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/46177
+ * gcc.dg/pr46177.c: New testcase.
+
2010-11-02 Martin Jambor <mjambor@suse.cz>
PR middle-end/46120
diff --git a/gcc/testsuite/gcc.dg/pr46177.c b/gcc/testsuite/gcc.dg/pr46177.c
new file mode 100644
index 0000000..397e316
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr46177.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fno-tree-copy-prop -ftree-loop-distribution" } */
+
+extern int A[];
+extern int B[];
+
+void
+foo (int j, int c)
+{
+ int i;
+
+ if (c)
+ for (i = 0; i < j; i++)
+ A[i] = B[i] = 0;
+
+ for (i = 0; i < j; i++)
+ A[i] = B[i];
+}
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c
index 63f7178..bc3f54d 100644
--- a/gcc/tree-loop-distribution.c
+++ b/gcc/tree-loop-distribution.c
@@ -317,27 +317,20 @@ static void
prop_phis (basic_block b)
{
gimple_stmt_iterator psi;
- gimple_seq phis = phi_nodes (b);
- for (psi = gsi_start (phis); !gsi_end_p (psi); )
+ for (psi = gsi_start_phis (b); !gsi_end_p (psi); )
{
gimple phi = gsi_stmt (psi);
- tree def = gimple_phi_result (phi), use = gimple_phi_arg_def (phi, 0);
-
- gcc_assert (gimple_phi_num_args (phi) == 1);
+ tree def = gimple_phi_result (phi);
if (!is_gimple_reg (def))
+ mark_virtual_phi_result_for_renaming (phi);
+ else
{
- imm_use_iterator iter;
- use_operand_p use_p;
- gimple stmt;
-
- FOR_EACH_IMM_USE_STMT (stmt, iter, def)
- FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
- SET_USE (use_p, use);
+ tree use = gimple_phi_arg_def (phi, 0);
+ gcc_assert (gimple_phi_num_args (phi) == 1);
+ replace_uses_by (def, use);
}
- else
- replace_uses_by (def, use);
remove_phi_node (&psi, true);
}