From: Jason Merrill Date: Fri, 9 Jul 2021 09:45:03 +0000 (-0400) Subject: c++: enable -fdelete-dead-exceptions by default X-Git-Tag: basepoints/gcc-13~6006 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b15e301748f0e042379909e32b3ade439dd8f8f9;p=thirdparty%2Fgcc.git c++: enable -fdelete-dead-exceptions by default As I was discussing with richi, I don't think it makes sense to protect calls to pure/const functions from DCE just because they aren't explicitly declared noexcept. PR100382 indicates that there are different considerations for Go, which has non-call exceptions. But still turn the flag off for that specific testcase. gcc/c-family/ChangeLog: * c-opts.c (c_common_post_options): Set -fdelete-dead-exceptions. gcc/ChangeLog: * doc/invoke.texi: -fdelete-dead-exceptions is on by default for C++. gcc/testsuite/ChangeLog: * g++.dg/torture/pr100382.C: Pass -fno-delete-dead-exceptions. --- diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c index 60b5802722ce..1c4e832c7ed0 100644 --- a/gcc/c-family/c-opts.c +++ b/gcc/c-family/c-opts.c @@ -1015,6 +1015,10 @@ c_common_post_options (const char **pfilename) SET_OPTION_IF_UNSET (&global_options, &global_options_set, flag_finite_loops, optimize >= 2 && cxx_dialect >= cxx11); + /* It's OK to discard calls to pure/const functions that might throw. */ + SET_OPTION_IF_UNSET (&global_options, &global_options_set, + flag_delete_dead_exceptions, true); + if (cxx_dialect >= cxx11) { /* If we're allowing C++0x constructs, don't warn about C++98 diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index e67d47af676d..ea8812425e95 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -16335,8 +16335,10 @@ arbitrary signal handlers such as @code{SIGALRM}. @opindex fdelete-dead-exceptions Consider that instructions that may throw exceptions but don't otherwise contribute to the execution of the program can be optimized away. -This option is enabled by default for the Ada compiler, as permitted by -the Ada language specification. +This does not affect calls to functions except those with the +@code{pure} or @code{const} attributes. +This option is enabled by default for the Ada and C++ compilers, as permitted by +the language specifications. Optimization passes that cause dead exceptions to be removed are enabled independently at different optimization levels. @item -funwind-tables diff --git a/gcc/testsuite/g++.dg/torture/pr100382.C b/gcc/testsuite/g++.dg/torture/pr100382.C index ffc4182cfcea..eac5743b956d 100644 --- a/gcc/testsuite/g++.dg/torture/pr100382.C +++ b/gcc/testsuite/g++.dg/torture/pr100382.C @@ -1,4 +1,5 @@ // { dg-do run } +// { dg-additional-options -fno-delete-dead-exceptions } int x, y; int __attribute__((pure,noinline)) foo () { if (x) throw 1; return y; }