From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by sourceware.org (Postfix) with ESMTPS id 524FE3858C50 for ; Wed, 23 Mar 2022 15:03:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 524FE3858C50 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.cz Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 238031F387; Wed, 23 Mar 2022 15:03:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1648047827; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=w6hskwHJcNcp3XvW9GXtmcgj5Cv2YElmpQHbGeQD8m4=; b=ZbtNmxReCyGEWdY/Q3QKBR9Hm0kh+vHCN/zmA2mLWXmN80PGhrSZKnOfr/kCPuJGKqhG4o 2LqkTSokFbB93PaCnygAjibqImItFll3CQhXLxj0z8TPlif0mvaq/txd7oeCJ9o72+ZNyU b7VPURJWus2K6gVXaSrjQWObrdu5Ssc= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1648047827; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=w6hskwHJcNcp3XvW9GXtmcgj5Cv2YElmpQHbGeQD8m4=; b=k8Q0Ps/7738f7c2XTgSqiPOLPOCRx0tGY5w5cnVgOoHUFo/N4IkR6M538/2swNZ7POyX1O /C32w7DJUo08moBA== Received: from suse.cz (virgil.suse.cz [10.100.13.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by relay2.suse.de (Postfix) with ESMTPS id 0CEF2A3BA8; Wed, 23 Mar 2022 15:03:46 +0000 (UTC) From: Martin Jambor To: GCC Patches Cc: Jan Hubicka , Jan Hubicka Subject: Re: [PATCH PING] ipa-cp: Do not create clones for values outside known value range (PR 102513) In-Reply-To: References: User-Agent: Notmuch/0.35 (https://notmuchmail.org) Emacs/27.2 (x86_64-suse-linux-gnu) Date: Wed, 23 Mar 2022 16:03:46 +0100 Message-ID: MIME-Version: 1.0 Content-Type: text/plain X-Spam-Status: No, score=-10.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, 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-List-Received-Date: Wed, 23 Mar 2022 15:03:49 -0000 Hello, I would like to ping this patch, please. Thanks, Martin On Mon, Feb 14 2022, Martin Jambor wrote: > Hi, > > PR 102513 shows we emit bogus array access warnings when IPA-CP > creates clones specialized for values which it deduces from arithmetic > jump functions describing self-recursive calls. Those can however be > avoided if we consult the IPA-VR information that the same pass also > has. > > The patch below does that at the stage when normally values are only > examined for profitability. It would be better not to create lattices > describing such bogus values in the first place, however that presents > an ordering problem, the pass currently propagates all information, > and so both constants and VR, in no particular order when processing > SCCs, and so this approach seemed much simpler. > > I plan to rearrange the pass so that it clones in multiple passes over > the call graph (or rather the lattice dependence graph) and it feels > natural to only do propagation for these kinds of recursion in the > second or later passes, which would fix the issue more elegantly. > > Bootstrapped and tested on x86_64, OK for trunk (and perhaps also for > GCC 11)? > > Thanks, > > Martin > > > gcc/ChangeLog: > > 2022-02-14 Martin Jambor > > PR ipa/102513 > * ipa-cp.cc (decide_whether_version_node): Skip scalar values > which do not fit the known value_range. > > gcc/testsuite/ChangeLog: > > 2022-02-14 Martin Jambor > > PR ipa/102513 > * gcc.dg/ipa/pr102513.c: New test. > --- > gcc/ipa-cp.cc | 28 ++++++++++++++++++++++-- > gcc/testsuite/gcc.dg/ipa/pr102513.c | 33 +++++++++++++++++++++++++++++ > 2 files changed, 59 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/ipa/pr102513.c > > diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc > index 453e9c93cc3..ec37632d487 100644 > --- a/gcc/ipa-cp.cc > +++ b/gcc/ipa-cp.cc > @@ -6154,8 +6154,32 @@ decide_whether_version_node (struct cgraph_node *node) > { > ipcp_value *val; > for (val = lat->values; val; val = val->next) > - ret |= decide_about_value (node, i, -1, val, &avals, > - &self_gen_clones); > + { > + /* If some values generated for self-recursive calls with > + arithmetic jump functions fall outside of the known > + value_range for the parameter, we can skip them. VR interface > + supports this only for integers now. */ > + if (TREE_CODE (val->value) == INTEGER_CST > + && !plats->m_value_range.bottom_p () > + && !plats->m_value_range.m_vr.contains_p (val->value)) > + { > + /* This can happen also if a constant present in the source > + code falls outside of the range of parameter's type, so we > + cannot assert. */ > + if (dump_file && (dump_flags & TDF_DETAILS)) > + { > + fprintf (dump_file, " - skipping%s value ", > + val->self_recursion_generated_p () > + ? " self_recursion_generated" : ""); > + print_ipcp_constant_value (dump_file, val->value); > + fprintf (dump_file, " because it is outside known " > + "value range.\n"); > + } > + continue; > + } > + ret |= decide_about_value (node, i, -1, val, &avals, > + &self_gen_clones); > + } > } > > if (!plats->aggs_bottom) > diff --git a/gcc/testsuite/gcc.dg/ipa/pr102513.c b/gcc/testsuite/gcc.dg/ipa/pr102513.c > new file mode 100644 > index 00000000000..9ee5431b730 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/ipa/pr102513.c > @@ -0,0 +1,33 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -Warray-bounds" } */ > + > +extern int block2[7][256]; > + > +static int encode_block(int block2[7][256], unsigned level) > +{ > + int best_score = 0; > + > + for (unsigned x = 0; x < level; x++) { > + int v = block2[1][x]; > + block2[level][x] = 0; > + best_score += v * v; > + } > + > + if (level > 0 && best_score > 64) { > + int score = 0; > + > + score += encode_block(block2, level - 1); > + score += encode_block(block2, level - 1); > + > + if (score < best_score) { > + best_score = score; > + } > + } > + > + return best_score; > +} > + > +int foo(void) > +{ > + return encode_block(block2, 5); > +} > -- > 2.34.1