mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-21 00:11:00 +08:00
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:
parent
5582ad0afb
commit
6e3e708dba
28
gcc/testsuite/g++.dg/opt/pr109434.C
Normal file
28
gcc/testsuite/g++.dg/opt/pr109434.C
Normal 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;
|
||||
}
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user