{"id":2233232,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2233232/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/8a6698e2-4e65-4611-9e93-25ed121d9092@oss.qualcomm.com/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/1.1/projects/17/?format=json","name":"GNU Compiler Collection","link_name":"gcc","list_id":"gcc-patches.gcc.gnu.org","list_email":"gcc-patches@gcc.gnu.org","web_url":null,"scm_url":null,"webscm_url":null},"msgid":"<8a6698e2-4e65-4611-9e93-25ed121d9092@oss.qualcomm.com>","date":"2026-05-05T21:05:44","name":"[to-be-committed,RISC-V,PR,rtl-optimization/80770] Simplify bit flipping operations down to xor","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"0fd8e3d0421d16d11980888659a0831dedbcd937","submitter":{"id":92310,"url":"http://patchwork.ozlabs.org/api/1.1/people/92310/?format=json","name":"Jeffrey Law","email":"jeffrey.law@oss.qualcomm.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/8a6698e2-4e65-4611-9e93-25ed121d9092@oss.qualcomm.com/mbox/","series":[{"id":502899,"url":"http://patchwork.ozlabs.org/api/1.1/series/502899/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=502899","date":"2026-05-05T21:05:44","name":"[to-be-committed,RISC-V,PR,rtl-optimization/80770] Simplify bit flipping operations down to xor","version":1,"mbox":"http://patchwork.ozlabs.org/series/502899/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2233232/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2233232/checks/","tags":{},"headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.a=rsa-sha256\n header.s=qcppdkim1 header.b=YLCA4C+X;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.a=rsa-sha256 header.s=google header.b=j9Y1DFNv;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=38.145.34.32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.a=rsa-sha256\n header.s=qcppdkim1 header.b=YLCA4C+X;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.a=rsa-sha256 header.s=google header.b=j9Y1DFNv","sourceware.org; dmarc=none (p=none dis=none)\n header.from=oss.qualcomm.com","sourceware.org;\n spf=pass smtp.mailfrom=oss.qualcomm.com","server2.sourceware.org;\n arc=none smtp.remote-ip=205.220.168.131"],"Received":["from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g99zp2TMpz1yJV\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 06 May 2026 07:06:30 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 126474BABF35\n\tfor <incoming@patchwork.ozlabs.org>; Tue,  5 May 2026 21:06:28 +0000 (GMT)","from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com\n [205.220.168.131])\n by sourceware.org (Postfix) with ESMTPS id CD9F04BA2E06\n for <gcc-patches@gcc.gnu.org>; Tue,  5 May 2026 21:05:49 +0000 (GMT)","from pps.filterd (m0279867.ppops.net [127.0.0.1])\n by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 645Do2xo3475717\n for <gcc-patches@gcc.gnu.org>; Tue, 5 May 2026 21:05:48 GMT","from mail-dy1-f199.google.com (mail-dy1-f199.google.com\n [74.125.82.199])\n by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4dyhsgssgu-1\n (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n for <gcc-patches@gcc.gnu.org>; Tue, 05 May 2026 21:05:48 +0000 (GMT)","by mail-dy1-f199.google.com with SMTP id\n 5a478bee46e88-2efc342ef15so4601537eec.1\n for <gcc-patches@gcc.gnu.org>; Tue, 05 May 2026 14:05:48 -0700 (PDT)","from [172.31.0.17] ([136.38.201.137])\n by smtp.gmail.com with ESMTPSA id\n 5a478bee46e88-2f56d8c45acsm601270eec.13.2026.05.05.14.05.46\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Tue, 05 May 2026 14:05:46 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 126474BABF35","OpenDKIM Filter v2.11.0 sourceware.org CD9F04BA2E06"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org CD9F04BA2E06","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org CD9F04BA2E06","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1778015150; cv=none;\n b=L9fLtjXQXULG3GcjL45OZ1h4+RTHV2jhDA/2LcsYt+nqb9JiOJbDmdbQ2GPQelMmMzkubPvylANCSDv6SAHPR9oFwkLKcX4+p5szs4jPNDzlrHMpZAd0ZDACuHWRSumvrtg3sKdBlYYzD4jeeC02If1j5Q0rLnJc2lR9RoMzqWc=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1778015150; c=relaxed/simple;\n bh=QQvpV+O+AnMaFFwpNG10g6RhCZmxqHNJArN9wDAKhKg=;\n h=DKIM-Signature:DKIM-Signature:Message-ID:Date:MIME-Version:From:\n Subject:To;\n b=VFrgUXD7LUtykr/FfFJaU+aY2D3QeGmrl/u+GbBP4MYP2PrOKepa62++HWjS0g746WuH50c7bwGX8RW6EDeSXtj6f1Gqt/0QI9VSB5DlKA85d6M6GCqGAoAtFkfvdcM4g7iXy4MrMvQ3eIon0KxtguPtqPwzaKT0tyIKjGQ5wI8=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n cc:content-type:date:from:message-id:mime-version:subject:to; s=\n qcppdkim1; bh=ysVe1FvMU60WUIH9Lga2A5jky4GoSBuFkNXitFZDvGs=; b=YL\n CA4C+XmL6qPKZbnk8Z2ADLdj44N8PcRbHrmPFvEVXoIhamalgmBNoDRcp125Sg3Z\n Vbxnhe77NpOFByuP1KdvPPKhG8QHaq3+S3G58hrK4zGFu3wEhZwu6f1vI/S/Db1Z\n bHIrHl2qBri6IRUqdqpkxhmoBg675smU6Cw0FnouCh5dP41p3i+D1M1zNnfqdzS8\n gV99YRTwGoCTK2YLJszBIJaE8kRnjvojmmEqFbNBqNhi1xahWyzFMqzaoCQidaXW\n qOuAdlVjUsz8QJ2cQFc6e9vDomD++la6X/lkD2iKfv5R5pSYCM3OvEjGm9KvsV7v\n lg9yhk5iYXviWBWDpIzQ==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=oss.qualcomm.com; s=google; t=1778015148; x=1778619948; darn=gcc.gnu.org;\n h=cc:to:subject:from:content-language:user-agent:mime-version:date\n :message-id:from:to:cc:subject:date:message-id:reply-to;\n bh=ysVe1FvMU60WUIH9Lga2A5jky4GoSBuFkNXitFZDvGs=;\n b=j9Y1DFNvcwLTZqfEqEdQevESZKlOqG4aFFPuKSHDwK0Wxkbc/e96PEXlVuw5VWigpY\n 9IAiyNm/Hr0HmrD7z0dgDgMyLddiTcr/bNUzo7z1CW5M4R0Roao+JhaGtbUf2z+TeqcM\n 2K3ff1R6wNMLc9wpuCdp6a2QE80jBtwjzFk8n0dCejWJae0Ev/l3ETAHHp6QphOlXX9n\n +rntXexLTCIP4lTbq6r5AOChojMgqJzTEfjVH41JV4sKM1wJ7ZXmWMUA0JMyXfwTHI6g\n 3+yOI7H/i1zfCoHDUMaXoP/CzujWsNrmPpPIXSVYQ/zJ9lpyWNWdnrlUDgLYzCztaCm0\n Nuhg=="],"X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1778015148; x=1778619948;\n h=cc:to:subject:from:content-language:user-agent:mime-version:date\n :message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=ysVe1FvMU60WUIH9Lga2A5jky4GoSBuFkNXitFZDvGs=;\n b=ZJjZGIzqVCgtE/wx0y91wtt437SeFhlHmtl8Z+s9SrX+vrbFG0YOin7TMKtwLVAMk3\n YO8S93b7msdo3aQXJ4Ikl35l+3d1GEgm3zXI0ulCBeupfxSCQx04D9NrPAwcscfC5ORQ\n ZYHTsTYyDeVRNIwembgkCYDwgCc1ex0FBvMY5BmuRm8AauTn9A7zqewsmRYjR/45otQR\n uFqEseH+3LbIgjfaCzKoOWqcYgDnzGxp/5BZfU73AoOpF/pfpFL79FmYOlFypHrrfzxs\n EI2yNpzK61e1KGHgQY40UYPh4IC0JNbM2lZNR665sNZhJQefYm6rUf1JpC/Q2kDVf56a\n /U0Q==","X-Gm-Message-State":"AOJu0YzO0YGqKaH6k1mQ2Oh8A+Ay2hPKrUW7Zmgg6Tpuom9pjY184aEi\n gMRpV9Fsm71q0pW+zSoxuVLyqLBwgUo4TWHfCW0kiBTPfr5mIzfi9zy3gopD41bxnJl9H0+yAE6\n afIQxIkB1SRVsJOwrpGX6g8E0zYBx7Pzm9tSv52QlheTJ/Lc/OF/zK5XsE9fhgsmHIYmi","X-Gm-Gg":"AeBDieuxMuTtXriW13ORGxPKuAMtSuCVMwYEXI/Na+XyauwWHypXqN3G4jXWN/F3V3d\n WBtZaNJfqnhw8JH32KL7Hq54hZqI3VcVIZzIT0c3OvidgFfDHdlgUNLBrOu/7yLwnZ3G7vG/I+N\n aH9e0EPizhYKWK8H10caC/WO7Znp229nxQ7wzXz3cT6kMcjAeLL+lMUoX9kGq7hcLfby/RY86B0\n VekgIpgA5d1m9fLoUw4OAoqMt+VNJVooKe7HPgsKDA6NhBkUDEwPqkyqFa6naE3ehA76bo90zvm\n BsjcjC+JNeO0tNSe3JaKCnYAx8J0V45K7Wg9l7w1mTqIKLodj6pkTXacZCEXo3hSr4CTP2WD3wu\n x6K/myfcmKmoxVCV/C58/gqK3dX471KMCAAxk4BkoMptfWQ9RedUf/ZhoQy2o","X-Received":["by 2002:a05:7300:4313:b0:2d8:b814:29af with SMTP id\n 5a478bee46e88-2f54b89a0cemr454344eec.3.1778015147614;\n Tue, 05 May 2026 14:05:47 -0700 (PDT)","by 2002:a05:7300:4313:b0:2d8:b814:29af with SMTP id\n 5a478bee46e88-2f54b89a0cemr454329eec.3.1778015146963;\n Tue, 05 May 2026 14:05:46 -0700 (PDT)"],"Content-Type":"multipart/mixed; boundary=\"------------0EHqPX0UUBqVkeh2nRgj9027\"","Message-ID":"<8a6698e2-4e65-4611-9e93-25ed121d9092@oss.qualcomm.com>","Date":"Tue, 5 May 2026 15:05:44 -0600","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Content-Language":"en-US","From":"Jeffrey Law <jeffrey.law@oss.qualcomm.com>","Subject":"[to-be-committed][RISC-V][PR rtl-optimization/80770] Simplify bit\n flipping operations down to xor","To":"'GCC Patches' <gcc-patches@gcc.gnu.org>","Cc":"Shreya Munnangi <smunnang@qti.qualcomm.com>","X-Proofpoint-ORIG-GUID":"LYkS7FSIRf-Cg8VN2UurftCCzD4Grcqq","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwNTA1MDIwNCBTYWx0ZWRfX5npjW7ur1gcO\n 1Jfm94wwuAUz8pxdD+6aH/D1nMiSJ3z6QLSs3kDOcJio0HbAo4S15xK5p1RBmOrW5H+gcGJ7uzf\n C6aIntIl/AdnYrijpjw95yC3VxcfvC3WJc+68oUo1+ESpDq4yR6xm5wssNGGdW2fSJwL6PhR8F/\n 4U8TrqQmbE7x9yuc8uyo6h2i3+39l7v7fS1D2Pqrw5vLBH4Jdy/sE/frzcNVNByvXuc5sfgwwCV\n DhMeQE1opXJNC2Yw0Q09iPO38Ikzl9wC8x/ZTleIRLn5wCUv7AapooK/wDTxzvrYB7KbY01gvg8\n TgfHgNrAdNFBiTK66BufwoJgex8QqowvxqyiOuoS75X+l2ja998hqwSo+Sf7j4FFwLLzfD9jfnw\n kiCbjIv3d5V6oOdsX/JVMK+dcYeSWtwFI8pohpjONi1fc7L/cx2wokt25OJ5RF/0zOZdF/yofXk\n tSU8VzAh9WG8hStvpGA==","X-Authority-Analysis":"v=2.4 cv=EPU2FVZC c=1 sm=1 tr=0 ts=69fa5bac cx=c_pps\n a=cFYjgdjTJScbgFmBucgdfQ==:117 a=asGLMfRmzhnGNxaIYohjRg==:17\n a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22\n a=u7WPNUs3qKkmUXheDGA7:22 a=eoimf2acIAo5FJnRuUoq:22 a=r77TgQKjGQsHNAKrUKIA:9\n a=iuSFgX2wElZ1C-qDm9AA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10\n a=1uNG8G8LnQSDS5BAtasA:9 a=B2y7HmGcmWMA:10 a=scEy_gLbYbu1JhEsrz4S:22","X-Proofpoint-GUID":"LYkS7FSIRf-Cg8VN2UurftCCzD4Grcqq","X-Proofpoint-Virus-Version":"vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-05-05_02,2026-04-30_02,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=outbound_notspam policy=outbound score=0\n adultscore=0 malwarescore=0 impostorscore=0 clxscore=1015 bulkscore=0\n phishscore=0 suspectscore=0 priorityscore=1501 spamscore=0 lowpriorityscore=0\n classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0\n reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050204","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <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>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"},"content":"So this is the target independent work to finish resolving pr80770.  \nIt's a combination of Shreya's efforts and my own.\n\nTo recap, the basic idea is we want to simplify RTL blobs which \nultimately are just flipping a bit.  Consider:\n\n> (set (reg:DI 153)\n>      (ior:DI (and:DI (reg:DI 140 [ *s_4(D) ])\n>              (const_int 254 [0xfe]))\n>          (and:DI (not:DI (reg:DI 140 [ *s_4(D) ]))\n>              (const_int 1 [0x1]))))\n\nThe first operand of the IOR clears the low bit of the source register \nleaving everything else unchanged.  The second operand of the IOR clears \neverything but the low bit and flips the low bit. When we IOR those \ntogether we get the original value with the lowest bit flipped.  The key \nis to realize we have the same pseudo in both arms and there are no bits \nin common for the constants. So this works for an arbitrary bit(s) as \nlong as the constants have the right form.\n\nThat gets us good code on riscv and almost certainly helps other \ntargets.  There is another form which shows up on the H8 and possibly \nother targets sub-word arithmetic.  op0 and op1 are respectively:\n\n\n> (gdb) p debug_rtx (op0)\n> (and:QI (reg:QI 24 [ *s_4(D) ])\n>     (const_int 127 [0x7f]))\n> $1 = void\n> (gdb) p debug_rtx (op1)\n> (plus:QI (and:QI (reg:QI 24 [ *s_4(D) ])\n>         (const_int -128 [0xffffffffffffff80]))\n>     (const_int -128 [0xffffffffffffff80]))\n> $2 = void\n\nNote we're in QImode.  op1 just flips the highest QImode bit.  If there \nare carry-outs, we don't really care about them.  The net is we can \ncapture that case on the H8 by verifying this form flips the highest bit \nfor the given mode.  Otherwise the carry-outs are relevant and our \ntransformation is incorrect.\n\nPlan is to commit Friday.  While it has been tested with the usual \nbootstraps as well as testing on various cross platforms, I'm more \ncomfortable giving folks time to take a looksie to see if Shreya or I \nmissed anything critical.\n\nFor the testcase in question before/afters look like this:\n\nx86:\n         movzbl  (%rdi), %eax\n         movl    %eax, %edx\n         andl    $-2, %eax\n         andl    $1, %edx\n         xorl    $1, %edx\n         orl     %edx, %eax\n         movb    %al, (%rdi)\n\n   Turns into:\n\n         xorb    $1, (%rdi)\n\nRISC-V:\n\n         lbu     a5,0(a0)\n         andi    a4,a5,1\n         xori    a4,a4,1\n         andi    a5,a5,-2\n         or      a5,a5,a4\n         sb      a5,0(a0)\n\n   Turns into:\n\n         lbu     a5,0(a0)\n         xori    a5,a5,1\n         sb      a5,0(a0)\n\n\nJeff\nPR rtl-optimization/80770\n\ngcc/\n\t* simplify-rtx.cc (simplify_context::simplify_binary_operation_1):\n\tIdentify and optimize cases where an IOR is just a bit flip.\n\ngcc/testsuite\n\n\t* gcc.target/riscv/pr80770.c: New test.","diff":"diff --git a/gcc/simplify-rtx.cc b/gcc/simplify-rtx.cc\nindex bf625cdaf608..365bb9db1930 100644\n--- a/gcc/simplify-rtx.cc\n+++ b/gcc/simplify-rtx.cc\n@@ -3897,6 +3897,101 @@ simplify_context::simplify_binary_operation_1 (rtx_code code,\n \t  && negated_ops_p (XEXP (op0, 0), op1))\n \treturn simplify_gen_binary (IOR, mode, XEXP (op0, 1), op1);\n \n+      /* (ior (and (A C1) (and (not (A) C2))) can be converted\n+\t into (and (xor (A C2) (C1 + C2))) when there are no bits\n+\t in common between C1 and C2.  */\n+      if (GET_CODE (op0) == AND\n+\t  && GET_CODE (op1) == AND\n+\t  && GET_CODE (XEXP (op1, 0)) == NOT\n+\t  && rtx_equal_p (XEXP (op0, 0), XEXP (XEXP (op1, 0), 0))\n+\t  && CONST_INT_P (XEXP (op0, 1))\n+\t  && CONST_INT_P (XEXP (op1, 1))\n+\t  && (INTVAL (XEXP (op0, 1)) & INTVAL (XEXP (op1, 1))) == 0)\n+\t{\n+\t  rtx c = GEN_INT (INTVAL (XEXP (op0, 1)) + INTVAL (XEXP (op1, 1)));\n+\n+\t  tem = simplify_gen_binary (XOR, mode, XEXP (op0, 0), XEXP (op1, 1));\n+\t  if (tem)\n+\t    {\n+\t      tem = simplify_gen_binary (AND, mode, tem, c);\n+\t      if (tem)\n+\t\treturn tem;\n+\t    }\n+\t}\n+\n+      /* Same thing, but operand order is reversed for the outer IOR.  */\n+      if (GET_CODE (op0) == AND\n+\t  && GET_CODE (op1) == AND\n+\t  && GET_CODE (XEXP (op0, 0)) == NOT\n+\t  && rtx_equal_p (XEXP (op1, 0), XEXP (XEXP (op0, 0), 0))\n+\t  && CONST_INT_P (XEXP (op0, 1))\n+\t  && CONST_INT_P (XEXP (op1, 1))\n+\t  && (INTVAL (XEXP (op0, 1)) & INTVAL (XEXP (op1, 1))) == 0)\n+\t{\n+\t  rtx c = GEN_INT (INTVAL (XEXP (op0, 1)) + INTVAL (XEXP (op1, 1)));\n+\n+\t  tem = simplify_gen_binary (XOR, mode, XEXP (op1, 0), XEXP (op0, 1));\n+\t  if (tem)\n+\t    {\n+\t      tem = simplify_gen_binary (AND, mode, tem, c);\n+\t      if (tem)\n+\t\treturn tem;\n+\t    }\n+\t}\n+\n+      /* Another variant seen on some backends, particularly those with\n+\t sub-word operations.  For these cases we have to know there is no\n+\t carry from the PLUS into relevant bits.  In practice that means\n+\t it's only valid for the uppermost bit.  */\n+      if (GET_CODE (op0) == AND\n+\t  && GET_CODE (op1) == PLUS\n+\t  && GET_CODE (XEXP (op1, 0)) == AND\n+\t  && rtx_equal_p (XEXP (op0, 0), XEXP (XEXP (op1, 0), 0))\n+\t  && CONST_INT_P (XEXP (op0, 1))\n+\t  && CONST_INT_P (XEXP (op1, 1))\n+\t  && CONST_INT_P (XEXP (XEXP (op1, 0), 1))\n+\t  && INTVAL (XEXP (op1, 1)) == INTVAL (XEXP (XEXP (op1, 0), 1))\n+\t  && GET_MODE_BITSIZE (GET_MODE (op1)).is_constant ()\n+\t  && ((INTVAL (XEXP (op1, 1)) & GET_MODE_MASK (GET_MODE (op1)))\n+\t      == HOST_WIDE_INT_1U << (GET_MODE_BITSIZE (GET_MODE (op1)).to_constant () - 1))\n+\t  && (INTVAL (XEXP (op0, 1)) & INTVAL (XEXP (op1, 1))) == 0)\n+\t{\n+\t  rtx c = GEN_INT (INTVAL (XEXP (op0, 1)) + INTVAL (XEXP (op1, 1)));\n+\n+\t  tem = simplify_gen_binary (XOR, mode, XEXP (op0, 0), XEXP (op1, 1));\n+\t  if (tem)\n+\t    {\n+\t      tem = simplify_gen_binary (AND, mode, tem, c);\n+\t      if (tem)\n+\t\treturn tem;\n+\t    }\n+\t}\n+\n+      /* And its variant with the operands of the outer AND reversed.  */\n+      if (GET_CODE (op1) == AND\n+\t  && GET_CODE (op0) == PLUS\n+\t  && GET_CODE (XEXP (op0, 0)) == AND\n+\t  && rtx_equal_p (XEXP (op1, 0), XEXP (XEXP (op0, 0), 0))\n+\t  && CONST_INT_P (XEXP (op1, 1))\n+\t  && CONST_INT_P (XEXP (op0, 1))\n+\t  && CONST_INT_P (XEXP (XEXP (op0, 0), 1))\n+\t  && INTVAL (XEXP (op0, 1)) == INTVAL (XEXP (XEXP (op0, 0), 1))\n+\t  && GET_MODE_BITSIZE (GET_MODE (op0)).is_constant ()\n+\t  && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (GET_MODE (op0)))\n+\t      == HOST_WIDE_INT_1U << (GET_MODE_BITSIZE (GET_MODE (op0)).to_constant () - 1))\n+\t  && (INTVAL (XEXP (op1, 1)) & INTVAL (XEXP (op0, 1))) == 0)\n+\t{\n+\t  rtx c = GEN_INT (INTVAL (XEXP (op1, 1)) + INTVAL (XEXP (op0, 1)));\n+\n+\t  tem = simplify_gen_binary (XOR, mode, XEXP (op1, 0), XEXP (op0, 1));\n+\t  if (tem)\n+\t    {\n+\t      tem = simplify_gen_binary (AND, mode, tem, c);\n+\t      if (tem)\n+\t\treturn tem;\n+\t    }\n+\t}\n+\n       tem = simplify_with_subreg_not (code, mode, op0, op1);\n       if (tem)\n \treturn tem;\ndiff --git a/gcc/testsuite/gcc.target/riscv/pr80770.c b/gcc/testsuite/gcc.target/riscv/pr80770.c\nnew file mode 100644\nindex 000000000000..4dafe3955f05\n--- /dev/null\n+++ b/gcc/testsuite/gcc.target/riscv/pr80770.c\n@@ -0,0 +1,150 @@\n+/* { dg-do compile } */\n+/* { dg-additional-options \"-std=gnu99\" } */\n+/* { dg-skip-if \"\" { *-*-* } { \"-O0\" \"-O1\" } } */\n+\n+\n+struct S {\n+  _Bool b0: 1;\n+  _Bool b1: 1;\n+  _Bool b2: 1;\n+  _Bool b3: 1;\n+  _Bool b4: 1;\n+  _Bool b5: 1;\n+  _Bool b6: 1;\n+  _Bool b7: 1;\n+  _Bool b8: 1;\n+  _Bool b9: 1;\n+  _Bool b10: 1;\n+  _Bool b11: 1;\n+  _Bool b12: 1;\n+  _Bool b13: 1;\n+  _Bool b14: 1;\n+  _Bool b15: 1;\n+  _Bool b16: 1;\n+  _Bool b17: 1;\n+  _Bool b18: 1;\n+  _Bool b19: 1;\n+  _Bool b20: 1;\n+  _Bool b21: 1;\n+  _Bool b22: 1;\n+  _Bool b23: 1;\n+  _Bool b24: 1;\n+  _Bool b25: 1;\n+  _Bool b26: 1;\n+  _Bool b27: 1;\n+  _Bool b28: 1;\n+  _Bool b29: 1;\n+  _Bool b30: 1;\n+  _Bool b31: 1;\n+  _Bool b32: 1;\n+  _Bool b33: 1;\n+  _Bool b34: 1;\n+  _Bool b35: 1;\n+  _Bool b36: 1;\n+  _Bool b37: 1;\n+  _Bool b38: 1;\n+  _Bool b39: 1;\n+  _Bool b40: 1;\n+  _Bool b41: 1;\n+  _Bool b42: 1;\n+  _Bool b43: 1;\n+  _Bool b44: 1;\n+  _Bool b45: 1;\n+  _Bool b46: 1;\n+  _Bool b47: 1;\n+  _Bool b48: 1;\n+  _Bool b49: 1;\n+  _Bool b50: 1;\n+  _Bool b51: 1;\n+  _Bool b52: 1;\n+  _Bool b53: 1;\n+  _Bool b54: 1;\n+  _Bool b55: 1;\n+  _Bool b56: 1;\n+  _Bool b57: 1;\n+  _Bool b58: 1;\n+  _Bool b59: 1;\n+  _Bool b60: 1;\n+  _Bool b61: 1;\n+  _Bool b62: 1;\n+  _Bool b63: 1;\n+};\n+\n+#define T(N) void fb##N (struct S *s) { s->b##N = !s->b##N; }\n+\n+T(0)\n+T(1)\n+T(2)\n+T(3)\n+T(4)\n+T(5)\n+T(6)\n+T(7)\n+T(8)\n+T(9)\n+T(10)\n+T(11)\n+T(12)\n+T(13)\n+T(14)\n+T(15)\n+T(16)\n+T(17)\n+T(18)\n+T(19)\n+T(20)\n+T(21)\n+T(22)\n+T(23)\n+T(24)\n+T(25)\n+T(26)\n+T(27)\n+T(28)\n+T(29)\n+T(30)\n+T(31)\n+#if __riscv_xlen == 64\n+T(32)\n+T(33)\n+T(34)\n+T(35)\n+T(36)\n+T(37)\n+T(38)\n+T(39)\n+T(40)\n+T(41)\n+T(42)\n+T(43)\n+T(44)\n+T(45)\n+T(46)\n+T(47)\n+T(48)\n+T(49)\n+T(50)\n+T(51)\n+T(52)\n+T(53)\n+T(54)\n+T(55)\n+T(56)\n+T(57)\n+T(58)\n+T(59)\n+T(60)\n+T(61)\n+T(62)\n+T(63)\n+#endif\n+\n+/* { dg-final { scan-assembler-times \"lbu\\t\" 64 { target rv64 } } } */\n+/* { dg-final { scan-assembler-times \"lbu\\t\" 32 { target rv32 } } } */\n+\n+/* { dg-final { scan-assembler-times \"xori\\t\" 64 { target rv64 } } } */\n+/* { dg-final { scan-assembler-times \"xori\\t\" 32 { target rv32 } } } */\n+\n+\n+/* { dg-final { scan-assembler-times \"sb\\t\" 64 { target rv64 } } } */\n+/* { dg-final { scan-assembler-times \"sb\\t\" 32 { target rv32 } } } */\n","prefixes":["to-be-committed","RISC-V","PR","rtl-optimization/80770"]}