From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from sonic308-2.consmr.mail.bf2.yahoo.com (sonic308-2.consmr.mail.bf2.yahoo.com [74.6.130.41]) by sourceware.org (Postfix) with ESMTPS id 7ACC63858D32 for ; Sun, 12 Feb 2023 20:46:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7ACC63858D32 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=yahoo.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=yahoo.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1676234757; bh=85awqhwRsKYDFvAxAfcPIObsguRgtzsmqhYB7+AmH9g=; h=Date:From:Subject:To:References:From:Subject:Reply-To; b=r1ZfT39lMOLnaYPQYfjVeGXaLnsj8saLZWzHBPotM2Zee0u+T73KERTA0wiha8+bUjbBQasZ/F7Ijgugt8qhClvl98OcR7BrVHsHZ/dMSWLPfMvh9ZvlWoRtfO4ICZOTiLcdDPWODcnS8R014yhysloYQ818AHaxwppjv+8kM2dK7mqN11FyvpdD9VVRPVeeb8fhnezMvjo1vefHCWIm+DaTUl86ynI1vCCmctVGa7/foyaSjg6odl8zlUDuuh10TW5jIF515c+C1EIQ30KebzzdZVZseS1Qz8QSXn6mPDFR+9SdVQqllaaV27ZuYjRQER83J0v5RflCJA5T286nCg== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1676234757; bh=1qqt5KjNIJdTFwnAHotBU7N4SXiHUedcBPWBCVB4hba=; h=X-Sonic-MF:Date:From:Subject:To:From:Subject; b=n1p0WoM8ETdIBfML5kGjZLAEejsPCfS5ZSSIkQjfZ8wVm2RCQNdjl+zqObrnNgebtGtfEqFgYjEKHq2d18v2yrJCD9jZMEi5+A65K1EYn0uyR1WlKOC/ATIPlZ2A1thvFa8x6X3Dl3duzekAYPqKJ9HamFys9f7JaoYlMhS6A29vBJsYX4NlL8mKEN4GeEm3XYWCmU6Dm3eb9K+Y0Hob954uwjkvvXDFob+TQtiCxC4eOdfr+plQs0ubDdRPmeD9yY+R7xrmRT/7UxhbOrQB7Yz1lp7PTYvZLPlwhj86VIeVj519XLIl+97yPA6mI9kHdk2gHtTw8Fausgz/wRw7Lw== X-YMail-OSG: rImTOHkVM1m_rzCN0L1oIAyV3CdhSay0itN5r3zSsl52P6GfO7kOAK9yNrB90aI 7lbvqrsfHI.PYXj0MYBFJanut3nF.zGV8qmRiB16.WIMrbk1tAjIt2h2ruW2261Tr.peLD2HgTmg UZXK4m7w6ysXWnkzta0jhBO8.qtFnGwP0eiH5lzkeKIBJNf2e02gD7fnGxqac5yYJ_.u4FYu1946 4Fi45TBk1A.jLWgLi44QwRHoecFpBSM2bLNiL1TgOZDFpzuDVHVQNjImwqvYjkRRImBul.6sWKyw EvkqIltsZiyeW6Cm7ml4EKAqDU4.FxIV4_TqRJXknd5phECYu7SgyTPuYAcKsZt8hMNrdK1MkZv0 MyXBtvdsNrX9xCc3gBbFhYL9WsoDULkMashqL4cahCylplm0BOdZFQ6X.pXeruM995aj9URnb89c 4Rsl8NxsymP.h.S.ecx3uZcIZGvrNBFy3_RqOGxrwmGnVnH3Pr1A.sBTDdRjY6O_LO5kfci3H1y9 TnVGhycjUJgMqSDltJF5xFPp7sWO6U8z1kahWZlz75yLKV04XVLK7Rwqzd7Y1cVtjHi1pKLM6Q_a 6PQjbw1X_HGT46L.rYGv231qEnjiDvxNmKeDJ57bCE.X4rXn0hz.13JU.TWk0Pkr333.PYk6WgiM 3gGsr_9KaJ.R6uE3.V77tvvP9zD4NIdzJDX0LRYpDeReXpSyiRXnMZFVTHp3GRA2wgpcFvLXKaIk aQVD_Z9DBt5YwmFhgN.0Oyoz71QH0O3Pu.JQWfIbsT1oz76RWroP0FAQaOYkeldxnUtG9KOu8aGe ImAEmYQoM5DVjzh9dk7qg7xQ1ThdtdPsvfWFVyxydYbf6sfMzElDGeE5UveuTgPj5q_Nt.zry0ZD iD3u871_xyC0dfK5m2IoBmH_tjOEY1qE6InHD9B1ndrj_O2Hkt8ZtZC6CnB2APF..6L44fDBV9gO p1Js38VRIPMxiv1TqqTKmK_oQ8_FLNNRwtf6Qnz_SZdStbxZ99e0rxt2m3dyPsnlFkUCFrwV8b.r rPCKdnw8f8K1O4QFDvNmIj0_YvTUEY_BzSA20MIQJdReN1xnPG7dNxLJ4eB8rNrUogc.K5LPLsLa Hfzf7ALZkuH90OMS9rZQnTMEZeCGxZ2.FR0K5usPQVp_sU0k5YbzDKy46P.AA_mCKWfaYPUn_FjQ ToMg_XQOYx5HrtQl1wkaVxNbrxbmnxj8XXvw9Z7RJl0TNoe2IXocaMY8cw9mlCohoAfm_i6Sce35 YScAPDJRoz2jkFfs3p4Om2tRgw9fLtYehsiHRfXoTId3BA7PdDjUV0zJc4S.eaUDZ6XPphM0u4rn eGT8odgksHmo_4f3j_inxzhuLNrr54lemgKDFTNucSu7xwIWryUaakoiIMp3VIBd6_paYWJpShR3 M5k9DqHi9RBaNZIQ7Pu1Czv_53qC3vchV_DJ3ytHBk0tJ8ilsDEUPHpeH0I76X8xA6V2I3TmVKoL vPEExexSCyw_q.aoIVTSfj4D3fN_JAMfocZtgW22nNjE7DxeW3DejkdXwtcMhHMmypPLnHWlTSv0 ayXn5ZYjsLeTSO5DvSFENxzPgcf._1cZcsAsOml8Anayizw4clcCAKmAeFg.ncOFbYBo9gNOTVLe Ied95pno0vj4zdSah.CQ6etzsXqc1CXuwFPLnk90uPqdwvFaZpEJCCtZQ2sG9u4wcCNd273WamGT 3JfhpPZXWWFiuWJmWBDWGNc3cqEOAIhzHPPnobStYG3gyakeonuOQ_8hLRKHmsbOUkHB7W_1iDTR g.yNgxlTySw.jvTSCyeAQWTIjHFG4TF_HPufQiIq.D0OqnlFuZDywerY5kK52a.WdqAGYUsc4SWt yOPf0yeuKPCxx8f7j05LNuTfGjxIDE9QzqXgHnKCwN8tNT7jYnMWlYl1wdMVEqjHwWNy5QTs4srs ika4ePIVv8vxQf1c.0EfBxIasD_EEAZMnqCK6z5L_shtUcLyBbxxevVPBd93cXsFiz3Z_1iPq2J0 k7Sx2b1GQCdhXmg_Lmyuslw.6jPZ5SrApkzrGCeJJ7GObLTnlQhwjPdktvV4XFDdbGAP3YEtp6N4 aeUaZTyDDOocLPUvGK7.4FqCbPyDSggh0rjPIDGSXfYTsz1HfMq35RKhTJty8YMNpFvXgI5HRPwR CJ83.4J5WWCREXOe29n1kWtnLZ09deXNNJin_FPkTBZqsZYAhV9fe9kWbUmmJCtOL3RKD8WBNq0B xX41ZlRs_AxbH1NT3 X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic308.consmr.mail.bf2.yahoo.com with HTTP; Sun, 12 Feb 2023 20:45:57 +0000 Received: by hermes--production-bf1-57c96c66f6-npzd5 (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 8b4ee7c3d5314f6334b1565a3babeda1; Sun, 12 Feb 2023 20:45:51 +0000 (UTC) Message-ID: <2515add9-9834-03ed-3156-fb3694149a0f@yahoo.com> Date: Sun, 12 Feb 2023 15:45:50 -0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 Content-Language: en-US From: David Shane Holden Subject: __builtin_(add|mul)_overflow methods generate duplicate operations if both operands are const To: gcc@gcc.gnu.org Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit References: <2515add9-9834-03ed-3156-fb3694149a0f.ref@yahoo.com> X-Mailer: WebService/1.1.21183 mail.backend.jedi.jws.acl:role.jedi.acl.token.atz.jws.hermes.yahoo X-Spam-Status: No, score=0.7 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP 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: I requested a bugzilla account a few days ago and haven't heard back so I'm just going to report this here. #include #include #include bool add(uint8_t *r, const uint8_t *a, const uint8_t *b) { return __builtin_add_overflow(*a, *b, r); } bool mul(uint8_t *r, const uint8_t *a, const uint8_t *b) { return __builtin_mul_overflow(*a, *b, r); } int main() { uint8_t x; /* 64 + 64 should not overflow */ x = 64; if (add(&x, &x, &x)) printf("false positive: x=%i\n", x); /* 4 * 4 should not overflow */ x = 4; if (mul(&x, &x, &x)) printf("false positive: x=%i\n", x); /* 128 + 128 should overflow */ x = 128; if (!add(&x, &x, &x)) printf("false negative: x=%i\n", x); /* 16 * 16 should overflow */ x = 16; if (!mul(&x, &x, &x)) printf("false negative: x=%i\n", x); return 0; } $ gcc -g3 -O1 -o test test.c; ./test false positive: x=128 false positive: x=16 false negative: x=0 false negative: x=0 The generated assembly correctly adds a with b and stores in r but then it does the operation again before testing for carry and returning. If r is also one of the operands then the erroneous second operation will use the computed value of r in place of the original operand leading to an incorrect overflow result. 0000000000400895 : ; return __builtin_add_overflow(*a, *b, r); 400895: 0f b6 02 movzbl (%rdx), %eax 400898: 02 06 addb (%rsi), %al 40089a: 88 07 movb %al, (%rdi) 40089c: 0f b6 02 movzbl (%rdx), %eax << 40089f: 02 06 addb (%rsi), %al << 4008a1: 0f 92 c0 setb %al ; } 4008a4: c3 retq 00000000004008a5 : ; return __builtin_mul_overflow(*a, *b, r); 4008a5: 0f b6 06 movzbl (%rsi), %eax 4008a8: f6 22 mulb (%rdx) 4008aa: 88 07 movb %al, (%rdi) 4008ac: 0f b6 06 movzbl (%rsi), %eax << 4008af: f6 22 mulb (%rdx) << 4008b1: 0f 90 c0 seto %al ; } 4008b4: c3 retq This only seems to be triggered when both a *and* b are const. Removing const from either or both operands generates the correct assembly. 0000000000400855 : ; return __builtin_add_overflow(*a, *b, r); 400855: 0f b6 02 movzbl (%rdx), %eax 400858: 02 06 addb (%rsi), %al 40085a: 88 07 movb %al, (%rdi) 40085c: 0f 92 c0 setb %al ; } 40085f: c3 retq 0000000000400860 : ; return __builtin_mul_overflow(*a, *b, r); 400860: 0f b6 06 movzbl (%rsi), %eax 400863: f6 22 mulb (%rdx) 400865: 88 07 movb %al, (%rdi) 400867: 0f 90 c0 seto %al ; } 40086a: c3 retq Tested on the following systems: $ uname -srm; gcc12 --version FreeBSD 13.1-RELEASE-p2 amd64 gcc12 (FreeBSD Ports Collection) 12.2.0 $ uname -smr; gcc --version Linux 6.1.2-1-MANJARO-ARM aarch64 gcc (GCC) 12.1.0 $ uname -srm; gcc --version MINGW64_NT-10.0-22000 3.4.5.x86_64 x86_64 gcc.exe (Rev10, Built by MSYS2 project) 12.2.0 Poking godbolt indicates this was likely introduced in 9.4.