genmatch.c (add_operator): Treat ADDR_EXPR as atom.
2015-06-29 Richard Biener <rguenther@suse.de> * genmatch.c (add_operator): Treat ADDR_EXPR as atom. * fold-const.c (fold_binary_loc): Move &A - &B simplification via ptr_difference_const ... * match.pd: ... here. When matching (X ^ Y) == Y also match with swapped operands. From-SVN: r225115
This commit is contained in:
parent
2dcaddb8d7
commit
99e943a2be
@ -1,3 +1,11 @@
|
||||
2015-06-29 Richard Biener <rguenther@suse.de>
|
||||
|
||||
* genmatch.c (add_operator): Treat ADDR_EXPR as atom.
|
||||
* fold-const.c (fold_binary_loc): Move &A - &B simplification
|
||||
via ptr_difference_const ...
|
||||
* match.pd: ... here.
|
||||
When matching (X ^ Y) == Y also match with swapped operands.
|
||||
|
||||
2015-06-29 Richard Biener <rguenther@suse.de>
|
||||
|
||||
* lto-streamer.h (LTO_major_version): Bump to 5.
|
||||
|
@ -10618,16 +10618,6 @@ fold_binary_loc (location_t loc,
|
||||
fold_convert_loc (loc, type,
|
||||
negate_expr (arg1)));
|
||||
|
||||
/* Try folding difference of addresses. */
|
||||
{
|
||||
HOST_WIDE_INT diff;
|
||||
|
||||
if ((TREE_CODE (arg0) == ADDR_EXPR
|
||||
|| TREE_CODE (arg1) == ADDR_EXPR)
|
||||
&& ptr_difference_const (arg0, arg1, &diff))
|
||||
return build_int_cst_type (type, diff);
|
||||
}
|
||||
|
||||
/* Fold &a[i] - &a[j] to i-j. */
|
||||
if (TREE_CODE (arg0) == ADDR_EXPR
|
||||
&& TREE_CODE (TREE_OPERAND (arg0, 0)) == ARRAY_REF
|
||||
|
@ -324,6 +324,9 @@ add_operator (enum tree_code code, const char *id,
|
||||
/* And allow CONSTRUCTOR for vector initializers. */
|
||||
&& !(code == CONSTRUCTOR))
|
||||
return;
|
||||
/* Treat ADDR_EXPR as atom, thus don't allow matching its operand. */
|
||||
if (code == ADDR_EXPR)
|
||||
nargs = 0;
|
||||
operator_id *op = new operator_id (code, id, nargs, tcc);
|
||||
id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
|
||||
if (*slot)
|
||||
|
17
gcc/match.pd
17
gcc/match.pd
@ -545,6 +545,21 @@ along with GCC; see the file COPYING3. If not see
|
||||
(with { tree algn = wide_int_to_tree (TREE_TYPE (@0), wi::bit_not (@1)); }
|
||||
(bit_and @0 { algn; })))
|
||||
|
||||
/* Try folding difference of addresses. */
|
||||
(simplify
|
||||
(minus (convert ADDR_EXPR@0) (convert @1))
|
||||
(if (tree_nop_conversion_p (type, TREE_TYPE (@0)))
|
||||
(with { HOST_WIDE_INT diff; }
|
||||
(if (ptr_difference_const (@0, @1, &diff))
|
||||
{ build_int_cst_type (type, diff); }))))
|
||||
(simplify
|
||||
(minus (convert @0) (convert ADDR_EXPR@1))
|
||||
(if (tree_nop_conversion_p (type, TREE_TYPE (@0)))
|
||||
(with { HOST_WIDE_INT diff; }
|
||||
(if (ptr_difference_const (@0, @1, &diff))
|
||||
{ build_int_cst_type (type, diff); }))))
|
||||
|
||||
|
||||
|
||||
/* We can't reassociate at all for saturating types. */
|
||||
(if (!TYPE_SATURATING (type))
|
||||
@ -1229,7 +1244,7 @@ along with GCC; see the file COPYING3. If not see
|
||||
/* (X ^ Y) == Y becomes X == 0.
|
||||
Likewise (X ^ Y) == X becomes Y == 0. */
|
||||
(simplify
|
||||
(cmp (bit_xor:c @0 @1) @0)
|
||||
(cmp:c (bit_xor:c @0 @1) @0)
|
||||
(cmp @1 { build_zero_cst (TREE_TYPE (@1)); }))
|
||||
|
||||
/* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2). */
|
||||
|
Loading…
Reference in New Issue
Block a user