]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
aarch64: Avoid a use of callee_offset
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 12 Sep 2023 15:05:04 +0000 (16:05 +0100)
committerRichard Sandiford <richard.sandiford@arm.com>
Tue, 12 Sep 2023 15:05:04 +0000 (16:05 +0100)
When we emit the frame chain, i.e. when we reach Here in this statement
of aarch64_expand_prologue:

  if (emit_frame_chain)
    {
      // Here
      ...
    }

the stack is in one of two states:

- We've allocated up to the frame chain, but no more.

- We've allocated the whole frame, and the frame chain is within easy
  reach of the new SP.

The offset of the frame chain from the current SP is available
in aarch64_frame as callee_offset.  It is also available as the
chain_offset local variable, where the latter is calculated from other
data.  (However, chain_offset is not always equal to callee_offset when
!emit_frame_chain, so chain_offset isn't redundant.)

In c600df9a4060da3c6121ff4d0b93f179eafd69d1 I switched to using
chain_offset for the initialisation of the hard frame pointer:

       aarch64_add_offset (Pmode, hard_frame_pointer_rtx,
-                         stack_pointer_rtx, callee_offset,
+                         stack_pointer_rtx, chain_offset,
                          tmp1_rtx, tmp0_rtx, frame_pointer_needed);

But the later REG_CFA_ADJUST_CFA handling still used callee_offset.

I think the difference is harmless, but it's more logical for the
CFA note to be in sync, and it's more convenient for later patches
if it uses chain_offset.

gcc/
* config/aarch64/aarch64.cc (aarch64_expand_prologue): Use
chain_offset rather than callee_offset.

gcc/config/aarch64/aarch64.cc

index b91f77d7b1f007ea611ee761c058b68eb8c72758..9fb9462369361728916e55d14f84678d4d8eabf2 100644 (file)
@@ -10034,7 +10034,6 @@ aarch64_expand_prologue (void)
   poly_int64 initial_adjust = frame.initial_adjust;
   HOST_WIDE_INT callee_adjust = frame.callee_adjust;
   poly_int64 final_adjust = frame.final_adjust;
-  poly_int64 callee_offset = frame.callee_offset;
   poly_int64 sve_callee_adjust = frame.sve_callee_adjust;
   poly_int64 below_hard_fp_saved_regs_size
     = frame.below_hard_fp_saved_regs_size;
@@ -10147,8 +10146,7 @@ aarch64_expand_prologue (void)
             implicit.  */
          if (!find_reg_note (insn, REG_CFA_ADJUST_CFA, NULL_RTX))
            {
-             rtx src = plus_constant (Pmode, stack_pointer_rtx,
-                                      callee_offset);
+             rtx src = plus_constant (Pmode, stack_pointer_rtx, chain_offset);
              add_reg_note (insn, REG_CFA_ADJUST_CFA,
                            gen_rtx_SET (hard_frame_pointer_rtx, src));
            }