cfgrtl.c (try_redirect_by_replacing_jump): Allow redirect_jump to fail if target...
authorJakub Jelinek <jakub@redhat.com>
Sun, 30 Dec 2001 12:20:43 +0000 (13:20 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sun, 30 Dec 2001 12:20:43 +0000 (13:20 +0100)
* cfgrtl.c (try_redirect_by_replacing_jump): Allow redirect_jump
to fail if target is EXIT_BLOCK_PTR, die otherwise.
(redirect_edge_and_branch): Likewise.
* cfgcleanup.c (try_forward_edge): Don't force jump redirecting
if target is EXIT_BLOCK_PTR.

* gcc.c-torture/compile/20011229-2.c: New test.

From-SVN: r48399

gcc/ChangeLog
gcc/cfgcleanup.c
gcc/cfgrtl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20011229-2.c [new file with mode: 0644]

index 69b90569be080f75111893b4be5a3327912164e0..76c405a515888ac956f023274ec7a97c13195f8a 100644 (file)
@@ -1,3 +1,11 @@
+2001-12-30  Jakub Jelinek  <jakub@redhat.com>
+
+       * cfgrtl.c (try_redirect_by_replacing_jump): Allow redirect_jump
+       to fail if target is EXIT_BLOCK_PTR, die otherwise.
+       (redirect_edge_and_branch): Likewise.
+       * cfgcleanup.c (try_forward_edge): Don't force jump redirecting
+       if target is EXIT_BLOCK_PTR.
+
 2001-12-29  David Edelsohn  <edelsohn@gnu.org>
 
        * gcc.c (init_gcc_spec): Do not link with static libgcc.a if
index 9933defe433d640fc1f88b9ce0d0f5ae2dc766d5..98030325f294b62f7620f8a6c31ea6e62431595f 100644 (file)
@@ -440,7 +440,8 @@ try_forward_edges (mode, b)
          int edge_probability = e->probability;
          int edge_frequency;
 
-         if (threaded)
+         /* Don't force if target is exit block.  */
+         if (threaded && target != EXIT_BLOCK_PTR)
            {
              notice_new_block (redirect_edge_and_branch_force (e, target));
              if (rtl_dump_file)
index 92d230eebce2c7745270003b73565c308b256526..e7e6e699accbc277b4d02ba34ad8c06d2456f439 100644 (file)
@@ -687,9 +687,18 @@ try_redirect_by_replacing_jump (e, target)
       if (rtl_dump_file)
        fprintf (rtl_dump_file, "Redirecting jump %i from %i to %i.\n",
                 INSN_UID (insn), e->dest->index, target->index);
-      redirect_jump (insn, block_label (target), 0);
+      if (!redirect_jump (insn, block_label (target), 0))
+       {
+         if (target == EXIT_BLOCK_PTR)
+           return false;
+         abort ();
+       }
     }
 
+  /* Cannot do anything for target exit block.  */
+  else if (target == EXIT_BLOCK_PTR)
+    return false;
+
   /* Or replace possibly complicated jump insn by simple jump insn.  */
   else
     {
@@ -806,6 +815,8 @@ redirect_edge_and_branch (e, target)
       int j;
       rtx new_label = block_label (target);
 
+      if (target == EXIT_BLOCK_PTR)
+       return false;
       if (GET_CODE (PATTERN (tmp)) == ADDR_VEC)
        vec = XVEC (PATTERN (tmp), 0);
       else
@@ -843,11 +854,18 @@ redirect_edge_and_branch (e, target)
        return false;
 
       /* If the insn doesn't go where we think, we're confused.  */
-      if (JUMP_LABEL (insn) != old_label
-         /* If the substitution doesn't succeed, die.  This can happen
-            if the back end emitted unrecognizable instructions.  */
-         || !redirect_jump (insn, block_label (target), 0))
+      if (JUMP_LABEL (insn) != old_label)
        abort ();
+
+      /* If the substitution doesn't succeed, die.  This can happen
+        if the back end emitted unrecognizable instructions or if
+        target is exit block on some arches.  */
+      if (!redirect_jump (insn, block_label (target), 0))
+       {
+         if (target == EXIT_BLOCK_PTR)
+           return false;
+         abort ();
+       }
     }
 
   if (rtl_dump_file)
index 75d38d829b97e174409cb30269cbecb85bd55541..a756c74ae77ca9c822fe4b8c375dce6f33cd0a20 100644 (file)
@@ -1,3 +1,7 @@
+2001-12-30  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.c-torture/compile/20011229-2.c: New test.
+
 2001-12-29  Jakub Jelinek  <jakub@redhat.com>
 
        * gcc.dg/debug-3.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/20011229-2.c b/gcc/testsuite/gcc.c-torture/compile/20011229-2.c
new file mode 100644 (file)
index 0000000..bb49bd1
--- /dev/null
@@ -0,0 +1,17 @@
+/* Test whether jump threading doesn't ICE if redirecting the jump to exit
+   block.  */
+
+extern int bar ();
+extern void baz ();
+
+void foo ()
+{
+  int x;
+
+  do
+    {
+      if ((x = bar ()) == 1)
+       baz ();
+    }
+  while (x == 1);
+}