]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/7520 (internal compiler error in verify_local_live_at_start)
authorRichard Henderson <rth@redhat.com>
Thu, 7 Nov 2002 00:22:48 +0000 (16:22 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 7 Nov 2002 00:22:48 +0000 (16:22 -0800)
        PR optimization/7520
        * cfganal.c (flow_active_insn_p): New.
        (forwarder_block_p): Use it.

From-SVN: r58871

gcc/ChangeLog
gcc/cfganal.c

index 76fd68f42693c4cf2cdc8c14d52849ec670f4328..bb30ccaf9cc02cd0835a8472f6bfde74dee9d86c 100644 (file)
@@ -1,3 +1,9 @@
+2002-11-06  Richard Henderson  <rth@redhat.com>
+
+       PR optimization/7520
+       * cfganal.c (flow_active_insn_p): New.
+       (forwarder_block_p): Use it.
+
 2002-11-06  Janis Johnson  <janis187@us.ibm.com>
 
        * doc/contrib.texi: Merge in the list from the Java web pages.
index 6009d59cbe85884295ed0e1b40554ee90297d07a..8aba2318692b90c4c33fb327b56017fbc1137f36 100644 (file)
@@ -56,7 +56,31 @@ static void flow_dfs_compute_reverse_finish
 static void remove_fake_successors     PARAMS ((basic_block));
 static bool need_fake_edge_p           PARAMS ((rtx));
 static bool keep_with_call_p           PARAMS ((rtx));
+static bool flow_active_insn_p         PARAMS ((rtx));
 \f
+/* Like active_insn_p, except keep the return value clobber around
+   even after reload.  */
+
+static bool
+flow_active_insn_p (insn)
+     rtx insn;
+{
+  if (active_insn_p (insn))
+    return true;
+
+  /* A clobber of the function return value exists for buggy 
+     programs that fail to return a value.  It's effect is to
+     keep the return value from being live across the entire
+     function.  If we allow it to be skipped, we introduce the
+     possibility for register livetime aborts.  */
+  if (GET_CODE (PATTERN (insn)) == CLOBBER
+      && GET_CODE (XEXP (PATTERN (insn), 0)) == REG
+      && REG_FUNCTION_VALUE_P (XEXP (PATTERN (insn), 0)))
+    return true;
+
+  return false;
+}
+
 /* Return true if the block has no effect and only forwards control flow to
    its single destination.  */
 
@@ -71,12 +95,12 @@ forwarder_block_p (bb)
     return false;
 
   for (insn = bb->head; insn != bb->end; insn = NEXT_INSN (insn))
-    if (INSN_P (insn) && active_insn_p (insn))
+    if (INSN_P (insn) && flow_active_insn_p (insn))
       return false;
 
   return (!INSN_P (insn)
          || (GET_CODE (insn) == JUMP_INSN && simplejump_p (insn))
-         || !active_insn_p (insn));
+         || !flow_active_insn_p (insn));
 }
 
 /* Return nonzero if we can reach target from src by falling through.  */