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 --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.
-- 
2.43.0

Reply via email to