From patchwork Mon Apr 18 17:00:45 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wilco Dijkstra X-Patchwork-Id: 611818 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3qpZDH3fyqz9t3w for ; Tue, 19 Apr 2016 03:01:16 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=kQaOye78; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:mime-version:content-type :content-transfer-encoding; q=dns; s=default; b=j8b5890ML/m6Css8 rP1DZRPG60HAydw7Ma/y0wcux0VXZ1wyv4X+/pq2sxE4GxM5iGg8JvJrUIlnaS5a zAUOzODKNYJN+RQqkq+B+PamvHx0whVg3+7sbpkppy+Ugu1AOkxnV2LzmRAKoYQi oStCFU/l+o/vvSOo1u9BpJ8WRvk= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:mime-version:content-type :content-transfer-encoding; s=default; bh=0bnzwS8rbrc7FEPn24lIDh mafx8=; b=kQaOye788hPnVZRT1JB7hyQNYaUgFvVEmvY/+yt1J8Ei0IYywUnvyO lBv3K8vEsxjRfyuHnuoBHteYUo3chLH0eeLf+LJ4+vATcQpunhhBVRv3g2uSa5SJ +tz81odyZBUwPNdnLo/O4p9DJSvyf5x7dex/LipmyKo1KGpKho7is= Received: (qmail 89086 invoked by alias); 18 Apr 2016 17:01:03 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 89072 invoked by uid 89); 18 Apr 2016 17:01:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=BAYES_00, KAM_LOTSOFHASH, SPF_PASS autolearn=no version=3.3.2 spammy=21, 5, H*RU:15.01.0466.022, Hx-spam-relays-external:15.01.0466.022, H*r:15.01.0466.022 X-HELO: eu-smtp-delivery-143.mimecast.com Received: from eu-smtp-delivery-143.mimecast.com (HELO eu-smtp-delivery-143.mimecast.com) (207.82.80.143) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 18 Apr 2016 17:00:51 +0000 Received: from emea01-db3-obe.outbound.protection.outlook.com (mail-db3lrp0083.outbound.protection.outlook.com [213.199.154.83]) (Using TLS) by eu-smtp-1.mimecast.com with ESMTP id uk-mta-40-MP9_uMqoTNKY0gq0aRr3aQ-1; Mon, 18 Apr 2016 18:00:46 +0100 Received: from AM3PR08MB0088.eurprd08.prod.outlook.com (2a01:111:e400:8847::18) by AM3PR08MB0088.eurprd08.prod.outlook.com (2a01:111:e400:8847::18) with Microsoft SMTP Server (TLS) id 15.1.466.19; Mon, 18 Apr 2016 17:00:45 +0000 Received: from AM3PR08MB0088.eurprd08.prod.outlook.com ([fe80::d0af:2d98:cf1b:e43e]) by AM3PR08MB0088.eurprd08.prod.outlook.com ([fe80::d0af:2d98:cf1b:e43e%17]) with mapi id 15.01.0466.022; Mon, 18 Apr 2016 17:00:45 +0000 From: Wilco Dijkstra To: "gcc-patches@gcc.gnu.org" CC: nd Subject: [PATCH] Optimize strchr (s, 0) to strlen Date: Mon, 18 Apr 2016 17:00:45 +0000 Message-ID: x-ms-office365-filtering-correlation-id: aec47d8b-c716-44b7-f7b5-08d367aafb8d x-microsoft-exchange-diagnostics: 1; AM3PR08MB0088; 5:cl/1G7QREeoYVPksHO02xHg+i+aUBaGNBsp6KiU9dS0r4lEE68my+zhmxPm1DCZM+9KF3aAwe0KhMg9AYsBNra3bKB8kj1ZPXyPg/XhsRscJZraNAjlMrXBMekY0ZbekyF5tkvxtNT0PYeas+IJF3LH4m42Hr0lcrZ4dYdC1uNevKc3WHxn0v3fom+GMzvd6; 24:2v3spFdGhwjaNhqYYF/DRDvzz0el+aC8gQSXoIP5p1K6eyT+sxDnSmeZTmByIRxV1oXzoPAhmeN7m5oqiOQRpUoYUG0MC9SPbNNd+1RWEKs=; 7:NLoToNfBP65XDe3G/ZL2sESLU1DplrK0EFikkOka3rBWkUdTGLvLz44TdCegWkzsljQRjX5FtRRO9iZmdN2sGVugHCVTrSUcwleMZkzPPPiEOKbS42stH+NmFOwb18qNV4MgN9cLeFNU+VRKsKFF0NEv1auhbkUbn6XGEsxuD9cFddjXvtHmSvEBXmFtdFst6izneGPag4QUYI6JY19RNbarfOn4G1SXGdp+PVy4OgI=; 20:m9UlkNT2GdsNB9Vrrucz8kzXucJ3ku1QQUUSAod3+ELEeomzkOdAiac0Aho/VC2T6n/BD5pf5YCtcM5rxGRmOvoSceN3h+i6CMEhdjoWnlmgwc3dsdBI/DJPMl6jOh/64fVTdHjlNUgyRZD1S8ECaXCT4ayHP2Wc6+goYmdUr0M= x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:AM3PR08MB0088; nodisclaimer: True x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(9101521026)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001); SRVR:AM3PR08MB0088; BCL:0; PCL:0; RULEID:; SRVR:AM3PR08MB0088; x-forefront-prvs: 0916FC3A18 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(6009001)(377424004)(33656002)(450100001)(189998001)(229853001)(74316001)(106116001)(54356999)(575784001)(5250100002)(2351001)(86362001)(81166005)(2900100001)(19580405001)(2501003)(50986999)(11100500001)(110136002)(19580395003)(5002640100001)(5003600100002)(2906002)(76576001)(5008740100001)(66066001)(92566002)(3846002)(1220700001)(9686002)(586003)(102836003)(1096002)(6116002)(4326007)(87936001); DIR:OUT; SFP:1101; SCL:1; SRVR:AM3PR08MB0088; H:AM3PR08MB0088.eurprd08.prod.outlook.com; FPR:; SPF:None; MLV:sfv; LANG:en; spamdiagnosticoutput: 1:23 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-originalarrivaltime: 18 Apr 2016 17:00:45.0452 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM3PR08MB0088 X-MC-Unique: MP9_uMqoTNKY0gq0aRr3aQ-1 Optimize strchr (s, 0) to s + strlen (s). strchr (s, 0) appears a common idiom for finding the end of a string, however it is not a very efficient way of doing so. Strlen is a much simpler operation which is significantly faster (eg. on x86 strlen is 50% faster for strings of 8 bytes and about twice as fast as strchr on strings of 1KB). OK for trunk? ChangeLog: 2016-04-18 Wilco Dijkstra gcc/ * gcc/builtins.c (fold_builtin_strchr): Optimize strchr (s, 0) into strlen. testsuite/ * gcc/testsuite/gcc.dg/strlenopt-20.c: Update test. * gcc/testsuite/gcc.dg/strlenopt-21.c: Likewise. * gcc/testsuite/gcc.dg/strlenopt-22.c: Likewise. * gcc/testsuite/gcc.dg/strlenopt-26.c: Likewise. * gcc/testsuite/gcc.dg/strlenopt-5.c: Likewise. * gcc/testsuite/gcc.dg/strlenopt-7.c: Likewise. * gcc/testsuite/gcc.dg/strlenopt-9.c: Likewise. diff --git a/gcc/builtins.c b/gcc/builtins.c index 058ecc39aab205099713e503861103ce6ba5ee6d..150e707178a3e119d42ef630b384da3eaf7b2182 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -8567,20 +8567,20 @@ fold_builtin_strchr (location_t loc, tree s1, tree s2, tree type) else { const char *p1; + char c; if (TREE_CODE (s2) != INTEGER_CST) return NULL_TREE; + if (target_char_cast (s2, &c)) + return NULL_TREE; + p1 = c_getstr (s1); if (p1 != NULL) { - char c; const char *r; tree tem; - if (target_char_cast (s2, &c)) - return NULL_TREE; - r = strchr (p1, c); if (r == NULL) @@ -8590,6 +8590,20 @@ fold_builtin_strchr (location_t loc, tree s1, tree s2, tree type) tem = fold_build_pointer_plus_hwi_loc (loc, s1, r - p1); return fold_convert_loc (loc, type, tem); } + else if (c == 0) + { + tree fn = builtin_decl_implicit (BUILT_IN_STRLEN); + if (!fn) + return NULL_TREE; + + s1 = builtin_save_expr (s1); + + /* Transform strchr (s1, '\0') to s1 + strlen (s1). */ + fn = build_call_expr_loc (loc, fn, 1, s1); + tree tem = fold_build_pointer_plus (s1, fn); + return fold_convert_loc (loc, type, tem); + } + return NULL_TREE; } } diff --git a/gcc/testsuite/gcc.dg/strlenopt-20.c b/gcc/testsuite/gcc.dg/strlenopt-20.c index a83e845c26d88e5acdcabf142f7b319136663488..7b483eaeac1aa47278111a92148a16f00b2aaa2d 100644 --- a/gcc/testsuite/gcc.dg/strlenopt-20.c +++ b/gcc/testsuite/gcc.dg/strlenopt-20.c @@ -86,9 +86,9 @@ main () return 0; } -/* { dg-final { scan-tree-dump-times "strlen \\(" 1 "strlen" } } */ +/* { dg-final { scan-tree-dump-times "strlen \\(" 2 "strlen" } } */ /* { dg-final { scan-tree-dump-times "memcpy \\(" 4 "strlen" } } */ /* { dg-final { scan-tree-dump-times "strcpy \\(" 0 "strlen" } } */ /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen" } } */ -/* { dg-final { scan-tree-dump-times "strchr \\(" 1 "strlen" } } */ +/* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen" } } */ /* { dg-final { scan-tree-dump-times "stpcpy \\(" 0 "strlen" } } */ diff --git a/gcc/testsuite/gcc.dg/strlenopt-21.c b/gcc/testsuite/gcc.dg/strlenopt-21.c index e22fa9fca9ba14354db2cd5f602283b64bd8dcac..05b85a49dde0a7f5d269174fd4269e40be910dbd 100644 --- a/gcc/testsuite/gcc.dg/strlenopt-21.c +++ b/gcc/testsuite/gcc.dg/strlenopt-21.c @@ -57,9 +57,9 @@ main () return 0; } -/* { dg-final { scan-tree-dump-times "strlen \\(" 1 "strlen" } } */ +/* { dg-final { scan-tree-dump-times "strlen \\(" 2 "strlen" } } */ /* { dg-final { scan-tree-dump-times "memcpy \\(" 3 "strlen" } } */ /* { dg-final { scan-tree-dump-times "strcpy \\(" 0 "strlen" } } */ /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen" } } */ -/* { dg-final { scan-tree-dump-times "strchr \\(" 1 "strlen" } } */ +/* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen" } } */ /* { dg-final { scan-tree-dump-times "stpcpy \\(" 0 "strlen" } } */ diff --git a/gcc/testsuite/gcc.dg/strlenopt-22.c b/gcc/testsuite/gcc.dg/strlenopt-22.c index aa55f5ebd6a2d4803ee9a7fd60fc538d86f47124..b4ef772f0e59252f10a5419ede6837b3c8ca8265 100644 --- a/gcc/testsuite/gcc.dg/strlenopt-22.c +++ b/gcc/testsuite/gcc.dg/strlenopt-22.c @@ -31,9 +31,9 @@ main () return 0; } -/* { dg-final { scan-tree-dump-times "strlen \\(" 3 "strlen" } } */ +/* { dg-final { scan-tree-dump-times "strlen \\(" 4 "strlen" } } */ /* { dg-final { scan-tree-dump-times "memcpy \\(" 1 "strlen" } } */ /* { dg-final { scan-tree-dump-times "strcpy \\(" 1 "strlen" } } */ /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen" } } */ -/* { dg-final { scan-tree-dump-times "strchr \\(" 1 "strlen" } } */ +/* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen" } } */ /* { dg-final { scan-tree-dump-times "stpcpy \\(" 0 "strlen" } } */ diff --git a/gcc/testsuite/gcc.dg/strlenopt-26.c b/gcc/testsuite/gcc.dg/strlenopt-26.c index 4bd54bef540806ca90d2b9bcfc33eb531991c967..da2f465a5b5003fa5dca05f3a6ee00e97b98b5dd 100644 --- a/gcc/testsuite/gcc.dg/strlenopt-26.c +++ b/gcc/testsuite/gcc.dg/strlenopt-26.c @@ -21,4 +21,5 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "strlen \\(" 1 "strlen" } } */ +/* { dg-final { scan-tree-dump-times "strlen \\(" 2 "strlen" } } */ +/* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen" } } */ diff --git a/gcc/testsuite/gcc.dg/strlenopt-5.c b/gcc/testsuite/gcc.dg/strlenopt-5.c index 1b006a93045599a75bdb10a39e86ffa59b475c83..a24aea44e8b00ff7b35a907aaa941b4c509642c4 100644 --- a/gcc/testsuite/gcc.dg/strlenopt-5.c +++ b/gcc/testsuite/gcc.dg/strlenopt-5.c @@ -48,9 +48,9 @@ main () return 0; } -/* { dg-final { scan-tree-dump-times "strlen \\(" 0 "strlen" } } */ +/* { dg-final { scan-tree-dump-times "strlen \\(" 2 "strlen" } } */ /* { dg-final { scan-tree-dump-times "memcpy \\(" 2 "strlen" } } */ /* { dg-final { scan-tree-dump-times "strcpy \\(" 1 "strlen" } } */ /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen" } } */ -/* { dg-final { scan-tree-dump-times "strchr \\(" 2 "strlen" } } */ +/* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen" } } */ /* { dg-final { scan-tree-dump-times "stpcpy \\(" 0 "strlen" } } */ diff --git a/gcc/testsuite/gcc.dg/strlenopt-7.c b/gcc/testsuite/gcc.dg/strlenopt-7.c index 3ae1e2cb3f0d08c8b05107c4e65b67bdb39cf7ab..aa53d7e75254dfe56c93172afc49f95e5b7901e6 100644 --- a/gcc/testsuite/gcc.dg/strlenopt-7.c +++ b/gcc/testsuite/gcc.dg/strlenopt-7.c @@ -40,11 +40,11 @@ main () return 0; } -/* { dg-final { scan-tree-dump-times "strlen \\(" 0 "strlen" } } */ +/* { dg-final { scan-tree-dump-times "strlen \\(" 1 "strlen" } } */ /* { dg-final { scan-tree-dump-times "memcpy \\(" 2 "strlen" } } */ /* { dg-final { scan-tree-dump-times "strcpy \\(" 0 "strlen" } } */ /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen" } } */ -/* { dg-final { scan-tree-dump-times "strchr \\(" 1 "strlen" } } */ +/* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen" } } */ /* { dg-final { scan-tree-dump-times "stpcpy \\(" 0 "strlen" } } */ /* { dg-final { scan-tree-dump-times "\\*r_\[0-9\]* = 0;" 1 "strlen" } } */ /* { dg-final { scan-tree-dump-times "return 3;" 1 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/strlenopt-9.c b/gcc/testsuite/gcc.dg/strlenopt-9.c index b0406b162d48fca375883035043b0c50b9db61a1..e5e276210ba4b7d75867605f1ecf5c06eb970ef5 100644 --- a/gcc/testsuite/gcc.dg/strlenopt-9.c +++ b/gcc/testsuite/gcc.dg/strlenopt-9.c @@ -98,10 +98,10 @@ main () return 0; } -/* { dg-final { scan-tree-dump-times "strlen \\(" 3 "strlen" } } */ +/* { dg-final { scan-tree-dump-times "strlen \\(" 5 "strlen" } } */ /* { dg-final { scan-tree-dump-times "memcpy \\(" 6 "strlen" } } */ /* { dg-final { scan-tree-dump-times "strcpy \\(" 1 "strlen" } } */ /* { dg-final { scan-tree-dump-times "strcat \\(" 0 "strlen" } } */ -/* { dg-final { scan-tree-dump-times "strchr \\(" 3 "strlen" } } */ +/* { dg-final { scan-tree-dump-times "strchr \\(" 0 "strlen" } } */ /* { dg-final { scan-tree-dump-times "stpcpy \\(" 0 "strlen" } } */ /* { dg-final { scan-tree-dump-times "return 4;" 1 "optimized" } } */