define i1 @src(i32 %A) { %mask1 = and i32 %A, 15 ; 0x0f %tst1 = icmp eq i32 %mask1, 3 ; 0x03 %mask2 = and i32 %A, 255 ; 0xff %tst2 = icmp eq i32 %mask2, 243; 0xf3 %res = or i1 %tst1, %tst2 ret i1 %res }
->
define i1 @tgt(i32 %A) { %1 = and i32 %A, 15 %res = icmp eq i32 %1, 3 ret i1 %res }
Proof: https://alive2.llvm.org/ce/z/4AyvcE
Assume that (B & D) & (C ^ E) == 0, and (B & D) == D || (B & D) == B,
transforms:
(icmp ne (A & B), C) & (icmp ne (A & D), E) -> (icmp ne (A & (B&D)), (C&E))
Is Mask & (BMask_Mixed | BMask_NotMixed) better?