Hi!

What is the reason for these notes?
I mean, for indirect calls usually the argument is NULL, so at least for
that case I'd say
(expr_list:REG_CALL_DECL (nil)
is just a waste of RTL memory, because nothing will really make use of it:
static tree
get_call_fndecl (rtx_insn *insn)
{
  rtx note, datum;

  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;
}

will return the same thing whether ther is REG_CALL_DECL (nil) or no note at
all.
But even for normal calls, on most targets the decl is often embedded
already somewhere else in the call instruction:
(call_insn 6 5 7 2 (call (mem:QI (symbol_ref:DI ("exit") [flags 0x41] 
<function_decl 0x7fc30b495e58 __builtin_exit>) [0 __builtin_exit S1 A8])
        (const_int 0 [0])) mnau.c:1 -1
     (expr_list:REG_CALL_DECL (symbol_ref:DI ("exit") [flags 0x41] 
<function_decl 0x7fc30b495e58 __builtin_exit>)
So, why doesn't say get_call_fndecl use REG_CALL_DECL if present, otherwise
if flag_ipa_ra look up the CALL rtx in the instruction and look up the 
symbol_ref in its
MEM?
Then, what call.c could do is instead of:
          last = last_call_insn ();
          add_reg_note (last, REG_CALL_DECL, datum);
first call get_call_fndecl (last) and if that returns datum, don't add any
note.

        Jakub

Reply via email to