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.
This commit is contained in:
Richard Biener 2023-04-11 15:06:59 +02:00
parent 5582ad0afb
commit 6e3e708dba
2 changed files with 30 additions and 1 deletions

View File

@ -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;
}

View File

@ -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;