From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by sourceware.org (Postfix) with ESMTPS id E017F3858413 for ; Mon, 25 Jul 2022 19:50:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E017F3858413 Received: by mail-pj1-x1031.google.com with SMTP id t3-20020a17090a3b4300b001f21eb7e8b0so14727527pjf.1 for ; Mon, 25 Jul 2022 12:50:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=ULEpa9uhx+Ai/qLOx8lKy7vMoFZu2TQTXivC6hREvJk=; b=0+U9qiOO/P5PXfCUQPHrGEW87si9c1pntdnX0tJhC0DAzXkUOa3k43l5p4uAyqsfYF xqmqIVviwlm4PMpulC8joZlkzB2xstT9+EZrbJ62w4nI+PSI1d4/pjBpwUQHhHo0mHcS 0xjDcW7S2LzzJUVMzBRY+3VAKJBNwP6nEtixY6A+JaaFT3rx9H7gIMJSC3JYG6PgIkxu LQzKY1fe4VjiZZuxAISFFiZal3dGfCA1e4+LhwfaoHkCKgBg9Vv15z9diHcTqU67edQK +6ZdUb9DYftcTNw9kJ0Od2efys696EXPaJ49MT2Ku/myLUrjLGYMTrATnI1X8V/Ojwvb GtuA== X-Gm-Message-State: AJIora8DKIiRLKEV5KafVQZkSnG75cjrq3+qxSNFCjBbqkA360WfQLa7 7xxlYQIcilF5HXwCay8hEuUkAkUeHSzpdsOM0vy8O8d05do= X-Google-Smtp-Source: AGRyM1sNZcwh4cdtZXwcherIS1bJpk9ORpXQkzyGOxwhcEbTWlSOQRjrhCPdQnsEXvn2QhMreY20b8ZsMT5zKE7BHH4= X-Received: by 2002:a17:90a:9709:b0:1f2:84a:cc7d with SMTP id x9-20020a17090a970900b001f2084acc7dmr15522824pjo.180.1658778607717; Mon, 25 Jul 2022 12:50:07 -0700 (PDT) MIME-Version: 1.0 References: <20220725193425.511903-1-sfeifer@redhat.com> In-Reply-To: <20220725193425.511903-1-sfeifer@redhat.com> From: Andrew Pinski Date: Mon, 25 Jul 2022 12:49:55 -0700 Message-ID: Subject: Re: [PATCH] match.pd: Add new division pattern [PR104992] To: Sam Feifer Cc: GCC Patches Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-7.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 25 Jul 2022 19:50:12 -0000 On Mon, Jul 25, 2022 at 12:37 PM Sam Feifer via Gcc-patches 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 >