diff mbox series

[V7,3/3] slight tune heuristic min_insns_constant_in_pool

Message ID 20240729050757.2500551-3-guojiufu@linux.ibm.com
State New
Headers show
Series [V7,1/3] split complicate 64bit constant to memory | expand

Commit Message

Jiufu Guo July 29, 2024, 5:07 a.m. UTC
Hi,

The default rs6000_min_insns_constant_in_pool is 2, which would suitable
for a few cases.  While for different targets, we can tune this threshold
slightly.

For example, 'pld' could load a constant value from memory as faster as
building a constant by one instruction, and faster than build a constant
through two instructions.

This patch tune the parameter rs6000_min_insns_constant_in_pool for
TARGET_PREFIXED and TARGET_32BIT.

Bootstrap and regtest pass on ppc64 and ppc64le.
Is this patch ok for trunk?

BR,
Jeff(Jiufu) Guo

gcc/ChangeLog:

	* config/rs6000/rs6000.cc (rs6000_option_override_internal): Tune
	rs6000_min_insns_constant_in_pool.

gcc/testsuite/ChangeLog:

	* gcc.target/powerpc/const-build-1.c: Keep original test point
	by using rs6000_min_insns_constant_in_pool.
	* gcc.target/powerpc/const-build.c: Likewise.

---
 gcc/config/rs6000/rs6000.cc                      | 15 +++++++++++++++
 gcc/testsuite/gcc.target/powerpc/const-build-1.c |  2 +-
 gcc/testsuite/gcc.target/powerpc/const-build.c   |  2 +-
 3 files changed, 17 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index c785fb20b1b..632760dc814 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -4847,6 +4847,21 @@  rs6000_option_override_internal (bool global_init_p)
     warning (0, "%qs is deprecated and not recommended in any circumstances",
 	     "-mno-speculate-indirect-jumps");
 
+  /* Set the threshold for how complicated constant should be put
+    into constant pool.  */
+  if (!OPTION_SET_P (rs6000_min_insns_constant_in_pool))
+    {
+      /* one insn could load for the constant: pld 3, .LC1@pcrel
+	 ld 0,.LC1@toc(2). */
+      if (TARGET_PREFIXED || (TARGET_64BIT && TARGET_CMODEL == CMODEL_SMALL))
+	rs6000_min_insns_constant_in_pool = 1;
+
+      /* Consider address addjust, slight increase the threshold:
+	add 30,0,30; lwz 9,.LC1-.LCTOC1(30); ld 9,0(9); or
+	lis 9,.LC0@ha; la 9,.LC0@l(9); ld 9,0(9)*/
+      else if (TARGET_32BIT && flag_pic != 1)
+	rs6000_min_insns_constant_in_pool = 3;
+    }
   return ret;
 }
 
diff --git a/gcc/testsuite/gcc.target/powerpc/const-build-1.c b/gcc/testsuite/gcc.target/powerpc/const-build-1.c
index 7e35f8c507f..e7061709fea 100644
--- a/gcc/testsuite/gcc.target/powerpc/const-build-1.c
+++ b/gcc/testsuite/gcc.target/powerpc/const-build-1.c
@@ -1,5 +1,5 @@ 
 /* { dg-do compile { target lp64 } } */
-/* { dg-options "-O2 -mdejagnu-cpu=power10" } */
+/* { dg-options "-O2 -mdejagnu-cpu=power10 --param=rs6000-min-insns-constant-in-pool=2" } */
 /* { dg-require-effective-target power10_ok } */
 
 unsigned long long msk66() { return 0x6666666666666666ULL; }
diff --git a/gcc/testsuite/gcc.target/powerpc/const-build.c b/gcc/testsuite/gcc.target/powerpc/const-build.c
index 52941ca4c2f..31e1a611243 100644
--- a/gcc/testsuite/gcc.target/powerpc/const-build.c
+++ b/gcc/testsuite/gcc.target/powerpc/const-build.c
@@ -1,5 +1,5 @@ 
 /* { dg-do run } */
-/* { dg-options "-O2 -save-temps" } */
+/* { dg-options "-O2 -save-temps --param=rs6000-min-insns-constant-in-pool=2" } */
 /* { dg-require-effective-target has_arch_ppc64 } */
 
 /* Verify that two instructions are successfully used to build constants.