"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).

Thanks,
Richard

>
> -- 
> H.J.
>
> From 6e20aad0c0b02c688f93ebc20b160f31c23adc82 Mon Sep 17 00:00:00 2001
> From: "H.J. Lu" <hjl.to...@gmail.com>
> Date: Sat, 31 May 2025 08:42:21 +0800
> Subject: [PATCH] Also check function symbol for function declaration
>
> 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.
>
> Signed-off-by: H.J. Lu <hjl.to...@gmail.com>
> ---
>  gcc/rtlanal.cc | 31 +++++++++++++++++++++----------
>  1 file changed, 21 insertions(+), 10 deletions(-)
>
> diff --git a/gcc/rtlanal.cc b/gcc/rtlanal.cc
> index 900f53e252a..b0983f8ebfc 100644
> --- a/gcc/rtlanal.cc
> +++ b/gcc/rtlanal.cc
> @@ -833,17 +833,28 @@ get_call_rtx_from (const rtx_insn *insn)
>  tree
>  get_call_fndecl (const rtx_insn *insn)
>  {
> -  rtx note, datum;
> -
> +  rtx note;
>    note = find_reg_note (insn, REG_CALL_DECL, NULL_RTX);
> -  if (note == NULL_RTX)
> -    return NULL_TREE;
> -
> -  datum = XEXP (note, 0);
> -  if (datum != NULL_RTX)
> -    return SYMBOL_REF_DECL (datum);
> -
> -  return NULL_TREE;
> +  if (note)
> +    {
> +      rtx datum = XEXP (note, 0);
> +      if (datum)
> +     return SYMBOL_REF_DECL (datum);
> +    }
> +  rtx call = get_call_rtx_from (insn);
> +  rtx addr = XEXP (call, 0);
> +  tree fndecl = nullptr;
> +  if (MEM_P (addr))
> +    {
> +      addr = XEXP (addr, 0);
> +      if (GET_CODE (addr) == SYMBOL_REF)
> +     {
> +       tree decl = SYMBOL_REF_DECL (addr);
> +       if (decl && TREE_CODE (decl) == FUNCTION_DECL)
> +         fndecl = decl;
> +     }
> +    }
> +  return fndecl;
>  }
>  
>  /* Return the value of the integer term in X, if one is apparent;

Reply via email to