https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118103

--- Comment #9 from Li Pan <pan2.li at intel dot com> ---
(In reply to Richard Sandiford from comment #7)
> The problem seems to be in the modelling of the FRM register. 
> CALL_USED_REGISTERS says that the register is call-clobbered/caller-save,
> which means:
> 
> (a) it is not treated as live on entry to the function
> (b) all calls are assumed to clobber the contents
> 
> So in:
> 
> ;;  entry block defs     1 [ra] 2 [sp] 10 [a0] 11 [a1] 12 [a2] 13 [a3] 14
> [a4] 15 [a5] 16 [a6] 17 [a7] 42 [fa0] 43 [fa1] 44 [fa2] 45 [fa3] 46 [fa4] 47
> [fa5] 48 [fa6] 49 [fa7]
> …
> (note 63 1 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK)
> (note 2 63 10 2 NOTE_INSN_FUNCTION_BEG)
> (call_insn 10 2 68 2 (parallel [
>             (call (mem:SI (symbol_ref:DI ("initialize") [flags 0x3] 
> <function_decl … initialize>) [0 initialize S4 A32])
>                 (const_int 0 [0]))
>             (use (unspec:SI [
>                         (const_int 0 [0])
>                     ] UNSPEC_CALLEE_CC))
>             (clobber (reg:SI 1 ra))
>         ]) "/tmp/a.c":30:3 456 {call_internal}
>      (expr_list:REG_CALL_DECL (symbol_ref:DI ("initialize") [flags 0x3] 
> <function_decl … initialize>)
>         (expr_list:REG_EH_REGION (const_int 0 [0])
>             (nil)))
>     (nil))
> (insn 68 10 3 2 (set (reg:SI 10 a0 [165])
>         (reg:SI 69 frm)) "/tmp/a.c":18:36 2725 {frrmsi}
>      (nil))
> 
> the FRM on entry to insn 68 is in a sense doubly undefined: it wasn't
> defined on entry, and any value that it did have is in any case clobbered by
> the call.
> 
> If FRM is in fact a call-preserved/callee-save register, that should be
> described using CALL_REALLY_USED_REGISTERS.  If instead FRM is a
> cooperatively-managed global register, global_regs[FRM_REGNUM] should be set
> to true.

Thanks Richard, I think it is cooperatively-managed global register. Let me
double check where should I set this.

Reply via email to