[gcc r14-6674] treat argp-based mem as frame related in dse

Jiu Fu Guo guojiufu@gcc.gnu.org
Tue Dec 19 05:18:53 GMT 2023


https://gcc.gnu.org/g:4759383245ac97a5c83c0272f0a831f2a26ea5c1

commit r14-6674-g4759383245ac97a5c83c0272f0a831f2a26ea5c1
Author: Jiufu Guo <guojiufu@linux.ibm.com>
Date:   Tue Dec 19 13:03:06 2023 +0800

    treat argp-based mem as frame related in dse
    
    The issue mentioned in PR112525 would be able to be handled by
    updating dse.cc to treat arg_pointer_rtx similarly with frame_pointer_rtx.
    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=30271#c10 also mentioned
    this idea.
    
    And arpg area may be used to pass argument to callee. So, it would
    be needed to check if call insns are using that mem.
    
            PR rtl-optimization/112525
            PR target/30271
    
    gcc/ChangeLog:
    
            * dse.cc (get_group_info): Add arg_pointer_rtx as frame_related.
            (check_mem_read_rtx): Add parameter to indicate if it is checking mem
            for call insn.
            (scan_insn): Add mem checking on call usage.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/powerpc/pr112525.c: New test.
            * gcc.target/powerpc/pr30271.c: New test.

Diff:
---
 gcc/dse.cc                                  | 17 +++++++++++++----
 gcc/testsuite/gcc.target/powerpc/pr112525.c | 15 +++++++++++++++
 gcc/testsuite/gcc.target/powerpc/pr30271.c  | 15 +++++++++++++++
 3 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/gcc/dse.cc b/gcc/dse.cc
index 40c4c29d07e..b98b47fff60 100644
--- a/gcc/dse.cc
+++ b/gcc/dse.cc
@@ -682,7 +682,8 @@ get_group_info (rtx base)
       gi->group_kill = BITMAP_ALLOC (&dse_bitmap_obstack);
       gi->process_globally = false;
       gi->frame_related =
-	(base == frame_pointer_rtx) || (base == hard_frame_pointer_rtx);
+	(base == frame_pointer_rtx) || (base == hard_frame_pointer_rtx)
+	|| (base == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM]);
       gi->offset_map_size_n = 0;
       gi->offset_map_size_p = 0;
       gi->offset_map_n = NULL;
@@ -2164,7 +2165,7 @@ replace_read (store_info *store_info, insn_info_t store_insn,
    be active.  */
 
 static void
-check_mem_read_rtx (rtx *loc, bb_info_t bb_info)
+check_mem_read_rtx (rtx *loc, bb_info_t bb_info, bool used_in_call = false)
 {
   rtx mem = *loc, mem_addr;
   insn_info_t insn_info;
@@ -2309,7 +2310,8 @@ check_mem_read_rtx (rtx *loc, bb_info_t bb_info)
 		 stored, rewrite the read.  */
 	      else
 		{
-		  if (store_info->rhs
+		  if (!used_in_call
+		      && store_info->rhs
 		      && known_subrange_p (offset, width, store_info->offset,
 					   store_info->width)
 		      && all_positions_needed_p (store_info,
@@ -2375,7 +2377,8 @@ check_mem_read_rtx (rtx *loc, bb_info_t bb_info)
 
 	  /* If this read is just reading back something that we just
 	     stored, rewrite the read.  */
-	  if (store_info->rhs
+	  if (!used_in_call
+	      && store_info->rhs
 	      && store_info->group_id == -1
 	      && store_info->cse_base == base
 	      && known_subrange_p (offset, width, store_info->offset,
@@ -2657,6 +2660,12 @@ scan_insn (bb_info_t bb_info, rtx_insn *insn, int max_active_local_stores)
            that is not relative to the frame.  */
         add_non_frame_wild_read (bb_info);
 
+      for (rtx link = CALL_INSN_FUNCTION_USAGE (insn);
+	   link != NULL_RTX;
+	   link = XEXP (link, 1))
+	if (GET_CODE (XEXP (link, 0)) == USE && MEM_P (XEXP (XEXP (link, 0),0)))
+	  check_mem_read_rtx (&XEXP (XEXP (link, 0),0), bb_info, true);
+
       return;
     }
 
diff --git a/gcc/testsuite/gcc.target/powerpc/pr112525.c b/gcc/testsuite/gcc.target/powerpc/pr112525.c
new file mode 100644
index 00000000000..428598188e7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr112525.c
@@ -0,0 +1,15 @@
+/* { dg-do compile { target lp64 } } */
+/* { dg-options "-O2" } */
+
+typedef struct teststruct
+{
+  double d;
+  int arr[15]; 
+} teststruct;
+
+void
+foo (teststruct p)
+{
+}
+
+/* { dg-final { scan-assembler-not {\mstd\M} } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/pr30271.c b/gcc/testsuite/gcc.target/powerpc/pr30271.c
new file mode 100644
index 00000000000..bddef039798
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr30271.c
@@ -0,0 +1,15 @@
+/* { dg-do compile { target lp64 } } */
+/* { dg-options "-O3 -mstrict-align" } */
+
+struct SS
+{
+  int t, t1;
+};
+
+int
+f (struct SS b)
+{
+  return b.t + b.t1;
+}
+
+/* { dg-final { scan-assembler-not {\mstd\M} } } */


More information about the Gcc-cvs mailing list