[v2,2/2] RISC-V: Optimize RVV epilogue logic.

Message ID 20221115083358.4130952-3-jiawei@iscas.ac.cn
State Accepted
Headers
Series RISC-V: Optimize RVV epilogue logic. |

Checks

Context Check Description
snail/gcc-patch-check success Github commit url

Commit Message

Jiawei Nov. 15, 2022, 8:33 a.m. UTC
  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(-)
  

Patch

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)
     {