public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-4611] tree-optimization/111773 - avoid CD-DCE of noreturn special calls
@ 2023-10-13  6:34 Richard Biener
  0 siblings, 0 replies; only message in thread
From: Richard Biener @ 2023-10-13  6:34 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:35b5bb475375dba4ea9101d6db13a6012c4e84ca

commit r14-4611-g35b5bb475375dba4ea9101d6db13a6012c4e84ca
Author: Richard Biener <rguenther@suse.de>
Date:   Thu Oct 12 10:13:58 2023 +0200

    tree-optimization/111773 - avoid CD-DCE of noreturn special calls
    
    The support to elide calls to allocation functions in DCE runs into
    the issue that when implementations are discovered noreturn we end
    up DCEing the calls anyway, leaving blocks without termination and
    without outgoing edges which is both invalid IL and wrong-code when
    as in the example the noreturn call would throw.  The following
    avoids taking advantage of both noreturn and the ability to elide
    allocation at the same time.
    
    For the testcase it's valid to throw or return 10 by eliding the
    allocation.  But we have to do either where currently we'd run
    off the function.
    
            PR tree-optimization/111773
            * tree-ssa-dce.cc (mark_stmt_if_obviously_necessary): Do
            not elide noreturn calls that are reflected to the IL.
    
            * g++.dg/torture/pr111773.C: New testcase.

Diff:
---
 gcc/testsuite/g++.dg/torture/pr111773.C | 31 +++++++++++++++++++++++++++++++
 gcc/tree-ssa-dce.cc                     |  8 ++++++++
 2 files changed, 39 insertions(+)

diff --git a/gcc/testsuite/g++.dg/torture/pr111773.C b/gcc/testsuite/g++.dg/torture/pr111773.C
new file mode 100644
index 00000000000..af8c687252c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr111773.C
@@ -0,0 +1,31 @@
+// { dg-do run }
+
+#include <new>
+
+void* operator new(std::size_t sz)
+{
+  throw std::bad_alloc{};
+}
+
+int __attribute__((noipa)) foo ()
+{
+  int* p1 = static_cast<int*>(::operator new(sizeof(int)));
+  return 10;
+}
+
+int main()
+{
+  int res;
+  try
+    {
+      res = foo ();
+    }
+  catch (...)
+    {
+      return 0;
+    }
+
+  if (res != 10)
+    __builtin_abort ();
+  return 0;
+}
diff --git a/gcc/tree-ssa-dce.cc b/gcc/tree-ssa-dce.cc
index f0b02456132..bbdf9312c9f 100644
--- a/gcc/tree-ssa-dce.cc
+++ b/gcc/tree-ssa-dce.cc
@@ -221,6 +221,14 @@ mark_stmt_if_obviously_necessary (gimple *stmt, bool aggressive)
 
     case GIMPLE_CALL:
       {
+	/* Never elide a noreturn call we pruned control-flow for.  */
+	if ((gimple_call_flags (stmt) & ECF_NORETURN)
+	    && gimple_call_ctrl_altering_p (stmt))
+	  {
+	    mark_stmt_necessary (stmt, true);
+	    return;
+	  }
+
 	tree callee = gimple_call_fndecl (stmt);
 	if (callee != NULL_TREE
 	    && fndecl_built_in_p (callee, BUILT_IN_NORMAL))

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-10-13  6:34 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-13  6:34 [gcc r14-4611] tree-optimization/111773 - avoid CD-DCE of noreturn special calls Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).