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.
