diff options
author | 2023-03-29 02:50:21 +0100 | |
---|---|---|
committer | 2023-03-29 02:50:27 +0100 | |
commit | d48b81be598d22b4c80bea061776cb58518b3f58 (patch) | |
tree | 660280342c80a8a6d18f3827b6d9045ea99736aa /sys-devel | |
parent | sec-keys/openpgp-keys-gentoo-developers: drop 20221031, 20230102 (diff) | |
download | gentoo-d48b81be598d22b4c80bea061776cb58518b3f58.tar.gz gentoo-d48b81be598d22b4c80bea061776cb58518b3f58.tar.bz2 gentoo-d48b81be598d22b4c80bea061776cb58518b3f58.zip |
sys-devel/gcc: backport opencv ICE fix for 13
I've decided that for now I'll just put these temporary already-on-master
patches in files/ given I'd have to re-cut the patchset repeatedly otherwise
(have to add it, cut a patchset, then delete it from git immediately so 9999
doesn't break, but then I'm in trouble if I want to backport another patch before
the next snapshot).
Closes: https://bugs.gentoo.org/903505
Signed-off-by: Sam James <sam@gentoo.org>
Diffstat (limited to 'sys-devel')
-rw-r--r-- | sys-devel/gcc/files/gcc-13.0.1_pre20230326-76_all_all_PR109265_PR109274_PR109325_range_def_chain.patch | 219 | ||||
-rw-r--r-- | sys-devel/gcc/gcc-13.0.1_pre20230326-r1.ebuild | 57 |
2 files changed, 276 insertions, 0 deletions
diff --git a/sys-devel/gcc/files/gcc-13.0.1_pre20230326-76_all_all_PR109265_PR109274_PR109325_range_def_chain.patch b/sys-devel/gcc/files/gcc-13.0.1_pre20230326-76_all_all_PR109265_PR109274_PR109325_range_def_chain.patch new file mode 100644 index 000000000000..bd66ce422cff --- /dev/null +++ b/sys-devel/gcc/files/gcc-13.0.1_pre20230326-76_all_all_PR109265_PR109274_PR109325_range_def_chain.patch @@ -0,0 +1,219 @@ +https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109265 +https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109274 +https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109325 +https://bugs.gentoo.org/903505 +https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=dd63bba0c8dc3a6ae06cfdc084bca7c68b8bbd39 + +From dd63bba0c8dc3a6ae06cfdc084bca7c68b8bbd39 Mon Sep 17 00:00:00 2001 +From: Andrew MacLeod <amacleod@redhat.com> +Date: Fri, 24 Mar 2023 11:21:20 -0400 +Subject: [PATCH] Fix compute_operand when op1 == op2 symbolically. + +First, class value_relation should not sanitize records. just create +what is asked. + +Second., if there is not a relation record, compute_operand was +creating one for op1 == op2 if op1 and op2 were the same symbol. This +is not the correct way to communicate the information, as that record +will continue to be passed along the GORI unwind chain. + +Instead, simply pass that information locally to the opX_range routine +for only the current statement. + + PR tree-optimization/109265 + PR tree-optimization/109274 + gcc/ + * gimple-range-gori.cc (gori_compute::compute_operand_range): Do + not create a relation record is op1 and op2 are the same symbol. + (gori_compute::compute_operand1_range): Pass op1 == op2 to the + handler for this stmt, but create a new record only if this statement + generates a relation based on the ranges. + (gori_compute::compute_operand2_range): Ditto. + * value-relation.h (value_relation::set_relation): Always create the + record that is requested. + + gcc/testsuite/ + * gcc.dg/pr109274.c: New. + * gfortran.dg/pr109265.f90: New. +--- a/gcc/gimple-range-gori.cc ++++ b/gcc/gimple-range-gori.cc +@@ -623,21 +623,6 @@ gori_compute::compute_operand_range (vrange &r, gimple *stmt, + tree op1 = gimple_range_ssa_p (handler.operand1 ()); + tree op2 = gimple_range_ssa_p (handler.operand2 ()); + +- // If there is a relation, use it instead of any passed in. This will allow +- // multiple relations to be processed in compound logicals. +- if (op1 && op2) +- { +- relation_kind k = handler.op1_op2_relation (lhs); +- // If there is no relation, and op1 == op2, create a relation. +- if (!vrel_ptr && k == VREL_VARYING && op1 == op2) +- k = VREL_EQ; +- if (k != VREL_VARYING) +- { +- vrel.set_relation (k, op1, op2); +- vrel_ptr = &vrel; +- } +- } +- + // Handle end of lookup first. + if (op1 == name) + return compute_operand1_range (r, handler, lhs, name, src, vrel_ptr); +@@ -1093,6 +1078,7 @@ gori_compute::compute_operand1_range (vrange &r, + const vrange &lhs, tree name, + fur_source &src, value_relation *rel) + { ++ value_relation local_rel; + gimple *stmt = handler.stmt (); + tree op1 = handler.operand1 (); + tree op2 = handler.operand2 (); +@@ -1101,6 +1087,7 @@ gori_compute::compute_operand1_range (vrange &r, + relation_trio trio; + if (rel) + trio = rel->create_trio (lhs_name, op1, op2); ++ relation_kind op_op = trio.op1_op2 (); + + Value_Range op1_range (TREE_TYPE (op1)); + Value_Range tmp (TREE_TYPE (op1)); +@@ -1113,10 +1100,26 @@ gori_compute::compute_operand1_range (vrange &r, + if (op2) + { + src.get_operand (op2_range, op2); +- relation_kind op_op = trio.op1_op2 (); ++ ++ // If there is a relation betwen op1 and op2, use it instead. ++ // This allows multiple relations to be processed in compound logicals. ++ if (gimple_range_ssa_p (op1) && gimple_range_ssa_p (op2)) ++ { ++ relation_kind k = handler.op1_op2_relation (lhs); ++ if (k != VREL_VARYING) ++ { ++ op_op = k; ++ local_rel.set_relation (op_op, op1, op2); ++ rel = &local_rel; ++ } ++ } ++ + if (op_op != VREL_VARYING) + refine_using_relation (op1, op1_range, op2, op2_range, src, op_op); + ++ // If op1 == op2, create a new trio for just this call. ++ if (op1 == op2 && gimple_range_ssa_p (op1)) ++ trio = relation_trio (trio.lhs_op1 (), trio.lhs_op2 (), VREL_EQ); + if (!handler.calc_op1 (tmp, lhs, op2_range, trio)) + return false; + } +@@ -1185,6 +1188,7 @@ gori_compute::compute_operand2_range (vrange &r, + const vrange &lhs, tree name, + fur_source &src, value_relation *rel) + { ++ value_relation local_rel; + gimple *stmt = handler.stmt (); + tree op1 = handler.operand1 (); + tree op2 = handler.operand2 (); +@@ -1201,9 +1205,26 @@ gori_compute::compute_operand2_range (vrange &r, + if (rel) + trio = rel->create_trio (lhs_name, op1, op2); + relation_kind op_op = trio.op1_op2 (); ++ ++ // If there is a relation betwen op1 and op2, use it instead. ++ // This allows multiple relations to be processed in compound logicals. ++ if (gimple_range_ssa_p (op1) && gimple_range_ssa_p (op2)) ++ { ++ relation_kind k = handler.op1_op2_relation (lhs); ++ if (k != VREL_VARYING) ++ { ++ op_op = k; ++ local_rel.set_relation (op_op, op1, op2); ++ rel = &local_rel; ++ } ++ } ++ + if (op_op != VREL_VARYING) + refine_using_relation (op1, op1_range, op2, op2_range, src, op_op); + ++ // If op1 == op2, create a new trio for this stmt. ++ if (op1 == op2 && gimple_range_ssa_p (op1)) ++ trio = relation_trio (trio.lhs_op1 (), trio.lhs_op2 (), VREL_EQ); + // Intersect with range for op2 based on lhs and op1. + if (!handler.calc_op2 (tmp, lhs, op1_range, trio)) + return false; +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/pr109274.c +@@ -0,0 +1,16 @@ ++/* PR tree-optimization/109274 */ ++/* { dg-do compile } */ ++/* { dg-options "-O2 " } */ ++ ++float a, b, c; ++int d; ++float bar (void); ++ ++void ++foo (void) ++{ ++ a = 0 * -(2.0f * c); ++ d = a != a ? 0 : bar (); ++ b = c; ++} ++ +--- /dev/null ++++ b/gcc/testsuite/gfortran.dg/pr109265.f90 +@@ -0,0 +1,39 @@ ++! PR tree-optimization/109265 ++! { dg-do compile } ++! { dg-options "-O3 -w" } ++ ++module pr109265 ++ integer, parameter :: r8 = selected_real_kind (12) ++contains ++ subroutine foo (b, c, d, e, f) ++ implicit none ++ logical :: b ++ real (kind = r8) :: c, d, e, f, i ++ if (b) then ++ c = bar (c * d, e) ++ i = bar (f, c) ++ call baz (i) ++ call baz (-i) ++ end if ++ end subroutine foo ++ function bar (a, b) ++ implicit none ++ real (kind = r8) :: bar ++ real (kind = r8) :: a, b ++ bar = a + b ++ end function bar ++ subroutine baz (b) ++ implicit none ++ real (kind = r8) :: b, d, e, f, g, h, i ++ d = b ++ i = 0 ++ e = d ++ f = d ++ g = d ++ 10 continue ++ if ((e.eq.d) .and. (f.eq.d) .and. (g.eq.d) .and. (h.eq.d)) then ++ h = i ++ goto 10 ++ end if ++ end subroutine baz ++end module pr109265 +--- a/gcc/value-relation.h ++++ b/gcc/value-relation.h +@@ -445,13 +445,6 @@ value_relation::set_relation (relation_kind r, tree n1, tree n2) + { + gcc_checking_assert (TREE_CODE (n1) == SSA_NAME + && TREE_CODE (n2) == SSA_NAME); +- if (n1 == n2 && r != VREL_EQ) +- { +- related = VREL_VARYING; +- name1 = NULL_TREE; +- name2 = NULL_TREE; +- return; +- } + related = r; + name1 = n1; + name2 = n2; +-- +2.31.1 diff --git a/sys-devel/gcc/gcc-13.0.1_pre20230326-r1.ebuild b/sys-devel/gcc/gcc-13.0.1_pre20230326-r1.ebuild new file mode 100644 index 000000000000..f3595ae7bc43 --- /dev/null +++ b/sys-devel/gcc/gcc-13.0.1_pre20230326-r1.ebuild @@ -0,0 +1,57 @@ +# 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}-76_all_all_PR109265_PR109274_PR109325_range_def_chain.patch + eapply_user +} |