public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [RFC][PATCH] Extend DCE to remove unnecessary new/delete-pairs
@ 2017-11-21 11:35 Dominik Inführ
  2017-11-21 17:13 ` Jeff Law
                   ` (3 more replies)
  0 siblings, 4 replies; 91+ messages in thread
From: Dominik Inführ @ 2017-11-21 11:35 UTC (permalink / raw)
  To: GCC Patches


[-- Attachment #1.1: Type: text/plain, Size: 330 bytes --]

Hi,

this patch tries to extend tree-ssa-dce.c to remove unnecessary new/delete-pairs (it already does that for malloc/free). Clang does it too and it seems to be allowed by http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3664.html. I’ve bootstrapped/regtested on aarch64-linux and x86_64-linux.

Best,
Dominik


[-- Attachment #1.2: dce-new-delete.diff --]
[-- Type: application/octet-stream, Size: 14200 bytes --]

diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
index d95a2b6ea4f..4ed8c2d191a 100644
--- a/gcc/c/c-decl.c
+++ b/gcc/c/c-decl.c
@@ -2454,6 +2454,7 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype)
 	  TREE_THIS_VOLATILE (newdecl) |= TREE_THIS_VOLATILE (olddecl);
 	  DECL_IS_MALLOC (newdecl) |= DECL_IS_MALLOC (olddecl);
 	  DECL_IS_OPERATOR_NEW (newdecl) |= DECL_IS_OPERATOR_NEW (olddecl);
+	  DECL_IS_OPERATOR_DELETE (newdecl) |= DECL_IS_OPERATOR_DELETE (olddecl);
 	  TREE_READONLY (newdecl) |= TREE_READONLY (olddecl);
 	  DECL_PURE_P (newdecl) |= DECL_PURE_P (olddecl);
 	  DECL_IS_NOVOPS (newdecl) |= DECL_IS_NOVOPS (olddecl);
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 54e06568e46..d1c77b1d670 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -4182,8 +4182,11 @@ cxx_init_decl_processing (void)
     opnew = push_cp_library_fn (VEC_NEW_EXPR, newtype, 0);
     DECL_IS_MALLOC (opnew) = 1;
     DECL_IS_OPERATOR_NEW (opnew) = 1;
-    push_cp_library_fn (DELETE_EXPR, deltype, ECF_NOTHROW);
-    push_cp_library_fn (VEC_DELETE_EXPR, deltype, ECF_NOTHROW);
+    tree opdel = push_cp_library_fn (DELETE_EXPR, deltype, ECF_NOTHROW);
+    DECL_IS_OPERATOR_DELETE (opdel) = 1;
+    opdel = push_cp_library_fn (VEC_DELETE_EXPR, deltype, ECF_NOTHROW);
+    DECL_IS_OPERATOR_DELETE (opdel) = 1;
+
     if (flag_sized_deallocation)
       {
 	/* Also push the sized deallocation variants:
@@ -4195,8 +4198,10 @@ cxx_init_decl_processing (void)
 	deltype = cp_build_type_attribute_variant (void_ftype_ptr_size,
 						   extvisattr);
 	deltype = build_exception_variant (deltype, empty_except_spec);
-	push_cp_library_fn (DELETE_EXPR, deltype, ECF_NOTHROW);
+	opdel = push_cp_library_fn (DELETE_EXPR, deltype, ECF_NOTHROW);
+	DECL_IS_OPERATOR_DELETE (opdel) = 1;
 	push_cp_library_fn (VEC_DELETE_EXPR, deltype, ECF_NOTHROW);
+	DECL_IS_OPERATOR_DELETE (opdel) = 1;
       }
 
     if (aligned_new_threshold)
@@ -4224,8 +4229,10 @@ cxx_init_decl_processing (void)
 					    align_type_node, NULL_TREE);
 	deltype = cp_build_type_attribute_variant (deltype, extvisattr);
 	deltype = build_exception_variant (deltype, empty_except_spec);
-	push_cp_library_fn (DELETE_EXPR, deltype, ECF_NOTHROW);
-	push_cp_library_fn (VEC_DELETE_EXPR, deltype, ECF_NOTHROW);
+	opdel = push_cp_library_fn (DELETE_EXPR, deltype, ECF_NOTHROW);
+	DECL_IS_OPERATOR_DELETE (opdel) = 1;
+	opdel = push_cp_library_fn (VEC_DELETE_EXPR, deltype, ECF_NOTHROW);
+	DECL_IS_OPERATOR_DELETE (opdel) = 1;
 
 	if (flag_sized_deallocation)
 	  {
@@ -4235,8 +4242,10 @@ cxx_init_decl_processing (void)
 						NULL_TREE);
 	    deltype = cp_build_type_attribute_variant (deltype, extvisattr);
 	    deltype = build_exception_variant (deltype, empty_except_spec);
-	    push_cp_library_fn (DELETE_EXPR, deltype, ECF_NOTHROW);
-	    push_cp_library_fn (VEC_DELETE_EXPR, deltype, ECF_NOTHROW);
+	    opdel = push_cp_library_fn (DELETE_EXPR, deltype, ECF_NOTHROW);
+	    DECL_IS_OPERATOR_DELETE (opdel) = 1;
+	    opdel = push_cp_library_fn (VEC_DELETE_EXPR, deltype, ECF_NOTHROW);
+	    DECL_IS_OPERATOR_DELETE (opdel) = 1;
 	  }
       }
 
diff --git a/gcc/gimple.c b/gcc/gimple.c
index c986a732004..27aab5aa3b5 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -2543,6 +2543,32 @@ gimple_builtin_call_types_compatible_p (const gimple *stmt, tree fndecl)
   return true;
 }
 
+/* Return true when STMT is operator new call.  */
+
+bool
+gimple_call_operator_new_p (const gimple *stmt)
+{
+  tree fndecl;
+
+  if (is_gimple_call (stmt)
+      && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE)
+    return DECL_IS_OPERATOR_NEW (fndecl);
+  return false;
+}
+
+/* Return true when STMT is operator delete call.  */
+
+bool
+gimple_call_operator_delete_p (const gimple *stmt)
+{
+  tree fndecl;
+
+  if (is_gimple_call (stmt)
+      && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE)
+    return DECL_IS_OPERATOR_DELETE (fndecl);
+  return false;
+}
+
 /* Return true when STMT is builtins call.  */
 
 bool
diff --git a/gcc/gimple.h b/gcc/gimple.h
index 334def89398..c9c25c2a228 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -1514,6 +1514,8 @@ extern alias_set_type gimple_get_alias_set (tree);
 extern bool gimple_ior_addresses_taken (bitmap, gimple *);
 extern bool gimple_builtin_call_types_compatible_p (const gimple *, tree);
 extern combined_fn gimple_call_combined_fn (const gimple *);
+extern bool gimple_call_operator_new_p (const gimple *);
+extern bool gimple_call_operator_delete_p (const gimple *);
 extern bool gimple_call_builtin_p (const gimple *);
 extern bool gimple_call_builtin_p (const gimple *, enum built_in_class);
 extern bool gimple_call_builtin_p (const gimple *, enum built_in_function);
diff --git a/gcc/testsuite/g++.dg/cpp1y/new1.C b/gcc/testsuite/g++.dg/cpp1y/new1.C
new file mode 100644
index 00000000000..b966cf5d7b7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/new1.C
@@ -0,0 +1,65 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-cddce-details" } */
+
+#include <stdlib.h>
+
+void
+new_without_use() {
+  int *x = new int;
+}
+
+void
+new_array_without_use() {
+  int *x = new int[5];
+}
+
+void
+new_primitive() {
+  int *x = new int;
+  delete x;
+}
+
+void
+new_array() {
+  int *x = new int[10];
+  delete [] x;
+}
+
+void
+new_primitive_store() {
+  int *x = new int;
+  *x = 10;
+  delete x;
+}
+
+void
+new_primitive_load() {
+  int *x = new int;
+  int tmp = *x;
+  delete x;
+}
+
+int
+new_primitive_load_with_use() {
+  int *x = new int;
+  int tmp = *x;
+  delete x;
+  return tmp;
+}
+
+void
+new_array_store() {
+  int *x = new int[10];
+  x[4] = 10;
+  delete [] x;
+}
+
+void
+new_array_load() {
+  int *x = new int[10];
+  int tmp = x[4];
+  delete [] x;
+}
+
+/* { dg-final { scan-tree-dump-times "Deleting : operator delete" 4 "cddce1"} } */
+/* { dg-final { scan-tree-dump-times "Deleting : _\\d+ = operator new" 6 "cddce1"} } */
diff --git a/gcc/tree-core.h b/gcc/tree-core.h
index aa54221253c..9a406c5d86c 100644
--- a/gcc/tree-core.h
+++ b/gcc/tree-core.h
@@ -1787,7 +1787,9 @@ struct GTY(()) tree_function_decl {
   unsigned has_debug_args_flag : 1;
   unsigned tm_clone_flag : 1;
   unsigned versioned_function : 1;
-  /* No bits left.  */
+
+  unsigned operator_delete_flag : 1;
+  /* 31 bits left.  */
 };
 
 struct GTY(()) tree_translation_unit_decl {
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index a5f0edf7893..571a0b7bb5a 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -238,6 +238,11 @@ mark_stmt_if_obviously_necessary (gimple *stmt, bool aggressive)
 
 	    default:;
 	    }
+
+	if (callee != NULL_TREE
+	    && DECL_IS_OPERATOR_NEW (callee))
+	  return;
+
 	/* Most, but not all function calls are required.  Function calls that
 	   produce no result and have no side effects (i.e. const pure
 	   functions) are unnecessary.  */
@@ -581,6 +586,11 @@ mark_all_reaching_defs_necessary_1 (ao_ref *ref ATTRIBUTE_UNUSED,
 
 	  default:;
 	  }
+
+      if (callee != NULL_TREE
+	  && (DECL_IS_OPERATOR_NEW (callee)
+	      || DECL_IS_OPERATOR_DELETE (callee)))
+	return false;
     }
 
   if (! gimple_clobber_p (def_stmt))
@@ -767,20 +777,23 @@ propagate_necessity (bool aggressive)
 	  /* If this is a call to free which is directly fed by an
 	     allocation function do not mark that necessary through
 	     processing the argument.  */
-	  if (gimple_call_builtin_p (stmt, BUILT_IN_FREE))
+	  if (gimple_call_builtin_p (stmt, BUILT_IN_FREE)
+	      || gimple_call_operator_delete_p (stmt))
 	    {
 	      tree ptr = gimple_call_arg (stmt, 0);
 	      gimple *def_stmt;
 	      tree def_callee;
+
 	      /* If the pointer we free is defined by an allocation
 		 function do not add the call to the worklist.  */
 	      if (TREE_CODE (ptr) == SSA_NAME
 		  && is_gimple_call (def_stmt = SSA_NAME_DEF_STMT (ptr))
 		  && (def_callee = gimple_call_fndecl (def_stmt))
-		  && DECL_BUILT_IN_CLASS (def_callee) == BUILT_IN_NORMAL
-		  && (DECL_FUNCTION_CODE (def_callee) == BUILT_IN_ALIGNED_ALLOC
-		      || DECL_FUNCTION_CODE (def_callee) == BUILT_IN_MALLOC
-		      || DECL_FUNCTION_CODE (def_callee) == BUILT_IN_CALLOC))
+		  && ((DECL_BUILT_IN_CLASS (def_callee) == BUILT_IN_NORMAL
+		       && (DECL_FUNCTION_CODE (def_callee) == BUILT_IN_ALIGNED_ALLOC
+			  || DECL_FUNCTION_CODE (def_callee) == BUILT_IN_MALLOC
+			  || DECL_FUNCTION_CODE (def_callee) == BUILT_IN_CALLOC))
+		      || DECL_IS_OPERATOR_NEW (def_callee)))
 		{
 		  gimple *bounds_def_stmt;
 		  tree bounds;
@@ -794,7 +807,24 @@ propagate_necessity (bool aggressive)
 			  && chkp_gimple_call_builtin_p (bounds_def_stmt,
 							 BUILT_IN_CHKP_BNDRET)
 			  && gimple_call_arg (bounds_def_stmt, 0) == ptr))
-		    continue;
+		    {
+		      /* For operator delete [] we need to keep size operand
+			 alive. Otherwise this operand isn't available anymore
+			 when we finally decide that this stmt is necessary in
+			eliminate_unnecessary_stmts. If it should really be
+			unnecessary, a later pass can clean this up.  */
+		      if (gimple_call_operator_delete_p (stmt))
+			{
+			  for (unsigned i=1; i < gimple_call_num_args (stmt); ++i)
+			    {
+			      tree arg = gimple_call_arg (stmt, i);
+			      if (TREE_CODE (arg) == SSA_NAME)
+				mark_operand_necessary (arg);
+			    }
+			}
+
+		      continue;
+		    }
 		}
 	    }
 
@@ -849,6 +879,11 @@ propagate_necessity (bool aggressive)
 		      || DECL_FUNCTION_CODE (callee) == BUILT_IN_ASSUME_ALIGNED))
 		continue;
 
+	      if (callee != NULL_TREE
+		  && (DECL_IS_OPERATOR_NEW (callee)
+		      || DECL_IS_OPERATOR_DELETE (callee)))
+		continue;
+
 	      /* Calls implicitly load from memory, their arguments
 	         in addition may explicitly perform memory loads.  */
 	      mark_all_reaching_defs_necessary (stmt);
@@ -1269,7 +1304,8 @@ eliminate_unnecessary_stmts (void)
 	     defining statement of its argument is not necessary
 	     (and thus is getting removed).  */
 	  if (gimple_plf (stmt, STMT_NECESSARY)
-	      && gimple_call_builtin_p (stmt, BUILT_IN_FREE))
+	      && (gimple_call_builtin_p (stmt, BUILT_IN_FREE)
+		  || gimple_call_operator_delete_p (stmt)))
 	    {
 	      tree ptr = gimple_call_arg (stmt, 0);
 	      if (TREE_CODE (ptr) == SSA_NAME)
diff --git a/gcc/tree-streamer-in.c b/gcc/tree-streamer-in.c
index baf0c5bf837..eb8a2aa1a93 100644
--- a/gcc/tree-streamer-in.c
+++ b/gcc/tree-streamer-in.c
@@ -326,6 +326,7 @@ unpack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
   DECL_IS_RETURNS_TWICE (expr) = (unsigned) bp_unpack_value (bp, 1);
   DECL_IS_MALLOC (expr) = (unsigned) bp_unpack_value (bp, 1);
   DECL_IS_OPERATOR_NEW (expr) = (unsigned) bp_unpack_value (bp, 1);
+  DECL_IS_OPERATOR_DELETE (expr) = (unsigned) bp_unpack_value (bp, 1);
   DECL_DECLARED_INLINE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
   DECL_STATIC_CHAIN (expr) = (unsigned) bp_unpack_value (bp, 1);
   DECL_NO_INLINE_WARNING_P (expr) = (unsigned) bp_unpack_value (bp, 1);
diff --git a/gcc/tree-streamer-out.c b/gcc/tree-streamer-out.c
index 7f52d455f5e..a63d16deb23 100644
--- a/gcc/tree-streamer-out.c
+++ b/gcc/tree-streamer-out.c
@@ -287,6 +287,7 @@ pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
   bp_pack_value (bp, DECL_IS_RETURNS_TWICE (expr), 1);
   bp_pack_value (bp, DECL_IS_MALLOC (expr), 1);
   bp_pack_value (bp, DECL_IS_OPERATOR_NEW (expr), 1);
+  bp_pack_value (bp, DECL_IS_OPERATOR_DELETE (expr), 1);
   bp_pack_value (bp, DECL_DECLARED_INLINE_P (expr), 1);
   bp_pack_value (bp, DECL_STATIC_CHAIN (expr), 1);
   bp_pack_value (bp, DECL_NO_INLINE_WARNING_P (expr), 1);
diff --git a/gcc/tree.h b/gcc/tree.h
index 0ec092aa812..88d7e73fd09 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -2866,6 +2866,11 @@ extern void decl_fini_priority_insert (tree, priority_type);
 #define DECL_IS_OPERATOR_NEW(NODE) \
   (FUNCTION_DECL_CHECK (NODE)->function_decl.operator_new_flag)
 
+/* Nonzero in a FUNCTION_DECL means this function should be treated as
+   C++ operator delete.  */
+#define DECL_IS_OPERATOR_DELETE(NODE) \
+  (FUNCTION_DECL_CHECK (NODE)->function_decl.operator_delete_flag)
+
 /* Nonzero in a FUNCTION_DECL means this function may return more
    than once.  */
 #define DECL_IS_RETURNS_TWICE(NODE) \
diff --git a/libstdc++-v3/testsuite/ext/bitmap_allocator/check_delete.cc b/libstdc++-v3/testsuite/ext/bitmap_allocator/check_delete.cc
index bc36ed595e0..10e26615fb7 100644
--- a/libstdc++-v3/testsuite/ext/bitmap_allocator/check_delete.cc
+++ b/libstdc++-v3/testsuite/ext/bitmap_allocator/check_delete.cc
@@ -15,6 +15,8 @@
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
+// { dg-options "-fno-tree-dce" }
+
 // 20.4.1.1 allocator members
 
 #include <cstdlib>
diff --git a/libstdc++-v3/testsuite/ext/bitmap_allocator/check_new.cc b/libstdc++-v3/testsuite/ext/bitmap_allocator/check_new.cc
index 073d588f3b9..7efd325bec2 100644
--- a/libstdc++-v3/testsuite/ext/bitmap_allocator/check_new.cc
+++ b/libstdc++-v3/testsuite/ext/bitmap_allocator/check_new.cc
@@ -15,6 +15,8 @@
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
+// { dg-options "-fno-tree-dce" }
+
 // 20.4.1.1 allocator members
 
 #include <cstdlib>
diff --git a/libstdc++-v3/testsuite/ext/new_allocator/check_delete.cc b/libstdc++-v3/testsuite/ext/new_allocator/check_delete.cc
index ce6c1da3e27..30390c266d0 100644
--- a/libstdc++-v3/testsuite/ext/new_allocator/check_delete.cc
+++ b/libstdc++-v3/testsuite/ext/new_allocator/check_delete.cc
@@ -17,6 +17,8 @@
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
+// { dg-options "-fno-tree-dce" }
+
 // 20.4.1.1 allocator members
 
 #include <cstdlib>
diff --git a/libstdc++-v3/testsuite/ext/new_allocator/check_new.cc b/libstdc++-v3/testsuite/ext/new_allocator/check_new.cc
index d410f5f7feb..18396482d9a 100644
--- a/libstdc++-v3/testsuite/ext/new_allocator/check_new.cc
+++ b/libstdc++-v3/testsuite/ext/new_allocator/check_new.cc
@@ -17,6 +17,8 @@
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
+// { dg-options "-fno-tree-dce" }
+
 // 20.4.1.1 allocator members
 
 #include <cstdlib>

[-- Attachment #2: Message signed with OpenPGP using GPGMail --]
[-- Type: application/pgp-signature, Size: 842 bytes --]

^ permalink raw reply	[flat|nested] 91+ messages in thread

end of thread, other threads:[~2019-08-15 11:24 UTC | newest]

Thread overview: 91+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-21 11:35 [RFC][PATCH] Extend DCE to remove unnecessary new/delete-pairs Dominik Inführ
2017-11-21 17:13 ` Jeff Law
2017-11-21 17:36   ` Dominik Inführ
2017-11-21 17:45     ` Jeff Law
2017-11-22 10:40   ` Martin Jambor
2017-11-22 18:03     ` Jeff Law
2017-11-22  9:33 ` Richard Biener
2017-11-22 10:41   ` Jakub Jelinek
2017-11-27  9:57     ` Dominik Inführ
2017-11-27 10:48       ` Jakub Jelinek
2017-11-27 17:04       ` Jeff Law
2017-11-28 11:55         ` Richard Biener
2017-11-28 14:48           ` Jakub Jelinek
2017-11-29  8:13       ` Martin Sebor
2017-11-29  9:33         ` Jakub Jelinek
2017-11-29 16:29           ` Martin Sebor
2017-11-29 16:53             ` David Malcolm
2017-11-29 17:01               ` Andrew Pinski
2018-05-13 17:19               ` Marc Glisse
2019-07-02 11:49                 ` [PATCH 1/2] Come up with function_decl_type and use it in tree_function_decl Martin Liška
2019-07-02 11:50                   ` [PATCH 2/2] Extend DCE to remove unnecessary new/delete-pairs (PR c++/23383) Martin Liška
2019-08-02 21:34                     ` H.J. Lu
2019-08-05  6:44                       ` [PATCH] Handle new operators with no arguments in DCE Martin Liška
2019-08-05  7:08                         ` Marc Glisse
2019-08-05  9:53                           ` Martin Liška
2019-08-05 11:57                             ` Marc Glisse
2019-08-05 12:52                               ` Martin Liška
2019-08-05 13:46                                 ` Marc Glisse
2019-08-06 14:07                                   ` Martin Liška
2019-08-06 15:35                                     ` [PATCH] Detect not-cloned new/delete operators " Martin Liška
2019-08-06 15:59                                       ` Marc Glisse
2019-08-07  9:31                                         ` Martin Liška
2019-08-07 10:15                                           ` Richard Biener
2019-08-06 17:30                                       ` Martin Jambor
2019-08-07  8:56                                         ` Martin Liška
2019-08-07  9:54                                     ` [PATCH] Handle new operators with no arguments " Richard Biener
2019-08-07 11:36                                       ` Martin Liška
2019-08-07 11:51                                         ` Jakub Jelinek
2019-08-07 12:06                                           ` Martin Liška
2019-08-07 14:35                                             ` Richard Biener
2019-08-08  9:01                                               ` Martin Liška
2019-08-15 11:06                                                 ` Martin Liška
2019-08-15 11:35                                                   ` Richard Biener
2019-08-05 12:13                         ` Richard Biener
2019-07-02 16:02                   ` [PATCH 1/2] Come up with function_decl_type and use it in tree_function_decl Martin Sebor
2019-07-02 17:15                   ` Marc Glisse
2019-07-03 15:03                     ` Martin Liška
2019-07-03 16:44                       ` Richard Biener
2019-07-04 22:21                         ` Marc Glisse
2019-07-08 13:02                           ` Martin Liška
2019-07-08 22:00                             ` Jason Merrill
2019-07-09  2:28                             ` Marc Glisse
2019-07-09  7:52                               ` Marc Glisse
2019-07-09  8:49                                 ` Martin Liška
2019-07-09 10:22                                   ` Marc Glisse
2019-07-09 21:02                                     ` Jason Merrill
2019-07-11  6:48                                       ` Martin Liška
2019-07-22 14:00                                         ` Martin Liška
2019-07-24 19:05                                         ` Jeff Law
2019-07-25 10:24                                           ` Richard Biener
2019-07-25  2:17                                         ` Marc Glisse
2019-07-25  8:34                                           ` Martin Liška
2019-07-25 12:21                                             ` Marc Glisse
2019-07-25 13:50                                               ` Martin Liška
2019-07-25 15:41                                                 ` Martin Liška
2019-07-28 21:50                                                   ` [PATCH] Remove also 2nd argument for unused delete operator (PR tree-optimization/91270) Martin Liška
2019-07-29 10:03                                                     ` Richard Biener
2019-07-29 10:54                                                       ` Martin Liška
2019-07-29 14:40                                                         ` Richard Biener
2019-07-30  7:48                                                           ` Martin Liška
2019-07-30  8:09                                                             ` Martin Liška
2019-07-30  8:42                                                               ` Richard Biener
2019-07-30 10:20                                                                 ` Martin Liška
2019-07-30 10:28                                                                   ` Richard Biener
2019-07-30 12:08                                                                   ` Marc Glisse
2019-07-30 12:12                                                                     ` Martin Liška
2019-07-30 13:14                                                                       ` Marc Glisse
2019-07-30 13:41                                                                         ` Martin Liška
2019-07-30 14:37                                                                           ` Marc Glisse
2019-07-31  8:42                                                                             ` [PATCH] Mark necessary 2nd and later args for delete op Martin Liška
2019-07-31 10:24                                                                               ` Richard Biener
2019-07-31 10:00                                                                           ` [PATCH] Remove also 2nd argument for unused delete operator (PR tree-optimization/91270) Richard Biener
2019-07-29  9:59                                                   ` [PATCH 1/2] Come up with function_decl_type and use it in tree_function_decl Richard Biener
2017-11-29 18:05             ` [RFC][PATCH] Extend DCE to remove unnecessary new/delete-pairs Richard Biener
2017-12-04 12:20             ` Trevor Saunders
2017-12-01  1:24           ` Jeff Law
2017-12-01  1:23         ` Jeff Law
2017-11-22 13:03 ` Nathan Sidwell
2017-11-22 14:18   ` Richard Biener
2017-11-22 14:45     ` Nathan Sidwell
2017-11-22 21:45 ` Marc Glisse

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).