diff options
author | V3n3RiX <venerix@koprulu.sector> | 2023-04-12 11:41:02 +0100 |
---|---|---|
committer | V3n3RiX <venerix@koprulu.sector> | 2023-04-12 11:41:02 +0100 |
commit | d15be4fe2ff3e70717117a938dbe5a11cec60a7b (patch) | |
tree | 11b55e9435c5d885c195338bb42507d74636c34c /sys-devel/gcc/files/gcc-13.0.1_pre20230409-PR109434-DSE-throw.patch | |
parent | 81663ab80e0e0c5839b216934509b6bcbf08429a (diff) |
gentoo auto-resync : 12:04:2023 - 11:41:02
Diffstat (limited to 'sys-devel/gcc/files/gcc-13.0.1_pre20230409-PR109434-DSE-throw.patch')
-rw-r--r-- | sys-devel/gcc/files/gcc-13.0.1_pre20230409-PR109434-DSE-throw.patch | 63 |
1 files changed, 63 insertions, 0 deletions
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 <rguenther@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 |