regmove.c (perhaps_ends_bb_p): Use can_throw_internal to reduce false positives.
authorRichard Henderson <rth@redhat.com>
Wed, 28 Mar 2001 08:08:43 +0000 (00:08 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 28 Mar 2001 08:08:43 +0000 (00:08 -0800)
        * regmove.c (perhaps_ends_bb_p): Use can_throw_internal to
        reduce false positives.
        (regmove_optimize): Disable if flag_non_call_exceptions.

From-SVN: r40917

gcc/ChangeLog
gcc/regmove.c

index eca76ca6024f836e0fbcf3f7947779e14f0c6163..8994dd2a9cc84f1bad7c827896ae045533a11d83 100644 (file)
@@ -1,5 +1,9 @@
 2001-03-27  Richard Henderson  <rth@redhat.com>
 
+       * regmove.c (perhaps_ends_bb_p): Use can_throw_internal to
+       reduce false positives.
+       (regmove_optimize): Disable if flag_non_call_exceptions.
+
        * stmt.c (expand_return): Remove always true predicate.
        (expand_decl_cleanup_no_eh): Remove dead code.
 
index 262338f6b056ec86a3ff9a7eea2f169df88e43aa..26c4546fce364e8abe6b3993b789a514945a73cb 100644 (file)
@@ -395,11 +395,11 @@ static int perhaps_ends_bb_p (insn)
       /* A CALL_INSN might be the last insn of a basic block, if it is inside
         an EH region or if there are nonlocal gotos.  Note that this test is
         very conservative.  */
-      return flag_exceptions || nonlocal_goto_handler_labels;
-
+      if (nonlocal_goto_handler_labels)
+       return 1;
+      /* FALLTHRU */
     default:
-      /* All others never end a basic block.  */
-      return 0;
+      return can_throw_internal (insn);
     }
 }
 \f
@@ -1062,6 +1062,11 @@ regmove_optimize (f, nregs, regmove_dump_file)
   int i;
   rtx copy_src, copy_dst;
 
+  /* ??? Hack.  Regmove doesn't examine the CFG, and gets mightily
+     confused by non-call exceptions ending blocks.  */
+  if (flag_non_call_exceptions)
+    return;
+
   /* Find out where a potential flags register is live, and so that we
      can supress some optimizations in those zones.  */
   mark_flags_life_zones (discover_flags_reg ());