re PR rtl-optimization/48156 (wrong code with -fcrossjumping)
authorJakub Jelinek <jakub@redhat.com>
Sun, 20 Mar 2011 15:25:55 +0000 (16:25 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sun, 20 Mar 2011 15:25:55 +0000 (16:25 +0100)
PR rtl-optimization/48156
* df-core.c (df_get_bb_dirty): Use df_lr if df_live is NULL,
assume df and df_lr are not NULL.

* gcc.dg/pr48156.c: New test.

From-SVN: r171195

gcc/ChangeLog
gcc/df-core.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr48156.c [new file with mode: 0644]

index 53820c1a3f545f464199ac21d08d46da3dfaeb8f..5549bc1b1af71d7937bc2f10c73c46d843946eff 100644 (file)
@@ -1,3 +1,9 @@
+2011-03-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/48156
+       * df-core.c (df_get_bb_dirty): Use df_lr if df_live is NULL,
+       assume df and df_lr are not NULL.
+
 2011-03-20  Ramana Radhakrishnan  <ramana.radhakrishnan@linaro.org>
 
        PR debug/48023
index 36270bf899338ffbb4a46a95111362146b454958..98c2088f51e1722cfb05b4c10d366fb05b86e0be 100644 (file)
@@ -1,6 +1,6 @@
 /* Allocation for dataflow support routines.
    Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-   2008, 2009, 2010 Free Software Foundation, Inc.
+   2008, 2009, 2010, 2011 Free Software Foundation, Inc.
    Originally contributed by Michael P. Hayes
              (m.hayes@elec.canterbury.ac.nz, mhayes@redhat.com)
    Major rewrite contributed by Danny Berlin (dberlin@dberlin.org)
@@ -1400,10 +1400,9 @@ df_mark_solutions_dirty (void)
 bool
 df_get_bb_dirty (basic_block bb)
 {
-  if (df && df_live)
-    return bitmap_bit_p (df_live->out_of_date_transfer_functions, bb->index);
-  else
-    return false;
+  return bitmap_bit_p ((df_live
+                       ? df_live : df_lr)->out_of_date_transfer_functions,
+                      bb->index);
 }
 
 
index eb1256af93b984c5bd08cc1c6a4f5bd01ede3cf1..cf81f1a7fc34d57096e614df8d8ec29c961d425e 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/48156
+       * gcc.dg/pr48156.c: New test.
+
 2011-03-19  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
        PR libfortran/47439
diff --git a/gcc/testsuite/gcc.dg/pr48156.c b/gcc/testsuite/gcc.dg/pr48156.c
new file mode 100644 (file)
index 0000000..7b4d529
--- /dev/null
@@ -0,0 +1,45 @@
+/* PR rtl-optimization/48156 */
+/* { dg-do run } */
+/* { dg-options "-O -fcrossjumping --param min-crossjump-insns=1" } */
+
+extern void abort (void);
+
+static int __attribute__ ((noinline, noclone))
+equals (int s1, int s2)
+{
+  return s1 == s2;
+}
+
+static int __attribute__ ((noinline, noclone))
+bar (void)
+{
+  return 1;
+}
+
+static void __attribute__ ((noinline, noclone))
+baz (int f, int j)
+{
+  if (f != 4 || j != 2)
+    abort ();
+}
+
+void
+foo (int x)
+{
+  int i = 0, j = bar ();
+
+  if (x == 1)
+    i = 2;
+
+  if (j && equals (i, j))
+    baz (8, i);
+  else
+    baz (4, i);
+}
+
+int
+main ()
+{
+  foo (1);
+  return 0;
+}