diff options
author | Richard Biener <rguenther@suse.de> | 2023-04-11 15:06:59 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2023-04-12 08:48:23 +0200 |
commit | 6e3e708dbadaae7b504af7fc4410015624793f02 (patch) | |
tree | 00784ed72f08b3dcd2d7c080239706c3ff8d741d /gcc | |
parent | 5582ad0afb051a76231b2959487f4ef1746df283 (diff) | |
download | gcc-6e3e708dbadaae7b504af7fc4410015624793f02.zip gcc-6e3e708dbadaae7b504af7fc4410015624793f02.tar.gz gcc-6e3e708dbadaae7b504af7fc4410015624793f02.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr109434.C | 28 | ||||
-rw-r--r-- | gcc/tree-ssa-dse.cc | 3 |
2 files changed, 30 insertions, 1 deletions
diff --git a/gcc/testsuite/g++.dg/opt/pr109434.C b/gcc/testsuite/g++.dg/opt/pr109434.C new file mode 100644 index 0000000..cffa327 --- /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; +} diff --git a/gcc/tree-ssa-dse.cc b/gcc/tree-ssa-dse.cc index 4f8a44f..eabe8ba 100644 --- 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; |