Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. Richard.
2014-10-30 Richard Biener <rguent...@suse.de> * match.pd: Implement more patterns that simplify to a single value. * fold-const.c (fold_binary_loc): Remove them here. * tree-ssa-forwprop.c (simplify_bitwise_binary): Likewise. Index: trunk/gcc/fold-const.c =================================================================== *** trunk.orig/gcc/fold-const.c 2014-10-30 14:02:58.477371843 +0100 --- trunk/gcc/fold-const.c 2014-10-30 14:03:05.829371337 +0100 *************** fold_binary_loc (location_t loc, *** 11089,11097 **** case BIT_IOR_EXPR: bit_ior: - if (operand_equal_p (arg0, arg1, 0)) - return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); - /* ~X | X is -1. */ if (TREE_CODE (arg0) == BIT_NOT_EXPR && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)) --- 11089,11094 ---- *************** fold_binary_loc (location_t loc, *** 11227,11235 **** goto bit_rotate; case BIT_XOR_EXPR: - if (integer_all_onesp (arg1)) - return fold_build1_loc (loc, BIT_NOT_EXPR, type, op0); - /* ~X ^ X is -1. */ if (TREE_CODE (arg0) == BIT_NOT_EXPR && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)) --- 11224,11229 ---- *************** fold_binary_loc (location_t loc, *** 11384,11394 **** goto bit_rotate; case BIT_AND_EXPR: - if (integer_all_onesp (arg1)) - return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); - if (operand_equal_p (arg0, arg1, 0)) - return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); - /* ~X & X, (X == 0) & X, and !X & X are always zero. */ if ((TREE_CODE (arg0) == BIT_NOT_EXPR || TREE_CODE (arg0) == TRUTH_NOT_EXPR --- 11378,11383 ---- Index: trunk/gcc/match.pd =================================================================== *** trunk.orig/gcc/match.pd 2014-10-30 14:02:58.477371843 +0100 --- trunk/gcc/match.pd 2014-10-30 14:04:22.869366033 +0100 *************** along with GCC; see the file COPYING3. *** 31,37 **** /* Simplifications of operations with one constant operand and ! simplifications to constants. */ (for op (plus pointer_plus minus bit_ior bit_xor) (simplify --- 31,37 ---- /* Simplifications of operations with one constant operand and ! simplifications to constants or single values. */ (for op (plus pointer_plus minus bit_ior bit_xor) (simplify *************** along with GCC; see the file COPYING3. *** 88,93 **** --- 88,109 ---- (bit_xor @0 @0) { build_zero_cst (type); }) + /* Canonicalize X ^ ~0 to ~X. */ + (simplify + (bit_xor @0 integer_all_onesp@1) + (bit_not @0)) + + /* x & ~0 -> x */ + (simplify + (bit_and @0 integer_all_onesp) + (non_lvalue @0)) + + /* x & x -> x, x | x -> x */ + (for bitop (bit_and bit_ior) + (simplify + (bitop @0 @0) + (non_lvalue @0))) + /* Simplifications of conversions. */ Index: trunk/gcc/tree-ssa-forwprop.c =================================================================== *** trunk.orig/gcc/tree-ssa-forwprop.c 2014-10-30 14:02:58.477371843 +0100 --- trunk/gcc/tree-ssa-forwprop.c 2014-10-30 14:03:05.830371337 +0100 *************** simplify_bitwise_binary (gimple_stmt_ite *** 2097,2112 **** return true; } - /* Canonicalize X ^ ~0 to ~X. */ - if (code == BIT_XOR_EXPR - && integer_all_onesp (arg2)) - { - gimple_assign_set_rhs_with_ops (gsi, BIT_NOT_EXPR, arg1, NULL_TREE); - gcc_assert (gsi_stmt (*gsi) == stmt); - update_stmt (stmt); - return true; - } - /* Try simple folding for X op !X, and X op X. */ res = simplify_bitwise_binary_1 (code, TREE_TYPE (arg1), arg1, arg2); if (res != NULL_TREE) --- 2097,2102 ----