public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH 0/2] resolve confilct between zcmp multi push/pop and shrink-wrap-separate
@ 2023-08-31  6:24 Fei Gao
  2023-08-31  6:24 ` [PATCH 1/2] allow targets to check shrink-wrap-separate enabled or not Fei Gao
  2023-08-31  6:24 ` [PATCH 2/2] [RISC-V] Enalble zcmp for -Os Fei Gao
  0 siblings, 2 replies; 11+ messages in thread
From: Fei Gao @ 2023-08-31  6:24 UTC (permalink / raw)
  To: gcc-patches; +Cc: kito.cheng, palmer, jeffreyalaw, sinan.lin, jiawei, Fei Gao

Enalble zcmp for -Os and shrink-warp-separate for
the speed perfered optimization by default.

Fei Gao (2):
  allow targets to check shrink-wrap-separate enabled or not
  [RISC-V] Enalble zcmp for -Os

 gcc/config/riscv/riscv.cc                     | 21 ++++-
 gcc/shrink-wrap.cc                            | 22 +++--
 gcc/shrink-wrap.h                             |  1 +
 gcc/testsuite/gcc.target/riscv/rv32e_zcmp.c   |  2 +-
 gcc/testsuite/gcc.target/riscv/rv32i_zcmp.c   |  2 +-
 .../gcc.target/riscv/zcmp_push_fpr.c          |  2 +-
 .../riscv/zcmp_shrink_wrap_separate.c         | 93 +++++++++++++++++++
 .../riscv/zcmp_shrink_wrap_separate2.c        | 93 +++++++++++++++++++
 .../gcc.target/riscv/zcmp_stack_alignment.c   |  2 +-
 9 files changed, 223 insertions(+), 15 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/riscv/zcmp_shrink_wrap_separate.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/zcmp_shrink_wrap_separate2.c

-- 
2.17.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/2] allow targets to check shrink-wrap-separate enabled or not
  2023-08-31  6:24 [PATCH 0/2] resolve confilct between zcmp multi push/pop and shrink-wrap-separate Fei Gao
@ 2023-08-31  6:24 ` Fei Gao
  2023-08-31  6:24 ` [PATCH 2/2] [RISC-V] Enalble zcmp for -Os Fei Gao
  1 sibling, 0 replies; 11+ messages in thread
From: Fei Gao @ 2023-08-31  6:24 UTC (permalink / raw)
  To: gcc-patches; +Cc: kito.cheng, palmer, jeffreyalaw, sinan.lin, jiawei, Fei Gao

No functional changes but restructure and expose use_shrink_wrapping_separate
to the TARGETs.

gcc/ChangeLog:

        * shrink-wrap.cc (try_shrink_wrapping_separate):call
          use_shrink_wrapping_separate.
        (use_shrink_wrapping_separate): wrap the condition
          check in use_shrink_wrapping_separate.
        * shrink-wrap.h (use_shrink_wrapping_separate): add to extern
---
 gcc/shrink-wrap.cc | 22 +++++++++++++++-------
 gcc/shrink-wrap.h  |  1 +
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/gcc/shrink-wrap.cc b/gcc/shrink-wrap.cc
index b8d7b557130..28301f04f89 100644
--- a/gcc/shrink-wrap.cc
+++ b/gcc/shrink-wrap.cc
@@ -1776,16 +1776,13 @@ insert_prologue_epilogue_for_components (sbitmap components)
   commit_edge_insertions ();
 }
 
-/* The main entry point to this subpass.  FIRST_BB is where the prologue
-   would be normally put.  */
-void
-try_shrink_wrapping_separate (basic_block first_bb)
+bool
+use_shrink_wrapping_separate (void)
 {
-  if (!(SHRINK_WRAPPING_ENABLED
-	&& flag_shrink_wrap_separate
+  if (!(SHRINK_WRAPPING_ENABLED && flag_shrink_wrap_separate
 	&& optimize_function_for_speed_p (cfun)
 	&& targetm.shrink_wrap.get_separate_components))
-    return;
+    return false;
 
   /* We don't handle "strange" functions.  */
   if (cfun->calls_alloca
@@ -1794,6 +1791,17 @@ try_shrink_wrapping_separate (basic_block first_bb)
       || crtl->calls_eh_return
       || crtl->has_nonlocal_goto
       || crtl->saves_all_registers)
+    return false;
+
+  return true;
+}
+
+/* The main entry point to this subpass.  FIRST_BB is where the prologue
+   would be normally put.  */
+void
+try_shrink_wrapping_separate (basic_block first_bb)
+{
+  if (!use_shrink_wrapping_separate ())
     return;
 
   /* Ask the target what components there are.  If it returns NULL, don't
diff --git a/gcc/shrink-wrap.h b/gcc/shrink-wrap.h
index 161647711a3..82386c2b712 100644
--- a/gcc/shrink-wrap.h
+++ b/gcc/shrink-wrap.h
@@ -26,6 +26,7 @@ along with GCC; see the file COPYING3.  If not see
 extern bool requires_stack_frame_p (rtx_insn *, HARD_REG_SET, HARD_REG_SET);
 extern void try_shrink_wrapping (edge *entry_edge, rtx_insn *prologue_seq);
 extern void try_shrink_wrapping_separate (basic_block first_bb);
+extern bool use_shrink_wrapping_separate (void);
 #define SHRINK_WRAPPING_ENABLED \
   (flag_shrink_wrap && targetm.have_simple_return ())
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 2/2] [RISC-V] Enalble zcmp for -Os
  2023-08-31  6:24 [PATCH 0/2] resolve confilct between zcmp multi push/pop and shrink-wrap-separate Fei Gao
  2023-08-31  6:24 ` [PATCH 1/2] allow targets to check shrink-wrap-separate enabled or not Fei Gao
@ 2023-08-31  6:24 ` Fei Gao
  2023-09-05 12:02   ` Kito Cheng
  1 sibling, 1 reply; 11+ messages in thread
From: Fei Gao @ 2023-08-31  6:24 UTC (permalink / raw)
  To: gcc-patches; +Cc: kito.cheng, palmer, jeffreyalaw, sinan.lin, jiawei, Fei Gao

Enalble zcmp for -Os and shrink-warp-separate for
the speed perfered optimization by default.

To force enabling zcmp multi push/pop in speed perfered case,
fno-shrink-wrap-separate has to be explictly given.

gcc/ChangeLog:

        * config/riscv/riscv.cc 
	(riscv_avoid_shrink_wrapping_separate): wrap the condition check in
        riscv_avoid_shrink_wrapping_separate.
        (riscv_avoid_multi_push):avoid multi push if shrink_wrapping_separate
          is active.
        (riscv_get_separate_components):call riscv_avoid_shrink_wrapping_separate

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/rv32e_zcmp.c: remove -fno-shrink-wrap-separate
        * gcc.target/riscv/rv32i_zcmp.c: likewise
        * gcc.target/riscv/zcmp_push_fpr.c: likewise
        * gcc.target/riscv/zcmp_stack_alignment.c: likewise
        * gcc.target/riscv/zcmp_shrink_wrap_separate.c: New test.
        * gcc.target/riscv/zcmp_shrink_wrap_separate2.c: New test.
---
 gcc/config/riscv/riscv.cc                     | 21 ++++-
 gcc/testsuite/gcc.target/riscv/rv32e_zcmp.c   |  2 +-
 gcc/testsuite/gcc.target/riscv/rv32i_zcmp.c   |  2 +-
 .../gcc.target/riscv/zcmp_push_fpr.c          |  2 +-
 .../riscv/zcmp_shrink_wrap_separate.c         | 93 +++++++++++++++++++
 .../riscv/zcmp_shrink_wrap_separate2.c        | 93 +++++++++++++++++++
 .../gcc.target/riscv/zcmp_stack_alignment.c   |  2 +-
 7 files changed, 207 insertions(+), 8 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/riscv/zcmp_shrink_wrap_separate.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/zcmp_shrink_wrap_separate2.c

diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 78600ba73b6..3f71000c88b 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -64,6 +64,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "cfghooks.h"
 #include "cfgloop.h"
 #include "cfgrtl.h"
+#include "shrink-wrap.h"
 #include "sel-sched.h"
 #include "sched-int.h"
 #include "fold-const.h"
@@ -372,6 +373,7 @@ static const struct riscv_tune_param optimize_size_tune_info = {
   false,					/* use_divmod_expansion */
 };
 
+static bool riscv_avoid_shrink_wrapping_separate ();
 static tree riscv_handle_fndecl_attribute (tree *, tree, tree, int, bool *);
 static tree riscv_handle_type_attribute (tree *, tree, tree, int, bool *);
 
@@ -5569,7 +5571,9 @@ riscv_avoid_multi_push (const struct riscv_frame_info *frame)
 {
   if (!TARGET_ZCMP || crtl->calls_eh_return || frame_pointer_needed
       || cfun->machine->interrupt_handler_p || cfun->machine->varargs_size != 0
-      || crtl->args.pretend_args_size != 0 || flag_shrink_wrap_separate
+      || crtl->args.pretend_args_size != 0
+      || (use_shrink_wrapping_separate ()
+	  && !riscv_avoid_shrink_wrapping_separate ())
       || (frame->mask & ~MULTI_PUSH_GPR_MASK))
     return true;
 
@@ -6831,6 +6835,17 @@ riscv_epilogue_uses (unsigned int regno)
   return false;
 }
 
+static bool
+riscv_avoid_shrink_wrapping_separate ()
+{
+  if (riscv_use_save_libcall (&cfun->machine->frame)
+      || cfun->machine->interrupt_handler_p
+      || !cfun->machine->frame.gp_sp_offset.is_constant ())
+    return true;
+
+  return false;
+}
+
 /* Implement TARGET_SHRINK_WRAP_GET_SEPARATE_COMPONENTS.  */
 
 static sbitmap
@@ -6840,9 +6855,7 @@ riscv_get_separate_components (void)
   sbitmap components = sbitmap_alloc (FIRST_PSEUDO_REGISTER);
   bitmap_clear (components);
 
-  if (riscv_use_save_libcall (&cfun->machine->frame)
-      || cfun->machine->interrupt_handler_p
-      || !cfun->machine->frame.gp_sp_offset.is_constant ())
+  if (riscv_avoid_shrink_wrapping_separate ())
     return components;
 
   offset = cfun->machine->frame.gp_sp_offset.to_constant ();
diff --git a/gcc/testsuite/gcc.target/riscv/rv32e_zcmp.c b/gcc/testsuite/gcc.target/riscv/rv32e_zcmp.c
index 394459c4ed7..50e443573ad 100644
--- a/gcc/testsuite/gcc.target/riscv/rv32e_zcmp.c
+++ b/gcc/testsuite/gcc.target/riscv/rv32e_zcmp.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options " -Os -march=rv32e_zca_zcmp -mabi=ilp32e -mcmodel=medlow -fno-shrink-wrap-separate" } */
+/* { dg-options " -Os -march=rv32e_zca_zcmp -mabi=ilp32e -mcmodel=medlow" } */
 /* { dg-skip-if "" { *-*-* } {"-O0" "-O1" "-O2" "-Og" "-O3" "-Oz" "-flto"} } */
 /* { dg-final { check-function-bodies "**" "" } } */
 
diff --git a/gcc/testsuite/gcc.target/riscv/rv32i_zcmp.c b/gcc/testsuite/gcc.target/riscv/rv32i_zcmp.c
index f00338a9d17..ea562b7a233 100644
--- a/gcc/testsuite/gcc.target/riscv/rv32i_zcmp.c
+++ b/gcc/testsuite/gcc.target/riscv/rv32i_zcmp.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options " -Os -march=rv32imaf_zca_zcmp -mabi=ilp32f -mcmodel=medlow -fno-shrink-wrap-separate" }*/
+/* { dg-options " -Os -march=rv32imaf_zca_zcmp -mabi=ilp32f -mcmodel=medlow" }*/
 /* { dg-skip-if "" { *-*-* } {"-O0" "-O1" "-O2" "-Og" "-O3" "-Oz" "-flto"} } */
 /* { dg-final { check-function-bodies "**" "" } } */
 
diff --git a/gcc/testsuite/gcc.target/riscv/zcmp_push_fpr.c b/gcc/testsuite/gcc.target/riscv/zcmp_push_fpr.c
index 530b35b53dd..c9d79205b31 100644
--- a/gcc/testsuite/gcc.target/riscv/zcmp_push_fpr.c
+++ b/gcc/testsuite/gcc.target/riscv/zcmp_push_fpr.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64imafd_zicsr_zifencei_zca_zcmp -mabi=lp64d -Os -fno-shrink-wrap-separate" } */
+/* { dg-options "-march=rv64imafd_zicsr_zifencei_zca_zcmp -mabi=lp64d -Os" } */
 /* { dg-skip-if "" { *-*-* } {"-O0" "-O1" "-O2" "-Og" "-O3" "-Oz" "-flto"} } */
 
 typedef struct
diff --git a/gcc/testsuite/gcc.target/riscv/zcmp_shrink_wrap_separate.c b/gcc/testsuite/gcc.target/riscv/zcmp_shrink_wrap_separate.c
new file mode 100644
index 00000000000..035bc32cec5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zcmp_shrink_wrap_separate.c
@@ -0,0 +1,93 @@
+/* { dg-do compile } */
+/* { dg-options " -O2 -march=rv32imaf_zca_zcmp -mabi=ilp32f" } */
+/* { dg-skip-if "" { *-*-* } {"-O0" "-O1" "-Os" "-Og" "-O3" "-Oz" "-flto"} } */
+
+typedef struct MAT_PARAMS_S
+{
+  int N;
+  signed short *A;
+  signed short *B;
+  signed int *C;
+} mat_params;
+
+typedef struct CORE_PORTABLE_S
+{
+  unsigned char portable_id;
+} core_portable;
+
+typedef struct RESULTS_S
+{
+  /* inputs */
+  signed short seed1;	   /* Initializing seed */
+  signed short seed2;	   /* Initializing seed */
+  signed short seed3;	   /* Initializing seed */
+  void *memblock[4];	   /* Pointer to safe memory location */
+  unsigned int size;	   /* Size of the data */
+  unsigned int iterations; /* Number of iterations to execute */
+  unsigned int execs;	   /* Bitmask of operations to execute */
+  struct list_head_s *list;
+  mat_params mat;
+  /* outputs */
+  unsigned short crc;
+  unsigned short crclist;
+  unsigned short crcmatrix;
+  unsigned short crcstate;
+  signed short err;
+  /* ultithread specific */
+  core_portable port;
+} core_results;
+
+extern signed short
+core_bench_state (unsigned int, void *, signed short, signed short,
+		  signed short, unsigned short);
+
+extern signed short
+core_bench_matrix (mat_params *, signed short, unsigned short);
+
+extern unsigned short
+crcu16 (signed short, unsigned short);
+
+signed short
+calc_func (signed short *pdata, core_results *res)
+{
+  signed short data = *pdata;
+  signed short retval;
+  unsigned char optype
+    = (data >> 7)
+      & 1;    /* bit 7 indicates if the function result has been cached */
+  if (optype) /* if cached, use cache */
+    return (data & 0x007f);
+  else
+    { /* otherwise calculate and cache the result */
+      signed short flag
+	= data & 0x7; /* bits 0-2 is type of function to perform */
+      signed short dtype
+	= ((data >> 3) & 0xf); /* bits 3-6 is specific data for the operation */
+      dtype |= dtype << 4; /* replicate the lower 4 bits to get an 8b value */
+      switch (flag)
+	{
+	case 0:
+	  if (dtype < 0x22) /* set min period for bit corruption */
+	    dtype = 0x22;
+	  retval = core_bench_state (res->size, res->memblock[3], res->seed1,
+				     res->seed2, dtype, res->crc);
+	  if (res->crcstate == 0)
+	    res->crcstate = retval;
+	  break;
+	case 1:
+	  retval = core_bench_matrix (&(res->mat), dtype, res->crc);
+	  if (res->crcmatrix == 0)
+	    res->crcmatrix = retval;
+	  break;
+	default:
+	  retval = data;
+	  break;
+	}
+      res->crc = crcu16 (retval, res->crc);
+      retval &= 0x007f;
+      *pdata = (data & 0xff00) | 0x0080 | retval; /* cache the result */
+      return retval;
+    }
+}
+
+/* { dg-final { scan-assembler-not "cm\.push" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zcmp_shrink_wrap_separate2.c b/gcc/testsuite/gcc.target/riscv/zcmp_shrink_wrap_separate2.c
new file mode 100644
index 00000000000..47c78886052
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zcmp_shrink_wrap_separate2.c
@@ -0,0 +1,93 @@
+/* { dg-do compile } */
+/* { dg-options " -O2 -fno-shrink-wrap-separate -march=rv32imaf_zca_zcmp -mabi=ilp32f" } */
+/* { dg-skip-if "" { *-*-* } {"-O0" "-O1" "-Os" "-Og" "-O3" "-Oz" "-flto"} } */
+
+typedef struct MAT_PARAMS_S
+{
+  int N;
+  signed short *A;
+  signed short *B;
+  signed int *C;
+} mat_params;
+
+typedef struct CORE_PORTABLE_S
+{
+  unsigned char portable_id;
+} core_portable;
+
+typedef struct RESULTS_S
+{
+  /* inputs */
+  signed short seed1;	   /* Initializing seed */
+  signed short seed2;	   /* Initializing seed */
+  signed short seed3;	   /* Initializing seed */
+  void *memblock[4];	   /* Pointer to safe memory location */
+  unsigned int size;	   /* Size of the data */
+  unsigned int iterations; /* Number of iterations to execute */
+  unsigned int execs;	   /* Bitmask of operations to execute */
+  struct list_head_s *list;
+  mat_params mat;
+  /* outputs */
+  unsigned short crc;
+  unsigned short crclist;
+  unsigned short crcmatrix;
+  unsigned short crcstate;
+  signed short err;
+  /* ultithread specific */
+  core_portable port;
+} core_results;
+
+extern signed short
+core_bench_state (unsigned int, void *, signed short, signed short,
+		  signed short, unsigned short);
+
+extern signed short
+core_bench_matrix (mat_params *, signed short, unsigned short);
+
+extern unsigned short
+crcu16 (signed short, unsigned short);
+
+signed short
+calc_func (signed short *pdata, core_results *res)
+{
+  signed short data = *pdata;
+  signed short retval;
+  unsigned char optype
+    = (data >> 7)
+      & 1;    /* bit 7 indicates if the function result has been cached */
+  if (optype) /* if cached, use cache */
+    return (data & 0x007f);
+  else
+    { /* otherwise calculate and cache the result */
+      signed short flag
+	= data & 0x7; /* bits 0-2 is type of function to perform */
+      signed short dtype
+	= ((data >> 3) & 0xf); /* bits 3-6 is specific data for the operation */
+      dtype |= dtype << 4; /* replicate the lower 4 bits to get an 8b value */
+      switch (flag)
+	{
+	case 0:
+	  if (dtype < 0x22) /* set min period for bit corruption */
+	    dtype = 0x22;
+	  retval = core_bench_state (res->size, res->memblock[3], res->seed1,
+				     res->seed2, dtype, res->crc);
+	  if (res->crcstate == 0)
+	    res->crcstate = retval;
+	  break;
+	case 1:
+	  retval = core_bench_matrix (&(res->mat), dtype, res->crc);
+	  if (res->crcmatrix == 0)
+	    res->crcmatrix = retval;
+	  break;
+	default:
+	  retval = data;
+	  break;
+	}
+      res->crc = crcu16 (retval, res->crc);
+      retval &= 0x007f;
+      *pdata = (data & 0xff00) | 0x0080 | retval; /* cache the result */
+      return retval;
+    }
+}
+
+/* { dg-final { scan-assembler "cm\.push" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zcmp_stack_alignment.c b/gcc/testsuite/gcc.target/riscv/zcmp_stack_alignment.c
index 2f2fa55baac..f7d8f446b79 100644
--- a/gcc/testsuite/gcc.target/riscv/zcmp_stack_alignment.c
+++ b/gcc/testsuite/gcc.target/riscv/zcmp_stack_alignment.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options " -O0 -march=rv32e_zca_zcb_zcmp -mabi=ilp32e -mcmodel=medlow -fomit-frame-pointer -fno-shrink-wrap-separate" } */
+/* { dg-options " -O0 -march=rv32e_zca_zcb_zcmp -mabi=ilp32e -mcmodel=medlow -fomit-frame-pointer" } */
 /* { dg-skip-if "" { *-*-* } {"-O2" "-O1" "-Os" "-Og" "-O3" "-Oz" "-flto"} } */
 /* { dg-final { check-function-bodies "**" "" } } */
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/2] [RISC-V] Enalble zcmp for -Os
  2023-08-31  6:24 ` [PATCH 2/2] [RISC-V] Enalble zcmp for -Os Fei Gao
@ 2023-09-05 12:02   ` Kito Cheng
  2023-09-06  1:47     ` Fei Gao
  0 siblings, 1 reply; 11+ messages in thread
From: Kito Cheng @ 2023-09-05 12:02 UTC (permalink / raw)
  To: Fei Gao; +Cc: gcc-patches, jiawei

> @@ -5569,7 +5571,9 @@ riscv_avoid_multi_push (const struct riscv_frame_info *frame)
>  {
>    if (!TARGET_ZCMP || crtl->calls_eh_return || frame_pointer_needed
>        || cfun->machine->interrupt_handler_p || cfun->machine->varargs_size != 0
> -      || crtl->args.pretend_args_size != 0 || flag_shrink_wrap_separate
> +      || crtl->args.pretend_args_size != 0
> +      || (use_shrink_wrapping_separate ()
> +         && !riscv_avoid_shrink_wrapping_separate ())

I think we should also check "!optimize_function_for_size_p (cfun)"
here, otherwise that does not really match what we claim in the commit
message.

e.g. it still will enable with -O2 -fno-shrink-wrap-separate

>        || (frame->mask & ~MULTI_PUSH_GPR_MASK))
>      return true;
>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Re: [PATCH 2/2] [RISC-V] Enalble zcmp for -Os
  2023-09-05 12:02   ` Kito Cheng
@ 2023-09-06  1:47     ` Fei Gao
  2023-09-06  8:06       ` Kito Cheng
  0 siblings, 1 reply; 11+ messages in thread
From: Fei Gao @ 2023-09-06  1:47 UTC (permalink / raw)
  To: Kito Cheng; +Cc: gcc-patches, jiawei

On 2023-09-05 20:02  Kito Cheng <kito.cheng@gmail.com> wrote:
>
>> @@ -5569,7 +5571,9 @@ riscv_avoid_multi_push (const struct riscv_frame_info *frame)
>>  {
>>    if (!TARGET_ZCMP || crtl->calls_eh_return || frame_pointer_needed
>>        || cfun->machine->interrupt_handler_p || cfun->machine->varargs_size != 0
>> -      || crtl->args.pretend_args_size != 0 || flag_shrink_wrap_separate
>> +      || crtl->args.pretend_args_size != 0
>> +      || (use_shrink_wrapping_separate ()
>> +         && !riscv_avoid_shrink_wrapping_separate ())
>
>I think we should also check "!optimize_function_for_size_p (cfun)"
>here, otherwise that does not really match what we claim in the commit
>message.
> 
A similar check optimize_function_for_speed_p is included in 
use_shrink_wrapping_separate of [1/2] allow targets to check
shrink-wrap-separate enabled or not.

>e.g. it still will enable with -O2 -fno-shrink-wrap-separate 
It's intentional to enable zcmp with -O2 -fno-shrink-wrap-separate. 
Maybe I should have given a better commit message saying
"enable muti push and pop for Zcmp extension when
shrink-wrap-separate is inactive".

Would you like a new patch from me or agree with my
explanation and modify commit message in your side?

BR
Fei
>
>>        || (frame->mask & ~MULTI_PUSH_GPR_MASK))
>>      return true;
>> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Re: [PATCH 2/2] [RISC-V] Enalble zcmp for -Os
  2023-09-06  1:47     ` Fei Gao
@ 2023-09-06  8:06       ` Kito Cheng
  2023-09-12  0:56         ` Fei Gao
  0 siblings, 1 reply; 11+ messages in thread
From: Kito Cheng @ 2023-09-06  8:06 UTC (permalink / raw)
  To: Fei Gao; +Cc: gcc-patches, jiawei

On Wed, Sep 6, 2023 at 9:47 AM Fei Gao <gaofei@eswincomputing.com> wrote:
>
> On 2023-09-05 20:02  Kito Cheng <kito.cheng@gmail.com> wrote:
> >
> >> @@ -5569,7 +5571,9 @@ riscv_avoid_multi_push (const struct riscv_frame_info *frame)
> >>  {
> >>    if (!TARGET_ZCMP || crtl->calls_eh_return || frame_pointer_needed
> >>        || cfun->machine->interrupt_handler_p || cfun->machine->varargs_size != 0
> >> -      || crtl->args.pretend_args_size != 0 || flag_shrink_wrap_separate
> >> +      || crtl->args.pretend_args_size != 0
> >> +      || (use_shrink_wrapping_separate ()
> >> +         && !riscv_avoid_shrink_wrapping_separate ())
> >
> >I think we should also check "!optimize_function_for_size_p (cfun)"
> >here, otherwise that does not really match what we claim in the commit
> >message.
> >
> A similar check optimize_function_for_speed_p is included in
> use_shrink_wrapping_separate of [1/2] allow targets to check
> shrink-wrap-separate enabled or not.
>
> >e.g. it still will enable with -O2 -fno-shrink-wrap-separate
> It's intentional to enable zcmp with -O2 -fno-shrink-wrap-separate.
> Maybe I should have given a better commit message saying
> "enable muti push and pop for Zcmp extension when
> shrink-wrap-separate is inactive".
>
> Would you like a new patch from me or agree with my
> explanation and modify commit message in your side?

Could you send a new patch with updated commit message.


>
> BR
> Fei
> >
> >>        || (frame->mask & ~MULTI_PUSH_GPR_MASK))
> >>      return true;
> >>
>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Re: [PATCH 2/2] [RISC-V] Enalble zcmp for -Os
  2023-09-06  8:06       ` Kito Cheng
@ 2023-09-12  0:56         ` Fei Gao
  0 siblings, 0 replies; 11+ messages in thread
From: Fei Gao @ 2023-09-12  0:56 UTC (permalink / raw)
  To: Kito Cheng; +Cc: gcc-patches, jiawei

On 2023-09-06 16:06  Kito Cheng <kito.cheng@gmail.com> wrote:
>
>On Wed, Sep 6, 2023 at 9:47 AM Fei Gao <gaofei@eswincomputing.com> wrote:
>>
>> On 2023-09-05 20:02  Kito Cheng <kito.cheng@gmail.com> wrote:
>> >
>> >> @@ -5569,7 +5571,9 @@ riscv_avoid_multi_push (const struct riscv_frame_info *frame)
>> >>  {
>> >>    if (!TARGET_ZCMP || crtl->calls_eh_return || frame_pointer_needed
>> >>        || cfun->machine->interrupt_handler_p || cfun->machine->varargs_size != 0
>> >> -      || crtl->args.pretend_args_size != 0 || flag_shrink_wrap_separate
>> >> +      || crtl->args.pretend_args_size != 0
>> >> +      || (use_shrink_wrapping_separate ()
>> >> +         && !riscv_avoid_shrink_wrapping_separate ())
>> >
>> >I think we should also check "!optimize_function_for_size_p (cfun)"
>> >here, otherwise that does not really match what we claim in the commit
>> >message.
>> >
>> A similar check optimize_function_for_speed_p is included in
>> use_shrink_wrapping_separate of [1/2] allow targets to check
>> shrink-wrap-separate enabled or not.
>>
>> >e.g. it still will enable with -O2 -fno-shrink-wrap-separate
>> It's intentional to enable zcmp with -O2 -fno-shrink-wrap-separate.
>> Maybe I should have given a better commit message saying
>> "enable muti push and pop for Zcmp extension when
>> shrink-wrap-separate is inactive".
>>
>> Would you like a new patch from me or agree with my
>> explanation and modify commit message in your side?
>
>Could you send a new patch with updated commit message. 
hi Kito

New patch with updated commit message:
https://patchwork.sourceware.org/project/gcc/list/?series=24300

BR, 
Fei
>
>
>>
>> BR
>> Fei
>> >
>> >>        || (frame->mask & ~MULTI_PUSH_GPR_MASK))
>> >>      return true;
>> >>
>>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/2] allow targets to check shrink-wrap-separate enabled or not
  2023-09-06  9:39 [PATCH 0/2] resolve confilct between zcmp multi push/pop and shrink-wrap-separate Fei Gao
@ 2023-09-06  9:39 ` Fei Gao
  0 siblings, 0 replies; 11+ messages in thread
From: Fei Gao @ 2023-09-06  9:39 UTC (permalink / raw)
  To: gcc-patches; +Cc: kito.cheng, palmer, jeffreyalaw, sinan.lin, jiawei, Fei Gao

No functional changes but restructure and expose use_shrink_wrapping_separate
to the TARGETs.

gcc/ChangeLog:

        * shrink-wrap.cc (try_shrink_wrapping_separate):call
          use_shrink_wrapping_separate.
        (use_shrink_wrapping_separate): wrap the condition
          check in use_shrink_wrapping_separate.
        * shrink-wrap.h (use_shrink_wrapping_separate): add to extern
---
 gcc/shrink-wrap.cc | 22 +++++++++++++++-------
 gcc/shrink-wrap.h  |  1 +
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/gcc/shrink-wrap.cc b/gcc/shrink-wrap.cc
index b8d7b557130..28301f04f89 100644
--- a/gcc/shrink-wrap.cc
+++ b/gcc/shrink-wrap.cc
@@ -1776,16 +1776,13 @@ insert_prologue_epilogue_for_components (sbitmap components)
   commit_edge_insertions ();
 }
 
-/* The main entry point to this subpass.  FIRST_BB is where the prologue
-   would be normally put.  */
-void
-try_shrink_wrapping_separate (basic_block first_bb)
+bool
+use_shrink_wrapping_separate (void)
 {
-  if (!(SHRINK_WRAPPING_ENABLED
-	&& flag_shrink_wrap_separate
+  if (!(SHRINK_WRAPPING_ENABLED && flag_shrink_wrap_separate
 	&& optimize_function_for_speed_p (cfun)
 	&& targetm.shrink_wrap.get_separate_components))
-    return;
+    return false;
 
   /* We don't handle "strange" functions.  */
   if (cfun->calls_alloca
@@ -1794,6 +1791,17 @@ try_shrink_wrapping_separate (basic_block first_bb)
       || crtl->calls_eh_return
       || crtl->has_nonlocal_goto
       || crtl->saves_all_registers)
+    return false;
+
+  return true;
+}
+
+/* The main entry point to this subpass.  FIRST_BB is where the prologue
+   would be normally put.  */
+void
+try_shrink_wrapping_separate (basic_block first_bb)
+{
+  if (!use_shrink_wrapping_separate ())
     return;
 
   /* Ask the target what components there are.  If it returns NULL, don't
diff --git a/gcc/shrink-wrap.h b/gcc/shrink-wrap.h
index 161647711a3..82386c2b712 100644
--- a/gcc/shrink-wrap.h
+++ b/gcc/shrink-wrap.h
@@ -26,6 +26,7 @@ along with GCC; see the file COPYING3.  If not see
 extern bool requires_stack_frame_p (rtx_insn *, HARD_REG_SET, HARD_REG_SET);
 extern void try_shrink_wrapping (edge *entry_edge, rtx_insn *prologue_seq);
 extern void try_shrink_wrapping_separate (basic_block first_bb);
+extern bool use_shrink_wrapping_separate (void);
 #define SHRINK_WRAPPING_ENABLED \
   (flag_shrink_wrap && targetm.have_simple_return ())
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/2] allow targets to check shrink-wrap-separate enabled or not
  2023-08-29  1:28     ` Fei Gao
@ 2023-08-29  1:46       ` Jeff Law
  0 siblings, 0 replies; 11+ messages in thread
From: Jeff Law @ 2023-08-29  1:46 UTC (permalink / raw)
  To: Fei Gao, gcc-patches; +Cc: Kito Cheng, Palmer Dabbelt, Sinan, jiawei



On 8/28/23 19:28, Fei Gao wrote:
> On 2023-08-29 06:54  Jeff Law <jeffreyalaw@gmail.com> wrote:
>>
>>
>>
>> On 8/28/23 01:47, Fei Gao wrote:
>>> no functional changes but allow targets to check shrink-wrap-separate enabled or not.
>>>
>>>      gcc/ChangeLog:
>>>
>>>            * shrink-wrap.cc (try_shrink_wrapping_separate):call
>>>              use_shrink_wrapping_separate.
>>>            (use_shrink_wrapping_separate): wrap the condition
>>>              check in use_shrink_wrapping_separate.
>>>            * shrink-wrap.h (use_shrink_wrapping_separate): add to extern
>> So as I mentioned earlier today in the older thread, can we use
>> override_options to do this?
>>
>> If we look at aarch64_override_options we have this:
>>
>>     /* The pass to insert speculation tracking runs before
>>        shrink-wrapping and the latter does not know how to update the
>>        tracking status.  So disable it in this case.  */
>>     if (aarch64_track_speculation)
>>       flag_shrink_wrap = 0;
>>
>> We kind of want this instead
>>
>>     if (flag_shrink_wrap)
>>       {
>>         turn off whatever target bits enable the cm.push/cm.pop insns
>>       }
>>
>>
>> This does imply that we have a distinct target flag to enable/disable
>> those instructions.  But that seems like a good thing to have anyway.
> I'm afraid we cannot simply resolve the confilict based on
> flag_shrink_wrap/flag_shrink_wrap_separate only, as they're set true from -O1 onwards,
> which means zcmp is disabled almostly unless -fno-shrink-warp/-fno-shrink-warp-separate
> are explictly given.
Yea, but I would generally expect that if someone is really concerned 
about code size, they're probably using -Os which (hopefully) would not 
have shrink-wrapping enabled.

> 
> So after discussion with Kito, we would like to turn on zcmp for -Os and shrink-warp-separate
> for the speed perfered optimization. use_shrink_wrapping_separate in this patch provide the
> chance for this check. No new hook is needed.
Seems reasonable to me if Kito is OK with it.

jeff

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/2] allow targets to check shrink-wrap-separate enabled or not
  2023-08-28  7:47 ` [PATCH 1/2] allow targets to check shrink-wrap-separate enabled or not Fei Gao
@ 2023-08-28 22:54   ` Jeff Law
  2023-08-29  1:28     ` Fei Gao
  0 siblings, 1 reply; 11+ messages in thread
From: Jeff Law @ 2023-08-28 22:54 UTC (permalink / raw)
  To: Fei Gao, gcc-patches; +Cc: kito.cheng, palmer, sinan.lin, jiawei



On 8/28/23 01:47, Fei Gao wrote:
> no functional changes but allow targets to check shrink-wrap-separate enabled or not.
> 
>    gcc/ChangeLog:
> 
>          * shrink-wrap.cc (try_shrink_wrapping_separate):call
>            use_shrink_wrapping_separate.
>          (use_shrink_wrapping_separate): wrap the condition
>            check in use_shrink_wrapping_separate.
>          * shrink-wrap.h (use_shrink_wrapping_separate): add to extern
So as I mentioned earlier today in the older thread, can we use 
override_options to do this?

If we look at aarch64_override_options we have this:

   /* The pass to insert speculation tracking runs before
      shrink-wrapping and the latter does not know how to update the
      tracking status.  So disable it in this case.  */
   if (aarch64_track_speculation)
     flag_shrink_wrap = 0;

We kind of want this instead

   if (flag_shrink_wrap)
     {
       turn off whatever target bits enable the cm.push/cm.pop insns
     }


This does imply that we have a distinct target flag to enable/disable 
those instructions.  But that seems like a good thing to have anyway.

jeff

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/2] allow targets to check shrink-wrap-separate enabled or not
  2023-08-28  7:47 [PATCH 0/2] support cm.push cm.pop cm.popret in zcmp and resolve confilct with shrink-wrap-separate Fei Gao
@ 2023-08-28  7:47 ` Fei Gao
  2023-08-28 22:54   ` Jeff Law
  0 siblings, 1 reply; 11+ messages in thread
From: Fei Gao @ 2023-08-28  7:47 UTC (permalink / raw)
  To: gcc-patches; +Cc: kito.cheng, palmer, jeffreyalaw, sinan.lin, jiawei, Fei Gao

no functional changes but allow targets to check shrink-wrap-separate enabled or not.

  gcc/ChangeLog:

        * shrink-wrap.cc (try_shrink_wrapping_separate):call
          use_shrink_wrapping_separate.
        (use_shrink_wrapping_separate): wrap the condition
          check in use_shrink_wrapping_separate.
        * shrink-wrap.h (use_shrink_wrapping_separate): add to extern
---
 gcc/shrink-wrap.cc | 25 +++++++++++++++++--------
 gcc/shrink-wrap.h  |  1 +
 2 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/gcc/shrink-wrap.cc b/gcc/shrink-wrap.cc
index b8d7b557130..d534964321a 100644
--- a/gcc/shrink-wrap.cc
+++ b/gcc/shrink-wrap.cc
@@ -1776,16 +1776,14 @@ insert_prologue_epilogue_for_components (sbitmap components)
   commit_edge_insertions ();
 }
 
-/* The main entry point to this subpass.  FIRST_BB is where the prologue
-   would be normally put.  */
-void
-try_shrink_wrapping_separate (basic_block first_bb)
+bool
+use_shrink_wrapping_separate (void)
 {
   if (!(SHRINK_WRAPPING_ENABLED
-	&& flag_shrink_wrap_separate
-	&& optimize_function_for_speed_p (cfun)
-	&& targetm.shrink_wrap.get_separate_components))
-    return;
+        && flag_shrink_wrap_separate
+        && optimize_function_for_speed_p (cfun)
+        && targetm.shrink_wrap.get_separate_components))
+    return false;
 
   /* We don't handle "strange" functions.  */
   if (cfun->calls_alloca
@@ -1794,6 +1792,17 @@ try_shrink_wrapping_separate (basic_block first_bb)
       || crtl->calls_eh_return
       || crtl->has_nonlocal_goto
       || crtl->saves_all_registers)
+    return false;
+
+  return true;
+}
+
+/* The main entry point to this subpass.  FIRST_BB is where the prologue
+   would be normally put.  */
+void
+try_shrink_wrapping_separate (basic_block first_bb)
+{
+  if (!use_shrink_wrapping_separate ())
     return;
 
   /* Ask the target what components there are.  If it returns NULL, don't
diff --git a/gcc/shrink-wrap.h b/gcc/shrink-wrap.h
index 161647711a3..82386c2b712 100644
--- a/gcc/shrink-wrap.h
+++ b/gcc/shrink-wrap.h
@@ -26,6 +26,7 @@ along with GCC; see the file COPYING3.  If not see
 extern bool requires_stack_frame_p (rtx_insn *, HARD_REG_SET, HARD_REG_SET);
 extern void try_shrink_wrapping (edge *entry_edge, rtx_insn *prologue_seq);
 extern void try_shrink_wrapping_separate (basic_block first_bb);
+extern bool use_shrink_wrapping_separate (void);
 #define SHRINK_WRAPPING_ENABLED \
   (flag_shrink_wrap && targetm.have_simple_return ())
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2023-09-12  0:56 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-31  6:24 [PATCH 0/2] resolve confilct between zcmp multi push/pop and shrink-wrap-separate Fei Gao
2023-08-31  6:24 ` [PATCH 1/2] allow targets to check shrink-wrap-separate enabled or not Fei Gao
2023-08-31  6:24 ` [PATCH 2/2] [RISC-V] Enalble zcmp for -Os Fei Gao
2023-09-05 12:02   ` Kito Cheng
2023-09-06  1:47     ` Fei Gao
2023-09-06  8:06       ` Kito Cheng
2023-09-12  0:56         ` Fei Gao
  -- strict thread matches above, loose matches on Subject: below --
2023-09-06  9:39 [PATCH 0/2] resolve confilct between zcmp multi push/pop and shrink-wrap-separate Fei Gao
2023-09-06  9:39 ` [PATCH 1/2] allow targets to check shrink-wrap-separate enabled or not Fei Gao
2023-08-28  7:47 [PATCH 0/2] support cm.push cm.pop cm.popret in zcmp and resolve confilct with shrink-wrap-separate Fei Gao
2023-08-28  7:47 ` [PATCH 1/2] allow targets to check shrink-wrap-separate enabled or not Fei Gao
2023-08-28 22:54   ` Jeff Law
2023-08-29  1:28     ` Fei Gao
2023-08-29  1:46       ` Jeff Law

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).