From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 75142 invoked by alias); 30 Apr 2015 09:34:11 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 75130 invoked by uid 89); 30 Apr 2015 09:34:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-ob0-f175.google.com Received: from mail-ob0-f175.google.com (HELO mail-ob0-f175.google.com) (209.85.214.175) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Thu, 30 Apr 2015 09:34:09 +0000 Received: by obbeb7 with SMTP id eb7so40065620obb.3 for ; Thu, 30 Apr 2015 02:34:07 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.202.71.84 with SMTP id u81mr2566989oia.81.1430386447244; Thu, 30 Apr 2015 02:34:07 -0700 (PDT) Received: by 10.76.115.167 with HTTP; Thu, 30 Apr 2015 02:34:07 -0700 (PDT) In-Reply-To: <1421837394-7619-5-git-send-email-rv@rasmusvillemoes.dk> References: <1421837394-7619-1-git-send-email-rv@rasmusvillemoes.dk> <1421837394-7619-5-git-send-email-rv@rasmusvillemoes.dk> Date: Thu, 30 Apr 2015 09:42:00 -0000 Message-ID: Subject: Re: [PATCH 4/4] match.pd: Add x + ((-x) & m) -> (x + m) & ~m pattern From: Richard Biener To: Rasmus Villemoes Cc: GCC Patches , Andrew Pinski Content-Type: text/plain; charset=UTF-8 X-IsSubscribed: yes X-SW-Source: 2015-04/txt/msg01988.txt.bz2 On Wed, Jan 21, 2015 at 11:49 AM, Rasmus Villemoes wrote: > Generalizing the x+(x&1) pattern, one can round up x to a multiple of > a 2^k by adding the negative of x modulo 2^k. But it is fewer > instructions, and presumably requires fewer registers, to do the more > common (x+m)&~m where m=2^k-1. > > Signed-off-by: Rasmus Villemoes > --- > gcc/match.pd | 9 ++++++ > gcc/testsuite/gcc.dg/20150120-4.c | 59 +++++++++++++++++++++++++++++++++++++++ > 2 files changed, 68 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/20150120-4.c > > diff --git gcc/match.pd gcc/match.pd > index 47865f1..93c2298 100644 > --- gcc/match.pd > +++ gcc/match.pd > @@ -273,6 +273,15 @@ along with GCC; see the file COPYING3. If not see > (if (TREE_CODE (@2) != SSA_NAME || has_single_use (@2)) > (bit_ior @0 (bit_not @1)))) > > +/* x + ((-x) & m) -> (x + m) & ~m when m == 2^k-1. */ > +(simplify > + (plus:c @0 (bit_and@2 (negate @0) CONSTANT_CLASS_P@1)) I think you want to restrict this to INTEGER_CST@1 > + (with { tree cst = fold_binary (PLUS_EXPR, TREE_TYPE (@1), > + @1, build_one_cst (TREE_TYPE (@1))); } We shouldn't dispatch to fold_binary in patterns. int_const_binop would be the appropriate function to use - but what happens for @1 == INT_MAX where @1 + 1 overflows? Similar, is this also valid for negative @1 and thus signed mask types? IMHO we should check whether @1 is equal to wi::mask (TYPE_PRECISION (TREE_TYPE (@1)) - wi::clz (@1), false, TYPE_PRECISION (TREE_TYPE (@1)). As with the other patch a ChangeLog entry is missing as well as stating how you tested the patch. Thanks, Richard. > + (if ((TREE_CODE (@2) != SSA_NAME || has_single_use (@2)) > + && cst && integer_pow2p (cst)) > + (bit_and (plus @0 @1) (bit_not @1))))) > + > (simplify > (abs (negate @0)) > (abs @0)) > diff --git gcc/testsuite/gcc.dg/20150120-4.c gcc/testsuite/gcc.dg/20150120-4.c > new file mode 100644 > index 0000000..c3552bf > --- /dev/null > +++ gcc/testsuite/gcc.dg/20150120-4.c > @@ -0,0 +1,59 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-original" } */ > + > +/* x + ((-x) & m) -> (x + m) & ~m for m one less than a pow2. */ > +int > +fn1 (int x) > +{ > + return x + ((-x) & 7); > +} > +int > +fn2 (int x) > +{ > + return ((-x) & 7) + x; > +} > +unsigned int > +fn3 (unsigned int x) > +{ > + return x + ((-x) & 7); > +} > +unsigned int > +fn4 (unsigned int x) > +{ > + return ((-x) & 7) + x; > +} > +unsigned int > +fn5 (unsigned int x) > +{ > + return x + ((-x) % 8); > +} > +unsigned int > +fn6 (unsigned int x) > +{ > + return ((-x) % 8) + x; > +} > +int > +fn7 (int x) > +{ > + return x + ((-x) & 9); > +} > +int > +fn8 (int x) > +{ > + return ((-x) & 9) + x; > +} > +unsigned int > +fn9 (unsigned int x) > +{ > + return x + ((-x) & ~0U); > +} > +unsigned int > +fn10 (unsigned int x) > +{ > + return ((-x) & ~0U) + x; > +} > + > + > +/* { dg-final { scan-tree-dump-times "x \\+ 7" 6 "original" } } */ > +/* { dg-final { scan-tree-dump-times "-x & 9" 2 "original" } } */ > +/* { dg-final { scan-tree-dump-times "return 0" 2 "original" } } */ > -- > 2.1.3 >