DAGCombiner folds (xor (and x, y), y) -> (and (not x), y). Can I do the reverse for a target?


DAGCombiner currently folds (xor (and x, y), y) → (and (not x), y)

I was trying to do the reverse of this transformation, i.e., (and (xor x, -1), y) → (xor (and x, y), y), and recognized that this causes an infinite loop. What’s the advantage of doing the above folding? if I want to do the reverse for a specific target where I can place that and make sure it doesn’t get reversed by the above folding?


The goal of the transform is to provide a simpler canonical form. E.g.
(not x) can be computed independently and it is also easier to reason
about. Why is it beneficial for your target to have the first form?