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