On Fri, Jun 12, 2015 at 08:44:45AM +0200, Marc Glisse wrote: > 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]’
I remember trying convert1?, convert2?, and so on. But I gave up soon. > >>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. Yeah, imagine if we'd have to change every pattern like that :-(. Marek