From e9901f8b5664ad2ed996beff64d1c1bc4bea0bda Mon Sep 17 00:00:00 2001
From: Andrew Pinski <pinskia@physics.uc.edu>
Date: Mon, 23 Jan 2006 15:19:29 +0000
Subject: [PATCH] re PR tree-optimization/25315 (testsuite
 failure:27_io/basic_ostream/inserters_character/char/9555-oc.cc
 wchar_t/9555-oc.cc exec)

2006-01-23  Andrew Pinski  <pinskia@physics.uc.edu>
            Daniel Berlin  <dberlin@dberlin.org>

        PR tree-opt/25315
        PR tree-opt/25857
        * tree-ssa-pre.c (insert_extra_phis): If an incomming edge is abnormal
        return from the function.

2006-01-23  Andrew Pinski  <pinskia@physics.uc.edu>

        PR tree-opt/25857
        * g++.dg/opt/pr25857.C: New test.


Co-Authored-By: Daniel Berlin <dberlin@dberlin.org>

From-SVN: r110127
---
 gcc/ChangeLog                      |  8 ++++++++
 gcc/testsuite/ChangeLog            |  5 +++++
 gcc/testsuite/g++.dg/opt/pr25857.C | 18 ++++++++++++++++++
 gcc/tree-ssa-pre.c                 |  4 ++++
 4 files changed, 35 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/opt/pr25857.C

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index eaaf2d87fe01..2a85326102fc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2006-01-23  Andrew Pinski  <pinskia@physics.uc.edu>
+            Daniel Berlin  <dberlin@dberlin.org>
+
+	PR tree-opt/25315
+	PR tree-opt/25857
+	* tree-ssa-pre.c (insert_extra_phis): If an incomming edge is abnormal 
+	return from the function.
+
 2006-01-22  Zack Weinberg  <zackw@panix.com>
 
 	* rtl.def (match_code): Add second argument.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index eb289c61b23e..461ad4c08035 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-01-23  Andrew Pinski  <pinskia@physics.uc.edu>
+
+	PR tree-opt/25857
+	* g++.dg/opt/pr25857.C: New test.
+
 2006-01-23  Steven Bosscher  <stevenb.gcc@gmail.com>
 	Jan Hubicka  <jh@suse.cz>
 	Richard Guenther  <rguenther@suse.de>
diff --git a/gcc/testsuite/g++.dg/opt/pr25857.C b/gcc/testsuite/g++.dg/opt/pr25857.C
new file mode 100644
index 000000000000..4e6858fe1958
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/pr25857.C
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int foo();
+int i;
+
+struct A
+{
+  ~A() { if (this != (A*)(&i)) foo(); }
+};
+
+struct B
+{
+  A a1, a2, a3, a4;
+  ~B() { foo(); }
+};
+
+B b;
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index ada654b17c1d..a695e90807bc 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -2745,6 +2745,10 @@ insert_extra_phis (basic_block block, basic_block dom)
 
       FOR_EACH_EDGE (e, ei, block->preds)
 	{
+	  /* We cannot handle abnormal incomming edges correctly.  */
+	  if (e->flags & EDGE_ABNORMAL)
+	    return;
+
 	  if (first)
 	    {
 	      bitmap_set_copy (tempset, AVAIL_OUT (e->src));
-- 
GitLab