generic-match-head.c: Include cgraph.h.
authorRichard Biener <rguenther@suse.de>
Thu, 23 Jul 2015 14:31:44 +0000 (14:31 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 23 Jul 2015 14:31:44 +0000 (14:31 +0000)
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.

From-SVN: r226111

gcc/ChangeLog
gcc/fold-const.c
gcc/generic-match-head.c
gcc/gimple-match-head.c
gcc/match.pd
gcc/tree-ssa-sccvn.c

index f5bb227c33830b978d532b048150b8b15c8865bc..cc07d768c1293a647e6d4ea9cdb96d8d83c5c470 100644 (file)
@@ -1,3 +1,13 @@
+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.
+
 2015-07-23  Richard Biener  <rguenther@suse.de>
 
        * gimple-fold.c (fold_gimple_cond): Do not require folding
index fa321f455d2ce430dcc6be642eac98f22380102d..886922fcbcfaae24f90d991404c0d583d0a4173b 100644 (file)
@@ -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 da7abc669647df562e3a3cbf59942223aa36db2e..0a7038dfc864e28ba1f1ca04a0c810638cff8f6e 100644 (file)
@@ -46,8 +46,10 @@ along with GCC; see the file COPYING3.  If not see
 #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 2b1423806bca237910a1f75912182f372e5b346d..2c66dccb26024ce3de62024801b3f112d11af26e 100644 (file)
@@ -46,6 +46,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "builtins.h"
 #include "dumpfile.h"
 #include "target.h"
+#include "cgraph.h"
 #include "gimple-match.h"
 
 
index 9cf02783c46c273e434c3252a659b59e300974f5..9c181f6e1424f06ed16b89c7f86a65a24e9003d0 100644 (file)
@@ -1754,7 +1754,28 @@ along with GCC; see the file COPYING3.  If not see
  (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 c20f1cc94bf2518f36ef8ddd8512448a50e51a6c..ab4b1100b8ce5c166545520c84c724d8a294c823 100644 (file)
@@ -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);
     }