From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) by sourceware.org (Postfix) with ESMTPS id 80BD03858D32; Tue, 13 Jun 2023 03:30:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 80BD03858D32 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.ibm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linux.ibm.com Received: from pps.filterd (m0353726.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 35D3HGn4002804; Tue, 13 Jun 2023 03:30:42 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : references : date : in-reply-to : message-id : mime-version : content-type : content-transfer-encoding; s=pp1; bh=94DikOMxstVAyq4DwgZEiZrimMuDOFvkaX8HJ4TOHOA=; b=GTJovHfJzY4CjFxZTyDqOuomeKryL6RUnu4+Tp7ZG1y56EjTfGaOVcA/p/tNvv3Oc2cJ h0a01JPfb9WOunf1OmArW5+e+9kEI61BYZQgMFmWArv0xnFRXTQO++gwyTRGYtY4HPxX 9g8zY4CDtaCeWyusa291nC5jYBAOLmuo0XD6OCv5p5UVVIAM75DU9cpZQVEjq0Pai/pD B6nubRovt3EoAG9D87PlYrUdA8Wo3zl65x2OvRlhOarXuKZA/tS3g3cLZUNY0uIUrQpF EzNq47Xa/tCFGuRZEqpqa0m3RD7ftCWoVQZZYqrkaKo5WOj+sEZ1tgs1XQmu7+QvzwrH 5g== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3r6gdpr59m-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 13 Jun 2023 03:30:42 +0000 Received: from m0353726.ppops.net (m0353726.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 35D3UfnT009107; Tue, 13 Jun 2023 03:30:41 GMT Received: from ppma04dal.us.ibm.com (7a.29.35a9.ip4.static.sl-reverse.com [169.53.41.122]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3r6gdpr595-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 13 Jun 2023 03:30:41 +0000 Received: from pps.filterd (ppma04dal.us.ibm.com [127.0.0.1]) by ppma04dal.us.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 35D2SBCg011879; Tue, 13 Jun 2023 03:30:40 GMT Received: from smtprelay02.dal12v.mail.ibm.com ([9.208.130.97]) by ppma04dal.us.ibm.com (PPS) with ESMTPS id 3r4gt5pejs-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 13 Jun 2023 03:30:40 +0000 Received: from smtpav06.wdc07v.mail.ibm.com (smtpav06.wdc07v.mail.ibm.com [10.39.53.233]) by smtprelay02.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 35D3UdSO20447934 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 13 Jun 2023 03:30:39 GMT Received: from smtpav06.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4D1585803F; Tue, 13 Jun 2023 03:30:39 +0000 (GMT) Received: from smtpav06.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E19AD5804E; Tue, 13 Jun 2023 03:30:38 +0000 (GMT) Received: from ltcden2-lp1.aus.stglabs.ibm.com (unknown [9.3.90.43]) by smtpav06.wdc07v.mail.ibm.com (Postfix) with ESMTPS; Tue, 13 Jun 2023 03:30:38 +0000 (GMT) From: Jiufu Guo To: David Edelsohn Cc: gcc-patches@gcc.gnu.org, segher@kernel.crashing.org, linkw@gcc.gnu.org, bergner@linux.ibm.com Subject: Re: [PATCH 1/4] rs6000: build constant via li;rotldi References: <20230608015547.3432691-1-guojiufu@linux.ibm.com> <20230608015547.3432691-2-guojiufu@linux.ibm.com> Date: Tue, 13 Jun 2023 11:30:36 +0800 In-Reply-To: (David Edelsohn's message of "Sat, 10 Jun 2023 21:11:16 -0400") Message-ID: <7ncz20ca3n.fsf@ltcden2-lp1.aus.stglabs.ibm.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: pZx6hizNtIB33tfY79Ik5d0NGnwC4aBe X-Proofpoint-GUID: ycTWkRaTEgA6P075cQR4enkZUqqFF1RP X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.957,Hydra:6.0.573,FMLib:17.11.176.26 definitions=2023-06-12_18,2023-06-12_02,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 priorityscore=1501 bulkscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 phishscore=0 adultscore=0 mlxlogscore=999 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2305260000 definitions=main-2306130025 X-Spam-Status: No, score=-11.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_MSPIKE_H5,RCVD_IN_MSPIKE_WL,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 List-Id: Hi David, David Edelsohn writes: > On Wed, Jun 7, 2023 at 9:55=E2=80=AFPM Jiufu Guo = wrote: > > Hi, > > This patch checks if a constant is possible to be rotated to/from a posi= tive > or negative value from "li". If so, we could use "li;rotldi" to build it. > > Bootstrap and regtest pass on ppc64{,le}. > Is this ok for trunk? > > BR, > Jeff (Jiufu) > > gcc/ChangeLog: > > * config/rs6000/rs6000.cc (can_be_rotated_to_positive_li): New f= unction. > (can_be_rotated_to_negative_li): New function. > (can_be_built_by_li_and_rotldi): New function. > (rs6000_emit_set_long_const): Call can_be_built_by_li_and_rotldi. > > gcc/testsuite/ChangeLog: > > * gcc.target/powerpc/const-build.c: New test. > --- > gcc/config/rs6000/rs6000.cc | 64 +++++++++++++++++-- > .../gcc.target/powerpc/const-build.c | 54 ++++++++++++++++ > 2 files changed, 112 insertions(+), 6 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/powerpc/const-build.c > > diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc > index 42f49e4a56b..1dd0072350a 100644 > --- a/gcc/config/rs6000/rs6000.cc > +++ b/gcc/config/rs6000/rs6000.cc > @@ -10258,6 +10258,48 @@ rs6000_emit_set_const (rtx dest, rtx source) > return true; > } > > +/* Check if C can be rotated to a positive value which 'li' instruction > + is able to load. If so, set *ROT to the number by which C is rotate= d, > + and return true. Return false otherwise. */ > + > +static bool > +can_be_rotated_to_positive_li (HOST_WIDE_INT c, int *rot) > +{ > + /* 49 leading zeros and 15 low bits on the positive value > + generated by 'li' instruction. */ > + return can_be_rotated_to_lowbits (c, 15, rot); > +} > + > +/* Like can_be_rotated_to_positive_li, but check the negative value of = 'li'. */ > + > +static bool > +can_be_rotated_to_negative_li (HOST_WIDE_INT c, int *rot) > +{ > + return can_be_rotated_to_lowbits (~c, 15, rot); > +} > + > +/* Check if value C can be built by 2 instructions: one is 'li', anothe= r is > + rotldi. > + > + If so, *SHIFT is set to the shift operand of rotldi(rldicl), and *MA= SK > + is set to -1, and return true. Return false otherwise. */ > + > > I look at this feature and it's good, but I don't fully understand the be= nefit of this level of abstraction. Ideally all of the above functions wou= ld > be inlined. They aren't reused. >=20=20 > +static bool > +can_be_built_by_li_and_rotldi (HOST_WIDE_INT c, int *shift, > + HOST_WIDE_INT *mask) > +{ > + int n; > + if (can_be_rotated_to_positive_li (c, &n) > + || can_be_rotated_to_negative_li (c, &n)) > > Why not > > /* Check if C or ~C can be rotated to a positive or negative value > which 'li' instruction is able to load. */ > if (can_be_rotated_to_lowbits (c, 15, &n) > || can_be_rotated_to_lowbits (~c, 15, &n)) =20 Thanks a lot for your review!! Your suggestions could also achieve my goal of using a new function: Using "can_be_rotated_to_positive_li" is just trying to get a straightforward name. Like yours, the code's comments would also make it easy to understand. BR, Jeff (Jiufu Guo) >=20=20 > ... > > This is a style of software engineering, but it seems overkill to me when= the function is a single line that tail calls another function. Am I miss= ing > something? > > The rest of this patch looks good. > > Thanks, David >=20=20 > + { > + *mask =3D HOST_WIDE_INT_M1; > + *shift =3D HOST_BITS_PER_WIDE_INT - n; > + return true; > + } > + > + return false; > +} > + > /* Subroutine of rs6000_emit_set_const, handling PowerPC64 DImode. > Output insns to set DEST equal to the constant C as a series of > lis, ori and shl instructions. */ > @@ -10266,15 +10308,14 @@ static void > rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c) > { > rtx temp; > + int shift; > + HOST_WIDE_INT mask; > HOST_WIDE_INT ud1, ud2, ud3, ud4; > > ud1 =3D c & 0xffff; > - c =3D c >> 16; > - ud2 =3D c & 0xffff; > - c =3D c >> 16; > - ud3 =3D c & 0xffff; > - c =3D c >> 16; > - ud4 =3D c & 0xffff; > + ud2 =3D (c >> 16) & 0xffff; > + ud3 =3D (c >> 32) & 0xffff; > + ud4 =3D (c >> 48) & 0xffff; > > if ((ud4 =3D=3D 0xffff && ud3 =3D=3D 0xffff && ud2 =3D=3D 0xffff && (= ud1 & 0x8000)) > || (ud4 =3D=3D 0 && ud3 =3D=3D 0 && ud2 =3D=3D 0 && ! (ud1 & 0x80= 00))) > @@ -10305,6 +10346,17 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE= _INT c) > emit_move_insn (dest, gen_rtx_XOR (DImode, temp, > GEN_INT ((ud2 ^ 0xffff) << 16))= ); > } > + else if (can_be_built_by_li_and_rotldi (c, &shift, &mask)) > + { > + temp =3D !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode); > + unsigned HOST_WIDE_INT imm =3D (c | ~mask); > + imm =3D (imm >> shift) | (imm << (HOST_BITS_PER_WIDE_INT - shift)= ); > + > + emit_move_insn (temp, GEN_INT (imm)); > + if (shift !=3D 0) > + temp =3D gen_rtx_ROTATE (DImode, temp, GEN_INT (shift)); > + emit_move_insn (dest, temp); > + } > else if (ud3 =3D=3D 0 && ud4 =3D=3D 0) > { > temp =3D !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode); > diff --git a/gcc/testsuite/gcc.target/powerpc/const-build.c b/gcc/testsu= ite/gcc.target/powerpc/const-build.c > new file mode 100644 > index 00000000000..70f095f6bf2 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/powerpc/const-build.c > @@ -0,0 +1,54 @@ > +/* { dg-do run } */ > +/* { dg-options "-O2 -save-temps" } */ > +/* { dg-require-effective-target has_arch_ppc64 } */ > + > +#define NOIPA __attribute__ ((noipa)) > + > +struct fun > +{ > + long long (*f) (void); > + long long val; > +}; > + > +long long NOIPA > +li_rotldi_1 (void) > +{ > + return 0x7531000000000LL; > +} > + > +long long NOIPA > +li_rotldi_2 (void) > +{ > + return 0x2100000000000064LL; > +} > + > +long long NOIPA > +li_rotldi_3 (void) > +{ > + return 0xffff8531ffffffffLL; > +} > + > +long long NOIPA > +li_rotldi_4 (void) > +{ > + return 0x21ffffffffffff94LL; > +} > + > +struct fun arr[] =3D { > + {li_rotldi_1, 0x7531000000000LL}, > + {li_rotldi_2, 0x2100000000000064LL}, > + {li_rotldi_3, 0xffff8531ffffffffLL}, > + {li_rotldi_4, 0x21ffffffffffff94LL}, > +}; > + > +/* { dg-final { scan-assembler-times {\mrotldi\M} 4 } } */ > + > +int > +main () > +{ > + for (int i =3D 0; i < sizeof (arr) / sizeof (arr[0]); i++) > + if ((*arr[i].f) () !=3D arr[i].val) > + __builtin_abort (); > + > + return 0; > +} > --=20 > 2.39.1