From: Richard Guenther Date: Tue, 9 Nov 2010 15:01:41 +0000 (+0000) Subject: re PR tree-optimization/46177 (ICE: in prop_phis, at tree-loop-distribution.c:327... X-Git-Tag: releases/gcc-4.6.0~2784 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5923c6c37f4966f840c2c959e9c0624269a1b910;p=thirdparty%2Fgcc.git re PR tree-optimization/46177 (ICE: in prop_phis, at tree-loop-distribution.c:327 with -fno-tree-copy-prop -ftree-loop-distribution) 2010-11-09 Richard Guenther PR tree-optimization/46177 * tree-loop-distribution.c (prop_phis): Remove. (generate_builtin): Re-use the old loop exit edge to avoid needing to update PHI nodes. * gcc.dg/pr46177-2.c: New testcase. From-SVN: r166492 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f4c868a9c5dd..de4d48453e04 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-11-09 Richard Guenther + + PR tree-optimization/46177 + * tree-loop-distribution.c (prop_phis): Remove. + (generate_builtin): Re-use the old loop exit edge to avoid + needing to update PHI nodes. + 2010-11-09 Joern Rennecke * ix86_expand_split_stack_prologue (args_size): Change type to diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4214d4e27ef4..70493d9c322e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-09 Richard Guenther + + PR tree-optimization/46177 + * gcc.dg/pr46177-2.c: New testcase. + 2010-11-09 Richard Guenther PR testsuite/46312 diff --git a/gcc/testsuite/gcc.dg/pr46177-2.c b/gcc/testsuite/gcc.dg/pr46177-2.c new file mode 100644 index 000000000000..91fd20e75508 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr46177-2.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fno-tree-copy-prop -ftree-loop-distribution" } */ + +int A[30], B[30]; + +void +foo (int j) +{ + int i, k; + for (k = 0; k < 10; k++) + if (j) + { + for (; j < k; j++) + ; + for (i = 0; i < k; i++) + A[i] = B[i] = 0; + } +} diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index bc3f54d97d46..59585cdd7617 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -311,31 +311,6 @@ generate_memset_zero (gimple stmt, tree op0, tree nb_iter, return res; } -/* Propagate phis in BB b to their uses and remove them. */ - -static void -prop_phis (basic_block b) -{ - gimple_stmt_iterator psi; - - for (psi = gsi_start_phis (b); !gsi_end_p (psi); ) - { - gimple phi = gsi_stmt (psi); - tree def = gimple_phi_result (phi); - - if (!is_gimple_reg (def)) - mark_virtual_phi_result_for_renaming (phi); - else - { - tree use = gimple_phi_arg_def (phi, 0); - gcc_assert (gimple_phi_num_args (phi) == 1); - replace_uses_by (def, use); - } - - remove_phi_node (&psi, true); - } -} - /* Tries to generate a builtin function for the instructions of LOOP pointed to by the bits set in PARTITION. Returns true when the operation succeeded. */ @@ -405,11 +380,13 @@ generate_builtin (struct loop *loop, bitmap partition, bool copy_p) if (res && !copy_p) { unsigned nbbs = loop->num_nodes; - basic_block src = loop_preheader_edge (loop)->src; - basic_block dest = single_exit (loop)->dest; - prop_phis (dest); - make_edge (src, dest, EDGE_FALLTHRU); + edge exit = single_exit (loop); + basic_block src = loop_preheader_edge (loop)->src, dest = exit->dest; + redirect_edge_pred (exit, src); + exit->flags &= ~(EDGE_TRUE_VALUE|EDGE_FALSE_VALUE); + exit->flags |= EDGE_FALLTHRU; cancel_loop_tree (loop); + rescan_loop_exit (exit, false, true); for (i = 0; i < nbbs; i++) delete_basic_block (bbs[i]);