From: Richard Guenther Date: Mon, 15 Mar 2010 13:18:45 +0000 (+0000) Subject: re PR tree-optimization/43367 (ice: in may_propagate_copy, at tree-ssa-copy.c:85) X-Git-Tag: releases/gcc-4.5.0~375 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=610b64e2a274bb1021ee5891fd68e8b2f95e7c1d;p=thirdparty%2Fgcc.git re PR tree-optimization/43367 (ice: in may_propagate_copy, at tree-ssa-copy.c:85) 2010-03-15 Richard Guenther PR tree-optimization/43367 * tree-cfg.c (gimple_can_merge_blocks_p): Simplify PHI elimination check. * gcc.c-torture/compile/pr43367.c: New testcase. From-SVN: r157458 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bd0736436c83..434288ebdba1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-03-15 Richard Guenther + + PR tree-optimization/43367 + * tree-cfg.c (gimple_can_merge_blocks_p): Simplify PHI + elimination check. + 2010-03-15 Richard Guenther PR tree-optimization/43317 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 65c465fa02b4..bd2f07b7b4c8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-03-15 Richard Guenther + + PR tree-optimization/43367 + * gcc.c-torture/compile/pr43367.c: New testcase. + 2010-03-15 Richard Guenther PR tree-optimization/43317 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr43367.c b/gcc/testsuite/gcc.c-torture/compile/pr43367.c new file mode 100644 index 000000000000..5c620c13c906 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr43367.c @@ -0,0 +1,30 @@ +unsigned char g_17; + +const unsigned char func_39 (unsigned char p_40, unsigned char * p_41) +{ + return 0; +} + +void int327 (const unsigned char p_48, unsigned char p_49) +{ + unsigned l_52; + unsigned char l_58[2]; + int i, j; + if (func_39 (l_52, &p_49), p_48) { + unsigned char *l_60; + unsigned char *l = &l_58[1]; + for (j; j; j++) { +lbl_59: + break; + } + for (l = 0; 1; l += 1) { + for (p_49 = 1; p_49; p_49 += 0) { + unsigned char **l_61[1][6]; + for (j = 0; j < 1; j++) + l_61[i][j] = &l_60; + goto lbl_59; + } + } + } +} + diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index e5ed9ec7006a..6f4e4167a6bc 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -1438,27 +1438,12 @@ gimple_can_merge_blocks_p (basic_block a, basic_block b) return false; /* It must be possible to eliminate all phi nodes in B. If ssa form - is not up-to-date, we cannot eliminate any phis; however, if only - some symbols as whole are marked for renaming, this is not a problem, - as phi nodes for those symbols are irrelevant in updating anyway. */ + is not up-to-date and a name-mapping is registered, we cannot eliminate + any phis. Symbols marked for renaming are never a problem though. */ phis = phi_nodes (b); - if (!gimple_seq_empty_p (phis)) - { - gimple_stmt_iterator i; - - if (name_mappings_registered_p ()) - return false; - - for (i = gsi_start (phis); !gsi_end_p (i); gsi_next (&i)) - { - gimple phi = gsi_stmt (i); - - if (!is_gimple_reg (gimple_phi_result (phi)) - && !may_propagate_copy (gimple_phi_result (phi), - gimple_phi_arg_def (phi, 0))) - return false; - } - } + if (!gimple_seq_empty_p (phis) + && name_mappings_registered_p ()) + return false; return true; }