From patchwork Mon Sep 4 20:58:13 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hamza Mahfooz X-Patchwork-Id: 75240 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 419953857702 for ; Mon, 4 Sep 2023 20:58:52 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from MTA-05-3.privateemail.com (mta-05-3.privateemail.com [198.54.118.212]) by sourceware.org (Postfix) with ESMTPS id C4D173858D35; Mon, 4 Sep 2023 20:58:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C4D173858D35 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=effective-light.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=effective-light.com Received: from mta-05.privateemail.com (localhost [127.0.0.1]) by mta-05.privateemail.com (Postfix) with ESMTP id 8051318000C2; Mon, 4 Sep 2023 16:58:31 -0400 (EDT) Received: from hal-station.. (unknown [74.12.11.94]) by mta-05.privateemail.com (Postfix) with ESMTPA; Mon, 4 Sep 2023 16:58:22 -0400 (EDT) From: Hamza Mahfooz To: gcc-patches@gcc.gnu.org Subject: [PATCH v2 1/2] strlen: fold strstr() even if the length isn't previously known [PR96601] Date: Mon, 4 Sep 2023 16:58:13 -0400 Message-ID: <20230904205814.222166-1-someguy@effective-light.com> X-Mailer: git-send-email 2.42.0 MIME-Version: 1.0 X-Virus-Scanned: ClamAV using ClamSMTP X-Spam-Status: No, score=-13.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jakub Jelinek , Richard Biener , Martin Sebor , Hamza Mahfooz , Ian Lance Taylor Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Currently, we give up in fold_strstr_to_strncmp() if the length of the the second argument to strstr() isn't known to us by the time we hit that function. However, we can instead insert a strlen() in ourselves and continue trying to fold strstr() into strlen()+strncmp(). PR tree-optimization/96601 gcc/ChangeLog: * tree-ssa-strlen.cc (fold_strstr_to_strncmp): If arg1_len == NULL, insert a strlen() for strstr()'s arg1 and use it as arg1_len. gcc/testsuite/ChangeLog: * gcc.dg/strlenopt-30.c: Modify test. Signed-off-by: Hamza Mahfooz --- Please push this for me if you think it looks good. Since, I don't have write access to the repository. --- gcc/testsuite/gcc.dg/strlenopt-30.c | 5 +- gcc/tree-ssa-strlen.cc | 81 ++++++++++++++++------------- 2 files changed, 45 insertions(+), 41 deletions(-) diff --git a/gcc/testsuite/gcc.dg/strlenopt-30.c b/gcc/testsuite/gcc.dg/strlenopt-30.c index 2a3098ba96f..1ee814048c1 100644 --- a/gcc/testsuite/gcc.dg/strlenopt-30.c +++ b/gcc/testsuite/gcc.dg/strlenopt-30.c @@ -38,9 +38,6 @@ void f5(char *s) foo_f5(); } -/* Do not perform transform, since strlen (t) - is unknown. */ - __attribute__((no_icf)) _Bool f6(char *s, char *t) { @@ -60,4 +57,4 @@ _Bool f7(char *s) return (t1 == s); } -/* { dg-final { scan-tree-dump-times "__builtin_strncmp" 5 "strlen1" } } */ +/* { dg-final { scan-tree-dump-times "__builtin_strncmp" 6 "strlen1" } } */ diff --git a/gcc/tree-ssa-strlen.cc b/gcc/tree-ssa-strlen.cc index 8b7ef919826..b0ebbb0db62 100644 --- a/gcc/tree-ssa-strlen.cc +++ b/gcc/tree-ssa-strlen.cc @@ -5273,6 +5273,7 @@ fold_strstr_to_strncmp (tree rhs1, tree rhs2, gimple *stmt) tree arg1 = gimple_call_arg (call_stmt, 1); tree arg1_len = NULL_TREE; int idx = get_stridx (arg1, call_stmt); + gimple_stmt_iterator gsi = gsi_for_stmt (call_stmt); if (idx) { @@ -5286,51 +5287,57 @@ fold_strstr_to_strncmp (tree rhs1, tree rhs2, gimple *stmt) } } - if (arg1_len != NULL_TREE) + if (arg1_len == NULL_TREE) { - gimple_stmt_iterator gsi = gsi_for_stmt (call_stmt); - tree strncmp_decl = builtin_decl_explicit (BUILT_IN_STRNCMP); + tree strlen_decl = builtin_decl_explicit (BUILT_IN_STRLEN); + gcall *strlen_call = gimple_build_call (strlen_decl, 1, arg1); + tree strlen_lhs = make_ssa_name (size_type_node, strlen_call); + + gimple_call_set_lhs (strlen_call, strlen_lhs); + gimple_set_vuse (strlen_call, gimple_vuse (call_stmt)); + gsi_insert_before (&gsi, strlen_call, GSI_SAME_STMT); + arg1_len = strlen_lhs; + } + else if (!is_gimple_val (arg1_len)) + { + tree arg1_len_tmp = make_ssa_name (TREE_TYPE (arg1_len)); + gassign *arg1_stmt = gimple_build_assign (arg1_len_tmp, + arg1_len); + gsi_insert_before (&gsi, arg1_stmt, GSI_SAME_STMT); + arg1_len = arg1_len_tmp; + } - if (!is_gimple_val (arg1_len)) + tree strncmp_decl = builtin_decl_explicit (BUILT_IN_STRNCMP); + gcall *strncmp_call = gimple_build_call (strncmp_decl, 3, + arg0, arg1, arg1_len); + tree strncmp_lhs = make_ssa_name (integer_type_node); + gimple_set_vuse (strncmp_call, gimple_vuse (call_stmt)); + gimple_call_set_lhs (strncmp_call, strncmp_lhs); + gsi_remove (&gsi, true); + gsi_insert_before (&gsi, strncmp_call, GSI_SAME_STMT); + tree zero = build_zero_cst (TREE_TYPE (strncmp_lhs)); + + if (is_gimple_assign (stmt)) + { + if (gimple_assign_rhs_code (stmt) == COND_EXPR) { - tree arg1_len_tmp = make_ssa_name (TREE_TYPE (arg1_len)); - gassign *arg1_stmt = gimple_build_assign (arg1_len_tmp, - arg1_len); - gsi_insert_before (&gsi, arg1_stmt, GSI_SAME_STMT); - arg1_len = arg1_len_tmp; - } - - gcall *strncmp_call = gimple_build_call (strncmp_decl, 3, - arg0, arg1, arg1_len); - tree strncmp_lhs = make_ssa_name (integer_type_node); - gimple_set_vuse (strncmp_call, gimple_vuse (call_stmt)); - gimple_call_set_lhs (strncmp_call, strncmp_lhs); - gsi_remove (&gsi, true); - gsi_insert_before (&gsi, strncmp_call, GSI_SAME_STMT); - tree zero = build_zero_cst (TREE_TYPE (strncmp_lhs)); - - if (is_gimple_assign (stmt)) - { - if (gimple_assign_rhs_code (stmt) == COND_EXPR) - { - tree cond = gimple_assign_rhs1 (stmt); - TREE_OPERAND (cond, 0) = strncmp_lhs; - TREE_OPERAND (cond, 1) = zero; - } - else - { - gimple_assign_set_rhs1 (stmt, strncmp_lhs); - gimple_assign_set_rhs2 (stmt, zero); - } + tree cond = gimple_assign_rhs1 (stmt); + TREE_OPERAND (cond, 0) = strncmp_lhs; + TREE_OPERAND (cond, 1) = zero; } else { - gcond *cond = as_a (stmt); - gimple_cond_set_lhs (cond, strncmp_lhs); - gimple_cond_set_rhs (cond, zero); + gimple_assign_set_rhs1 (stmt, strncmp_lhs); + gimple_assign_set_rhs2 (stmt, zero); } - update_stmt (stmt); } + else + { + gcond *cond = as_a (stmt); + gimple_cond_set_lhs (cond, strncmp_lhs); + gimple_cond_set_rhs (cond, zero); + } + update_stmt (stmt); } } }