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

Reply via email to