Wojciech Muła <wojciech_m...@poczta.onet.pl> writes: > > The main concern is if it's a proper approach? Seems that to match > other logic functions, like "a & b | c", a separate pattern is required. > Since an argument can be either negated or not, and we can use three > logic ops (or, and, xor) there would be 72 patterns. So maybe a new > optimization pass would be easier to create and maintain? (Just a silly > guess.)
Yes that's not scalable. > > I'd be grateful for any comments and advice. Maybe you could write it in the simplifier pattern language and then generate a suitable builtin. See https://gcc.gnu.org/onlinedocs/gccint/Match-and-Simplify.html However the problem is that this may affect other optimizations because it happens too early. e.g. the compiler would also need to learn to constant propagate the new builtin, and understand its side effects, which might affect a lot of places. So a custom compiler patch that runs late may be better. Or perhaps some extension of the simplifier that does it. I looked at this at some point for PCMP*STR* which are similarly powerful instructions that could potentially replace a lot of others. -Andi