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 D24C03858D3C for ; Mon, 14 Feb 2022 18:17:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D24C03858D3C 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 B7FFE1F383 for ; Mon, 14 Feb 2022 18:17:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1644862661; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type; bh=WVcGXN0DKhDjtjnfp/KH3drqvoyn3ozFaDOg6WhmhvY=; b=wXdXD6XEUO23UOz/+bsfA3sGuLZPfS6U5j/xzohuRoHp1l6ZumInbad6Lw2rF82C2HWcr0 hmlMCgZ+u4jFL3iQdWFl+80QaTR+KyljLonHQ3wNrN0G+ZiYZiTtDED8+yYmrfjuXAGPSL pNIg8HnzuRsvkvjloK7ZqL+vuzqZjNY= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1644862661; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type; bh=WVcGXN0DKhDjtjnfp/KH3drqvoyn3ozFaDOg6WhmhvY=; b=W9djvprpqplzx2eRkmR/ZfDRX6IrJQT0mT8xGuQOSv5+d7IatomF/jROdP42Y//AGq0ZZt nPozfSpZQ5q6rfAg== 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 A348FA3B8C; Mon, 14 Feb 2022 18:17:41 +0000 (UTC) From: Martin Jambor To: GCC Patches Cc: Jan Hubicka Subject: [PATCH] ipa-cp: Do not create clones for values outside known value range (PR 102513) User-Agent: Notmuch/0.34.1 (https://notmuchmail.org) Emacs/27.2 (x86_64-suse-linux-gnu) Date: Mon, 14 Feb 2022 19:17:41 +0100 Message-ID: MIME-Version: 1.0 Content-Type: text/plain X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, 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-List-Received-Date: Mon, 14 Feb 2022 18:17:45 -0000 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