public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Pat Haugen <pthaugen@linux.ibm.com>
To: GCC Patches <gcc-patches@gcc.gnu.org>,
	Segher Boessenkool <segher@kernel.crashing.org>,
	Peter Bergner <bergner@linux.ibm.com>,
	David Edelsohn <dje.gcc@gmail.com>,
	"Kewen.Lin" <linkw@linux.ibm.com>
Subject: Re: [PATCH V2, rs6000] Disable generation of scalar modulo instructions
Date: Fri, 2 Jun 2023 10:13:29 -0500	[thread overview]
Message-ID: <76007815-81cd-f7b9-06e4-b0250a27b0f4@linux.ibm.com> (raw)
In-Reply-To: <36819cc8-c948-1426-2429-7fe4f6b67c94@linux.ibm.com>

Ping ^3

On 4/18/23 7:22 AM, Pat Haugen via Gcc-patches wrote:
> Updated from prior patch to also disable for int128.
> 
> 
> Disable generation of scalar modulo instructions.
> 
> It was recently discovered that the scalar modulo instructions can suffer
> noticeable performance issues for certain input values. This patch disables
> their generation since the equivalent div/mul/sub sequence does not suffer
> the same problem.
> 
> Bootstrapped and regression tested on powerpc64/powerpc64le.
> Ok for master and backports after burn in?
> 
> -Pat
> 
> 
> 2023-04-18  Pat Haugen  <pthaugen@linux.ibm.com>
> 
> gcc/
>      * config/rs6000/rs6000.h (RS6000_DISABLE_SCALAR_MODULO): New.
>      * config/rs6000/rs6000.md (mod<mode>3, *mod<mode>3): Disable.
>      (define_expand umod<mode>3): New.
>      (define_insn umod<mode>3): Rename to *umod<mode>3 and disable.
>      (umodti3, modti3): Disable.
> 
> gcc/testsuite/
>      * gcc.target/powerpc/clone1.c: Add xfails.
>      * gcc.target/powerpc/clone3.c: Likewise.
>      * gcc.target/powerpc/mod-1.c: Likewise.
>      * gcc.target/powerpc/mod-2.c: Likewise.
>      * gcc.target/powerpc/p10-vdivq-vmodq.c: Likewise.
> 
> 
> diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
> index 3503614efbd..1cf0a0013c0 100644
> --- a/gcc/config/rs6000/rs6000.h
> +++ b/gcc/config/rs6000/rs6000.h
> @@ -2492,3 +2492,9 @@ while (0)
>          rs6000_asm_output_opcode (STREAM);                \
>       }                                    \
>     while (0)
> +
> +/* Disable generation of scalar modulo instructions due to performance 
> issues
> +   with certain input values. This can be removed in the future when the
> +   issues have been resolved.  */
> +#define RS6000_DISABLE_SCALAR_MODULO 1
> +
> diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
> index 44f7dd509cb..4f397bc9179 100644
> --- a/gcc/config/rs6000/rs6000.md
> +++ b/gcc/config/rs6000/rs6000.md
> @@ -3421,6 +3421,17 @@ (define_expand "mod<mode>3"
>       FAIL;
> 
>         operands[2] = force_reg (<MODE>mode, operands[2]);
> +
> +      if (RS6000_DISABLE_SCALAR_MODULO)
> +    {
> +      temp1 = gen_reg_rtx (<MODE>mode);
> +      temp2 = gen_reg_rtx (<MODE>mode);
> +
> +      emit_insn (gen_div<mode>3 (temp1, operands[1], operands[2]));
> +      emit_insn (gen_mul<mode>3 (temp2, temp1, operands[2]));
> +      emit_insn (gen_sub<mode>3 (operands[0], operands[1], temp2));
> +      DONE;
> +    }
>       }
>     else
>       {
> @@ -3440,17 +3451,42 @@ (define_insn "*mod<mode>3"
>     [(set (match_operand:GPR 0 "gpc_reg_operand" "=&r,r")
>           (mod:GPR (match_operand:GPR 1 "gpc_reg_operand" "r,r")
>            (match_operand:GPR 2 "gpc_reg_operand" "r,r")))]
> -  "TARGET_MODULO"
> +  "TARGET_MODULO && !RS6000_DISABLE_SCALAR_MODULO"
>     "mods<wd> %0,%1,%2"
>     [(set_attr "type" "div")
>      (set_attr "size" "<bits>")])
> 
> +;; This define_expand can be removed when RS6000_DISABLE_SCALAR_MODULO is
> +;; removed.
> +(define_expand "umod<mode>3"
> +  [(set (match_operand:GPR 0 "gpc_reg_operand")
> +    (umod:GPR (match_operand:GPR 1 "gpc_reg_operand")
> +          (match_operand:GPR 2 "gpc_reg_operand")))]
> +  ""
> +{
> +  rtx temp1;
> +  rtx temp2;
> +
> +  if (!TARGET_MODULO)
> +    FAIL;
> 
> -(define_insn "umod<mode>3"
> +  if (RS6000_DISABLE_SCALAR_MODULO)
> +    {
> +      temp1 = gen_reg_rtx (<MODE>mode);
> +      temp2 = gen_reg_rtx (<MODE>mode);
> +
> +      emit_insn (gen_udiv<mode>3 (temp1, operands[1], operands[2]));
> +      emit_insn (gen_mul<mode>3 (temp2, temp1, operands[2]));
> +      emit_insn (gen_sub<mode>3 (operands[0], operands[1], temp2));
> +      DONE;
> +    }
> +})
> +
> +(define_insn "*umod<mode>3"
>     [(set (match_operand:GPR 0 "gpc_reg_operand" "=&r,r")
>           (umod:GPR (match_operand:GPR 1 "gpc_reg_operand" "r,r")
>             (match_operand:GPR 2 "gpc_reg_operand" "r,r")))]
> -  "TARGET_MODULO"
> +  "TARGET_MODULO && !RS6000_DISABLE_SCALAR_MODULO"
>     "modu<wd> %0,%1,%2"
>     [(set_attr "type" "div")
>      (set_attr "size" "<bits>")])
> @@ -3507,7 +3543,7 @@ (define_insn "umodti3"
>     [(set (match_operand:TI 0 "altivec_register_operand" "=v")
>       (umod:TI (match_operand:TI 1 "altivec_register_operand" "v")
>            (match_operand:TI 2 "altivec_register_operand" "v")))]
> -  "TARGET_POWER10 && TARGET_POWERPC64"
> +  "TARGET_POWER10 && TARGET_POWERPC64 && !RS6000_DISABLE_SCALAR_MODULO"
>     "vmoduq %0,%1,%2"
>     [(set_attr "type" "vecdiv")
>      (set_attr "size" "128")])
> @@ -3516,7 +3552,7 @@ (define_insn "modti3"
>     [(set (match_operand:TI 0 "altivec_register_operand" "=v")
>       (mod:TI (match_operand:TI 1 "altivec_register_operand" "v")
>           (match_operand:TI 2 "altivec_register_operand" "v")))]
> -  "TARGET_POWER10 && TARGET_POWERPC64"
> +  "TARGET_POWER10 && TARGET_POWERPC64 && !RS6000_DISABLE_SCALAR_MODULO"
>     "vmodsq %0,%1,%2"
>     [(set_attr "type" "vecdiv")
>      (set_attr "size" "128")])
> diff --git a/gcc/testsuite/gcc.target/powerpc/clone1.c 
> b/gcc/testsuite/gcc.target/powerpc/clone1.c
> index c69fd2aa1b8..74323ca0e8c 100644
> --- a/gcc/testsuite/gcc.target/powerpc/clone1.c
> +++ b/gcc/testsuite/gcc.target/powerpc/clone1.c
> @@ -21,6 +21,7 @@ long mod_func_or (long a, long b, long c)
>     return mod_func (a, b) | c;
>   }
> 
> -/* { dg-final { scan-assembler-times {\mdivd\M}  1 } } */
> -/* { dg-final { scan-assembler-times {\mmulld\M} 1 } } */
> -/* { dg-final { scan-assembler-times {\mmodsd\M} 1 } } */
> +/* { Fail due to RS6000_DISABLE_SCALAR_MODULO. */
> +/* { dg-final { scan-assembler-times {\mdivd\M}  1 { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-times {\mmulld\M} 1 { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-times {\mmodsd\M} 1 { xfail *-*-* } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/clone3.c 
> b/gcc/testsuite/gcc.target/powerpc/clone3.c
> index 911b88b781d..d3eb4dd2378 100644
> --- a/gcc/testsuite/gcc.target/powerpc/clone3.c
> +++ b/gcc/testsuite/gcc.target/powerpc/clone3.c
> @@ -27,7 +27,8 @@ long mod_func_or (long a, long b, long c)
>     return mod_func (a, b) | c;
>   }
> 
> -/* { dg-final { scan-assembler-times {\mdivd\M}  1 } } */
> -/* { dg-final { scan-assembler-times {\mmulld\M} 1 } } */
> -/* { dg-final { scan-assembler-times {\mmodsd\M} 2 } } */
> +/* { Fail due to RS6000_DISABLE_SCALAR_MODULO. */
> +/* { dg-final { scan-assembler-times {\mdivd\M}  1 { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-times {\mmulld\M} 1 { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-times {\mmodsd\M} 2 { xfail *-*-* } } } */
>   /* { dg-final { scan-assembler-times {\mpld\M}   1 } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/mod-1.c 
> b/gcc/testsuite/gcc.target/powerpc/mod-1.c
> index 861ba670af4..74af98f5bc3 100644
> --- a/gcc/testsuite/gcc.target/powerpc/mod-1.c
> +++ b/gcc/testsuite/gcc.target/powerpc/mod-1.c
> @@ -7,13 +7,14 @@ long lsmod (long a, long b) { return a%b; }
>   unsigned int iumod (unsigned int a, unsigned int b) { return a%b; }
>   unsigned long lumod (unsigned long a, unsigned long b) { return a%b; }
> 
> -/* { dg-final { scan-assembler-times "modsw " 1 } } */
> -/* { dg-final { scan-assembler-times "modsd " 1 } } */
> -/* { dg-final { scan-assembler-times "moduw " 1 } } */
> -/* { dg-final { scan-assembler-times "modud " 1 } } */
> -/* { dg-final { scan-assembler-not   "mullw "   } } */
> -/* { dg-final { scan-assembler-not   "mulld "   } } */
> -/* { dg-final { scan-assembler-not   "divw "    } } */
> -/* { dg-final { scan-assembler-not   "divd "    } } */
> -/* { dg-final { scan-assembler-not   "divwu "   } } */
> -/* { dg-final { scan-assembler-not   "divdu "   } } */
> +/* { Fail due to RS6000_DISABLE_SCALAR_MODULO. */
> +/* { dg-final { scan-assembler-times "modsw " 1 { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-times "modsd " 1 { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-times "moduw " 1 { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-times "modud " 1 { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-not   "mullw "   { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-not   "mulld "   { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-not   "divw "    { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-not   "divd "    { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-not   "divwu "   { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-not   "divdu "   { xfail *-*-* } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/mod-2.c 
> b/gcc/testsuite/gcc.target/powerpc/mod-2.c
> index 441ec5878f1..896e2e35260 100644
> --- a/gcc/testsuite/gcc.target/powerpc/mod-2.c
> +++ b/gcc/testsuite/gcc.target/powerpc/mod-2.c
> @@ -5,8 +5,9 @@
>   int ismod (int a, int b) { return a%b; }
>   unsigned int iumod (unsigned int a, unsigned int b) { return a%b; }
> 
> -/* { dg-final { scan-assembler-times "modsw " 1 } } */
> -/* { dg-final { scan-assembler-times "moduw " 1 } } */
> -/* { dg-final { scan-assembler-not   "mullw "   } } */
> -/* { dg-final { scan-assembler-not   "divw "    } } */
> -/* { dg-final { scan-assembler-not   "divwu "   } } */
> +/* { Fail due to RS6000_DISABLE_SCALAR_MODULO. */
> +/* { dg-final { scan-assembler-times "modsw " 1 { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-times "moduw " 1 { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-not   "mullw "   { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-not   "divw "    { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler-not   "divwu "   { xfail *-*-* } } } */
> diff --git a/gcc/testsuite/gcc.target/powerpc/p10-vdivq-vmodq.c 
> b/gcc/testsuite/gcc.target/powerpc/p10-vdivq-vmodq.c
> index 84685e5ff43..148998c8c9d 100644
> --- a/gcc/testsuite/gcc.target/powerpc/p10-vdivq-vmodq.c
> +++ b/gcc/testsuite/gcc.target/powerpc/p10-vdivq-vmodq.c
> @@ -23,5 +23,6 @@ __int128 s_mod(__int128 a, __int128 b)
> 
>   /* { dg-final { scan-assembler {\mvdivsq\M} } } */
>   /* { dg-final { scan-assembler {\mvdivuq\M} } } */
> -/* { dg-final { scan-assembler {\mvmodsq\M} } } */
> -/* { dg-final { scan-assembler {\mvmoduq\M} } } */
> +/* { Fail due to RS6000_DISABLE_SCALAR_MODULO. */
> +/* { dg-final { scan-assembler {\mvmodsq\M} { xfail *-*-* } } } */
> +/* { dg-final { scan-assembler {\mvmoduq\M} { xfail *-*-* } } } */


  parent reply	other threads:[~2023-06-02 15:13 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-18 12:22 Pat Haugen
2023-05-04 20:25 ` Pat Haugen
2023-05-18 17:57 ` Pat Haugen
2023-06-02 15:13 ` Pat Haugen [this message]
2023-06-05  6:10 ` Kewen.Lin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=76007815-81cd-f7b9-06e4-b0250a27b0f4@linux.ibm.com \
    --to=pthaugen@linux.ibm.com \
    --cc=bergner@linux.ibm.com \
    --cc=dje.gcc@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=linkw@linux.ibm.com \
    --cc=segher@kernel.crashing.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).