public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Andrew Pinski <pinskia@gmail.com>
To: Sam Feifer <sfeifer@redhat.com>
Cc: GCC Patches <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH] match.pd: Add new division pattern [PR104992]
Date: Mon, 25 Jul 2022 12:49:55 -0700	[thread overview]
Message-ID: <CA+=Sn1n6T-eyB1XekNPWcVgyA04z3SW3_r6P7w6auo8ZVPZ2pw@mail.gmail.com> (raw)
In-Reply-To: <20220725193425.511903-1-sfeifer@redhat.com>

On Mon, Jul 25, 2022 at 12:37 PM Sam Feifer via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> This patch fixes a missed optimization in match.pd. It takes the pattern, x / y * y == x, and optimizes it to x % y == 0. This produces fewer instructions.
>
> There are also tests for the optimizations to be added to the test suite.
>
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
>
>         PR tree-optimization/104992
>
> gcc/ChangeLog:
>
>         * match.pd x / y * y == x: New simplification.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/pr104992-1.c: New test.
>         * gcc.dg/pr104992.c: New test.
> ---
>  gcc/match.pd                      |  5 +++++
>  gcc/testsuite/gcc.dg/pr104992-1.c | 30 ++++++++++++++++++++++++++
>  gcc/testsuite/gcc.dg/pr104992.c   | 35 +++++++++++++++++++++++++++++++
>  3 files changed, 70 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.dg/pr104992-1.c
>  create mode 100644 gcc/testsuite/gcc.dg/pr104992.c
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 9736393061a..f7ab2174b8a 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -8054,3 +8054,8 @@ and,
>        (if (TYPE_UNSIGNED (TREE_TYPE (@0)))
>          (bit_and @0 @1)
>        (cond (le @0 @1) @0 (bit_and @0 @1))))))
> +
> +/* x / y * y == x -> x % y == 0.  */
> +(simplify
> +  (eq (mult (trunc_div @0 @1) @1) @0)
> +  (eq (trunc_mod @0 @1) { build_zero_cst TREE_TYPE(@0); }))

I suspect for eq and mult you might want to add :c to them even though
in your testcase you don't need them, you might be able to get it via
using different statements and looking at the forwprop gimple dump.
Also, did you send the wrong patch as it looks like the function call
to build_zero_cst has been eaten ... (or is it just because TREE_TYPE
has parentheses inside the macro and it just accidently works :)).

You might also want to make sure it does the right thing for vector
types and complex types (yes both are valid for trunc_div still).

Thanks,
Andrew Pinski

> diff --git a/gcc/testsuite/gcc.dg/pr104992-1.c b/gcc/testsuite/gcc.dg/pr104992-1.c
> new file mode 100644
> index 00000000000..a80e5e180ce
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr104992-1.c
> @@ -0,0 +1,30 @@
> +/* PR tree-optimization/104992 */
> +/* { dg-do run } */
> +/* { dg-options "-O2"} */
> +
> +#include "pr104992.c"
> +
> +int main () {
> +
> +    /* Should be true.  */
> +    if (!foo(6, 3)
> +        || !bar(12, 2)
> +        || !baz(34, 17)
> +        || !qux(50, 10)
> +        || !fred(16, 8)
> +        || !baz(-9, 3)
> +        || !baz(9, -3)
> +        || !baz(-9, -3)
> +        ) {
> +            __builtin_abort();
> +         }
> +
> +    /* Should be false.  */
> +    if (foo(5, 30)
> +        || bar(72, 27)
> +        || baz(42, 15)) {
> +            __builtin_abort();
> +        }
> +
> +    return 0;
> +}
> diff --git a/gcc/testsuite/gcc.dg/pr104992.c b/gcc/testsuite/gcc.dg/pr104992.c
> new file mode 100644
> index 00000000000..b4b0ca53118
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr104992.c
> @@ -0,0 +1,35 @@
> +/* PR tree-optimization/104992 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> +
> +/* Form from PR.  */
> +__attribute__((noipa)) unsigned foo(unsigned x, unsigned y)
> +{
> +    return x / y * y == x;
> +}
> +
> +__attribute__((noipa)) unsigned bar(unsigned x, unsigned y) {
> +    return x == x / y * y;
> +}
> +
> +/* Signed test case.  */
> +__attribute__((noipa)) unsigned baz (int x, int y) {
> +    return x / y * y == x;
> +}
> +
> +/* Changed order.  */
> +__attribute__((noipa)) unsigned qux (unsigned x, unsigned y) {
> +    return y * (x / y) == x;
> +}
> +
> +/* Wrong order.  */
> +__attribute__((noipa)) unsigned fred (unsigned x, unsigned y) {
> +    return y * x / y == x;
> +}
> +
> +/* Wrong pattern.  */
> +__attribute__((noipa)) unsigned waldo (unsigned x, unsigned y, unsigned z) {
> +    return x / y * z == x;
> +}
> +
> +/* { dg-final {scan-tree-dump-times " % " 4 "optimized" } } */
>
> base-commit: 633e9920589ddfaf2d6da1c24ce99b18a2638db4
> --
> 2.31.1
>

  reply	other threads:[~2022-07-25 19:50 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-25 19:34 Sam Feifer
2022-07-25 19:49 ` Andrew Pinski [this message]
2022-07-25 20:59   ` Sam Feifer
2022-07-25 21:14     ` Andrew Pinski
2022-07-26 14:31       ` Sam Feifer
2022-07-27  8:42         ` Richard Biener
2022-07-27 19:57           ` Sam Feifer
2022-07-28  7:03             ` Richard Biener
2022-08-01 13:27               ` Sam Feifer

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='CA+=Sn1n6T-eyB1XekNPWcVgyA04z3SW3_r6P7w6auo8ZVPZ2pw@mail.gmail.com' \
    --to=pinskia@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=sfeifer@redhat.com \
    /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).