re PR rtl-optimization/23454 (ICE in invert_exp_1, at jump.c:1719)
authorJakub Jelinek <jakub@redhat.com>
Sat, 3 Sep 2005 18:49:51 +0000 (20:49 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 3 Sep 2005 18:49:51 +0000 (20:49 +0200)
PR rtl-optimization/23454
* reorg.c (relax_delay_slots): Only call invert_jump if any_condjump_p
is true.

* g++.dg/opt/pr23454.C: New test.

From-SVN: r103810

gcc/ChangeLog
gcc/reorg.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr23454.C [new file with mode: 0644]

index 4b488fa..8bbb5ba 100644 (file)
@@ -1,3 +1,9 @@
+2005-09-03  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/23454
+       * reorg.c (relax_delay_slots): Only call invert_jump if any_condjump_p
+       is true.
+
 2005-09-03  Richard Henderson  <rth@redhat.com>
            John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
index cda7168..8b9d7ef 100644 (file)
@@ -3123,10 +3123,11 @@ relax_delay_slots (rtx first)
          if (target_label && target_label != JUMP_LABEL (insn))
            reorg_redirect_jump (insn, target_label);
 
-         /* See if this jump branches around an unconditional jump.
-            If so, invert this jump and point it to the target of the
+         /* See if this jump conditionally branches around an unconditional
+            jump.  If so, invert this jump and point it to the target of the
             second jump.  */
          if (next && JUMP_P (next)
+             && any_condjump_p (insn)
              && (simplejump_p (next) || GET_CODE (PATTERN (next)) == RETURN)
              && target_label
              && next_active_insn (target_label) == next_active_insn (next)
@@ -3172,7 +3173,7 @@ relax_delay_slots (rtx first)
       if (JUMP_P (insn)
          && (simplejump_p (insn) || GET_CODE (PATTERN (insn)) == RETURN)
          && (other = prev_active_insn (insn)) != 0
-         && (condjump_p (other) || condjump_in_parallel_p (other))
+         && any_condjump_p (other)
          && no_labels_between_p (other, insn)
          && 0 > mostly_true_jump (other,
                                   get_branch_condition (other,
index 0abc44f..496ecc3 100644 (file)
@@ -1,3 +1,8 @@
+2005-09-03  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/23454
+       * g++.dg/opt/pr23454.C: New test.
+
 2005-09-03  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/23699
diff --git a/gcc/testsuite/g++.dg/opt/pr23454.C b/gcc/testsuite/g++.dg/opt/pr23454.C
new file mode 100644 (file)
index 0000000..ab82b1f
--- /dev/null
@@ -0,0 +1,41 @@
+/* PR rtl-optimization/23454 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+void foo ();
+int a, b;
+char c;
+long long d, e;
+
+static inline int
+bar (const long long s, const long long t)
+{
+  return ((s < t) ? -1 : s > t ? 1 : 0);
+}
+
+int fn ();
+int f;
+
+void
+baz (int x)
+{
+  long long g = fn ();
+  if (f)
+    {
+      b++;
+      return;
+    }
+  if (g == 0)
+    a++;
+  if (x)
+    foo ();
+  if (!c)
+    c = 1;
+  else if (g != 0)
+    {
+      if (bar (g, d) < 0)
+       d = g;
+      if (bar (g, e) > 0)
+       e = g;
+    }
+}