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