From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from nikam.ms.mff.cuni.cz (nikam.ms.mff.cuni.cz [195.113.20.16]) by sourceware.org (Postfix) with ESMTPS id DCD4C3857835 for ; Thu, 10 Aug 2023 22:24:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org DCD4C3857835 Authentication-Results: sourceware.org; dmarc=fail (p=none dis=none) header.from=ucw.cz Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=kam.mff.cuni.cz Received: by nikam.ms.mff.cuni.cz (Postfix, from userid 16202) id A6F47281318; Fri, 11 Aug 2023 00:24:54 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ucw.cz; s=gen1; t=1691706294; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type; bh=Hj/SPF9e4mS8JgbMW9U0QcBKoVqRgisabKKvZ4Rd7lU=; b=DXNBE2ly+DYpx0RwBdjCYZv1mP+/WzUPtqxVL+LVjLmQn6HrfWVXzY5jYSHnW5Y6lEqUxY 0+k+sudWT/dJOxPz29x7uV3OIQN6djm6zucOR3b+FmVio7VOmlYKHXw31gPoT6xmT3o5B6 QV/EmlpX3F54ZUJny3OiocnQIbf/E4g= Date: Fri, 11 Aug 2023 00:24:54 +0200 From: Jan Hubicka To: gcc-patches@gcc.gnu.org Subject: Fix division by zero in tree-ssa-loop-split Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,GIT_PATCH_0,HEADER_FROM_DIFFERENT_DOMAINS,JMQ_SPF_NEUTRAL,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,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 List-Id: Hi, Profile update I added to tree-ssa-loop-split can divide by zero in situation that the conditional is predicted with 0 probability which is triggered by jump threading update in the testcase. gcc/ChangeLog: PR middle-end/110923 * tree-ssa-loop-split.cc (split_loop): Watch for division by zero. gcc/testsuite/ChangeLog: PR middle-end/110923 * gcc.dg/tree-ssa/pr110923.c: New test. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr110923.c b/gcc/testsuite/gcc.dg/tree-ssa/pr110923.c new file mode 100644 index 00000000000..8f5720a5e9e --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr110923.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-tree-lsplit-details-blocks" } */ +int a, b, c, d; +int main() { + for (a = 0; a < 2; a++) { + if (b > 2) + c = 0; + if (b > a) + d = 0; + } + return 0; +} +/* { dg-final { scan-tree-dump-times "loop split" 1 "lsplit" } } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "lsplit" } } */ diff --git a/gcc/tree-ssa-loop-split.cc b/gcc/tree-ssa-loop-split.cc index 2f7918c6e65..64464802c1e 100644 --- a/gcc/tree-ssa-loop-split.cc +++ b/gcc/tree-ssa-loop-split.cc @@ -703,7 +703,7 @@ split_loop (class loop *loop1) split between of the two new loops. Keep orignal estimate since it is likely better then completely dropping it. - TODO: If we know that onle of the new loops has constant + TODO: If we know that one of the new loops has constant number of iterations, we can do better. We could also update upper bounds. */ if (loop1->any_estimate @@ -713,11 +713,15 @@ split_loop (class loop *loop1) ? true_edge->probability.to_sreal () : (sreal)1; sreal scale2 = false_edge->probability.reliable_p () ? false_edge->probability.to_sreal () : (sreal)1; + sreal div1 = loop1_prob.to_sreal (); /* +1 to get header interations rather than latch iterations and then -1 to convert back. */ - loop1->nb_iterations_estimate - = MAX ((((sreal)loop1->nb_iterations_estimate.to_shwi () + 1) * scale - / loop1_prob.to_sreal ()).to_nearest_int () - 1, 0); + if (div1 != 0) + loop1->nb_iterations_estimate + = MAX ((((sreal)loop1->nb_iterations_estimate.to_shwi () + 1) + * scale / div1).to_nearest_int () - 1, 0); + else + loop1->any_estimate = false; loop2->nb_iterations_estimate = MAX ((((sreal)loop2->nb_iterations_estimate.to_shwi () + 1) * scale2 / profile_probability::very_likely ().to_sreal ())