[PATCH] InstCombine ((x | ~y) ^ (~x ^ y)) to (x & ~y)
mayur.p at samsung.com
Thu Aug 28 05:59:45 PDT 2014
Hi Daniel, Anton,
There is a discussion is going on at http://lists.cs.uiuc.edu/pipermail/llvmdev/2014-August/075532.html regarding a more general way to handle matching
different patterns. If we can come up with a general approach that would be best. But till then we should not miss any optimizing opportunity I think.
------- Original Message -------
Sender : Daniel Berlin<dberlin at dberlin.org>
Date : Aug 23, 2014 06:06 (GMT+09:00)
Title : Re: [PATCH] InstCombine ((x | ~y) ^ (~x ^ y)) to (x & ~y)
On Fri, Aug 22, 2014 at 12:11 PM, Richard Smith <richard at metafoo.co.uk> wrote:
On Fri, Aug 22, 2014 at 11:14 AM, David Majnemer <david.majnemer at gmail.com> wrote:
This can be generalized:
`(X | (Y ^ Z)) ^ ((X ^ Z) ^ Y)` -> `X & (Y ^ Z)`
Is matching that really the right approach? I would (perhaps naively) think we should instead CSE that to
(X | A) ^ X ^ A (with A = Y ^ Z)
... and we should be able to perform these more primitive transformations:
(X | A) ^ X -> ~X & A
(~X & A) ^ A -> X & A
... which together reduce your expression to X & (Y ^ Z). Perhaps one of those takes us further from canonical form, though. What are the rules for canonicity here?
Bringing this up, so far the answers to "why do we keep adding transforms here" has been "to improve matching capabilities" (which is a result, not an objective). I'd really love it if someone could step back and present a real design (Defining what canonical forms should instcombine expect as input or output) rather than add a ton of possibly used/not used transforms that may or may not transform things back and forth.
llvm-commits mailing list
llvm-commits at cs.uiuc.edu
More information about the llvm-commits