[instCombine] Add (A ^ B) | ~(A | B) -> ~(A & B)
authorDávid Bolvanský <david.bolvansky@gmail.com>
Tue, 12 Jan 2021 18:28:01 +0000 (19:28 +0100)
committerDávid Bolvanský <david.bolvansky@gmail.com>
Tue, 12 Jan 2021 18:29:17 +0000 (19:29 +0100)
commit0529946b5bafafd10d77b946ee9fa96f388860ef
treec7b959ced4861af107fc23f0d9c8a13c46fe0663
parentbb9ebf6baf7057d7f2aed90fccbac2414cf9a134
[instCombine] Add (A ^ B) | ~(A | B) -> ~(A & B)

define i32 @src(i32 %x, i32 %y) {
%0:
  %xor = xor i32 %y, %x
  %or = or i32 %y, %x
  %neg = xor i32 %or, 4294967295
  %or1 = or i32 %xor, %neg
  ret i32 %or1
}
=>
define i32 @tgt(i32 %x, i32 %y) {
%0:
  %and = and i32 %x, %y
  %neg = xor i32 %and, 4294967295
  ret i32 %neg
}
Transformation seems to be correct!

https://alive2.llvm.org/ce/z/Cvca4a
llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
llvm/test/Transforms/InstCombine/or.ll