Since there is just a single check for LHS in ~(A | B) & C | ...
transforms and multiple RHS checks inside with more coming I am
removing m_OneUse checks for LHS and adding new checks for RHS.
This is non essential as long as there is total benefit.
In addition (~(A | B) & C) | (~(A | C) & B) --> (B ^ C) & ~A
checks were overly restrictive, it should be good without any
additional checks.
This isn't strong enough to prevent the transform from ending up with more instructions than we started with - we are creating 3 instructions, so we need to eliminate at least 2 intermediate values plus the final value.
I think we'd be ok if we have 2 m_OneUse checks in this match (similar to the transform above this).
Please add a test like this to confirm:
define i32 @or_and_not_not_2_extra_uses(i32 %a, i32 %b, i32 %c) { %or1 = or i32 %b, %a call void @use(i32 %or1) %not1 = xor i32 %or1, -1 %or2 = or i32 %a, %c %not2 = xor i32 %or2, -1 %and = and i32 %not2, %b call void @use(i32 %and) %or3 = or i32 %not1, %and ret i32 %or3 }