From patchwork Mon Jan 31 16:26:51 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom de Vries X-Patchwork-Id: 50592 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 1C9973948A48 for ; Mon, 31 Jan 2022 16:27:56 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1C9973948A48 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1643646476; bh=c0walYCCQC/xhfWqekygyd9xYvKjLjc+MDCg6IcltDw=; h=Date:Subject:To:References:In-Reply-To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=WcA5c/PjK5zkvCLny8hdYYfaoRUW5G2JF25x69/MQ/me6OOU0mOgUH3Ljeyn2dckN m4M6J4UanVmHeXmMjp8ms6SaWkCvGSEGLyYoUUYsAxpqtwZaHzyd5kmF0HOJRgKAAe xiCC0AE7Sb7GaM1SDDV2dhHG3Kj0dE2dAtBocScY= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by sourceware.org (Postfix) with ESMTPS id 7A79439484A0 for ; Mon, 31 Jan 2022 16:26:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7A79439484A0 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 40AF81F380; Mon, 31 Jan 2022 16:26:52 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 16C7513C91; Mon, 31 Jan 2022 16:26:52 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 9NbDA8wN+GHIegAAMHmgww (envelope-from ); Mon, 31 Jan 2022 16:26:52 +0000 Message-ID: <3b14d728-35d3-251a-44b8-e152b92d5dd5@suse.de> Date: Mon, 31 Jan 2022 17:26:51 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.4.1 Subject: [PATCH][ldist] Don't add lib calls with -fno-tree-loop-distribute-patterns Content-Language: en-US To: Richard Biener References: <57323305-3384-e128-4627-ad26969a36f3@suse.de> In-Reply-To: X-Spam-Status: No, score=-12.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Tom de Vries via Gcc-patches From: Tom de Vries Reply-To: Tom de Vries Cc: GCC Patches Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" [ was: Re: [RFC] ldist: Recognize rawmemchr loop patterns ] On 1/31/22 16:00, Richard Biener wrote: >> I'm running into PR56888 ( >> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56888 ) on nvptx due to >> this, f.i. in gcc/testsuite/gcc.c-torture/execute/builtins/strlen.c, >> where gcc/testsuite/gcc.c-torture/execute/builtins/lib/strlen.c contains >> a strlen function, with a strlen loop, which is transformed by >> pass_loop_distribution into a __builtin_strlen, which is then expanded >> into a strlen call, creating a self-recursive function. [ And on nvptx, >> that happens to result in a compilation failure, which is how I found >> this. ] >> >> According to this ( >> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56888#c21 ) comment: >> ... >> -fno-tree-loop-distribute-patterns is the reliable way to not >> transform loops into library calls. >> ... >> >> Then should we have something along the lines of: >> ... >> $ git diff >> diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c >> index 6fe59cd56855..9a211d30cd7e 100644 >> --- a/gcc/tree-loop-distribution.c >> +++ b/gcc/tree-loop-distribution.c >> @@ -3683,7 +3683,11 @@ loop_distribution::transform_reduction_loop >> && TYPE_PRECISION (ptr_type_node) >= 32) >> || (TYPE_OVERFLOW_UNDEFINED (reduction_var_type) >> && TYPE_PRECISION (reduction_var_type) <= >> TYPE_PRECISION (sizetype))) >> - && builtin_decl_implicit (BUILT_IN_STRLEN)) >> + && builtin_decl_implicit (BUILT_IN_STRLEN) >> + && flag_tree_loop_distribute_patterns) >> generate_strlen_builtin (loop, reduction_var, load_iv.base, >> reduction_iv.base, loc); >> else if (direct_optab_handler (rawmemchr_optab, TYPE_MODE >> (load_type)) >> ... >> ? >> >> Or is the comment no longer valid? > > It is still valid - and yes, I think we need to guard it with this flag > but please do it in the caller to transform_reduction_loop. Done. Ok for trunk? Thanks, - Tom [ldist] Don't add lib calls with -fno-tree-loop-distribute-patterns As mentioned in PR56888 comment 21: ... -fno-tree-loop-distribute-patterns is the reliable way to not transform loops into library calls. ... However, since commit 6f966f06146 ("ldist: Recognize strlen and rawmemchr like loops") a strlen or rawmemchr library call may be introduced by ldist. This caused regressions in testcases gcc.c-torture/execute/builtins/strlen{,-2,-3}.c for nvptx. Fix this by not calling transform_reduction_loop from loop_distribution::execute for -fno-tree-loop-distribute-patterns. Tested regressing test-cases as well as gcc.dg/tree-ssa/ldist-*.c on nvptx. gcc/ChangeLog: 2022-01-31 Tom de Vries * tree-loop-distribution.cc (generate_reduction_builtin_1): Check for -ftree-loop-distribute-patterns. (loop_distribution::execute): Don't call transform_reduction_loop for -fno-tree-loop-distribute-patterns. gcc/testsuite/ChangeLog: 2022-01-31 Tom de Vries * gcc.dg/tree-ssa/ldist-strlen-4.c: New test. --- gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-4.c | 17 +++++++++++++++++ gcc/tree-loop-distribution.cc | 5 ++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-4.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-4.c new file mode 100644 index 000000000000..eafb37e84fc3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-4.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-loop-distribution -fno-tree-loop-distribute-patterns -fdump-tree-ldist-details" } */ +/* { dg-final { scan-tree-dump-not "generated strlen" "ldist" } } */ + +/* Copied from gcc/testsuite/gcc.c-torture/execute/builtins/lib/strlen.c. */ + +__SIZE_TYPE__ +foo (const char *s) +{ + __SIZE_TYPE__ i; + + i = 0; + while (s[i] != 0) + i++; + + return i; +} diff --git a/gcc/tree-loop-distribution.cc b/gcc/tree-loop-distribution.cc index 6fe59cd56855..c7b428572636 100644 --- a/gcc/tree-loop-distribution.cc +++ b/gcc/tree-loop-distribution.cc @@ -3290,6 +3290,8 @@ generate_reduction_builtin_1 (loop_p loop, gimple_seq &seq, tree reduction_var_old, tree reduction_var_new, const char *info, machine_mode load_mode) { + gcc_assert (flag_tree_loop_distribute_patterns); + /* Place new statements before LOOP. */ gimple_stmt_iterator gsi = gsi_last_bb (loop_preheader_edge (loop)->src); gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING); @@ -3773,7 +3775,8 @@ loop_distribution::execute (function *fun) if (niters == NULL_TREE || niters == chrec_dont_know) { datarefs_vec.create (20); - if (transform_reduction_loop (loop)) + if (flag_tree_loop_distribute_patterns + && transform_reduction_loop (loop)) { changed = true; loops_to_be_destroyed.safe_push (loop);