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

--- Comment #10 from Richard Sandiford <rsandifo at gcc dot gnu.org> ---
(In reply to H.J. Lu from comment #9)
> (In reply to Richard Sandiford from comment #8)
> > Yeah, that seems like the right thing to do.  But it means that:
> > 
> > (a) The reinit_regs calls shouldn't be needed any more.
> 
> How do we allow target attribute on a function to enable additional
> registers or disable some registers in a function without calling
> reinit_regs?
I meant that calling reinit_regs isn't necessary for changes in
call_saved_registers_type.  I agree that a change is still needed if you're
fixing and unfixing registers.  (I should have been clearer, sorry.)

But a change to the set of available registers is effectively a change to the
current target.  So rather than call reinit_regs directly, it would be better
to make ix86_set_current_function switch targets.  [More below]

> > (b) This part of ix86_conditional_register_usage:
> > 
> >   /* If there are no caller-saved registers, preserve all registers.
> >      except fixed_regs and registers used for function return value
> >      since aggregate_value_p checks call_used_regs[regno] on return
> >      value.  */
> >   if (cfun
> >       && (cfun->machine->call_saved_registers
> >       == TYPE_NO_CALLER_SAVED_REGISTERS))
> >     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
> >       if (!fixed_regs[i] && !ix86_function_value_regno_p (i))
> >     call_used_regs[i] = 0;
> > 
> >     should be removed, and should instead be reflected in the
> >     function_abi entry.
> > 
> > These days, as far as target-independent code is concerned, call_used_regs
> > just exists as a way for the target to communicate the *default* call-used
> > set to init_regs_1, for initialising the default ABI.  Other
> > target-independent code does not use call_used_regs & co.  Instead it
> > queries the function_abi structures.
> > 
> > Thus call_used_regs is not expected to (and should not) change based on the
> > current function's ABI.  It should always describe the default ABI.  Any
> > variations from the default ABI should be described in the function_abi
> > instead.
> 
> If I understand it correctly, call_used_regs only describes registers
> clobbered
> by callee and it shouldn't be used for anything else.
Yeah.  Specifically by callees that use the default ABI.

> If a target attribute
> enables additional registers in a function, shouldn't callee's call_used_regs
> in such a function be different, i.e., clobber more registers?  Also a target
> attribute may reduce number of registers in a function, like GPRs only.  How
> does call_used_regs work in these cases?
I suppose it depends on why the register is fixed.  Some targets have
special-purpose fixed registers that are call-preserved rather than call-used. 
And some targets have fixed registers that are effectively global (like the FP
rounding mode).  But if a register isn't being used at all (like SIMD registers
when only GPRs are enabled), then the normal approach is to treat the register
as call-used.

The function_abi definitions are a property of the current target, rather than
global.  So if ix86_set_current_function treated "GPR only" as a separate
target, that target would also get its own set of specialised function_abis. 
Setting up the target would indirectly call ix86_conditional_register_usage.

If we did that, the "GPR only" version of the no_caller_saved_registers ABI
would preserve only GPRs, while the "normal" version of the
no_caller_saved_registers ABI would preserve SIMD registers.  But like I say,
it would all happen "naturally" through ix86_set_current_target changing
target.

Reply via email to