From patchwork Wed Dec 22 02:26:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiufu Guo X-Patchwork-Id: 49167 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 718BF3858411 for ; Wed, 22 Dec 2021 02:26:56 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 718BF3858411 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1640140016; bh=PAb4fta1fkAOTaGAD+st5DAwAQwLJUNuGzAeVv4W+J0=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=dHlkXbmo1wOrj/rofChZZlqv/4m0ZVfThXes3FKZjPx2xKOhFa69kgR6PUGxBOc6g b6ZYpnLIkAU+kb5nOwVdCRWdPFdhMJkvvPRBsfDk0lrlJ9QQNMnHaJMYPTj4SfWC67 Z8o3OVp23eHa5BchlBFR73JkQmUtfwdyyGPlCzn0= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) by sourceware.org (Postfix) with ESMTPS id 9C5E23858C2C for ; Wed, 22 Dec 2021 02:26:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 9C5E23858C2C Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 1BM1cTMd032583; Wed, 22 Dec 2021 02:26:25 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 3d399153vv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 22 Dec 2021 02:26:25 +0000 Received: from m0098396.ppops.net (m0098396.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 1BM2NRiv004565; Wed, 22 Dec 2021 02:26:25 GMT Received: from ppma06fra.de.ibm.com (48.49.7a9f.ip4.static.sl-reverse.com [159.122.73.72]) by mx0a-001b2d01.pphosted.com with ESMTP id 3d399153v4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 22 Dec 2021 02:26:24 +0000 Received: from pps.filterd (ppma06fra.de.ibm.com [127.0.0.1]) by ppma06fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 1BM2Nq1Q023439; Wed, 22 Dec 2021 02:26:22 GMT Received: from b06cxnps4075.portsmouth.uk.ibm.com (d06relay12.portsmouth.uk.ibm.com [9.149.109.197]) by ppma06fra.de.ibm.com with ESMTP id 3d16wk0pd4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 22 Dec 2021 02:26:22 +0000 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 1BM2QIMc42795326 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 22 Dec 2021 02:26:18 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AEAF852050; Wed, 22 Dec 2021 02:26:18 +0000 (GMT) Received: from pike.rch.stglabs.ibm.com (unknown [9.5.12.127]) by d06av21.portsmouth.uk.ibm.com (Postfix) with ESMTP id 962D05205A; Wed, 22 Dec 2021 02:26:17 +0000 (GMT) To: gcc-patches@gcc.gnu.org Subject: [PATCH] disable aggressive_loop_optimizations until niter ready Date: Wed, 22 Dec 2021 10:26:17 +0800 Message-Id: <20211222022617.33192-1-guojiufu@linux.ibm.com> X-Mailer: git-send-email 2.17.1 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: 6qjNyDYXcn2bzutONmL2hdXeENXmtJN5 X-Proofpoint-GUID: 4sWy5KeioyDyLoXZn4RlgJ-xyn5Rtf7_ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2021-12-21_07,2021-12-21_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 lowpriorityscore=0 mlxlogscore=999 priorityscore=1501 phishscore=0 impostorscore=0 mlxscore=0 malwarescore=0 adultscore=0 bulkscore=0 spamscore=0 clxscore=1015 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2112220011 X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP 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: Jiufu Guo via Gcc-patches From: Jiufu Guo Reply-To: Jiufu Guo Cc: rguenther@suse.de, segher@kernel.crashing.org, wschmidt@linux.ibm.com, jlaw@tachyum.com, dje.gcc@gmail.com Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Hi, Normaly, estimate_numbers_of_iterations get/caculate niter first, and then invokes infer_loop_bounds_from_undefined. While in some case, after a few call stacks, estimate_numbers_of_iterations is invoked before niter is ready (e.g. before number_of_latch_executions returns). e.g. number_of_latch_executions->...follow_ssa_edge_expr--> --> estimate_numbers_of_iterations --> infer_loop_bounds_from_undefined. Since niter is still not computed, call to infer_loop_bounds_from_undefined may not get final result. To avoid infer_loop_bounds_from_undefined to be called with interim state and avoid infer_loop_bounds_from_undefined generates interim data, during niter's computing, we could disable flag_aggressive_loop_optimizations. Bootstrap and regtest pass on ppc64* and x86_64. Is this ok for trunk? BR, Jiufu gcc/ChangeLog: * tree-ssa-loop-niter.c (number_of_iterations_exit_assumptions): Disable/restore flag_aggressive_loop_optimizations. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/scev-16.c: New test. --- gcc/tree-ssa-loop-niter.c | 23 +++++++++++++++++++---- gcc/testsuite/gcc.dg/tree-ssa/scev-16.c | 20 ++++++++++++++++++++ 2 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/scev-16.c diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c index 06954e437f5..51bb501019e 100644 --- a/gcc/tree-ssa-loop-niter.c +++ b/gcc/tree-ssa-loop-niter.c @@ -2534,18 +2534,31 @@ number_of_iterations_exit_assumptions (class loop *loop, edge exit, && !POINTER_TYPE_P (type)) return false; + /* Before niter is calculated, avoid to analyze interim state. */ + int old_aggressive_loop_optimizations = flag_aggressive_loop_optimizations; + flag_aggressive_loop_optimizations = 0; + tree iv0_niters = NULL_TREE; if (!simple_iv_with_niters (loop, loop_containing_stmt (stmt), op0, &iv0, safe ? &iv0_niters : NULL, false)) - return number_of_iterations_popcount (loop, exit, code, niter); + { + bool res = number_of_iterations_popcount (loop, exit, code, niter); + flag_aggressive_loop_optimizations = old_aggressive_loop_optimizations; + return res; + } tree iv1_niters = NULL_TREE; if (!simple_iv_with_niters (loop, loop_containing_stmt (stmt), op1, &iv1, safe ? &iv1_niters : NULL, false)) - return false; + { + flag_aggressive_loop_optimizations = old_aggressive_loop_optimizations; + return false; + } /* Give up on complicated case. */ if (iv0_niters && iv1_niters) - return false; - + { + flag_aggressive_loop_optimizations = old_aggressive_loop_optimizations; + return false; + } /* We don't want to see undefined signed overflow warnings while computing the number of iterations. */ fold_defer_overflow_warnings (); @@ -2565,6 +2578,7 @@ number_of_iterations_exit_assumptions (class loop *loop, edge exit, only_exit_p, safe)) { fold_undefer_and_ignore_overflow_warnings (); + flag_aggressive_loop_optimizations = old_aggressive_loop_optimizations; return false; } @@ -2608,6 +2622,7 @@ number_of_iterations_exit_assumptions (class loop *loop, edge exit, niter->may_be_zero); fold_undefer_and_ignore_overflow_warnings (); + flag_aggressive_loop_optimizations = old_aggressive_loop_optimizations; /* If NITER has simplified into a constant, update MAX. */ if (TREE_CODE (niter->niter) == INTEGER_CST) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/scev-16.c b/gcc/testsuite/gcc.dg/tree-ssa/scev-16.c new file mode 100644 index 00000000000..708ffab88ca --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/scev-16.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-ivopts-scev" } */ + +/* Expect scalar_evolution = {(int) start_7(D), +, 1}_1), instead + (int) (short int) {(unsigned short) start_7(D), +, 1}_1 */ + +int arr[1000]; + +void +s2i (short start, short end) +{ + int res = 0; + for (short i = start; i < end; i++) + { + int lv = i; + arr[lv] += lv; + } +} + +/* { dg-final { scan-tree-dump-times "scalar_evolution = \{\\(int\\) start_\[0-9\]+\\(D\\), \\+, 1\}_1" 1 "ivopts" } } */