https://gcc.gnu.org/g:106d603005c774ad619103bae3b653c94b80bf9c
commit 106d603005c774ad619103bae3b653c94b80bf9c Author: Vineet Gupta <vine...@rivosinc.com> Date: Wed Mar 6 15:44:27 2024 -0800 RISC-V: avoid LUI based const mat in alloca epilogue expansion This is continuing on the prev patch in function epilogue expansion. Broken out of easy of review. gcc/ChangeLog: * config/riscv/riscv.cc (riscv_expand_epilogue): Handle offset being sum of two S12. Tested-by: Patrick O'Neill <patr...@rivosinc.com> # pre-commit-CI #1569 Signed-off-by: Vineet Gupta <vine...@rivosinc.com> (cherry picked from commit 9926c40a902edbc665919d508ef0c36f362f9c41) Diff: --- gcc/config/riscv/riscv.cc | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 2ecbcf1d0af..85df5b7ab49 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -8111,7 +8111,10 @@ riscv_expand_epilogue (int style) need_barrier_p = false; poly_int64 adjust_offset = -frame->hard_frame_pointer_offset; + rtx dwarf_adj = gen_int_mode (adjust_offset, Pmode); rtx adjust = NULL_RTX; + bool sum_of_two_s12 = false; + HOST_WIDE_INT one, two; if (!adjust_offset.is_constant ()) { @@ -8123,14 +8126,23 @@ riscv_expand_epilogue (int style) } else { - if (!SMALL_OPERAND (adjust_offset.to_constant ())) + HOST_WIDE_INT adj_off_value = adjust_offset.to_constant (); + if (SMALL_OPERAND (adj_off_value)) + { + adjust = GEN_INT (adj_off_value); + } + else if (SUM_OF_TWO_S12_ALGN (adj_off_value)) + { + riscv_split_sum_of_two_s12 (adj_off_value, &one, &two); + dwarf_adj = adjust = GEN_INT (one); + sum_of_two_s12 = true; + } + else { riscv_emit_move (RISCV_PROLOGUE_TEMP (Pmode), - GEN_INT (adjust_offset.to_constant ())); + GEN_INT (adj_off_value)); adjust = RISCV_PROLOGUE_TEMP (Pmode); } - else - adjust = GEN_INT (adjust_offset.to_constant ()); } insn = emit_insn ( @@ -8138,14 +8150,21 @@ riscv_expand_epilogue (int style) adjust)); rtx dwarf = NULL_RTX; - rtx cfa_adjust_value = gen_rtx_PLUS ( - Pmode, hard_frame_pointer_rtx, - gen_int_mode (-frame->hard_frame_pointer_offset, Pmode)); + rtx cfa_adjust_value = gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, + dwarf_adj); rtx cfa_adjust_rtx = gen_rtx_SET (stack_pointer_rtx, cfa_adjust_value); dwarf = alloc_reg_note (REG_CFA_ADJUST_CFA, cfa_adjust_rtx, dwarf); + RTX_FRAME_RELATED_P (insn) = 1; REG_NOTES (insn) = dwarf; + + if (sum_of_two_s12) + { + insn = emit_insn (gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx, + GEN_INT (two))); + RTX_FRAME_RELATED_P (insn) = 1; + } } if (use_restore_libcall || use_multi_pop)