"H.J. Lu" <hjl.to...@gmail.com> writes:
> On Mon, Jun 2, 2025 at 4:07 PM Richard Sandiford
> <richard.sandif...@arm.com> wrote:
>>
>> "H.J. Lu" <hjl.to...@gmail.com> writes:
>> > Since not all CALL instructions in RTL passes have a REG_CALL_DECL note,
>> > update get_call_fndecl to also check function symbol for function
>> > declaration so that it can be used on CALL instructions like
>> >
>> > (call_insn 39 38 61 7 (set (reg:SI 0 ax)
>> >         (call (mem:QI (symbol_ref:DI ("foo") [flags 0x3]
>> > <function_decl 0x7fffe96da900 foo>) [0 foo S1 A8])
>> >             (const_int 0 [0]))) "pr92080-15.c":24:9 1480 {*call_value}
>> >      (expr_list:REG_DEAD (reg:SI 5 di)
>> >         (expr_list:REG_DEAD (reg:SI 4 si)
>> >             (expr_list:REG_EH_REGION (const_int 0 [0])
>> >                 (nil))))
>> >     (expr_list:SI (use (reg:SI 5 di))
>> >         (expr_list:SI (use (reg:SI 4 si))
>> >             (nil))))
>> >
>> > PR other/120494
>> > * rtlanal.cc (get_call_fndecl): Also check function symbol to
>> > get function declaration.
>>
>> What's your use case for this?  I think we should instead move to making
>> the notes more generally available, since looking at the call rtx won't
>> work for targets that need indirect calls (e.g. for -mlong-calls).
>
> I am working on a pass which needs to check if CALL insn is a recursive call.

I assume false negatives are allowed?  That is, "false" means "might be
recursive, might not"?

> Currently I have
>
> * Get the declaration of the function called by INSN.  If INDIRECT_P
>    is true, also get indirect declaration.  */
>
> static tree
> get_call_fndecl_from_rtx (const rtx_insn *insn, bool indirect_p = false)
> {
>   rtx note = find_reg_note (insn, REG_CALL_DECL, NULL_RTX);
>   if (note)
>     {
>       rtx datum = XEXP (note, 0);
>       if (datum)
>         return SYMBOL_REF_DECL (datum);
>     }
>   rtx call = get_call_rtx_from (insn);
>   rtx fnaddr = XEXP (call, 0);
>   rtx addr = XEXP (fnaddr, 0);
>   if (GET_CODE (addr) == SYMBOL_REF)
>     {
>       tree fndecl = SYMBOL_REF_DECL (addr);
>       if (fndecl && TREE_CODE (fndecl) == FUNCTION_DECL)
>         return fndecl;
>     }
>   return indirect_p ? MEM_EXPR (fnaddr) : nullptr;
> }
>
>           if (CALL_P (insn))
>             {
>               tree fndecl = get_call_fndecl_from_rtx (insn);
>               if (fndecl == current_function_decl
>                   && decl_binds_to_current_def_p (fndecl))
>                 {
>                   recursive_call_p = true;
>                   break;
>                 }
>             }
>
> If get_call_fndecl works without a REG_CALL_DECL note, I can use it
> instead of writing my own.

I think we should consider removing the flag_ipa_ra guards around
the code that adds REG_CALL_DECLs.

Thanks,
Richard

Reply via email to