re PR rtl-optimization/49912 (ICE from -freorder-blocks-and-partition : verify_flow_i...
authorJakub Jelinek <jakub@redhat.com>
Sat, 26 Nov 2011 20:50:28 +0000 (21:50 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 26 Nov 2011 20:50:28 +0000 (21:50 +0100)
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
gcc/cfgrtl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/pr49912.C [new file with mode: 0644]

index bb63950..dcc99a0 100644 (file)
@@ -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.
index aeb4ba1..4b1d835 100644 (file)
@@ -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)
index 2a084c8..56073ab 100644 (file)
@@ -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 (file)
index 0000000..b8c3e5b
--- /dev/null
@@ -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);
+}