Richard Biener <richard.guent...@gmail.com> writes:
> On October 14, 2019 2:53:36 PM GMT+02:00, Richard Sandiford 
> <richard.sandif...@arm.com> wrote:
>>Richard Biener <richard.guent...@gmail.com> writes:
>>> On Fri, Oct 11, 2019 at 4:39 PM Richard Sandiford
>>> <richard.sandif...@arm.com> wrote:
>>>>
>>>> This turned out to be useful for the SVE PCS support, and is a
>>natural
>>>> tree-level analogue of insn_callee_abi.
>>>>
>>>> Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?
>>>>
>>>> Richard
>>>>
>>>>
>>>> 2019-10-11  Richard Sandiford  <richard.sandif...@arm.com>
>>>>
>>>> gcc/
>>>>         * function-abi.h (expr_callee_abi): Declare.
>>>>         * function-abi.cc (expr_callee_abi): New function.
>>>>
>>>> Index: gcc/function-abi.h
>>>> ===================================================================
>>>> --- gcc/function-abi.h  2019-09-30 17:39:33.514597856 +0100
>>>> +++ gcc/function-abi.h  2019-10-11 15:38:54.141605718 +0100
>>>> @@ -315,5 +315,6 @@ call_clobbered_in_region_p (unsigned int
>>>>  extern const predefined_function_abi &fntype_abi (const_tree);
>>>>  extern function_abi fndecl_abi (const_tree);
>>>>  extern function_abi insn_callee_abi (const rtx_insn *);
>>>> +extern function_abi expr_callee_abi (const_tree);
>>>>
>>>>  #endif
>>>> Index: gcc/function-abi.cc
>>>> ===================================================================
>>>> --- gcc/function-abi.cc 2019-09-30 17:39:33.514597856 +0100
>>>> +++ gcc/function-abi.cc 2019-10-11 15:38:54.141605718 +0100
>>>> @@ -229,3 +229,32 @@ insn_callee_abi (const rtx_insn *insn)
>>>>
>>>>    return default_function_abi;
>>>>  }
>>>> +
>>>> +/* Return the ABI of the function called by CALL_EXPR EXP.  Return
>>the
>>>> +   default ABI for erroneous calls.  */
>>>> +
>>>> +function_abi
>>>> +expr_callee_abi (const_tree exp)
>>>> +{
>>>> +  gcc_assert (TREE_CODE (exp) == CALL_EXPR);
>>>> +
>>>> +  if (tree fndecl = get_callee_fndecl (exp))
>>>> +    return fndecl_abi (fndecl);
>>>
>>> Please not.  The ABI in effect on the call is that of
>>> the type of CALL_EXPR_FN, what GIMPLE optimizers
>>> propagated as fndecl here doesn't matter.
>>
>>expr_callee_abi is returning the ABI of the callee function, ignoring
>>any additional effects involved in actually calling it.  It's supposed
>>to take advantage of local IPA information where possible, e.g. by
>>ignoring call-clobbered registers that the target doesn't actually
>>clobber.
>>
>>So if get_callee_fndecl returns either the correct FUNCTION_DECL or
>>null,
>>using it gives better information than just using the type.  Failing to
>>propagate the decl (or not having a decl to propagate) just means that
>>we don't take advantage of the IPA information.
>
> So we don't ever want to use this for stdcall vs. Msabi Or so where the 
> indirect call function type might be correctly attributed while a function 
> decl is not? 

Right.  This wouldn't be the right query for that case, since the
function is only telling us about the target.

>>>> +
>>>> +  tree callee = CALL_EXPR_FN (exp);
>>>> +  if (callee == error_mark_node)
>>>> +    return default_function_abi;
>>>> +
>>>> +  tree type = TREE_TYPE (callee);
>>>> +  if (type == error_mark_node)
>>>> +    return default_function_abi;
>>>> +
>>>> +  if (POINTER_TYPE_P (type))
>>>> +    {
>>>> +      type = TREE_TYPE (type);
>>>> +      if (type == error_mark_node)
>>>> +       return default_function_abi;
>>>> +    }
>>>
>>> so when it's not a POINTER_TYPE (it always shold be!)
>>> then you're handing arbitrary types to fntype_abi.
>>
>>fntype_abi asserts that TYPE is an appropriate type.  There's no safe
>>value we can return if it isn't.  (Well, apart from the error_mark_node
>>cases above, where the assumption is that compilation is going to fail
>>anyway.)
>>
>>I can change it to assert for POINTER_TYPE_P if that's guaranteed
>>everywhere.
>
> That's probably better. 

OK, here's what I applied after retesting with the ACLE stuff
that uses it.

Thanks,
Richard


2019-10-16  Richard Sandiford  <richard.sandif...@arm.com>

gcc/
        * function-abi.cc (expr_callee_abi): Assert for POINTER_TYPE_P.

Index: gcc/function-abi.cc
===================================================================
--- gcc/function-abi.cc 2019-10-14 09:05:57.142808555 +0100
+++ gcc/function-abi.cc 2019-10-16 11:58:35.362779932 +0100
@@ -249,12 +249,6 @@ expr_callee_abi (const_tree exp)
   if (type == error_mark_node)
     return default_function_abi;
 
-  if (POINTER_TYPE_P (type))
-    {
-      type = TREE_TYPE (type);
-      if (type == error_mark_node)
-       return default_function_abi;
-    }
-
-  return fntype_abi (type);
+  gcc_assert (POINTER_TYPE_P (type));
+  return fntype_abi (TREE_TYPE (type));
 }

Reply via email to