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  <rguent...@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

Reply via email to