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][17/n] Remove GENERIC stmt combining from SCCVN


This moves address-of-decl simplifications.  The second pattern is from

      if (integer_zerop (arg1)
          && tree_expr_nonzero_p (arg0))
        {
          tree res = constant_boolean_node (code==NE_EXPR, type);
          return omit_one_operand_loc (loc, type, res, arg0);
        }

which I didn't want to move in its full extent.

Bootstrapped and tested on x86_64-unknown-linux-gnu.

Richard.

2015-07-23  Richard Biener  <rguenther@suse.de>

	* generic-match-head.c: Include cgraph.h.
	* gimple-match-head.c: Likewise.
	* tree-ssa-sccvn.c (free_scc_vn): Guard against newly created
	SSA names.
	* fold-const.c (fold_binary_loc): Move &A ==/!= &B simplification...
	* match.pd: ...to a pattern here.  Add &A ==/!= 0 simplification
	pattern.

Index: gcc/generic-match-head.c
===================================================================
--- gcc/generic-match-head.c	(revision 226110)
+++ gcc/generic-match-head.c	(working copy)
@@ -46,8 +46,10 @@ along with GCC; see the file COPYING3.
 #include "builtins.h"
 #include "dumpfile.h"
 #include "target.h"
+#include "cgraph.h"
 #include "generic-match.h"
 
+
 /* Routine to determine if the types T1 and T2 are effectively
    the same for GENERIC.  If T1 or T2 is not a type, the test
    applies to their TREE_TYPE.  */
Index: gcc/gimple-match-head.c
===================================================================
--- gcc/gimple-match-head.c	(revision 226110)
+++ gcc/gimple-match-head.c	(working copy)
@@ -46,6 +46,7 @@ along with GCC; see the file COPYING3.
 #include "builtins.h"
 #include "dumpfile.h"
 #include "target.h"
+#include "cgraph.h"
 #include "gimple-match.h"
 
 
Index: gcc/tree-ssa-sccvn.c
===================================================================
--- gcc/tree-ssa-sccvn.c	(revision 226110)
+++ gcc/tree-ssa-sccvn.c	(working copy)
@@ -4223,6 +4223,8 @@ free_scc_vn (void)
     {
       tree name = ssa_name (i);
       if (name
+	  && SSA_NAME_VERSION (name) < vn_ssa_aux_table.length ()
+	  && vn_ssa_aux_table[SSA_NAME_VERSION (name)]
 	  && VN_INFO (name)->needs_insertion)
 	release_ssa_name (name);
     }
Index: gcc/fold-const.c
===================================================================
--- gcc/fold-const.c	(revision 226110)
+++ gcc/fold-const.c	(working copy)
@@ -11082,29 +11082,6 @@ fold_binary_loc (location_t loc,
 	  && code == NE_EXPR)
         return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0));
 
-      /* If this is an equality comparison of the address of two non-weak,
-	 unaliased symbols neither of which are extern (since we do not
-	 have access to attributes for externs), then we know the result.  */
-      if (TREE_CODE (arg0) == ADDR_EXPR
-	  && DECL_P (TREE_OPERAND (arg0, 0))
-	  && TREE_CODE (arg1) == ADDR_EXPR
-	  && DECL_P (TREE_OPERAND (arg1, 0)))
-	{
-	  int equal;
-
-	  if (decl_in_symtab_p (TREE_OPERAND (arg0, 0))
-	      && decl_in_symtab_p (TREE_OPERAND (arg1, 0)))
-	    equal = symtab_node::get_create (TREE_OPERAND (arg0, 0))
-		    ->equal_address_to (symtab_node::get_create
-					  (TREE_OPERAND (arg1, 0)));
-	  else
-	    equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0);
-	  if (equal != 2)
-	    return constant_boolean_node (equal
-				          ? code == EQ_EXPR : code != EQ_EXPR,
-				          type);
-	}
-
       /* Similarly for a BIT_XOR_EXPR;  X ^ C1 == C2 is X == (C1 ^ C2).  */
       if (TREE_CODE (arg0) == BIT_XOR_EXPR
 	  && TREE_CODE (arg1) == INTEGER_CST
Index: gcc/match.pd
===================================================================
--- gcc/match.pd	(revision 226110)
+++ gcc/match.pd	(working copy)
@@ -1754,7 +1754,28 @@ (define_operator_list CBRT BUILT_IN_CBRT
  (simplify
   (cmp (convert?@3 (bit_xor @0 INTEGER_CST@1)) INTEGER_CST@2)
   (if (tree_nop_conversion_p (TREE_TYPE (@3), TREE_TYPE (@0)))
-   (cmp @0 (bit_xor @1 (convert @2))))))
+   (cmp @0 (bit_xor @1 (convert @2)))))
+   
+ /* If this is an equality comparison of the address of two non-weak,
+    unaliased symbols neither of which are extern (since we do not
+    have access to attributes for externs), then we know the result.  */
+ (simplify
+  (cmp (convert? addr@0) (convert? addr@1))
+  (if (decl_in_symtab_p (TREE_OPERAND (@0, 0))
+       && decl_in_symtab_p (TREE_OPERAND (@1, 0)))
+   (with
+    {
+      int equal = symtab_node::get_create (TREE_OPERAND (@0, 0))
+           ->equal_address_to (symtab_node::get_create (TREE_OPERAND (@1, 0)));
+    }
+    (if (equal != 2)
+     { constant_boolean_node (equal ? cmp == EQ_EXPR : cmp != EQ_EXPR, type); }))))
+
+ (simplify
+  (cmp (convert? addr@0) integer_zerop)
+  (if (tree_single_nonzero_warnv_p (@0, NULL))
+   { constant_boolean_node (cmp == NE_EXPR, type); })))
+
 
 /* bool_var != 0 becomes bool_var.  */
 (simplify


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