On Fri, Apr 25, 2025 at 09:12:45PM -0700, Andrew Pinski wrote:
> --- a/gcc/tree-tailcall.cc
> +++ b/gcc/tree-tailcall.cc
> @@ -1083,57 +1083,74 @@ find_tail_calls (basic_block bb, struct tailcall 
> **ret, bool only_musttail,
>      {
>        bool ok = false;
>        value_range val;
> -      tree valr;
> -      /* If IPA-VRP proves called function always returns a singleton range,
> -      the return value is replaced by the only value in that range.
> -      For tail call purposes, pretend such replacement didn't happen.  */
>        if (ass_var == NULL_TREE && !tail_recursion)
> -     if (tree type = gimple_range_type (call))
> -       if (tree callee = gimple_call_fndecl (call))
> -         if ((INTEGRAL_TYPE_P (type)
> -              || SCALAR_FLOAT_TYPE_P (type)
> -              || POINTER_TYPE_P (type))
> -             && useless_type_conversion_p (TREE_TYPE (TREE_TYPE (callee)),
> -                                           type)
> -             && useless_type_conversion_p (TREE_TYPE (ret_var), type)
> -             && ipa_return_value_range (val, callee)
> -             && val.singleton_p (&valr))
> +     {
> +       tree other_value = NULL_TREE;
> +       /* If we have a function call that we know the return value is the 
> same
> +          as the argument, try the argument too. */
> +       int flags = gimple_call_return_flags (call);
> +       if ((flags & ERF_RETURNS_ARG) != 0
> +           && (flags & ERF_RETURN_ARG_MASK) < gimple_call_num_args (call))
> +         {
> +           tree arg = gimple_call_arg (call, flags & ERF_RETURN_ARG_MASK);
> +           if (useless_type_conversion_p (TREE_TYPE (arg), TREE_TYPE 
> (ret_var)))

This should have the arguments swapped, i.e.
              if (useless_type_conversion_p (TREE_TYPE (ret_var), TREE_TYPE 
(arg)))
because we want to check if the type of arg is uselessly convertible to the
ret_var type (i.e. the return type).

Otherwise LGTM.

        Jakub

Reply via email to