Hi, >> +/* Fold X + (X / CST) * -CST to X % CST. */ >> This one is still wrong Removed. >> I don't understand the point of the FLOAT_TYPE_P check. The check was there in fold-const. So, just had the same check. >> Will we also simplify (A & B) - (A & ~B) into B - (A ^ B) ? Done. >> or maybe integer_all_onesp (const_binop (BIT_XOR_EXPR, type, @2, @1)) Done. >> :c on bit_ior? It should also allow you to merge the 2 CST versions into one. Had it. But due to the error on "logical_inverted_value"; confused it with this pattern and had duplicated it. >> I am not really in favor of the indentation change (or the comment). Done. >> This patch is ok when bootstrapped / tested and with a proper changelog entry. Regression tested on X86_64 with no extra failures. 2015-10-20 Richard Biener Naveen H.S * fold-const.c (fold_binary_loc) : Move (-A) * (-B) -> A * B to match.pd. Move (a * (1 << b)) is (a << b) to match.pd. Move convert (C1/X)*C2 into (C1*C2)/X to match.pd. Move ~X & X, (X == 0) & X, and !X & X are zero to match.pd. Move X & ~X , X & (X == 0), and X & !X are zero to match.pd. * match.pd (mult:c @0 (convert? (lshift integer_onep@1 @2))): New simplifier. (mult (rdiv:s REAL_CST@0 @1) REAL_CST@2): New simplifier. (bit_and:c (convert? @0) (convert? (bit_not @0))): New simplifier. (bit_ior (bit_and:s @0 (bit_not:s @1)) (bit_and:s (bit_not:s @0) @1)) : New simplifier. (mult:c (convert1? (negate @0)) (convert2? negate_expr_p@1)): New simplifier. (match (logical_inverted_value @0) (truth_not @0)) : New Predicate. 2015-10-20 Richard Biener Naveen H.S * fold-const.c (fold_binary_loc) : Move Fold (A & ~B) - (A & B) into (A ^ B) - B to match.pd Move (X & ~Y) | (~X & Y) is X ^ Y to match.pd. * match.pd (minus (bit_and:s @0 (bit_not @1)) (bit_and:s @0 @1)): New simplifier. (minus (bit_and:s @0 INTEGER_CST@2) (bit_and:s @0 INTEGER_CST@1)): New simplifier. (minus (bit_and:s @0 @1) (bit_and:s @0 (bit_not @1))): New simplifier. (minus (bit_and:s @0 INTEGER_CST@1) (bit_and:s @0 INTEGER_CST@2)): New simplifier. (bit_ior:c (bit_and:c @0 (bit_not @1)) (bit_and:c (bit_not @0) @1)): New simplifier. (bit_ior:c (bit_and @0 INTEGER_CST@2) (bit_and (bit_not @0) INTEGER_CST@1)): New simplifier.