fold-const.c (fold_comparison): Remove equality folding of decl addresses ...
authorRichard Biener <rguenther@suse.de>
Tue, 28 Jul 2015 07:20:33 +0000 (07:20 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 28 Jul 2015 07:20:33 +0000 (07:20 +0000)
2015-07-28  Richard Biener  <rguenther@suse.de>

* fold-const.c (fold_comparison): Remove equality folding
of decl addresses ...
* match.pd: ... here and merge with existing pattern.

From-SVN: r226299

gcc/ChangeLog
gcc/fold-const.c
gcc/match.pd

index dcc18bdc77a98b8b95d251f51f0bedb625c39da0..c5ae23bec0dbeda4cd50a244124db82c14135297 100644 (file)
@@ -1,3 +1,9 @@
+2015-07-28  Richard Biener  <rguenther@suse.de>
+
+       * fold-const.c (fold_comparison): Remove equality folding
+       of decl addresses ...
+       * match.pd: ... here and merge with existing pattern.
+
 2015-07-28  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        PR tree-optimization/66828
index e69b1d041337af3dfeb1457edd585a3e77e801e4..f2bb602cf842fd98238a0fdcc936f3f12bdbcb21 100644 (file)
@@ -8511,30 +8511,6 @@ fold_comparison (location_t loc, enum tree_code code, tree type,
              return fold_build2_loc (loc, code, type, offset0, offset1);
            }
        }
-      /* For non-equal bases we can simplify if they are addresses
-        declarations with different addresses.  */
-      else if (indirect_base0 && indirect_base1
-              /* We know that !operand_equal_p (base0, base1, 0)
-                 because the if condition was false.  But make
-                 sure two decls are not the same.  */
-              && base0 != base1
-              && TREE_CODE (arg0) == ADDR_EXPR
-              && TREE_CODE (arg1) == ADDR_EXPR
-              && DECL_P (base0)
-              && DECL_P (base1)
-              /* Watch for aliases.  */
-              && (!decl_in_symtab_p (base0)
-                  || !decl_in_symtab_p (base1)
-                  || !symtab_node::get_create (base0)->equal_address_to
-                        (symtab_node::get_create (base1))))
-       {
-         if (code == EQ_EXPR)
-           return omit_two_operands_loc (loc, type, boolean_false_node,
-                                     arg0, arg1);
-         else if (code == NE_EXPR)
-           return omit_two_operands_loc (loc, type, boolean_true_node,
-                                     arg0, arg1);
-       }
       /* For equal offsets we can simplify to a comparison of the
         base addresses.  */
       else if (bitpos0 == bitpos1
index 3d53abffe25712ef18aa36171a928a8d055ee608..f431df567644889954cf6fc4502d87e9f6109ae8 100644 (file)
@@ -1808,15 +1808,20 @@ along with GCC; see the file COPYING3.  If not see
     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))
+  (if (DECL_P (TREE_OPERAND (@0, 0))
+       && DECL_P (TREE_OPERAND (@1, 0)))
+   (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); }))))
+     }
+     (if (equal != 2)
+      { constant_boolean_node (equal
+                              ? cmp == EQ_EXPR : cmp != EQ_EXPR, type); }))
+    (if (TREE_OPERAND (@0, 0) != TREE_OPERAND (@1, 0))
+     { constant_boolean_node (cmp == EQ_EXPR ? false : true, type); }))))
 
  (simplify
   (cmp (convert? addr@0) integer_zerop)