aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-07-28 07:20:33 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-07-28 07:20:33 +0000
commit70b47b619938d465c89370bfc5bf1988cfd0415b (patch)
tree22a38c7c40f26f676e0c77c00ac8701f1fda7272 /gcc
parent68512012b7c1a49d3851f62e089648c6e1276224 (diff)
downloadgcc-70b47b619938d465c89370bfc5bf1988cfd0415b.zip
gcc-70b47b619938d465c89370bfc5bf1988cfd0415b.tar.gz
gcc-70b47b619938d465c89370bfc5bf1988cfd0415b.tar.bz2
fold-const.c (fold_comparison): Remove equality folding of decl addresses ...
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c24
-rw-r--r--gcc/match.pd21
3 files changed, 19 insertions, 32 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dcc18bd..c5ae23b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index e69b1d0..f2bb602 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -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
diff --git a/gcc/match.pd b/gcc/match.pd
index 3d53abf..f431df5 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -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)