aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-forwprop.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-07-20 13:35:20 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2011-07-20 13:35:20 +0000
commitdca412a1ddaae99a8672bfbed37fe951f486b6bc (patch)
tree3997651a823f3fea3135b0089b972faf3df8feab /gcc/tree-ssa-forwprop.c
parent73d7e2662e438cc5e49b65a3df31a83844906eab (diff)
downloadgcc-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.c42
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)