We were marking more than necessary in aarch64_set_frame_expr. Fold the reduced function into aarch64_expand_prologue as necessary.
* config/aarch64/aarch64.c (aarch64_set_frame_expr): Remove. (aarch64_expand_prologue): Use REG_CFA_ADJUST_CFA directly, or no special markup at all. --- gcc/config/aarch64/aarch64.c | 56 ++++++++++++-------------------------------- 1 file changed, 15 insertions(+), 41 deletions(-) diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 9a11e05..dcca446 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -1918,22 +1918,6 @@ aarch64_layout_frame (void) cfun->machine->frame.laid_out = true; } -/* Make the last instruction frame-related and note that it performs - the operation described by FRAME_PATTERN. */ - -static void -aarch64_set_frame_expr (rtx frame_pattern) -{ - rtx insn; - - insn = get_last_insn (); - RTX_FRAME_RELATED_P (insn) = 1; - RTX_FRAME_RELATED_P (frame_pattern) = 1; - REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR, - frame_pattern, - REG_NOTES (insn)); -} - static bool aarch64_register_saved_on_entry (int regno) { @@ -2243,29 +2227,29 @@ aarch64_expand_prologue (void) { rtx op0 = gen_rtx_REG (Pmode, IP0_REGNUM); emit_move_insn (op0, GEN_INT (-frame_size)); - emit_insn (gen_add2_insn (stack_pointer_rtx, op0)); - aarch64_set_frame_expr (gen_rtx_SET - (Pmode, stack_pointer_rtx, - plus_constant (Pmode, - stack_pointer_rtx, - -frame_size))); + insn = emit_insn (gen_add2_insn (stack_pointer_rtx, op0)); + + add_reg_note (insn, REG_CFA_ADJUST_CFA, + gen_rtx_SET (VOIDmode, stack_pointer_rtx, + plus_constant (Pmode, stack_pointer_rtx, + -frame_size))); + RTX_FRAME_RELATED_P (insn) = 1; } else if (frame_size > 0) { - if ((frame_size & 0xfff) != frame_size) + int hi_ofs = frame_size & 0xfff000; + int lo_ofs = frame_size & 0x000fff; + + if (hi_ofs) { insn = emit_insn (gen_add2_insn - (stack_pointer_rtx, - GEN_INT (-(frame_size - & ~(HOST_WIDE_INT)0xfff)))); + (stack_pointer_rtx, GEN_INT (-hi_ofs))); RTX_FRAME_RELATED_P (insn) = 1; } - if ((frame_size & 0xfff) != 0) + if (lo_ofs) { insn = emit_insn (gen_add2_insn - (stack_pointer_rtx, - GEN_INT (-(frame_size - & (HOST_WIDE_INT)0xfff)))); + (stack_pointer_rtx, GEN_INT (-lo_ofs))); RTX_FRAME_RELATED_P (insn) = 1; } } @@ -2286,10 +2270,6 @@ aarch64_expand_prologue (void) insn = emit_insn (gen_add2_insn (stack_pointer_rtx, GEN_INT (-offset))); RTX_FRAME_RELATED_P (insn) = 1; - aarch64_set_frame_expr (gen_rtx_SET - (Pmode, stack_pointer_rtx, - gen_rtx_MINUS (Pmode, stack_pointer_rtx, - GEN_INT (offset)))); aarch64_save_callee_saves (DImode, fp_offset, R29_REGNUM, R30_REGNUM, false); @@ -2302,14 +2282,8 @@ aarch64_expand_prologue (void) insn = emit_insn (gen_add3_insn (hard_frame_pointer_rtx, stack_pointer_rtx, GEN_INT (fp_offset))); - aarch64_set_frame_expr (gen_rtx_SET - (Pmode, hard_frame_pointer_rtx, - plus_constant (Pmode, - stack_pointer_rtx, - fp_offset))); RTX_FRAME_RELATED_P (insn) = 1; - insn = emit_insn (gen_stack_tie (stack_pointer_rtx, - hard_frame_pointer_rtx)); + emit_insn (gen_stack_tie (stack_pointer_rtx, hard_frame_pointer_rtx)); } else { -- 1.8.3.1