https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102232
navidrahimi <navidrahimi at microsoft dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- Attachment #51752|0 |1 is obsolete| | --- Comment #5 from navidrahimi <navidrahimi at microsoft dot com> --- Comment on attachment 51752 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=51752 [PATCH] PR tree-optimization/102232 >From 7c2abb0eab05766ab879066b000c13de827e3b3d Mon Sep 17 00:00:00 2001 >From: Navid Rahimi <navidrah...@microsoft.com> >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)) > >+/* 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) != 212) >+ { >+ return 1; >+ } >+ if (foo (71856034, 10909) != 1549) >+ { >+ return 1; >+ } >+ if (foo (20350, 1744) != 578) >+ { >+ return 1; >+ } >+ if (foo (444813, 88563) != 86565) >+ { >+ return 1; >+ } >+ if (foo (112237, 63004) != 13771) >+ { >+ return 1; >+ } >+ if (foo (68268386, 787116) != 210706) >+ { >+ return 1; >+ } >+ if (foo (-444813, 88563) != 90561) >+ { >+ return 1; >+ } >+ if (foo (-68268386, 787116) != 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 >-- >2.25.1 >