From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id DCEAC3858400; Wed, 10 Nov 2021 16:17:37 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DCEAC3858400 From: "navidrahimi at microsoft dot com" To: gcc-bugs@gcc.gnu.org Subject: [Bug tree-optimization/102232] Missed arithmetic fold Date: Wed, 10 Nov 2021 16:17:37 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: tree-optimization X-Bugzilla-Version: 12.0 X-Bugzilla-Keywords: missed-optimization, TREE X-Bugzilla-Severity: enhancement X-Bugzilla-Who: navidrahimi at microsoft dot com X-Bugzilla-Status: NEW X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: attachments.isobsolete Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: gcc-bugs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-bugs mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 10 Nov 2021 16:17:38 -0000 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D102232 navidrahimi changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #51752|0 |1 is obsolete| | --- Comment #5 from navidrahimi --- Comment on attachment 51752 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=3D51752 [PATCH] PR tree-optimization/102232 >>From 7c2abb0eab05766ab879066b000c13de827e3b3d Mon Sep 17 00:00:00 2001 >From: Navid Rahimi >Date: Mon, 8 Nov 2021 13:57:19 -0800 >Subject: [PATCH] PR tree-optimization/102232 > > * match.pd (x * (1 + y / x) - y) -> (x - y % x): New optimization. > * gcc.dg/tree-ssa/pr102232.c: testcase for this optimization. >--- > gcc/match.pd | 7 ++++ > gcc/testsuite/gcc.dg/tree-ssa/pr102232.c | 52 ++++++++++++++++++++++++ > 2 files changed, 59 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr102232.c > >diff --git a/gcc/match.pd b/gcc/match.pd >index 71cf6f9df0a..37c01e79d97 100644 >--- a/gcc/match.pd >+++ b/gcc/match.pd >@@ -1295,6 +1295,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (bit_xor (bit_ior:c (bit_not @0) @1) (bit_ior:c @0 (bit_not @1))) > (bit_xor @0 @1)) >=20 >+/* x * (1 + y / x) - y -> x - y % x */ >+(simplify >+ (minus (mult:cs @0 (plus:cs integer_onep (trunc_div:s @1 @0))) @1) >+ (if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) >+ && types_match (@0, @1)) >+ (minus @0 (trunc_mod @1 @0)))) >+ > /* ((x & y) - (x | y)) - 1 -> ~(x ^ y) */ > (simplify > (plus (nop_convert1? (minus@2 (nop_convert2? (bit_and:c @0 @1)) >diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr102232.c b/gcc/testsuite/gcc.= dg/tree-ssa/pr102232.c >new file mode 100644 >index 00000000000..e7485cf24e9 >--- /dev/null >+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr102232.c >@@ -0,0 +1,52 @@ >+/* PR tree-optimization/102232 */ >+/* { dg-do run } */ >+/* { dg-options "-O3 -fdump-tree-optimized" } */ >+ >+int __attribute__ ((noipa)) foo (int a, int b) >+{ >+ return b * (1 + a / b) - a; >+} >+ >+int >+main (void) >+{ >+ // few randomly generated test cases >+ if (foo (71856034, 238) !=3D 212) >+ { >+ return 1; >+ } >+ if (foo (71856034, 10909) !=3D 1549) >+ { >+ return 1; >+ } >+ if (foo (20350, 1744) !=3D 578) >+ { >+ return 1; >+ } >+ if (foo (444813, 88563) !=3D 86565) >+ { >+ return 1; >+ } >+ if (foo (112237, 63004) !=3D 13771) >+ { >+ return 1; >+ } >+ if (foo (68268386, 787116) !=3D 210706) >+ { >+ return 1; >+ } >+ if (foo (-444813, 88563) !=3D 90561) >+ { >+ return 1; >+ } >+ if (foo (-68268386, 787116) !=3D 1363526) >+ { >+ return 1; >+ } >+ >+ return 0; >+} >+ >+/* Verify that multiplication and division has been removed. */ >+/* { dg-final { scan-tree-dump-not " \\* " "optimized" } } */ >+/* { dg-final { scan-tree-dump-not " / " "optimized" } } */ >\ No newline at end of file >--=20 >2.25.1 >=