From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) by sourceware.org (Postfix) with ESMTPS id 858BB3858C53 for ; Mon, 18 Mar 2024 09:10:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 858BB3858C53 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 ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 858BB3858C53 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710753044; cv=none; b=oFJaEmItqGQstL7129YUPRRzE2R/EIQ5ZnoTmePPXrdAs3JSJCFUtP8Rez3a6w0dD9CizENTy0Rs3fIMJbpGVBGh0+K3/SGnhnEp7XXDsrs+ADxj78cixcENW4Em8wKb9hTWD87NJXE3lb0pWBiD1i/aMp9l86cpoxHBK2jCWak= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710753044; c=relaxed/simple; bh=qARyZJ4lPaclB8o2gTpc75h05rEA0s20RuQzE1cPrtw=; h=DKIM-Signature:Message-ID:Date:Subject:From:To:MIME-Version; b=eJEeDfSIotJ7Ykk7cnGl57KAGLqoS/P9LerHtkqt9xUvF5QKTGq/FjPPIKsNkRBAFR3RWnJQZkjmfBBtyOBEcDlmTU+Xog5CUcaLtOIiTPUst42PECEPyoLHsbBmF5A/RyV8kJiaaim2hJeHquQXPFU5nWyKdeS11fRg0u8WMdI= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 42I7vEIT015269; Mon, 18 Mar 2024 09:10:40 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=message-id : date : subject : from : to : cc : references : in-reply-to : content-type : content-transfer-encoding : mime-version; s=pp1; bh=Bh7jZ7reK4/SM9YtuIkfOFehDxQDBHdJMslpNn+VouQ=; b=Mfh6I8KLbPK2EwNV9Mh0ONNCol5kohVBIRWQ0qv52DRQ2ZS2qzZay3ZBc9Npjvz32cxr pKdlsbZvI+eLiDp1QU6CoECEOnJawCu3kaWHDP5n5Z6t5GzXANePjAUJC8GOySucX3QD R59BhxNvE8jMv1/i1qgTyaVDaCvxXQC49whMFlOLzd0kMtDN7kEcnvqfYQcFT/bMf/JD 9+ztAgS+zZlOXFcqzYyzDPNsMROMYm7v9gJpPkbrXKo/9XvOHTCFGlkNYjMMHcseRQ3+ Ohjnq7mkynLRHCwNQB3vewKG2qBZ3uhWPzxa8FZ5jbN7+7RtBRCXmo0jP4dB3EuseN3U 4A== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3wwn5ftxbu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 18 Mar 2024 09:10:39 +0000 Received: from m0356516.ppops.net (m0356516.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 42I97pDt005176; Mon, 18 Mar 2024 09:10:39 GMT Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3wwn5ftxbm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 18 Mar 2024 09:10:39 +0000 Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 42I8nY3T015759; Mon, 18 Mar 2024 09:10:38 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 3wwp4yqyvh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 18 Mar 2024 09:10:38 +0000 Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay02.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 42I9AXdJ35783076 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 18 Mar 2024 09:10:35 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0DDBC2004F; Mon, 18 Mar 2024 09:10:33 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0806F2004B; Mon, 18 Mar 2024 09:10:31 +0000 (GMT) Received: from [9.197.245.53] (unknown [9.197.245.53]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 18 Mar 2024 09:10:30 +0000 (GMT) Message-ID: Date: Mon, 18 Mar 2024 17:10:32 +0800 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH, RFC] combine: Don't truncate const operand of AND if it's no benefits From: HAO CHEN GUI To: gcc-patches Cc: Segher Boessenkool , David , "Kewen.Lin" , Peter Bergner References: Content-Language: en-US In-Reply-To: Content-Type: text/plain; charset=UTF-8 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: QWJSq60cWJPCO17-21krem0G5uiUhAzS X-Proofpoint-ORIG-GUID: aqjRzjpcYBCPv-VIQQ36GSEkjo0CzPA3 Content-Transfer-Encoding: 8bit X-Proofpoint-UnRewURL: 0 URL was un-rewritten MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.272,Aquarius:18.0.1011,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2024-03-17_12,2024-03-18_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 priorityscore=1501 suspectscore=0 phishscore=0 mlxlogscore=999 impostorscore=0 lowpriorityscore=0 spamscore=0 clxscore=1015 adultscore=0 bulkscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2403140000 definitions=main-2403180067 X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_MSPIKE_H4,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, Gently ping this: https://gcc.gnu.org/pipermail/gcc-patches/2024-March/647533.html Thanks Gui Haochen 在 2024/3/11 13:41, HAO CHEN GUI 写道: > Hi, > This patch tries to fix the problem when a canonical form doesn't benefit > on a specific target. The const operand of AND is and with the nonzero > bits of another operand in combine pass. It's a canonical form, but it's no > benefits for the target which has rotate and mask insns. As the mask is > truncated, it can't match the insn conditions which it originally matches. > For example, the following insn condition checks the sum of two AND masks. > When one of the mask is truncated, the condition breaks. > > (define_insn "*rotlsi3_insert_5" > [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r") > (ior:SI (and:SI (match_operand:SI 1 "gpc_reg_operand" "0,r") > (match_operand:SI 2 "const_int_operand" "n,n")) > (and:SI (match_operand:SI 3 "gpc_reg_operand" "r,0") > (match_operand:SI 4 "const_int_operand" "n,n"))))] > "rs6000_is_valid_mask (operands[2], NULL, NULL, SImode) > && UINTVAL (operands[2]) != 0 && UINTVAL (operands[4]) != 0 > && UINTVAL (operands[2]) + UINTVAL (operands[4]) + 1 == 0" > ... > > This patch tries to fix the problem by comparing the rtx cost. If another > operand (varop) is not changed and rtx cost with new mask is not less than > the original one, the mask is restored to original one. > > I'm not sure if comparison of rtx cost here is proper. The outer code is > unknown and I suppose it as "SET". Also the rtx cost might not be accurate. > From my understanding, the canonical forms should always benefit as it can't > be undo in combine pass. Do we have a perfect solution for this kind of > issues? Looking forward for your advice. > > Another similar issues for canonical forms. Whether the widen mode for > lshiftrt is always good? > https://gcc.gnu.org/pipermail/gcc-patches/2023-July/624852.html > > Thanks > Gui Haochen > > ChangeLog > Combine: Don't truncate const operand of AND if it's no benefits > > In combine pass, the canonical form is to turn off all bits in the constant > that are know to already be zero for AND. > > /* Turn off all bits in the constant that are known to already be zero. > Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS > which is tested below. */ > > constop &= nonzero; > > But it doesn't benefit when the target has rotate and mask insert insns. > The AND mask is truncated and lost its information. Thus it can't match > the insn conditions. For example, the following insn condition checks > the sum of two AND masks. > > (define_insn "*rotlsi3_insert_5" > [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r") > (ior:SI (and:SI (match_operand:SI 1 "gpc_reg_operand" "0,r") > (match_operand:SI 2 "const_int_operand" "n,n")) > (and:SI (match_operand:SI 3 "gpc_reg_operand" "r,0") > (match_operand:SI 4 "const_int_operand" "n,n"))))] > "rs6000_is_valid_mask (operands[2], NULL, NULL, SImode) > && UINTVAL (operands[2]) != 0 && UINTVAL (operands[4]) != 0 > && UINTVAL (operands[2]) + UINTVAL (operands[4]) + 1 == 0" > ... > > This patch restores the const operand of AND if the another operand is > not optimized and the truncated const operand doesn't save the rtx cost. > > gcc/ > * combine.cc (simplify_and_const_int_1): Restore the const operand > of AND if varop is not optimized and the rtx cost of the new const > operand is not reduced. > > gcc/testsuite/ > * gcc.target/powerpc/rlwimi-0.c: Reduced total number of insns and > adjust the number of rotate and mask insns. > * gcc.target/powerpc/rlwimi-1.c: Likewise. > * gcc.target/powerpc/rlwimi-2.c: Likewise. > > patch.diff > diff --git a/gcc/combine.cc b/gcc/combine.cc > index a4479f8d836..16ff09ea854 100644 > --- a/gcc/combine.cc > +++ b/gcc/combine.cc > @@ -10161,8 +10161,23 @@ simplify_and_const_int_1 (scalar_int_mode mode, rtx varop, > if (constop == nonzero) > return varop; > > - if (varop == orig_varop && constop == orig_constop) > - return NULL_RTX; > + if (varop == orig_varop) > + { > + if (constop == orig_constop) > + return NULL_RTX; > + else > + { > + rtx tmp = simplify_gen_binary (AND, mode, varop, > + gen_int_mode (constop, mode)); > + rtx orig = simplify_gen_binary (AND, mode, varop, > + gen_int_mode (orig_constop, mode)); > + if (set_src_cost (tmp, mode, optimize_this_for_speed_p) > + < set_src_cost (orig, mode, optimize_this_for_speed_p)) > + return tmp; > + else > + return NULL_RTX; > + } > + } > > /* Otherwise, return an AND. */ > return simplify_gen_binary (AND, mode, varop, gen_int_mode (constop, mode)); > diff --git a/gcc/testsuite/gcc.target/powerpc/rlwimi-0.c b/gcc/testsuite/gcc.target/powerpc/rlwimi-0.c > index 961be199901..d9dd4419f1d 100644 > --- a/gcc/testsuite/gcc.target/powerpc/rlwimi-0.c > +++ b/gcc/testsuite/gcc.target/powerpc/rlwimi-0.c > @@ -2,15 +2,15 @@ > /* { dg-options "-O2" } */ > > /* { dg-final { scan-assembler-times {(?n)^\s+[a-z]} 16485 { target ilp32 } } } */ > -/* { dg-final { scan-assembler-times {(?n)^\s+[a-z]} 19909 { target lp64 } } } */ > +/* { dg-final { scan-assembler-times {(?n)^\s+[a-z]} 19780 { target lp64 } } } */ > /* { dg-final { scan-assembler-times {(?n)^\s+blr} 6750 } } */ > /* { dg-final { scan-assembler-times {(?n)^\s+mr} 3007 { target ilp32 } } } */ > -/* { dg-final { scan-assembler-times {(?n)^\s+mr} 11 { target lp64 } } } */ > -/* { dg-final { scan-assembler-times {(?n)^\s+rldicl} 6420 { target lp64 } } } */ > +/* { dg-final { scan-assembler-times {(?n)^\s+mr} 140 { target lp64 } } } */ > +/* { dg-final { scan-assembler-times {(?n)^\s+rldicl} 6162 { target lp64 } } } */ > > /* { dg-final { scan-assembler-times {(?n)^\s+rlwimi} 6420 { target ilp32 } } } */ > -/* { dg-final { scan-assembler-times {(?n)^\s+rldimi} 310 { target lp64 } } } */ > -/* { dg-final { scan-assembler-times {(?n)^\s+rlwimi} 6110 { target lp64 } } } */ > +/* { dg-final { scan-assembler-times {(?n)^\s+rldimi} 366 { target lp64 } } } */ > +/* { dg-final { scan-assembler-times {(?n)^\s+rlwimi} 6054 { target lp64 } } } */ > /* { dg-final { scan-assembler-times {(?n)^\s+rotlwi} 308 } } */ > > > diff --git a/gcc/testsuite/gcc.target/powerpc/rlwimi-1.c b/gcc/testsuite/gcc.target/powerpc/rlwimi-1.c > index e2c607b1d45..d955fc792d9 100644 > --- a/gcc/testsuite/gcc.target/powerpc/rlwimi-1.c > +++ b/gcc/testsuite/gcc.target/powerpc/rlwimi-1.c > @@ -2,15 +2,15 @@ > /* { dg-options "-O2" } */ > > /* { dg-final { scan-assembler-times {(?n)^\s+[a-z]} 13977 { target ilp32 } } } */ > -/* { dg-final { scan-assembler-times {(?n)^\s+[a-z]} 20217 { target lp64 } } } */ > +/* { dg-final { scan-assembler-times {(?n)^\s+[a-z]} 20189 { target lp64 } } } */ > /* { dg-final { scan-assembler-times {(?n)^\s+blr} 6750 } } */ > /* { dg-final { scan-assembler-times {(?n)^\s+mr} 499 { target ilp32 } } } */ > -/* { dg-final { scan-assembler-times {(?n)^\s+mr} 11 { target lp64 } } } */ > -/* { dg-final { scan-assembler-times {(?n)^\s+rldicl} 6728 { target lp64 } } } */ > +/* { dg-final { scan-assembler-times {(?n)^\s+mr} 39 { target lp64 } } } */ > +/* { dg-final { scan-assembler-times {(?n)^\s+rldicl} 6672 { target lp64 } } } */ > > /* { dg-final { scan-assembler-times {(?n)^\s+rlwimi} 1404 { target ilp32 } } } */ > -/* { dg-final { scan-assembler-times {(?n)^\s+rldimi} 134 { target lp64 } } } */ > -/* { dg-final { scan-assembler-times {(?n)^\s+rlwimi} 1270 { target lp64 } } } */ > +/* { dg-final { scan-assembler-times {(?n)^\s+rldimi} 190 { target lp64 } } } */ > +/* { dg-final { scan-assembler-times {(?n)^\s+rlwimi} 1214 { target lp64 } } } */ > > /* { dg-final { scan-assembler-times {(?n)^\s+mulli} 5324 } } */ > > diff --git a/gcc/testsuite/gcc.target/powerpc/rlwimi-2.c b/gcc/testsuite/gcc.target/powerpc/rlwimi-2.c > index bafa371db73..9abfd7abf08 100644 > --- a/gcc/testsuite/gcc.target/powerpc/rlwimi-2.c > +++ b/gcc/testsuite/gcc.target/powerpc/rlwimi-2.c > @@ -2,14 +2,14 @@ > /* { dg-options "-O2" } */ > > /* { dg-final { scan-assembler-times {(?n)^\s+[a-z]} 14121 { target ilp32 } } } */ > -/* { dg-final { scan-assembler-times {(?n)^\s+[a-z]} 20217 { target lp64 } } } */ > +/* { dg-final { scan-assembler-times {(?n)^\s+[a-z]} 19622 { target lp64 } } } */ > /* { dg-final { scan-assembler-times {(?n)^\s+blr} 6750 } } */ > /* { dg-final { scan-assembler-times {(?n)^\s+mr} 643 { target ilp32 } } } */ > -/* { dg-final { scan-assembler-times {(?n)^\s+mr} 11 { target lp64 } } } */ > -/* { dg-final { scan-assembler-times {(?n)^\s+rldicl} 7790 { target lp64 } } } */ > +/* { dg-final { scan-assembler-times {(?n)^\s+mr} 658 { target lp64 } } } */ > +/* { dg-final { scan-assembler-times {(?n)^\s+rldicl} 5460 { target lp64 } } } */ > > /* { dg-final { scan-assembler-times {(?n)^\s+rlwimi} 1692 { target ilp32 } } } */ > -/* { dg-final { scan-assembler-times {(?n)^\s+rlwimi} 1666 { target lp64 } } } */ > +/* { dg-final { scan-assembler-times {(?n)^\s+rlwimi} 1610 { target lp64 } } } */ > > /* { dg-final { scan-assembler-times {(?n)^\s+mulli} 5036 } } */ >