commit:     4e374e155734766b5682992ca22c77aef9de1220
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Wed Oct 18 19:33:33 2023 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Wed Oct 18 19:33:40 2023 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=4e374e15

sys-devel/gcc: backport pycryptodome ICE fix to 14.0.0_pre20231015

Signed-off-by: Sam James <sam <AT> gentoo.org>

 .../gcc-14.0.0_pre20231015-pycryptodome-ice.patch  | 212 +++++++++++++++++++++
 sys-devel/gcc/gcc-14.0.0_pre20231015-r1.ebuild     |  65 +++++++
 2 files changed, 277 insertions(+)

diff --git a/sys-devel/gcc/files/gcc-14.0.0_pre20231015-pycryptodome-ice.patch 
b/sys-devel/gcc/files/gcc-14.0.0_pre20231015-pycryptodome-ice.patch
new file mode 100644
index 000000000000..377f68511f78
--- /dev/null
+++ b/sys-devel/gcc/files/gcc-14.0.0_pre20231015-pycryptodome-ice.patch
@@ -0,0 +1,212 @@
+https://gcc.gnu.org/PR111845
+https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=f1744dd50bb1661c98b694ff907cb0a1be4f6134
+
+From f1744dd50bb1661c98b694ff907cb0a1be4f6134 Mon Sep 17 00:00:00 2001
+From: Jakub Jelinek <ja...@redhat.com>
+Date: Wed, 18 Oct 2023 12:37:40 +0200
+Subject: [PATCH] tree-ssa-math-opts: Fix up match_uaddc_usubc [PR111845]
+
+GCC ICEs on the first testcase.  Successful match_uaddc_usubc ends up with
+some dead stmts which DCE will remove (hopefully) later all.
+The ICE is because one of the dead stmts refers to a freed SSA_NAME.
+The code already gsi_removes a couple of stmts in the
+  /* Remove some statements which can't be kept in the IL because they
+     use SSA_NAME whose setter is going to be removed too.  */
+section for the same reason (the reason for the freed SSA_NAMEs is that
+we don't really have a replacement for those cases - all we have after
+a match is combined overflow from the addition/subtraction of 2 operands + a
+[0, 1] carry in, but not the individual overflows from the former 2
+additions), but for the last (most significant) limb case, where we try
+to match x = op1 + op2 + carry1 + carry2; or
+x = op1 - op2 - carry1 - carry2; we just gsi_replace the final stmt, but
+left around the 2 temporary stmts as dead; if we were unlucky enough that
+those referenced the carry flag that went away, it ICEs.
+
+So, the following patch remembers those temporary statements (rather than
+trying to rediscover them more expensively) and removes them before the
+final one is replaced.
+
+While working on it, I've noticed we didn't support all the reassociated
+possibilities of writing the addition of 4 operands or subtracting 3
+operands from one, we supported e.g.
+x = ((op1 + op2) + op3) + op4;
+x = op1 + ((op2 + op3) + op4);
+but not
+x = (op1 + (op2 + op3)) + op4;
+x = op1 + (op2 + (op3 + op4));
+Fixed by the change to inspect also rhs[2] when rhs[1] didn't yield what
+we were searching for (if non-NULL) - rhs[0] is inspected in the first
+loop and has different handling for the MINUS_EXPR case.
+
+2023-10-18  Jakub Jelinek  <ja...@redhat.com>
+
+       PR tree-optimization/111845
+       * tree-ssa-math-opts.cc (match_uaddc_usubc): Remember temporary
+       statements for the 4 operand addition or subtraction of 3 operands
+       from 1 operand cases and remove them when successful.  Look for
+       nested additions even from rhs[2], not just rhs[1].
+
+       * gcc.dg/pr111845.c: New test.
+       * gcc.target/i386/pr111845.c: New test.
+---
+ gcc/testsuite/gcc.dg/pr111845.c          | 16 ++++++++
+ gcc/testsuite/gcc.target/i386/pr111845.c | 47 +++++++++++++++++++++++
+ gcc/tree-ssa-math-opts.cc                | 48 +++++++++++++++---------
+ 3 files changed, 94 insertions(+), 17 deletions(-)
+ create mode 100644 gcc/testsuite/gcc.dg/pr111845.c
+ create mode 100644 gcc/testsuite/gcc.target/i386/pr111845.c
+
+diff --git a/gcc/testsuite/gcc.dg/pr111845.c b/gcc/testsuite/gcc.dg/pr111845.c
+new file mode 100644
+index 000000000000..1bcb4f88e6f1
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/pr111845.c
+@@ -0,0 +1,16 @@
++/* PR tree-optimization/111845 */
++/* { dg-do compile } */
++/* { dg-options "-O2 --param tree-reassoc-width=2" } */
++
++int a, b;
++unsigned int c, d, e;
++
++void
++foo (int x)
++{
++  b += d;
++  c += b < d;
++  b += e = a < x;
++  c += b;
++  c += b < e;
++}
+diff --git a/gcc/testsuite/gcc.target/i386/pr111845.c 
b/gcc/testsuite/gcc.target/i386/pr111845.c
+new file mode 100644
+index 000000000000..d52110a40422
+--- /dev/null
++++ b/gcc/testsuite/gcc.target/i386/pr111845.c
+@@ -0,0 +1,47 @@
++/* PR tree-optimization/111845 */
++/* { dg-do compile } */
++/* { dg-options "-O2 -g -masm=att" } */
++/* { dg-final { scan-assembler-times "\tadcq\t" 8 { target lp64 } } } */
++/* { dg-final { scan-assembler-times "\tadcl\t" 8 { target ia32 } } } */
++
++unsigned long l, m;
++
++__attribute__((noipa)) void
++foo (unsigned long x, unsigned long y, unsigned long h, unsigned long i, int 
a, int b)
++{
++  unsigned long c, d;
++  unsigned long e = __builtin_add_overflow (x, y, &c);
++  unsigned long f = __builtin_add_overflow (c, a < b, &d);
++  m = ((h + i) + e) + f;
++  l = d;
++}
++
++__attribute__((noipa)) void
++bar (unsigned long x, unsigned long y, unsigned long h, unsigned long i, int 
a, int b)
++{
++  unsigned long c, d;
++  unsigned long e = __builtin_add_overflow (x, y, &c);
++  unsigned long f = __builtin_add_overflow (c, a < b, &d);
++  m = (h + (i + e)) + f;
++  l = d;
++}
++
++__attribute__((noipa)) void
++baz (unsigned long x, unsigned long y, unsigned long h, unsigned long i, int 
a, int b)
++{
++  unsigned long c, d;
++  unsigned long e = __builtin_add_overflow (x, y, &c);
++  unsigned long f = __builtin_add_overflow (c, a < b, &d);
++  m = h + (i + (e + f));
++  l = d;
++}
++
++__attribute__((noipa)) void
++qux (unsigned long x, unsigned long y, unsigned long h, unsigned long i, int 
a, int b)
++{
++  unsigned long c, d;
++  unsigned long e = __builtin_add_overflow (x, y, &c);
++  unsigned long f = __builtin_add_overflow (c, a < b, &d);
++  m = h + ((i + e) + f);
++  l = d;
++}
+diff --git a/gcc/tree-ssa-math-opts.cc b/gcc/tree-ssa-math-opts.cc
+index 51c14d6bad9f..363f31646691 100644
+--- a/gcc/tree-ssa-math-opts.cc
++++ b/gcc/tree-ssa-math-opts.cc
+@@ -4581,6 +4581,7 @@ match_uaddc_usubc (gimple_stmt_iterator *gsi, gimple 
*stmt, tree_code code)
+   if (!INTEGRAL_TYPE_P (type) || !TYPE_UNSIGNED (type))
+     return false;
+ 
++  auto_vec<gimple *, 2> temp_stmts;
+   if (code != BIT_IOR_EXPR && code != BIT_XOR_EXPR)
+     {
+       /* If overflow flag is ignored on the MSB limb, we can end up with
+@@ -4615,26 +4616,29 @@ match_uaddc_usubc (gimple_stmt_iterator *gsi, gimple 
*stmt, tree_code code)
+             rhs[0] = gimple_assign_rhs1 (g);
+             tree &r = rhs[2] ? rhs[3] : rhs[2];
+             r = r2;
++            temp_stmts.quick_push (g);
+           }
+         else
+           break;
+       }
+-      while (TREE_CODE (rhs[1]) == SSA_NAME && !rhs[3])
+-      {
+-        gimple *g = SSA_NAME_DEF_STMT (rhs[1]);
+-        if (has_single_use (rhs[1])
+-            && is_gimple_assign (g)
+-            && gimple_assign_rhs_code (g) == PLUS_EXPR)
+-          {
+-            rhs[1] = gimple_assign_rhs1 (g);
+-            if (rhs[2])
+-              rhs[3] = gimple_assign_rhs2 (g);
+-            else
+-              rhs[2] = gimple_assign_rhs2 (g);
+-          }
+-        else
+-          break;
+-      }
++      for (int i = 1; i <= 2; ++i)
++      while (rhs[i] && TREE_CODE (rhs[i]) == SSA_NAME && !rhs[3])
++        {
++          gimple *g = SSA_NAME_DEF_STMT (rhs[i]);
++          if (has_single_use (rhs[i])
++              && is_gimple_assign (g)
++              && gimple_assign_rhs_code (g) == PLUS_EXPR)
++            {
++              rhs[i] = gimple_assign_rhs1 (g);
++              if (rhs[2])
++                rhs[3] = gimple_assign_rhs2 (g);
++              else
++                rhs[2] = gimple_assign_rhs2 (g);
++              temp_stmts.quick_push (g);
++            }
++          else
++            break;
++        }
+       /* If there are just 3 addends or one minuend and two subtrahends,
+        check for UADDC or USUBC being pattern recognized earlier.
+        Say r = op1 + op2 + ovf1 + ovf2; where the (ovf1 + ovf2) part
+@@ -5039,7 +5043,17 @@ match_uaddc_usubc (gimple_stmt_iterator *gsi, gimple 
*stmt, tree_code code)
+   g = gimple_build_assign (ilhs, IMAGPART_EXPR,
+                          build1 (IMAGPART_EXPR, TREE_TYPE (ilhs), nlhs));
+   if (rhs[2])
+-    gsi_insert_before (gsi, g, GSI_SAME_STMT);
++    {
++      gsi_insert_before (gsi, g, GSI_SAME_STMT);
++      /* Remove some further statements which can't be kept in the IL because
++       they can use SSA_NAMEs whose setter is going to be removed too.  */
++      while (temp_stmts.length ())
++      {
++        g = temp_stmts.pop ();
++        gsi2 = gsi_for_stmt (g);
++        gsi_remove (&gsi2, true);
++      }
++    }
+   else
+     gsi_replace (gsi, g, true);
+   /* Remove some statements which can't be kept in the IL because they
+-- 
+2.39.3

diff --git a/sys-devel/gcc/gcc-14.0.0_pre20231015-r1.ebuild 
b/sys-devel/gcc/gcc-14.0.0_pre20231015-r1.ebuild
new file mode 100644
index 000000000000..3e4f9224d3e3
--- /dev/null
+++ b/sys-devel/gcc/gcc-14.0.0_pre20231015-r1.ebuild
@@ -0,0 +1,65 @@
+# Copyright 1999-2023 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+TOOLCHAIN_PATCH_DEV="sam"
+PATCH_GCC_VER="14.0.0"
+PATCH_VER="4"
+MUSL_VER="1"
+MUSL_GCC_VER="14.0.0"
+
+if [[ ${PV} == *.9999 ]] ; then
+       MY_PV_2=$(ver_cut 2)
+       MY_PV_3=1
+       if [[ ${MY_PV_2} == 0 ]] ; then
+               MY_PV_2=0
+               MY_PV_3=0
+       else
+               MY_PV_2=$((${MY_PV_2} - 1))
+       fi
+
+       # e.g. 12.2.9999 -> 12.1.1
+       TOOLCHAIN_GCC_PV=$(ver_cut 1).${MY_PV_2}.${MY_PV_3}
+elif [[ -n ${TOOLCHAIN_GCC_RC} ]] ; then
+       # Cheesy hack for RCs
+       MY_PV=$(ver_cut 1).$((($(ver_cut 2) + 1))).$((($(ver_cut 3) - 
1)))-RC-$(ver_cut 5)
+       MY_P=${PN}-${MY_PV}
+       GCC_TARBALL_SRC_URI="mirror://gcc/snapshots/${MY_PV}/${MY_P}.tar.xz"
+       TOOLCHAIN_SET_S=no
+       S="${WORKDIR}"/${MY_P}
+fi
+
+inherit toolchain
+
+if tc_is_live ; then
+       # Needs to be after inherit (for now?), bug #830908
+       EGIT_BRANCH=master
+elif [[ -z ${TOOLCHAIN_USE_GIT_PATCHES} ]] ; then
+       # Don't keyword live ebuilds
+       #KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc 
~ppc64 ~riscv ~s390 ~sparc ~x86"
+       :;
+fi
+
+if [[ ${CATEGORY} != cross-* ]] ; then
+       # Technically only if USE=hardened *too* right now, but no point in 
complicating it further.
+       # If GCC is enabling CET by default, we need glibc to be built with 
support for it.
+       # bug #830454
+       RDEPEND="elibc_glibc? ( sys-libs/glibc[cet(-)?] )"
+       DEPEND="${RDEPEND}"
+       BDEPEND=">=${CATEGORY}/binutils-2.30[cet(-)?]"
+fi
+
+src_prepare() {
+       local p upstreamed_patches=(
+               # add them here
+       )
+       for p in "${upstreamed_patches[@]}"; do
+               rm -v "${WORKDIR}/patch/${p}" || die
+       done
+
+       toolchain_src_prepare
+
+       eapply "${FILESDIR}"/${P}-pycryptodome-ice.patch
+       eapply_user
+}

Reply via email to