diff options
author | Richard Guenther <rguenther@suse.de> | 2011-07-20 13:35:20 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-07-20 13:35:20 +0000 |
commit | dca412a1ddaae99a8672bfbed37fe951f486b6bc (patch) | |
tree | 3997651a823f3fea3135b0089b972faf3df8feab /gcc/tree-ssa-forwprop.c | |
parent | 73d7e2662e438cc5e49b65a3df31a83844906eab (diff) | |
download | gcc-dca412a1ddaae99a8672bfbed37fe951f486b6bc.zip gcc-dca412a1ddaae99a8672bfbed37fe951f486b6bc.tar.gz gcc-dca412a1ddaae99a8672bfbed37fe951f486b6bc.tar.bz2 |
re PR middle-end/18908 (Missed folding opportunities with bools)
2011-07-20 Richard Guenther <rguenther@suse.de>
PR middle-end/18908
* tree.c (integer_all_onesp): Use TYPE_PRECISION, not mode precision.
* tree-ssa-forwprop.c (simplify_bitwise_binary): Remove bogus
ADDR_EXPR folding. Canonicalize X ^ ~0 as ~X.
* gcc.dg/tree-ssa/pr18908.c: New testcase.
* gcc.dg/tree-ssa/bitwise-sink.c: Adjust.
From-SVN: r176508
Diffstat (limited to 'gcc/tree-ssa-forwprop.c')
-rw-r--r-- | gcc/tree-ssa-forwprop.c | 42 |
1 files changed, 11 insertions, 31 deletions
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index 5a40f5e..577609b 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -1710,37 +1710,6 @@ simplify_bitwise_binary (gimple_stmt_iterator *gsi) tree def1_arg1, def2_arg1; enum tree_code def1_code, def2_code; - /* If the first argument is an SSA name that is itself a result of a - typecast of an ADDR_EXPR to an integer, feed the ADDR_EXPR to the - folder rather than the ssa name. */ - if (code == BIT_AND_EXPR - && TREE_CODE (arg2) == INTEGER_CST - && TREE_CODE (arg1) == SSA_NAME) - { - gimple def = SSA_NAME_DEF_STMT (arg1); - tree op = arg1; - - /* ??? This looks bogus - the conversion could be truncating. */ - if (is_gimple_assign (def) - && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def)) - && INTEGRAL_TYPE_P (TREE_TYPE (arg1))) - { - tree opp = gimple_assign_rhs1 (def); - if (TREE_CODE (opp) == ADDR_EXPR) - op = opp; - } - - res = fold_binary_loc (gimple_location (stmt), - BIT_AND_EXPR, TREE_TYPE (gimple_assign_lhs (stmt)), - op, arg2); - if (res && is_gimple_min_invariant (res)) - { - gimple_assign_set_rhs_from_tree (gsi, res); - update_stmt (stmt); - return true; - } - } - def1_code = TREE_CODE (arg1); def1_arg1 = arg1; if (TREE_CODE (arg1) == SSA_NAME) @@ -1862,6 +1831,17 @@ simplify_bitwise_binary (gimple_stmt_iterator *gsi) return true; } + /* Canonicalize X ^ ~0 to ~X. */ + if (code == BIT_XOR_EXPR + && TREE_CODE (arg2) == INTEGER_CST + && 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) |