commit: b8a7e53a40d7938319d7673deba04c43952f84d8 Author: Sam James <sam <AT> gentoo <DOT> org> AuthorDate: Mon Jan 13 13:58:49 2025 +0000 Commit: Sam James <sam <AT> gentoo <DOT> org> CommitDate: Mon Jan 13 13:58:49 2025 +0000 URL: https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=b8a7e53a
15.0.0: drop upstream 82_all_PR118409-ifcombine.patch Merged upstream. Signed-off-by: Sam James <sam <AT> gentoo.org> 15.0.0/gentoo/82_all_PR118409-ifcombine.patch | 154 -------------------------- 15.0.0/gentoo/README.history | 4 + 2 files changed, 4 insertions(+), 154 deletions(-) diff --git a/15.0.0/gentoo/82_all_PR118409-ifcombine.patch b/15.0.0/gentoo/82_all_PR118409-ifcombine.patch deleted file mode 100644 index 6362cd1..0000000 --- a/15.0.0/gentoo/82_all_PR118409-ifcombine.patch +++ /dev/null @@ -1,154 +0,0 @@ -https://inbox.sourceware.org/gcc-patches/ored17gz9x....@lxoliva.fsfla.org/ - -From bfb791ad941348a0bb854b770f2294424528bc40 Mon Sep 17 00:00:00 2001 -Message-ID: <bfb791ad941348a0bb854b770f2294424528bc40.1736739564.git....@gentoo.org> -From: Alexandre Oliva <ol...@adacore.com> -Date: Mon, 13 Jan 2025 00:37:14 -0300 -Subject: [PATCH] propagate signbit mask to XOR right-hand operand - -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. - -Regstrapped on x86_64-linux-gnu. Ok to install? - -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 a3987c4590ae..93ed8b3abb05 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 000000000000..44ac7fae50dc ---- /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; -+} - -base-commit: 0e05b793fba2a9bea9f0fbb1f068679f5dadf514 --- -2.48.0 - diff --git a/15.0.0/gentoo/README.history b/15.0.0/gentoo/README.history index fdb33be..2789ef2 100644 --- a/15.0.0/gentoo/README.history +++ b/15.0.0/gentoo/README.history @@ -1,3 +1,7 @@ +39 ???? + + - 82_all_PR118409-ifcombine.patch + 38 13 January 2023 + 82_all_PR118409-ifcombine.patch