On Thu, 11 Jun 2015, Marek Polacek wrote:
On Thu, Jun 11, 2015 at 01:09:05PM +0200, Jakub Jelinek wrote:
What about some nop type conversions in between?
int
fn1 (unsigned int x, unsigned int y)
{
int a = x;
int b = y;
unsigned int c = x & y;
int d = a | b;
return (int) (c ^ d);
}
? Also wonder, if some testcases for match.pd shouldn't be
It doesn't work then. Adding some convert?s into the pattern didn't help
either.
Not judging at all whether it is desirable or not, but you might have hit
the issue that when you want several convert?, you need to use the
spelling convert1?, convert2?, and it stops there, while here you would
probably want at least 4 (maybe 6?) for this case. You might be able to
work around it with a user-defined predicate, but I keep getting errors
like
generic-match.c:6655:16: error: redeclaration of ‘tree_node* o20_pops [2]’
If you want to reproduce the error (this is probably not good as is, it is
only provided as a reproducer)
(match (nopand @0 @1)
(bit_and (convert1? @0) (convert2? @1))
(if (tree_nop_conversion_p (type, TREE_TYPE (@0))
&& tree_nop_conversion_p (type, TREE_TYPE (@1)))))
(match (nopior @0 @1)
(bit_ior (convert1? @0) (convert2? @1))
(if (tree_nop_conversion_p (type, TREE_TYPE (@0))
&& tree_nop_conversion_p (type, TREE_TYPE (@1)))))
(simplify
(bit_xor:c (convert1? (nopand@2 @0 @1))
(convert2? (nopior@3 @0 @1)))
(if (tree_nop_conversion_p (type, TREE_TYPE (@2))
&& tree_nop_conversion_p (type, TREE_TYPE (@3)))
(bit_xor (convert @0) (convert @1))))
fold-const.c traditionally avoided the combinatorial explosion by using
strip_nops.
--
Marc Glisse