On Fri, 12 Jun 2015, Richard Biener wrote:
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.
Yeah. We can probably special case conditional conversions in code
generation instead of lowering it. And then go the full way and special
case nop conversions so you can avoid writing the predicate as well.
Without special casing, I currently have:
(match (nopcvt @0)
(convert? @0)
(if (tree_nop_conversion_p (type, TREE_TYPE (@0)))))
(simplify
(bit_xor:c (convert1? (bit_and@2 (nopcvt @0) (nopcvt @1)))
(convert2? (bit_ior:c (nopcvt @0) (nopcvt @1))))
(if (tree_nop_conversion_p (type, TREE_TYPE (@2)))
(bit_xor (convert @0) (convert @1))))
which simplifies Jakub's testcase without exploding the size of *-match.c,
but it is still not very satisfying.
--
Marc Glisse