calls.c (expand_call): Disallow sibcalls to noreturn functions.
authorRichard Henderson <rth@cygnus.com>
Sat, 7 Oct 2000 20:53:21 +0000 (13:53 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sat, 7 Oct 2000 20:53:21 +0000 (13:53 -0700)
        * calls.c (expand_call): Disallow sibcalls to noreturn functions.
        * flow.c (make_edges): Revert last change.

        * config/alpha/alpha.h (FUNCTION_OK_FOR_SIBCALL): Don't test
        TREE_THIS_VOLATILE.
        * config/pa/pa.h (FUNCTION_OK_FOR_SIBCALL): Likewise.

From-SVN: r36781

gcc/ChangeLog
gcc/calls.c
gcc/config/alpha/alpha.h
gcc/config/pa/pa.h
gcc/flow.c

index fea8809b5a4a4d20c97fc8036a90bea4cbde4a54..b4a53e9388ddb8c913fc91f77aa821f5a780a56b 100644 (file)
@@ -1,3 +1,12 @@
+2000-10-07  Richard Henderson  <rth@cygnus.com>
+
+       * calls.c (expand_call): Disallow sibcalls to noreturn functions.
+       * flow.c (make_edges): Revert last change.
+
+       * config/alpha/alpha.h (FUNCTION_OK_FOR_SIBCALL): Don't test
+       TREE_THIS_VOLATILE.
+       * config/pa/pa.h (FUNCTION_OK_FOR_SIBCALL): Likewise.
+
 2000-10-06  David O'Brien  <obrien@dragon.nuxi.com>
 
        * config/alpha/elf.h: Standardize the formatting.
index 2163e51ebda5fd49d8731b9a027e616e2204f4b1..775d03d0bde5b3f4b5e40aed13d09d65d9fa30f9 100644 (file)
@@ -2463,6 +2463,7 @@ expand_call (exp, target, ignore)
         before the sibcall_epilogue.  */
       || fndecl == NULL_TREE
       || (flags & (ECF_RETURNS_TWICE | ECF_LONGJMP))
+      || TREE_THIS_VOLATILE (fndecl)
       || !FUNCTION_OK_FOR_SIBCALL (fndecl)
       /* If this function requires more stack slots than the current
         function, we cannot change it into a sibling call.  */
index 74b98e4f6c2cd51035f7ae931a84c520660db890..21d23bbffe433c46c602e895210d90feb25f74f2 100644 (file)
@@ -1187,8 +1187,7 @@ extern int alpha_memory_latency;
 #define FUNCTION_OK_FOR_SIBCALL(DECL)                  \
   (DECL                                                        \
    && ((TREE_ASM_WRITTEN (DECL) && !flag_pic)          \
-       || ! TREE_PUBLIC (DECL)                         \
-       || (0 && TREE_THIS_VOLATILE (DECL))))
+       || ! TREE_PUBLIC (DECL)))
 
 /* Try to output insns to set TARGET equal to the constant C if it can be
    done in less than N insns.  Do all computations in MODE.  Returns the place
index feb531bf7dfb327c8749ad752e1a2c2e21f55ac3..3d26e044f328b25b33d8f0cf4ec93117894fcb3f 100644 (file)
@@ -2014,8 +2014,7 @@ while (0)
 #define FUNCTION_OK_FOR_SIBCALL(DECL) \
   (DECL \
    && ! TARGET_64BIT \
-   && (! TREE_PUBLIC (DECL) \
-       || TREE_THIS_VOLATILE (DECL)))
+   && ! TREE_PUBLIC (DECL))
 
 #define PREDICATE_CODES                                                        \
   {"reg_or_0_operand", {SUBREG, REG, CONST_INT}},                      \
index 52eed8d179cd953162b2dbf059fd31d83f2abebc..0cb8428215b6b7ef55c8d2ecdfdfc28b61b56819 100644 (file)
@@ -1152,12 +1152,8 @@ make_edges (label_value_list)
         wouldn't have created the sibling call in the first place.  */
 
       if (code == CALL_INSN && SIBLING_CALL_P (insn))
-       {
-         if (! find_reg_note (insn, REG_NORETURN, NULL_RTX))
-           make_edge (edge_cache, bb, EXIT_BLOCK_PTR,
-                      EDGE_ABNORMAL | EDGE_ABNORMAL_CALL);
-       }
-      else
+       make_edge (edge_cache, bb, EXIT_BLOCK_PTR,
+                  EDGE_ABNORMAL | EDGE_ABNORMAL_CALL);
 
       /* If this is a CALL_INSN, then mark it as reaching the active EH
         handler for this CALL_INSN.  If we're handling asynchronous
@@ -1165,7 +1161,7 @@ make_edges (label_value_list)
 
         Also mark the CALL_INSN as reaching any nonlocal goto handler.  */
 
-      if (code == CALL_INSN || asynchronous_exceptions)
+      else if (code == CALL_INSN || asynchronous_exceptions)
        {
          /* Add any appropriate EH edges.  We do this unconditionally
             since there may be a REG_EH_REGION or REG_EH_RETHROW note