aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-08-02 09:43:14 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-08-02 09:43:14 +0000
commitfcddd80e2efd57253335eb33d4e35fb47a4a0e20 (patch)
tree6eb8077b726a7da082b816374813da18c0ff6f41 /gcc
parentb6a45605019bfe2fe588961c6959630f8b9deed0 (diff)
downloadgcc-fcddd80e2efd57253335eb33d4e35fb47a4a0e20.zip
gcc-fcddd80e2efd57253335eb33d4e35fb47a4a0e20.tar.gz
gcc-fcddd80e2efd57253335eb33d4e35fb47a4a0e20.tar.bz2
re PR tree-optimization/50672 (ice: verify_ssa failed: no immediate_use list)
2012-08-02 Richard Guenther <rguenther@suse.de> PR tree-optimization/50672 Revert 2012-08-01 Richard Guenther <rguenther@suse.de> * tree-ssa-tail-merge.c (release_last_vdef): Remove. (replace_block_by): Adjust. * g++.dg/torture/pr50672.C: New testcase. From-SVN: r190070
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr50672.C22
-rw-r--r--gcc/tree-ssa-tail-merge.c32
4 files changed, 68 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c48a2e2..1f6539e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,14 @@
2012-08-02 Richard Guenther <rguenther@suse.de>
+ PR tree-optimization/50672
+ Revert
+ 2012-08-01 Richard Guenther <rguenther@suse.de>
+
+ * tree-ssa-tail-merge.c (release_last_vdef): Remove.
+ (replace_block_by): Adjust.
+
+2012-08-02 Richard Guenther <rguenther@suse.de>
+
* tree-dfa.c (referenced_var_lookup): Remove.
(find_referenced_vars): Remove.
(pass_referenced_vars): Likewise.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 604782c..3941926 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-08-02 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/50672
+ * g++.dg/torture/pr50672.C: New testcase.
+
2012-08-02 Janus Weil <janus@gcc.gnu.org>
PR fortran/54147
diff --git a/gcc/testsuite/g++.dg/torture/pr50672.C b/gcc/testsuite/g++.dg/torture/pr50672.C
new file mode 100644
index 0000000..614a35b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr50672.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+struct A
+{
+ bool isHint();
+};
+class B
+{
+ void makeLine( int *) const;
+ void drawLine() const; A* to() const;
+ void _print() const;
+};
+A a;
+void B::makeLine(int *p1) const
+{
+ if (a.isHint() && to()->isHint()) ;
+ else {
+ if (p1) B::drawLine(); else B::_print();
+ return;
+ }
+ if (p1) B::drawLine(); else B::_print();
+}
diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c
index ab37336..a2d4633 100644
--- a/gcc/tree-ssa-tail-merge.c
+++ b/gcc/tree-ssa-tail-merge.c
@@ -812,6 +812,37 @@ same_succ_flush_bbs (bitmap bbs)
same_succ_flush_bb (BASIC_BLOCK (i));
}
+/* Release the last vdef in BB, either normal or phi result. */
+
+static void
+release_last_vdef (basic_block bb)
+{
+ gimple_stmt_iterator i;
+
+ for (i = gsi_last_bb (bb); !gsi_end_p (i); gsi_prev_nondebug (&i))
+ {
+ gimple stmt = gsi_stmt (i);
+ if (gimple_vdef (stmt) == NULL_TREE)
+ continue;
+
+ mark_virtual_operand_for_renaming (gimple_vdef (stmt));
+ return;
+ }
+
+ for (i = gsi_start_phis (bb); !gsi_end_p (i); gsi_next (&i))
+ {
+ gimple phi = gsi_stmt (i);
+ tree res = gimple_phi_result (phi);
+
+ if (is_gimple_reg (res))
+ continue;
+
+ mark_virtual_phi_result_for_renaming (phi);
+ return;
+ }
+
+}
+
/* For deleted_bb_preds, find bbs with same successors. */
static void
@@ -1446,6 +1477,7 @@ replace_block_by (basic_block bb1, basic_block bb2)
bb1->frequency = 0;
/* Do updates that use bb1, before deleting bb1. */
+ release_last_vdef (bb1);
same_succ_flush_bb (bb1);
delete_basic_block (bb1);