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 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 +#include + +std::optional foo() +{ + volatile int x = 1; + if (x) + throw std::runtime_error("haha"); + return 42; +} + +int main() +{ + std::optional 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 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