https://gcc.gnu.org/g:8b5321bc863bfc9920676c33295644cbebfd0a05

commit 8b5321bc863bfc9920676c33295644cbebfd0a05
Author: Jeff Law <j...@ventanamicro.com>
Date:   Tue May 7 11:43:09 2024 -0600

    [RISC-V] [PATCH v2] Enable inlining str* by default
    
    So with Chrstoph's patches from late 2022 we've had the ability to inline
    strlen, and str[n]cmp (scalar).  However, we never actually turned this
    capability on by default!
    
    This patch flips the those default to allow inlinining by default.  It also
    fixes one bug exposed by our internal testing when NBYTES is zero for 
strncmp.
    I don't think that case happens enough to try and optimize it, we just 
disable
    inline expansion for that instance.
    
    This has been bootstrapped and regression tested on rv64gc at various times 
as
    well as cross tested on rv64gc more times than I can probably count (we've 
have
    this patch internally for a while).  More importantly, I just successfully
    tested it on rv64gc and rv32gcv elf configurations with the trunk
    
    gcc/
    
            * config/riscv/riscv-string.cc (riscv_expand_strcmp): Do not inline
            strncmp with zero size.
            (emit_strcmp_scalar_compare_subword): Adjust rotation for rv32 vs 
rv64.
            * config/riscv/riscv.opt (var_inline_strcmp): Enable by default.
            (vriscv_inline_strncmp, riscv_inline_strlen): Likewise.
    
    gcc/testsuite
    
            * gcc.target/riscv/zbb-strlen-disabled-2.c: Turn off inlining.
    
    (cherry picked from commit 1139f38e798181572121657e5b267a9698edb62f)

Diff:
---
 gcc/config/riscv/riscv-string.cc                       | 9 ++++++++-
 gcc/config/riscv/riscv.opt                             | 6 +++---
 gcc/testsuite/gcc.target/riscv/zbb-strlen-disabled-2.c | 4 ++--
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/gcc/config/riscv/riscv-string.cc b/gcc/config/riscv/riscv-string.cc
index b09b51d7526b..41cb061c746d 100644
--- a/gcc/config/riscv/riscv-string.cc
+++ b/gcc/config/riscv/riscv-string.cc
@@ -153,7 +153,7 @@ emit_strcmp_scalar_compare_subword (rtx data1, rtx data2, 
rtx orc1,
   rtx imask = gen_rtx_CONST_INT (Xmode, im);
   rtx m_reg = gen_reg_rtx (Xmode);
   emit_insn (gen_rtx_SET (m_reg, imask));
-  do_rotr3 (m_reg, m_reg, GEN_INT (64 - cmp_bytes * BITS_PER_UNIT));
+  do_rotr3 (m_reg, m_reg, GEN_INT (BITS_PER_WORD - cmp_bytes * BITS_PER_UNIT));
   do_and3 (data1, m_reg, data1);
   do_and3 (data2, m_reg, data2);
   if (TARGET_ZBB)
@@ -497,6 +497,13 @@ riscv_expand_strcmp (rtx result, rtx src1, rtx src2,
        return false;
       nbytes = UINTVAL (bytes_rtx);
 
+      /* If NBYTES is zero the result of strncmp will always be zero,
+        but that would require special casing in the caller.  So for
+        now just don't do an inline expansion.  This probably rarely
+        happens in practice, but it is tested by the testsuite.  */
+      if (nbytes == 0)
+       return false;
+
       /* We don't emit parts of a strncmp() call.  */
       if (nbytes > compare_max)
        return false;
diff --git a/gcc/config/riscv/riscv.opt b/gcc/config/riscv/riscv.opt
index 7cca1c4aab20..1252834aec5b 100644
--- a/gcc/config/riscv/riscv.opt
+++ b/gcc/config/riscv/riscv.opt
@@ -517,15 +517,15 @@ Target Var(TARGET_INLINE_SUBWORD_ATOMIC) Init(1)
 Always inline subword atomic operations.
 
 minline-strcmp
-Target Var(riscv_inline_strcmp) Init(0)
+Target Var(riscv_inline_strcmp) Init(1)
 Inline strcmp calls if possible.
 
 minline-strncmp
-Target Var(riscv_inline_strncmp) Init(0)
+Target Var(riscv_inline_strncmp) Init(1)
 Inline strncmp calls if possible.
 
 minline-strlen
-Target Var(riscv_inline_strlen) Init(0)
+Target Var(riscv_inline_strlen) Init(1)
 Inline strlen calls if possible.
 
 -param=riscv-strcmp-inline-limit=
diff --git a/gcc/testsuite/gcc.target/riscv/zbb-strlen-disabled-2.c 
b/gcc/testsuite/gcc.target/riscv/zbb-strlen-disabled-2.c
index a481068aa0c7..1295aeb0086e 100644
--- a/gcc/testsuite/gcc.target/riscv/zbb-strlen-disabled-2.c
+++ b/gcc/testsuite/gcc.target/riscv/zbb-strlen-disabled-2.c
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv32gc_zbb" { target { rv32 } } } */
-/* { dg-options "-march=rv64gc_zbb" { target { rv64 } } } */
+/* { dg-options "-mno-inline-strlen -march=rv32gc_zbb" { target { rv32 } } } */
+/* { dg-options "-mno-inline-strlen -march=rv64gc_zbb" { target { rv64 } } } */
 /* { dg-skip-if "" { *-*-* } { "-O0" "-Os" "-Og" "-Oz" } } */
 
 typedef long unsigned int size_t;

Reply via email to