From 7e872b900f2c68ffa604f40cb43db717a744bbcc Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Sat, 26 Nov 2011 21:50:28 +0100
Subject: [PATCH] re PR rtl-optimization/49912 (ICE from
 -freorder-blocks-and-partition : verify_flow_info failed)

	PR rtl-optimization/49912
	* cfgrtl.c (rtl_verify_flow_info_1): Ignore also EDGE_PRESERVE bit
	when counting n_branch.

	* g++.dg/other/pr49912.C: New test.

From-SVN: r181743
---
 gcc/ChangeLog                        |  6 +++++
 gcc/cfgrtl.c                         |  3 ++-
 gcc/testsuite/ChangeLog              |  5 ++++
 gcc/testsuite/g++.dg/other/pr49912.C | 38 ++++++++++++++++++++++++++++
 4 files changed, 51 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/other/pr49912.C

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bb63950d69d0..dcc99a04bfa9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-11-26  Jakub Jelinek  <jakub@redhat.com>
+
+	PR rtl-optimization/49912
+	* cfgrtl.c (rtl_verify_flow_info_1): Ignore also EDGE_PRESERVE bit
+	when counting n_branch.
+
 2011-11-26  Uros Bizjak  <ubizjak@gmail.com>
 
 	* config/i386/sync.md (movdi_via_fpu): Add %Z insn suffixes.
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index aeb4ba184e16..4b1d8350de5d 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -1875,7 +1875,8 @@ rtl_verify_flow_info_1 (void)
 			    | EDGE_CAN_FALLTHRU
 			    | EDGE_IRREDUCIBLE_LOOP
 			    | EDGE_LOOP_EXIT
-			    | EDGE_CROSSING)) == 0)
+			    | EDGE_CROSSING
+			    | EDGE_PRESERVE)) == 0)
 	    n_branch++;
 
 	  if (e->flags & EDGE_ABNORMAL_CALL)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2a084c80bfba..56073ab096ad 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-11-26  Jakub Jelinek  <jakub@redhat.com>
+
+	PR rtl-optimization/49912
+	* g++.dg/other/pr49912.C: New test.
+
 2011-11-26  Uros Bizjak  <ubizjak@gmail.com>
 
 	* gcc.dg/vect/fast-math-vect-call-2.c: Require vect_double
diff --git a/gcc/testsuite/g++.dg/other/pr49912.C b/gcc/testsuite/g++.dg/other/pr49912.C
new file mode 100644
index 000000000000..b8c3e5bedff7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/pr49912.C
@@ -0,0 +1,38 @@
+// PR rtl-optimization/49912
+// { dg-do compile }
+// { dg-require-effective-target freorder }
+// { dg-options "-O -freorder-blocks-and-partition" }
+
+int foo (int *);
+
+struct S
+{
+  int *m1 ();
+  S (int);
+   ~S () { foo (m1 ()); }
+};
+
+template <int>
+struct V
+{
+  S *v1;
+  void m2 (const S &);
+  S *base ();
+};
+
+template <int N>
+void V<N>::m2 (const S &x)
+{
+  S a = x;
+  S *l = base ();
+  while (l)
+    *v1 = *--l;
+}
+
+V<0> v;
+
+void
+foo ()
+{
+  v.m2 (0);
+}
-- 
GitLab