diff options
author | Richard Biener <rguenther@suse.de> | 2015-07-28 07:20:33 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-07-28 07:20:33 +0000 |
commit | 70b47b619938d465c89370bfc5bf1988cfd0415b (patch) | |
tree | 22a38c7c40f26f676e0c77c00ac8701f1fda7272 | |
parent | 68512012b7c1a49d3851f62e089648c6e1276224 (diff) | |
download | gcc-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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fold-const.c | 24 | ||||
-rw-r--r-- | gcc/match.pd | 21 |
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) |