[PATCH][PR64971]Convert function pointer to Pmode when emit call.
authorRenlin Li <renlin.li@arm.com>
Tue, 9 Aug 2016 17:20:14 +0000 (17:20 +0000)
committerRenlin Li <renlin@gcc.gnu.org>
Tue, 9 Aug 2016 17:20:14 +0000 (17:20 +0000)
gcc/

2016-08-04  Renlin Li  <renlin.li@arm.com>

PR middle-end/64971
* calls.c (prepare_call_address): Convert funexp to Pmode when
necessary.
* config/aarch64/aarch64.md (sibcall): Remove fix for PR 64971.
(sibcall_value): Likewise.

From-SVN: r239300

gcc/ChangeLog
gcc/calls.c
gcc/config/aarch64/aarch64.md

index cee39a1c0c4bacdd165445c062619e5778a2627a..40537cba7e70c6da1ca5ee1e92d6eee59b1cdad5 100644 (file)
@@ -1,3 +1,11 @@
+2016-08-09  Renlin Li  <renlin.li@arm.com>
+
+       PR middle-end/64971
+       * calls.c (prepare_call_address): Convert funexp to Pmode when
+       necessary.
+       * config/aarch64/aarch64.md (sibcall): Remove fix for PR 64971.
+       (sibcall_value): Likewise.
+
 2016-08-09  Marek Polacek  <polacek@redhat.com>
 
        PR c/7652
index 949a92e3fe3417e77b339bf55abd57e7c34ecbac..4ad3e34d67752656f289b6040088d57cd9bfb4c5 100644 (file)
@@ -194,10 +194,19 @@ prepare_call_address (tree fndecl_or_type, rtx funexp, rtx static_chain_value,
               && targetm.small_register_classes_for_mode_p (FUNCTION_MODE))
              ? force_not_mem (memory_address (FUNCTION_MODE, funexp))
              : memory_address (FUNCTION_MODE, funexp));
-  else if (! sibcallp)
+  else
     {
-      if (!NO_FUNCTION_CSE && optimize && ! flag_no_function_cse)
-       funexp = force_reg (Pmode, funexp);
+      /* funexp could be a SYMBOL_REF represents a function pointer which is
+        of ptr_mode.  In this case, it should be converted into address mode
+        to be a valid address for memory rtx pattern.  See PR 64971.  */
+      if (GET_MODE (funexp) != Pmode)
+       funexp = convert_memory_address (Pmode, funexp);
+
+      if (! sibcallp)
+       {
+         if (!NO_FUNCTION_CSE && optimize && ! flag_no_function_cse)
+           funexp = force_reg (Pmode, funexp);
+       }
     }
 
   if (static_chain_value != 0
index f15dd8d8672e089d6d33b2237faf92e923cf1ac3..c95258b71033451ab1d5f4826e0bfa0044edc704 100644 (file)
           || aarch64_is_noplt_call_p (callee)))
       XEXP (operands[0], 0) = force_reg (Pmode, callee);
 
-    /* FIXME: This is a band-aid.  Need to analyze why expand_expr_addr_expr
-       is generating an SImode symbol reference.  See PR 64971.  */
-    if (TARGET_ILP32
-       && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF
-       && GET_MODE (XEXP (operands[0], 0)) == SImode)
-      XEXP (operands[0], 0) = convert_memory_address (Pmode,
-                                                     XEXP (operands[0], 0));
     if (operands[2] == NULL_RTX)
       operands[2] = const0_rtx;
 
           || aarch64_is_noplt_call_p (callee)))
       XEXP (operands[1], 0) = force_reg (Pmode, callee);
 
-    /* FIXME: This is a band-aid.  Need to analyze why expand_expr_addr_expr
-       is generating an SImode symbol reference.  See PR 64971.  */
-    if (TARGET_ILP32
-       && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF
-       && GET_MODE (XEXP (operands[1], 0)) == SImode)
-      XEXP (operands[1], 0) = convert_memory_address (Pmode,
-                                                     XEXP (operands[1], 0));
-
     if (operands[3] == NULL_RTX)
       operands[3] = const0_rtx;