From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <gentoo-commits+bounces-1708953-garchives=archives.gentoo.org@lists.gentoo.org> Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id CA64015813A for <garchives@archives.gentoo.org>; Mon, 13 Jan 2025 03:20:34 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 0E4E5E07FE; Mon, 13 Jan 2025 03:20:34 +0000 (UTC) Received: from smtp.gentoo.org (woodpecker.gentoo.org [140.211.166.183]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 28997E07FE for <gentoo-commits@lists.gentoo.org>; Mon, 13 Jan 2025 03:20:32 +0000 (UTC) Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id DFCE7340943 for <gentoo-commits@lists.gentoo.org>; Mon, 13 Jan 2025 03:20:30 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id 427321D2A for <gentoo-commits@lists.gentoo.org>; Mon, 13 Jan 2025 03:20:29 +0000 (UTC) From: "Sam James" <sam@gentoo.org> To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Sam James" <sam@gentoo.org> Message-ID: <1736738409.9990b777a4ae73b77ef376ee7aebfd0ac8523754.sam@gentoo> Subject: [gentoo-commits] proj/gcc-patches:master commit in: 15.0.0/gentoo/ X-VCS-Repository: proj/gcc-patches X-VCS-Files: 15.0.0/gentoo/82_all_PR118409-ifcombine.patch 15.0.0/gentoo/README.history X-VCS-Directories: 15.0.0/gentoo/ X-VCS-Committer: sam X-VCS-Committer-Name: Sam James X-VCS-Revision: 9990b777a4ae73b77ef376ee7aebfd0ac8523754 X-VCS-Branch: master Date: Mon, 13 Jan 2025 03:20:29 +0000 (UTC) Precedence: bulk List-Post: <mailto:gentoo-commits@lists.gentoo.org> List-Help: <mailto:gentoo-commits+help@lists.gentoo.org> List-Unsubscribe: <mailto:gentoo-commits+unsubscribe@lists.gentoo.org> List-Subscribe: <mailto:gentoo-commits+subscribe@lists.gentoo.org> List-Id: Gentoo Linux mail <gentoo-commits.gentoo.org> X-BeenThere: gentoo-commits@lists.gentoo.org X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Archives-Salt: b55f8b5d-6ba3-4c9b-b58e-f09fbea58857 X-Archives-Hash: 99900c8a49a0e059428992a080440894 commit: 9990b777a4ae73b77ef376ee7aebfd0ac8523754 Author: Sam James <sam <AT> gentoo <DOT> org> AuthorDate: Mon Jan 13 03:20:09 2025 +0000 Commit: Sam James <sam <AT> gentoo <DOT> org> CommitDate: Mon Jan 13 03:20:09 2025 +0000 URL: https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=9990b777 15.0.0: add ifcombine patch Bug: https://gcc.gnu.org/PR118409 Signed-off-by: Sam James <sam <AT> gentoo.org> 15.0.0/gentoo/82_all_PR118409-ifcombine.patch | 146 ++++++++++++++++++++++++++ 15.0.0/gentoo/README.history | 4 + 2 files changed, 150 insertions(+) diff --git a/15.0.0/gentoo/82_all_PR118409-ifcombine.patch b/15.0.0/gentoo/82_all_PR118409-ifcombine.patch new file mode 100644 index 0000000..e599f21 --- /dev/null +++ b/15.0.0/gentoo/82_all_PR118409-ifcombine.patch @@ -0,0 +1,146 @@ +https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118409#c26 + +[ifcombine] propagate signbit mask to XOR right-hand operand + +From: Alexandre Oliva <oliva@adacore.com> + +If a single-bit bitfield takes up the sign bit of a storage unit, +comparing the corresponding bitfield between two objects loads the +storage units, XORs them, converts the result to signed char, and +compares it with zero: ((signed char)(a.<byte> ^ c.<byte>) >= 0). + +fold_truth_andor_for_ifcombine recognizes the compare with zero as a +sign bit test, then it decomposes the XOR into an equality test. + +The problem is that, after this decomposition, that figures out the +width of the accessed fields, we apply the sign bit mask to the +left-hand operand of the compare, but we failed to also apply it to +the right-hand operand when both were taken from the same XOR. + +This patch fixes that. + + +for gcc/ChangeLog + + PR tree-optimization/118409 + * gimple-fold.cc (fold_truth_andor_for_ifcombine): Apply the + signbit mask to the right-hand XOR operand too. + +for gcc/testsuite/ChangeLog + + PR tree-optimization/118409 + * gcc.dg/field-merge-20.c: New. +--- + gcc/gimple-fold.cc | 20 ++++++++++ + gcc/testsuite/gcc.dg/field-merge-20.c | 64 +++++++++++++++++++++++++++++++++ + 2 files changed, 84 insertions(+) + create mode 100644 gcc/testsuite/gcc.dg/field-merge-20.c + +diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc +index a3987c4590ae6..93ed8b3abb056 100644 +--- a/gcc/gimple-fold.cc ++++ b/gcc/gimple-fold.cc +@@ -8270,6 +8270,16 @@ fold_truth_andor_for_ifcombine (enum tree_code code, tree truth_type, + ll_and_mask = sign; + else + ll_and_mask &= sign; ++ if (l_xor) ++ { ++ if (!lr_and_mask.get_precision ()) ++ lr_and_mask = sign; ++ else ++ lr_and_mask &= sign; ++ if (l_const.get_precision ()) ++ l_const &= wide_int::from (lr_and_mask, ++ l_const.get_precision (), UNSIGNED); ++ } + } + + if (rsignbit) +@@ -8279,6 +8289,16 @@ fold_truth_andor_for_ifcombine (enum tree_code code, tree truth_type, + rl_and_mask = sign; + else + rl_and_mask &= sign; ++ if (r_xor) ++ { ++ if (!rr_and_mask.get_precision ()) ++ rr_and_mask = sign; ++ else ++ rr_and_mask &= sign; ++ if (r_const.get_precision ()) ++ r_const &= wide_int::from (rr_and_mask, ++ r_const.get_precision (), UNSIGNED); ++ } + } + + /* If either comparison code is not correct for our logical operation, +diff --git a/gcc/testsuite/gcc.dg/field-merge-20.c b/gcc/testsuite/gcc.dg/field-merge-20.c +new file mode 100644 +index 0000000000000..44ac7fae50dc5 +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/field-merge-20.c +@@ -0,0 +1,64 @@ ++/* { dg-do run } */ ++/* { dg-options "-O1" } */ ++ ++/* tree-optimization/118409 */ ++ ++/* Check that tests involving a sign bit of a storage unit are handled ++ correctly. The compares are turned into xor tests by earlier passes, and ++ ifcombine has to propagate the sign bit mask to the right hand of the ++ compare extracted from the xor, otherwise we'll retain unwanted bits for the ++ compare. */ ++ ++typedef struct { ++ int p : __CHAR_BIT__; ++ int d : 1; ++ int b : __CHAR_BIT__ - 2; ++ int e : 1; ++} g; ++ ++g a = {.d = 1, .e = 1}, c = {.b = 1, .d = 1, .e = 1}; ++ ++__attribute__((noipa)) ++int f1 () ++{ ++ if (a.d == c.d ++ && a.e == c.e) ++ return 0; ++ return -1; ++} ++ ++__attribute__((noipa)) ++int f2 () ++{ ++ if (a.d != c.d ++ || a.e != c.e) ++ return -1; ++ return 0; ++} ++ ++__attribute__((noipa)) ++int f3 () ++{ ++ if (c.d == a.d ++ && c.e == a.e) ++ return 0; ++ return -1; ++} ++ ++__attribute__((noipa)) ++int f4 () ++{ ++ if (c.d != a.d ++ || c.e != a.e) ++ return -1; ++ return 0; ++} ++ ++int main() { ++ if (f1 () < 0 ++ || f2 () < 0 ++ || f3 () < 0 ++ || f4 () < 0) ++ __builtin_abort(); ++ return 0; ++} diff --git a/15.0.0/gentoo/README.history b/15.0.0/gentoo/README.history index f3ab09a..1f53f35 100644 --- a/15.0.0/gentoo/README.history +++ b/15.0.0/gentoo/README.history @@ -1,3 +1,7 @@ +38 ???? + + + 82_all_PR118409-ifcombine.patch + 37 13 January 2025 - 77_all_PR118112-c-c-UX-improvements-to-too-few-many-arguments-errors.patch