* rtl.h (get_call_rtx_from): New prototype.
authorsteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 16 Oct 2012 22:05:17 +0000 (22:05 +0000)
committersteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 16 Oct 2012 22:05:17 +0000 (22:05 +0000)
* rtlanal.c (get_call_rtx_from): New function.
* calls.c (emit_call_1): Use it.
* dse.c (scan_insn): Likewise
* dwarf2out.c (dwarf2out_var_location): Likewise.
* sched-deps.c (call_may_noreturn_p): Likewise.
* var-tracking.c (prepare_call_arguments): Likewise.
* config/sh/sh.c (sh_adjust_cost): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192516 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/calls.c
gcc/config/sh/sh.c
gcc/dse.c
gcc/dwarf2out.c
gcc/rtl.h
gcc/rtlanal.c
gcc/sched-deps.c
gcc/var-tracking.c

index 14b817d..c2e717f 100644 (file)
@@ -1,3 +1,14 @@
+2012-10-16  Steven Bosscher  <steven@gcc.gnu.org>
+
+       * rtl.h (get_call_rtx_from): New prototype.
+       * rtlanal.c (get_call_rtx_from): New function.
+       * calls.c (emit_call_1): Use it.
+       * dse.c (scan_insn): Likewise
+       * dwarf2out.c (dwarf2out_var_location): Likewise.
+       * sched-deps.c (call_may_noreturn_p): Likewise.
+       * var-tracking.c (prepare_call_arguments): Likewise.
+       * config/sh/sh.c (sh_adjust_cost): Likewise.
+
 2012-10-16  Tom de Vries  <tom@codesourcery.com>
 
        * expr.c (move_by_pieces, move_by_pieces_ninsns, can_store_by_pieces)
index 2180a62..d4ef639 100644 (file)
@@ -384,13 +384,8 @@ emit_call_1 (rtx funexp, tree fntree ATTRIBUTE_UNUSED, tree fndecl ATTRIBUTE_UNU
 
   /* Some target create a fresh MEM instead of reusing the one provided
      above.  Set its MEM_EXPR.  */
-  call = PATTERN (call_insn);
-  if (GET_CODE (call) == PARALLEL)
-    call = XVECEXP (call, 0, 0);
-  if (GET_CODE (call) == SET)
-    call = SET_SRC (call);
-  if (GET_CODE (call) == CALL
-      && MEM_P (XEXP (call, 0))
+  call = get_call_rtx_from (call_insn);
+  if (call
       && MEM_EXPR (XEXP (call, 0)) == NULL_TREE
       && MEM_EXPR (funmem) != NULL_TREE)
     set_mem_expr (XEXP (call, 0), MEM_EXPR (funmem));
index df5b4e5..b81c0c3 100644 (file)
@@ -10811,13 +10811,8 @@ sh_adjust_cost (rtx insn, rtx link ATTRIBUTE_UNUSED, rtx dep_insn, int cost)
         function's address.  */
       if (CALL_P (insn))
        {
-         rtx call = PATTERN (insn);
-
-         if (GET_CODE (call) == PARALLEL)
-           call = XVECEXP (call, 0 ,0);
-         if (GET_CODE (call) == SET)
-           call = SET_SRC (call);
-         if (GET_CODE (call) == CALL && MEM_P (XEXP (call, 0))
+         rtx call = get_call_rtx_from (insn);
+         if (call
                  /* sibcalli_thunk uses a symbol_ref in an unspec.  */
              && (GET_CODE (XEXP (XEXP (call, 0), 0)) == UNSPEC
                  || ! reg_set_p (XEXP (XEXP (call, 0), 0), dep_insn)))
index eff4a39..318bbc9 100644 (file)
--- a/gcc/dse.c
+++ b/gcc/dse.c
@@ -2518,14 +2518,8 @@ scan_insn (bb_info_t bb_info, rtx insn)
       const_call = RTL_CONST_CALL_P (insn);
       if (!const_call)
        {
-         rtx call = PATTERN (insn);
-         if (GET_CODE (call) == PARALLEL)
-           call = XVECEXP (call, 0, 0);
-         if (GET_CODE (call) == SET)
-           call = SET_SRC (call);
-         if (GET_CODE (call) == CALL
-             && MEM_P (XEXP (call, 0))
-             && GET_CODE (XEXP (XEXP (call, 0), 0)) == SYMBOL_REF)
+         rtx call = get_call_rtx_from (insn);
+         if (call && GET_CODE (XEXP (XEXP (call, 0), 0)) == SYMBOL_REF)
            {
              rtx symbol = XEXP (XEXP (call, 0), 0);
              if (SYMBOL_REF_DECL (symbol)
index 95fc130..fcdb1b1 100644 (file)
@@ -20100,12 +20100,8 @@ dwarf2out_var_location (rtx loc_note)
       if (!CALL_P (prev))
        prev = XVECEXP (PATTERN (prev), 0, 0);
       ca_loc->tail_call_p = SIBLING_CALL_P (prev);
-      x = PATTERN (prev);
-      if (GET_CODE (x) == PARALLEL)
-       x = XVECEXP (x, 0, 0);
-      if (GET_CODE (x) == SET)
-       x = SET_SRC (x);
-      if (GET_CODE (x) == CALL && MEM_P (XEXP (x, 0)))
+      x = get_call_rtx_from (PATTERN (prev));
+      if (x)
        {
          x = XEXP (XEXP (x, 0), 0);
          if (GET_CODE (x) == SYMBOL_REF
index a38924d..eeeb6ba 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1930,6 +1930,7 @@ extern bool nonzero_address_p (const_rtx);
 extern int rtx_unstable_p (const_rtx);
 extern bool rtx_varies_p (const_rtx, bool);
 extern bool rtx_addr_varies_p (const_rtx, bool);
+extern rtx get_call_rtx_from (rtx);
 extern HOST_WIDE_INT get_integer_term (const_rtx);
 extern rtx get_related_value (const_rtx);
 extern bool offset_within_block_p (const_rtx, HOST_WIDE_INT);
index fb7d45c..a19bdfd 100644 (file)
@@ -466,6 +466,22 @@ rtx_addr_varies_p (const_rtx x, bool for_alias)
   return 0;
 }
 \f
+/* Return the CALL in X if there is one.  */
+
+rtx
+get_call_rtx_from (rtx x)
+{
+  if (INSN_P (x))
+    x = PATTERN (x);
+  if (GET_CODE (x) == PARALLEL)
+    x = XVECEXP (x, 0, 0);
+  if (GET_CODE (x) == SET)
+    x = SET_SRC (x);
+  if (GET_CODE (x) == CALL && MEM_P (XEXP (x, 0)))
+    return x;
+  return NULL_RTX;
+}
+\f
 /* Return the value of the integer term in X, if one is apparent;
    otherwise return 0.
    Only obvious integer terms are detected.
index 936a131..b9ffb2d 100644 (file)
@@ -3425,14 +3425,8 @@ call_may_noreturn_p (rtx insn)
       && !RTL_LOOPING_CONST_OR_PURE_CALL_P (insn))
     return false;
 
-  call = PATTERN (insn);
-  if (GET_CODE (call) == PARALLEL)
-    call = XVECEXP (call, 0, 0);
-  if (GET_CODE (call) == SET)
-    call = SET_SRC (call);
-  if (GET_CODE (call) == CALL
-      && MEM_P (XEXP (call, 0))
-      && GET_CODE (XEXP (XEXP (call, 0), 0)) == SYMBOL_REF)
+  call = get_call_rtx_from (insn);
+  if (call && GET_CODE (XEXP (XEXP (call, 0), 0)) == SYMBOL_REF)
     {
       rtx symbol = XEXP (XEXP (call, 0), 0);
       if (SYMBOL_REF_DECL (symbol)
index 65116c2..25973a9 100644 (file)
@@ -5897,9 +5897,8 @@ static rtx call_arguments;
 static void
 prepare_call_arguments (basic_block bb, rtx insn)
 {
-  rtx link, x;
+  rtx link, x, call;
   rtx prev, cur, next;
-  rtx call = PATTERN (insn);
   rtx this_arg = NULL_RTX;
   tree type = NULL_TREE, t, fndecl = NULL_TREE;
   tree obj_type_ref = NULL_TREE;
@@ -5908,11 +5907,8 @@ prepare_call_arguments (basic_block bb, rtx insn)
 
   memset (&args_so_far_v, 0, sizeof (args_so_far_v));
   args_so_far = pack_cumulative_args (&args_so_far_v);
-  if (GET_CODE (call) == PARALLEL)
-    call = XVECEXP (call, 0, 0);
-  if (GET_CODE (call) == SET)
-    call = SET_SRC (call);
-  if (GET_CODE (call) == CALL && MEM_P (XEXP (call, 0)))
+  call = get_call_rtx_from (insn);
+  if (call)
     {
       if (GET_CODE (XEXP (XEXP (call, 0), 0)) == SYMBOL_REF)
        {
@@ -6186,12 +6182,8 @@ prepare_call_arguments (basic_block bb, rtx insn)
     }
   call_arguments = prev;
 
-  x = PATTERN (insn);
-  if (GET_CODE (x) == PARALLEL)
-    x = XVECEXP (x, 0, 0);
-  if (GET_CODE (x) == SET)
-    x = SET_SRC (x);
-  if (GET_CODE (x) == CALL && MEM_P (XEXP (x, 0)))
+  x = get_call_rtx_from (insn);
+  if (x)
     {
       x = XEXP (XEXP (x, 0), 0);
       if (GET_CODE (x) == SYMBOL_REF)