Message ID | 20220704065831.55961-1-guojiufu@linux.ibm.com |
---|---|
State | New |
Headers |
Return-Path: <gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org> 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 9726A385BAC3 for <patchwork@sourceware.org>; Mon, 4 Jul 2022 06:59:06 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9726A385BAC3 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1656917946; bh=+uTy9z+WR6d3uQXnJt2ggurYq1+u5XxlQGQWKpgErVg=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=ZaPGIOvCIQ4faggXR4Xo/tSLQH4eOzlcvFUqerWXp69F1ZTGNFYbVowkLwlbCCBR9 6erL+oMvjq28tMS/VQjpdnUupOPDLnuNNqFgh3Ygm+O9yrRH6hss3mtxBPFu2mPDpD X2/QyUmnpddwpO1aXl/f2HZU9fmUCAfklyRC/MR0= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mx0a-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) by sourceware.org (Postfix) with ESMTPS id EB7283857B82; Mon, 4 Jul 2022 06:58:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org EB7283857B82 Received: from pps.filterd (m0098419.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 2646oaNB006594; Mon, 4 Jul 2022 06:58:37 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0b-001b2d01.pphosted.com (PPS) with ESMTPS id 3h3u9x0539-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 04 Jul 2022 06:58:37 +0000 Received: from m0098419.ppops.net (m0098419.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 2646sJZw023427; Mon, 4 Jul 2022 06:58:36 GMT Received: from ppma03fra.de.ibm.com (6b.4a.5195.ip4.static.sl-reverse.com [149.81.74.107]) by mx0b-001b2d01.pphosted.com (PPS) with ESMTPS id 3h3u9x052u-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 04 Jul 2022 06:58:36 +0000 Received: from pps.filterd (ppma03fra.de.ibm.com [127.0.0.1]) by ppma03fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 2646osTr032381; Mon, 4 Jul 2022 06:58:35 GMT Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by ppma03fra.de.ibm.com with ESMTP id 3h2dn8spyn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 04 Jul 2022 06:58:34 +0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 2646wW7w21299646 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 4 Jul 2022 06:58:32 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9169B4C044; Mon, 4 Jul 2022 06:58:32 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C7AB24C040; Mon, 4 Jul 2022 06:58:31 +0000 (GMT) Received: from pike.rch.stglabs.ibm.com (unknown [9.5.12.127]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Mon, 4 Jul 2022 06:58:31 +0000 (GMT) To: gcc-patches@gcc.gnu.org Subject: [PATCH] HIGH part of symbol ref is invalid for constant pool Date: Mon, 4 Jul 2022 14:58:31 +0800 Message-Id: <20220704065831.55961-1-guojiufu@linux.ibm.com> X-Mailer: git-send-email 2.17.1 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: G3XNQuPQVCBSw_YUUD1JNkCYxr_3u6fw X-Proofpoint-GUID: pDv173JGZGgIwYR9EpUBOYqO9814cOFO X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.883,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-07-04_05,2022-06-28_01,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 impostorscore=0 bulkscore=0 spamscore=0 lowpriorityscore=0 adultscore=0 suspectscore=0 mlxscore=0 priorityscore=1501 clxscore=1011 phishscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2204290000 definitions=main-2207040027 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, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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 <gcc-patches.gcc.gnu.org> List-Unsubscribe: <https://gcc.gnu.org/mailman/options/gcc-patches>, <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe> List-Archive: <https://gcc.gnu.org/pipermail/gcc-patches/> List-Post: <mailto:gcc-patches@gcc.gnu.org> List-Help: <mailto:gcc-patches-request@gcc.gnu.org?subject=help> List-Subscribe: <https://gcc.gnu.org/mailman/listinfo/gcc-patches>, <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe> From: Jiufu Guo via Gcc-patches <gcc-patches@gcc.gnu.org> Reply-To: Jiufu Guo <guojiufu@linux.ibm.com> Cc: dje.gcc@gmail.com, segher@kernel.crashing.org, linkw@gcc.gnu.org Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" <gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org> |
Series |
HIGH part of symbol ref is invalid for constant pool
|
|
Commit Message
Jiufu Guo
July 4, 2022, 6:58 a.m. UTC
The high part of the symbol address is invalid for the constant pool. In function rs6000_cannot_force_const_mem, we already return true for "HIGH with UNSPEC" rtx. During debug GCC, I found that rs6000_cannot_force_const_mem is called for some other HIGH code rtx expressions which also indicate the high part of a symbol_ref. For example: (high:DI (const:DI (plus:DI (symbol_ref:DI ("xx") (const_int 12 [0xc]))))) (high:DI (symbol_ref:DI ("var_1")..))) In the below case, this kind of rtx could occur in the middle of optimizations pass but was not dumped to a file. So, no test case is attached to this patch. extern const unsigned int __decPOWERS[10]; void decSetCoeff (int *residue, const unsigned int *up) { unsigned int half = (unsigned int) __decPOWERS1[3] >> 1; if (*up >= half) *residue = 7; return; } This patch updates rs6000_cannot_force_const_mem to return true for rtx with HIGH code. Bootstrapped and regtested on ppc64le and ppc64. Is it ok for trunk? BR, Jiufu Guo gcc/ChangeLog: * config/rs6000/rs6000.cc (rs6000_cannot_force_const_mem): Return true for HIGH code rtx. --- gcc/config/rs6000/rs6000.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
Comments
Hi Jeff, Thanks for the patch, one question is inlined below. on 2022/7/4 14:58, Jiufu Guo wrote: > The high part of the symbol address is invalid for the constant pool. In > function rs6000_cannot_force_const_mem, we already return true for > "HIGH with UNSPEC" rtx. During debug GCC, I found that > rs6000_cannot_force_const_mem is called for some other HIGH code rtx > expressions which also indicate the high part of a symbol_ref. > For example: > (high:DI (const:DI (plus:DI (symbol_ref:DI ("xx") (const_int 12 [0xc]))))) > (high:DI (symbol_ref:DI ("var_1")..))) > > In the below case, this kind of rtx could occur in the middle of optimizations > pass but was not dumped to a file. So, no test case is attached to this > patch. > Could you help to expand this more on how it affects some tree-optimization pass? I guess some tree-opt will expand gimple expression to rtx, evaluate the cost or similar and make some decision basing on it. If that is the case, you probably can construct one test case to show that: without this patch, the evaluated cost or similar looks off, the optimization decision is sub-optimal; with this patch, the optimization result is expected. BR, Kewen > extern const unsigned int __decPOWERS[10]; > void > decSetCoeff (int *residue, const unsigned int *up) > { > unsigned int half = (unsigned int) __decPOWERS1[3] >> 1; > > if (*up >= half) > *residue = 7; > > return; > } > > This patch updates rs6000_cannot_force_const_mem to return true for > rtx with HIGH code. > > > Bootstrapped and regtested on ppc64le and ppc64. > Is it ok for trunk? > > BR, > Jiufu Guo > > > gcc/ChangeLog: > > * config/rs6000/rs6000.cc (rs6000_cannot_force_const_mem): > Return true for HIGH code rtx. > > --- > gcc/config/rs6000/rs6000.cc | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc > index 3ff16b8ae04..c2b10669627 100644 > --- a/gcc/config/rs6000/rs6000.cc > +++ b/gcc/config/rs6000/rs6000.cc > @@ -9707,8 +9707,11 @@ rs6000_init_stack_protect_guard (void) > static bool > rs6000_cannot_force_const_mem (machine_mode mode ATTRIBUTE_UNUSED, rtx x) > { > - if (GET_CODE (x) == HIGH > - && GET_CODE (XEXP (x, 0)) == UNSPEC) > + /* High part of a symbol ref/address can not be put into constant pool. e.g. > + (high:DI (symbol_ref:DI ("var")..)) or > + (high:DI (unspec:DI [(symbol_ref/u:DI ("*.LC0")..) > + (high:DI (const:DI (plus:DI (symbol_ref:DI ("xx")) (const_int 12)))). */ > + if (GET_CODE (x) == HIGH) > return true; > > /* A TLS symbol in the TOC cannot contain a sum. */
"Kewen.Lin" <linkw@linux.ibm.com> writes: > Hi Jeff, > > Thanks for the patch, one question is inlined below. > > on 2022/7/4 14:58, Jiufu Guo wrote: >> The high part of the symbol address is invalid for the constant pool. In >> function rs6000_cannot_force_const_mem, we already return true for >> "HIGH with UNSPEC" rtx. During debug GCC, I found that >> rs6000_cannot_force_const_mem is called for some other HIGH code rtx >> expressions which also indicate the high part of a symbol_ref. >> For example: >> (high:DI (const:DI (plus:DI (symbol_ref:DI ("xx") (const_int 12 [0xc]))))) >> (high:DI (symbol_ref:DI ("var_1")..))) >> >> In the below case, this kind of rtx could occur in the middle of optimizations >> pass but was not dumped to a file. So, no test case is attached to this >> patch. >> > > Could you help to expand this more on how it affects some tree-optimization pass? > I guess some tree-opt will expand gimple expression to rtx, evaluate the cost > or similar and make some decision basing on it. If that is the case, you probably > can construct one test case to show that: without this patch, the evaluated cost > or similar looks off, the optimization decision is sub-optimal; with this patch, > the optimization result is expected. Hi Kewen, Thanks a lot for your comments! From my investigations, I find some cases for which rs6000_cannot_force_const_mem is called on "HIGH code" rtx which is not UNSPEC sub-code. The code "decSetCoeff" is an example. In the middle of "combine" pass, function "recog_for_combine" invokes "force_const_mem", and the invoking could fail. src = force_const_mem (mode, src); if (src) { SUBST (SET_SRC (pat), src); changed = true; } Here, the rtx "(high:DI (unspec:DI [(symbol_ref" is the argument for the example code "decSetCoeff". I also tried to see if other passes(GIMPLE) could hit this kind cases, but did not find. BR, Jiufu(Jeff) > > BR, > Kewen > > >> extern const unsigned int __decPOWERS[10]; >> void >> decSetCoeff (int *residue, const unsigned int *up) >> { >> unsigned int half = (unsigned int) __decPOWERS1[3] >> 1; >> >> if (*up >= half) >> *residue = 7; >> >> return; >> } >> >> This patch updates rs6000_cannot_force_const_mem to return true for >> rtx with HIGH code. >> >> >> Bootstrapped and regtested on ppc64le and ppc64. >> Is it ok for trunk? >> >> BR, >> Jiufu Guo >> >> >> gcc/ChangeLog: >> >> * config/rs6000/rs6000.cc (rs6000_cannot_force_const_mem): >> Return true for HIGH code rtx. >> >> --- >> gcc/config/rs6000/rs6000.cc | 7 +++++-- >> 1 file changed, 5 insertions(+), 2 deletions(-) >> >> diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc >> index 3ff16b8ae04..c2b10669627 100644 >> --- a/gcc/config/rs6000/rs6000.cc >> +++ b/gcc/config/rs6000/rs6000.cc >> @@ -9707,8 +9707,11 @@ rs6000_init_stack_protect_guard (void) >> static bool >> rs6000_cannot_force_const_mem (machine_mode mode ATTRIBUTE_UNUSED, rtx x) >> { >> - if (GET_CODE (x) == HIGH >> - && GET_CODE (XEXP (x, 0)) == UNSPEC) >> + /* High part of a symbol ref/address can not be put into constant pool. e.g. >> + (high:DI (symbol_ref:DI ("var")..)) or >> + (high:DI (unspec:DI [(symbol_ref/u:DI ("*.LC0")..) >> + (high:DI (const:DI (plus:DI (symbol_ref:DI ("xx")) (const_int 12)))). */ >> + if (GET_CODE (x) == HIGH) >> return true; >> >> /* A TLS symbol in the TOC cannot contain a sum. */
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 3ff16b8ae04..c2b10669627 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -9707,8 +9707,11 @@ rs6000_init_stack_protect_guard (void) static bool rs6000_cannot_force_const_mem (machine_mode mode ATTRIBUTE_UNUSED, rtx x) { - if (GET_CODE (x) == HIGH - && GET_CODE (XEXP (x, 0)) == UNSPEC) + /* High part of a symbol ref/address can not be put into constant pool. e.g. + (high:DI (symbol_ref:DI ("var")..)) or + (high:DI (unspec:DI [(symbol_ref/u:DI ("*.LC0")..) + (high:DI (const:DI (plus:DI (symbol_ref:DI ("xx")) (const_int 12)))). */ + if (GET_CODE (x) == HIGH) return true; /* A TLS symbol in the TOC cannot contain a sum. */