commit:     e753e969fe0d9dffb1a68e4358821cddbf11bca6
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Wed Apr 12 07:38:52 2023 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Wed Apr 12 07:39:20 2023 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=e753e969

sys-devel/gcc: backport DSE fix for std::optional for 13

Probably wouldn't do this by itself but given I've just pushed the
SLP fix (989bee28461116343b958e978fe19472fe2ea3cb) and nobody will have built
that yet, let's just do it given it's a miscompilation.

Bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109434
Signed-off-by: Sam James <sam <AT> gentoo.org>

 ...gcc-13.0.1_pre20230409-PR109434-DSE-throw.patch | 63 ++++++++++++++++++++++
 sys-devel/gcc/gcc-13.0.1_pre20230409-r3.ebuild     | 58 ++++++++++++++++++++
 2 files changed, 121 insertions(+)

diff --git 
a/sys-devel/gcc/files/gcc-13.0.1_pre20230409-PR109434-DSE-throw.patch 
b/sys-devel/gcc/files/gcc-13.0.1_pre20230409-PR109434-DSE-throw.patch
new file mode 100644
index 000000000000..5d45d8f4e018
--- /dev/null
+++ b/sys-devel/gcc/files/gcc-13.0.1_pre20230409-PR109434-DSE-throw.patch
@@ -0,0 +1,63 @@
+https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=6e3e708dbadaae7b504af7fc4410015624793f02
+https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109434
+
+From 6e3e708dbadaae7b504af7fc4410015624793f02 Mon Sep 17 00:00:00 2001
+From: Richard Biener <rguent...@suse.de>
+Date: Tue, 11 Apr 2023 15:06:59 +0200
+Subject: [PATCH] tree-optimization/109434 - bogus DSE of throwing call LHS
+
+The byte tracking of call LHS didn't properly handle possibly
+throwing calls correctly which cases bogus DSE and in turn, for the
+testcase a bogus uninit diagnostic and (unreliable) wrong-code.
+
+       PR tree-optimization/109434
+       * tree-ssa-dse.cc (initialize_ao_ref_for_dse): Properly
+       handle possibly throwing calls when processing the LHS
+       and may-defs are not OK.
+
+       * g++.dg/opt/pr109434.C: New testcase.
+--- /dev/null
++++ b/gcc/testsuite/g++.dg/opt/pr109434.C
+@@ -0,0 +1,28 @@
++// { dg-do compile }
++// { dg-require-effective-target c++17 }
++// { dg-options "-O2 -Wall" }
++
++#include <optional>
++#include <stdexcept>
++
++std::optional<int> foo()
++{
++  volatile int x = 1;
++  if (x)
++    throw std::runtime_error("haha");
++  return 42;
++}
++
++int main()
++{
++  std::optional<int> optInt;
++  try {
++      // We falsely DSEd the LHS of the call even though foo throws
++      // which results in an uninitialized diagnostic
++      optInt = foo();
++  } catch (...) {
++      return optInt.has_value();
++  }
++  std::optional<double> optDbl{optInt};
++  return optDbl ? optDbl.value () : 2.0;
++}
+--- a/gcc/tree-ssa-dse.cc
++++ b/gcc/tree-ssa-dse.cc
+@@ -179,7 +179,8 @@ initialize_ao_ref_for_dse (gimple *stmt, ao_ref *write, 
bool may_def_ok = false)
+     }
+   if (tree lhs = gimple_get_lhs (stmt))
+     {
+-      if (TREE_CODE (lhs) != SSA_NAME)
++      if (TREE_CODE (lhs) != SSA_NAME
++        && (may_def_ok || !stmt_could_throw_p (cfun, stmt)))
+       {
+         ao_ref_init (write, lhs);
+         return true;
+-- 
+2.31.1

diff --git a/sys-devel/gcc/gcc-13.0.1_pre20230409-r3.ebuild 
b/sys-devel/gcc/gcc-13.0.1_pre20230409-r3.ebuild
new file mode 100644
index 000000000000..073f68b644ac
--- /dev/null
+++ b/sys-devel/gcc/gcc-13.0.1_pre20230409-r3.ebuild
@@ -0,0 +1,58 @@
+# Copyright 1999-2023 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+TOOLCHAIN_PATCH_DEV="sam"
+PATCH_VER="9"
+PATCH_GCC_VER="13.1.0"
+MUSL_VER="1"
+MUSL_GCC_VER="13.1.0"
+
+if [[ $(ver_cut 3) == 9999 ]] ; then
+       MY_PV_2=$(ver_cut 2)
+       MY_PV_3=$(($(ver_cut 3) - 9998))
+       if [[ ${MY_PV_2} == 0 ]] ; then
+               MY_PV_2=0
+               MY_PV_3=0
+       else
+               MY_PV_2=$(($(ver_cut 2) - 1))
+       fi
+
+       # e.g. 12.2.9999 -> 12.1.1
+       TOOLCHAIN_GCC_PV=$(ver_cut 1).${MY_PV_2}.${MY_PV_3}
+fi
+
+inherit toolchain
+# Needs to be after inherit (for now?), bug #830908
+EGIT_BRANCH=master
+
+# Don't keyword live ebuilds
+if ! tc_is_live && [[ -z ${TOOLCHAIN_USE_GIT_PATCHES} ]] ; then
+#      KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k ~mips ~ppc 
~ppc64 ~riscv ~s390 ~sparc ~x86"
+       KEYWORDS="~loong"
+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}-PR109469-SLP-returns-twice.patch
+       eapply "${FILESDIR}"/${P}-PR109434-DSE-throw.patch
+       eapply_user
+}

Reply via email to