| Submitter | Roland McGrath |
|---|---|
| Date | June 14, 2012, 5:16 p.m. |
| Message ID | <x57jboklg6f9.fsf@frobland.mtv.corp.google.com> |
| Download | mbox | patch |
| Permalink | /patch/164974/ |
| State | New |
| Headers | show |
Comments
On Jun 14, 2012, at 10:16 AM, Roland McGrath wrote: > But if e.g. I use -ffixed-r9 then I think it's a reasonable expectation > that no code is generated that touches r9 in any way, shape, or form. Also, I can't help but wonder if global_regs is respected. In theory, people are allowed to declare global registers, and nothing should be stopping them, though, this is abi breaking, and one does need to recompile the world as I recall to use it, so, most people don't use it and can't use it, but the bare metal people can. Your change looks good to me. I'll note in passing that cse.c does: /* Determine whether register number N is considered a fixed register for the purpose of approximating register costs. It is desirable to replace other regs with fixed regs, to reduce need for non-fixed hard regs. A reg wins if it is either the frame pointer or designated as fixed. */ #define FIXED_REGNO_P(N) \ ((N) == FRAME_POINTER_REGNUM || (N) == HARD_FRAME_POINTER_REGNUM \ || fixed_regs[N] || global_regs[N])
On Thu, Jun 14, 2012 at 1:13 PM, Mike Stump <mikestump@comcast.net> wrote: > On Jun 14, 2012, at 10:16 AM, Roland McGrath wrote: >> But if e.g. I use -ffixed-r9 then I think it's a reasonable expectation >> that no code is generated that touches r9 in any way, shape, or form. > > Also, I can't help but wonder if global_regs is respected. It's clearly not. Making the added condition !fixed_regs[i] && !global_regs[i] seems sensible to me. Thanks, Roland
Roland McGrath <mcgrathr@google.com> writes: > On Thu, Jun 14, 2012 at 1:13 PM, Mike Stump <mikestump@comcast.net> wrote: >> On Jun 14, 2012, at 10:16 AM, Roland McGrath wrote: >>> But if e.g. I use -ffixed-r9 then I think it's a reasonable expectation >>> that no code is generated that touches r9 in any way, shape, or form. >> >> Also, I can't help but wonder if global_regs is respected. > > It's clearly not. Making the added condition !fixed_regs[i] && > !global_regs[i] seems sensible to me. All global registers have to be fixed though. The original seemed fine to me FWIW. Richard
On 16/06/12 13:42, Richard Sandiford wrote: > Roland McGrath <mcgrathr@google.com> writes: >> On Thu, Jun 14, 2012 at 1:13 PM, Mike Stump <mikestump@comcast.net> wrote: >>> On Jun 14, 2012, at 10:16 AM, Roland McGrath wrote: >>>> But if e.g. I use -ffixed-r9 then I think it's a reasonable expectation >>>> that no code is generated that touches r9 in any way, shape, or form. >>> >>> Also, I can't help but wonder if global_regs is respected. >> >> It's clearly not. Making the added condition !fixed_regs[i] && >> !global_regs[i] seems sensible to me. > > All global registers have to be fixed though. The original seemed > fine to me FWIW. > > Richard > Indeed, see globalize_reg() in reginfo.c. R.
OK then. If you like the original patch, would you like to commit it for me? Thanks, Roland
On Mon, Jun 18, 2012 at 9:34 AM, Roland McGrath <mcgrathr@google.com> wrote:
> OK then. If you like the original patch, would you like to commit it for me?
ping?
Patch
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 092e202..bcfef3e 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -16752,7 +16752,12 @@ arm_get_frame_offsets (void) else for (i = 4; i <= (TARGET_THUMB1 ? LAST_LO_REGNUM : 11); i++) { - if ((offsets->saved_regs_mask & (1 << i)) == 0) + /* While the gratuitous register save/restore is ordinarily + harmless, if a register is marked as fixed it may be + entirely forbidden by the system ABI to touch it, so we + should avoid those registers. */ + if (!fixed_regs[i] + && (offsets->saved_regs_mask & (1 << i)) == 0) { reg = i; break;