<html><body><p>In SystemZ, for 64-bit operands, (not x) is translated as two xor instructions, i.e., XORing the high and low half words of x with 32-bit immediate. The other form that I want will reduce the instruction count by 1 because (and x, y) is translated as a single instruction.<br><br>PS. I am copying the below because I am not sure if it will be included in the reply by default<br><br>Thanks<br>Assem<br><br><tt>On Tue, Jun 21, 2016 at 12:49:14PM -0400, Assem Bsoul via llvm-dev wrote:<br>> DAGCombiner currently folds  (xor (and x, y), y) -> (and (not x), y)<br>> <br>> I was trying to do the reverse of this transformation, i.e., (and (xor x,<br>> -1), y) -> (xor (and x, y), y), and recognized that this causes an infinite<br>> loop. What's the advantage of doing the above folding? if I want to do the<br>> reverse for a specific target where I can place that and make sure it<br>> doesn't get reversed by the above folding?<br><br>The goal of the transform is to provide a simpler canonical form. E.g.<br>(not x) can be computed independently and it is also easier to reason<br>about. Why is it beneficial for your target to have the first form?<br><br>Joerg</tt><BR>
</body></html>