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. -- 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; -- 2.49.0