From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 90649 invoked by alias); 17 Aug 2016 06:55:21 -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 90538 invoked by uid 89); 17 Aug 2016 06:55:20 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_PASS autolearn=ham version=3.3.2 spammy=smarter, Hx-languages-length:1454 X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 17 Aug 2016 06:55:10 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 95E50AC0F for ; Wed, 17 Aug 2016 06:55:07 +0000 (UTC) Resent-From: =?UTF-8?Q?Martin_Li=c5=a1ka?= Resent-To: GCC Patches Resent-Date: Wed, 17 Aug 2016 08:55:06 +0200 Resent-Message-ID: Resent-User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2 Message-Id: <2f0f974b776ee917d094b78cd9b77b992988499c.1471416736.git.mliska@suse.cz> In-Reply-To: References: From: marxin Date: Wed, 17 Aug 2016 06:55:00 -0000 Subject: [PATCH 2/3] Smarter folding of __builtin_memchr To: gcc-patches@gcc.gnu.org X-IsSubscribed: yes X-SW-Source: 2016-08/txt/msg01233.txt.bz2 gcc/ChangeLog: 2016-08-16 Martin Liska * builtins.c (fold_builtin_memchr): Support following transformations: memchr (x, y, 0) -> NULL memchr ("known_string", 'n', 5) -> &"known_string" + 1 memchr ("known_string", 'n', 1) -> NULL --- gcc/builtins.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/gcc/builtins.c b/gcc/builtins.c index 8f1c752..ac251f8 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -7267,8 +7267,12 @@ fold_builtin_memchr (location_t loc, tree arg1, tree arg2, tree len, tree type) || !tree_fits_uhwi_p (len)) return NULL_TREE; + /* If the LEN parameter is zero, return zero. */ + if (integer_zerop (len)) + return build_int_cst (TREE_TYPE (arg1), 0); + p1 = c_getstr (arg1); - if (p1 && compare_tree_int (len, strlen (p1) + 1) <= 0) + if (p1) { char c; const char *r; @@ -7281,9 +7285,17 @@ fold_builtin_memchr (location_t loc, tree arg1, tree arg2, tree len, tree type) if (r == NULL) return build_int_cst (TREE_TYPE (arg1), 0); - - tem = fold_build_pointer_plus_hwi_loc (loc, arg1, r - p1); - return fold_convert_loc (loc, type, tem); + else + { + size_t offset = r - p1; + if (compare_tree_int (len, offset) <= 0) + return build_int_cst (TREE_TYPE (arg1), 0); + else + { + tem = fold_build_pointer_plus_hwi_loc (loc, arg1, offset); + return fold_convert_loc (loc, type, tem); + } + } } return NULL_TREE; } -- 2.9.2