Richard, here is the patch against the current trunk, as I promised
last week in Prague.  Please apply.


Thanks,
Roland


gcc/
2012-07-17  Roland McGrath  <mcgra...@google.com>

        * config/arm/arm.c (arm_get_frame_offsets): Never use a fixed register
        as the extra register to save/restore for stack-alignment padding.

diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index e2f625c..189f71e 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -16121,7 +16121,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 or global 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;

Reply via email to