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 *-*-* } } } */
next prev 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).