https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100382

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
Hum.  OK, so DSE would also miss is_ctrl_altering_stmt (DCE checks this which
covers stmt_can_throw_internal).  So with non-call-EH we even want to preserve
externally throwing EH?  Given there's can_delete_dead_exceptions I wonder
if this applies to call EH as well.  Note for this to make a practical
difference the throwing function would need to be pure at least (thus subject
to DCE in the first place).

So - wouldn't a more consistent check be

    (!stmt_could_throw_p ()
     || cfun->can_delete_dead_exceptions)

?

int x, y;
int __attribute__((pure,noinline)) foo () { if (x) throw; return y; }

int main()
{
  int a[2];
  x = 1;
  try {
    int res = foo ();
    a[0] = res;
  } catch (...) {
      return 0;
  }
  return 1;
}

should show this but the post-dom domwalk is plagued by the same ordering
issue as the dom domwalk was (we visit dom children in non-"RPO" order,
in this case inverted postorder).

Reply via email to