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
This commit is contained in:
parent
68512012b7
commit
70b47b6199
@ -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
|
||||
|
@ -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
|
||||
|
21
gcc/match.pd
21
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)
|
||||
|
Loading…
Reference in New Issue
Block a user