This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Ensure isolated *0 load does not get removed by DCE


As Marc noted, DCE will remove the isolated *0 which defeats the purpose of the most recent patch. This marks any isolated null pointer dereferences as volatile which ensures they don't go away.

This also fixes a comment and tests that the dereferences survive until the optimized dump.

Bootstrapped and regression tested on x86_64-unknown-linux-gnu. Installed on the trunk.


Jeff
	* gimple-ssa-isolate-paths.c (check_loadstore): Mark discovered
	memory references as volatile.
	(insert_trap_and_remove_trailing_statements): Fix comment.

	* gcc.dg/tree-ssa/isolate-1.c: Update expected output.
	* gcc.dg/tree-ssa/isolate-5.c: Verify the load survives through
	the SSA optimizers.

	
diff --git a/gcc/gimple-ssa-isolate-paths.c b/gcc/gimple-ssa-isolate-paths.c
index 48ab604..2d8f176 100644
--- a/gcc/gimple-ssa-isolate-paths.c
+++ b/gcc/gimple-ssa-isolate-paths.c
@@ -51,7 +51,12 @@ check_loadstore (gimple stmt ATTRIBUTE_UNUSED, tree op, void *data)
 {
   if ((TREE_CODE (op) == MEM_REF || TREE_CODE (op) == TARGET_MEM_REF)
       && operand_equal_p (TREE_OPERAND (op, 0), (tree)data, 0))
-    return true;
+    {
+      TREE_THIS_VOLATILE (op) = 1;
+      TREE_SIDE_EFFECTS (op) = 1;
+      update_stmt (stmt);
+      return true;
+    }
   return false;
 }
 
@@ -64,7 +69,7 @@ insert_trap_and_remove_trailing_statements (gimple_stmt_iterator *si_p, tree op)
      code that wishes to catch the signal can do so.
 
      If the dereference is a load, then there's nothing to do as the
-     LHS will be a throw-away SSA_NAME and the LHS is the NULL dereference.
+     LHS will be a throw-away SSA_NAME and the RHS is the NULL dereference.
 
      If the dereference is a store and we can easily transform the RHS,
      then simplify the RHS to enable more DCE.  */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/isolate-1.c b/gcc/testsuite/gcc.dg/tree-ssa/isolate-1.c
index 33745ba..f1f3101 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/isolate-1.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/isolate-1.c
@@ -50,7 +50,7 @@ d_type (struct d_info *di)
    and finally that we set the RHS of the store to zero.  */
 /* { dg-final { scan-tree-dump-times "__builtin_trap" 1 "isolate-paths"} } */
 /* { dg-final { scan-tree-dump-times "->type = 42" 1 "isolate-paths"} } */
-/* { dg-final { scan-tree-dump-times "->type = 0" 1 "isolate-paths"} } */
+/* { dg-final { scan-tree-dump-times "->type ={v} 0" 1 "isolate-paths"} } */
 /* { dg-final { scan-tree-dump-times "->zzz" 1 "isolate-paths"} } */
 /* { dg-final { cleanup-tree-dump "isolate-paths" } } */
 
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/isolate-5.c b/gcc/testsuite/gcc.dg/tree-ssa/isolate-5.c
index a70871e..ee587d2 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/isolate-5.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/isolate-5.c
@@ -1,6 +1,6 @@
 
 /* { dg-do compile } */ 
-/* { dg-options "-O2 -fdump-tree-isolate-paths" } */
+/* { dg-options "-O2 -fdump-tree-isolate-paths -fdump-tree-optimized" } */
 
 
 struct demangle_component
@@ -51,9 +51,11 @@ d_type (struct d_info *di)
    We leave the 0->type in the IL, so expect to see ->type twice.  */
 /* { dg-final { scan-tree-dump-times "__builtin_trap" 1 "isolate-paths"} } */
 /* { dg-final { scan-tree-dump-times "->type" 2 "isolate-paths"} } */
+/* { dg-final { scan-tree-dump-times "->type" 1 "optimized"} } */
+/* { dg-final { scan-tree-dump-times "\\.type" 1 "optimized"} } */
 /* { dg-final { scan-tree-dump-times "->zzz" 1 "isolate-paths"} } */
 /* { dg-final { cleanup-tree-dump "isolate-paths" } } */
-
+/* { dg-final { cleanup-tree-dump "optimized-paths" } } */
 
 
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]