Sometimes "step1 -= scalable_frame" will cause adjust equal to
zero. And it will generate additional redundant instruction 
"addi sp,sp,0". Add checking segement to skip that case.

gcc/ChangeLog:

        * config/riscv/riscv.cc (riscv_expand_epilogue): 
                                                New check segement.

---
 gcc/config/riscv/riscv.cc | 35 +++++++++++++++++++----------------
 1 file changed, 19 insertions(+), 16 deletions(-)

diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 02a01ca0b7c..433b9b13eb6 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -5185,25 +5185,28 @@ riscv_expand_epilogue (int style)
          step1 -= scalable_frame;
        }
 
-      /* Get an rtx for STEP1 that we can add to BASE.  */
-      rtx adjust = GEN_INT (step1.to_constant ());
-      if (!SMALL_OPERAND (step1.to_constant ()))
-       {
-         riscv_emit_move (RISCV_PROLOGUE_TEMP (Pmode), adjust);
-         adjust = RISCV_PROLOGUE_TEMP (Pmode);
-       }
-
-      insn = emit_insn (
-              gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx, adjust));
-
-      rtx dwarf = NULL_RTX;
-      rtx cfa_adjust_rtx = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
+      /* Get an rtx for STEP1 that we can add to BASE.  
+         Skip if adjust equal to zero.  */
+      if (step1.to_constant () != 0)
+      {
+        rtx adjust = GEN_INT (step1.to_constant ());
+        if (!SMALL_OPERAND (step1.to_constant ()))
+        {
+          riscv_emit_move (RISCV_PROLOGUE_TEMP (Pmode), adjust);
+          adjust = RISCV_PROLOGUE_TEMP (Pmode);
+        }
+
+        insn = emit_insn (
+               gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx, adjust));
+        rtx dwarf = NULL_RTX;
+        rtx cfa_adjust_rtx = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
                                         GEN_INT (step2));
 
-      dwarf = alloc_reg_note (REG_CFA_DEF_CFA, cfa_adjust_rtx, dwarf);
-      RTX_FRAME_RELATED_P (insn) = 1;
+        dwarf = alloc_reg_note (REG_CFA_DEF_CFA, cfa_adjust_rtx, dwarf);
+        RTX_FRAME_RELATED_P (insn) = 1;
 
-      REG_NOTES (insn) = dwarf;
+        REG_NOTES (insn) = dwarf;
+     }
     }
   else if (frame_pointer_needed)
     {
-- 
2.25.1

Reply via email to