aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-03-15 13:18:45 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-03-15 13:18:45 +0000
commit610b64e2a274bb1021ee5891fd68e8b2f95e7c1d (patch)
tree6b9d86bc43851d80373cb7adff8e1d0cfacfdb8f /gcc
parent610de68dbe2c55bad224111693e12cdb00aa87b8 (diff)
downloadgcc-610b64e2a274bb1021ee5891fd68e8b2f95e7c1d.zip
gcc-610b64e2a274bb1021ee5891fd68e8b2f95e7c1d.tar.gz
gcc-610b64e2a274bb1021ee5891fd68e8b2f95e7c1d.tar.bz2
re PR tree-optimization/43367 (ice: in may_propagate_copy, at tree-ssa-copy.c:85)
2010-03-15 Richard Guenther <rguenther@suse.de> 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr43367.c30
-rw-r--r--gcc/tree-cfg.c25
4 files changed, 46 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bd07364..434288e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2010-03-15 Richard Guenther <rguenther@suse.de>
+ PR tree-optimization/43367
+ * tree-cfg.c (gimple_can_merge_blocks_p): Simplify PHI
+ elimination check.
+
+2010-03-15 Richard Guenther <rguenther@suse.de>
+
PR tree-optimization/43317
* ipa-struct-reorg.c (create_new_general_access): Update stmt.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 65c465f..bd2f07b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2010-03-15 Richard Guenther <rguenther@suse.de>
+ PR tree-optimization/43367
+ * gcc.c-torture/compile/pr43367.c: New testcase.
+
+2010-03-15 Richard Guenther <rguenther@suse.de>
+
PR tree-optimization/43317
* gcc.dg/pr43317.c: New testcase.
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 0000000..5c620c1
--- /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 e5ed9ec..6f4e416 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;
}