diff options
author | Kai Tietz <ktietz@redhat.com> | 2011-07-28 12:41:51 +0200 |
---|---|---|
committer | Kai Tietz <ktietz@gcc.gnu.org> | 2011-07-28 12:41:51 +0200 |
commit | 9895824116383db2833af838db1dc4998d8afc33 (patch) | |
tree | 705a67e759f87d5cdb39284a5622195d98196c1a | |
parent | f627fef27a65762e1299098150bab3dab7c1f78f (diff) | |
download | gcc-9895824116383db2833af838db1dc4998d8afc33.zip gcc-9895824116383db2833af838db1dc4998d8afc33.tar.gz gcc-9895824116383db2833af838db1dc4998d8afc33.tar.bz2 |
tree-vrp.c (simplify_stmt_using_ranges): Remove TRUTH_NOT_EXPR case.
2011-07-28 Kai Tietz <ktietz@redhat.com>
* tree-vrp.c (simplify_stmt_using_ranges): Remove
TRUTH_NOT_EXPR case.
(simplify_truth_ops_using_ranges): Likewise.
(build_assert_expr_for): Likewise.
(build_assert_expr_for_1): Remove TRUTH_NOT_EXPR case
and handle BIT_NOT_EXPR for truth-operation.
From-SVN: r176866
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 83 |
2 files changed, 42 insertions, 50 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b8317a3..3be00e9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2011-07-28 Kai Tietz <ktietz@redhat.com> + + * tree-vrp.c (simplify_stmt_using_ranges): Remove + TRUTH_NOT_EXPR case. + (simplify_truth_ops_using_ranges): Likewise. + (build_assert_expr_for): Likewise. + (build_assert_expr_for_1): Remove TRUTH_NOT_EXPR case + and handle BIT_NOT_EXPR for truth-operation. + 2011-07-28 Georg-Johann Lay <avr@gjlay.de> PR target/49313 diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 0acbbf2..b53ef5e 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -3972,13 +3972,6 @@ build_assert_expr_for (tree cond, tree v) tree a = build2 (ASSERT_EXPR, TREE_TYPE (v), v, cond); assertion = gimple_build_assign (n, a); } - else if (TREE_CODE (cond) == TRUTH_NOT_EXPR) - { - /* Given !V, build the assignment N = false. */ - tree op0 = TREE_OPERAND (cond, 0); - gcc_assert (op0 == v); - assertion = gimple_build_assign (n, boolean_false_node); - } else if (TREE_CODE (cond) == SSA_NAME) { /* Given V, build the assignment N = true. */ @@ -4525,7 +4518,8 @@ register_edge_assert_for_1 (tree op, enum tree_code code, retval |= register_edge_assert_for_1 (gimple_assign_rhs2 (op_def), code, e, bsi); } - else if (gimple_assign_rhs_code (op_def) == TRUTH_NOT_EXPR) + else if (gimple_assign_rhs_code (op_def) == BIT_NOT_EXPR + && TYPE_PRECISION (TREE_TYPE (gimple_assign_lhs (op_def))) == 1) { /* Recurse, flipping CODE. */ code = invert_tree_comparison (code, false); @@ -6754,6 +6748,9 @@ simplify_truth_ops_using_ranges (gimple_stmt_iterator *gsi, gimple stmt) bool sop = false; bool need_conversion; + /* We handle only !=/== case here. */ + gcc_assert (rhs_code == EQ_EXPR || rhs_code == NE_EXPR); + op0 = gimple_assign_rhs1 (stmt); if (TYPE_PRECISION (TREE_TYPE (op0)) != 1) { @@ -6770,52 +6767,40 @@ simplify_truth_ops_using_ranges (gimple_stmt_iterator *gsi, gimple stmt) return false; } - if (rhs_code == TRUTH_NOT_EXPR) + op1 = gimple_assign_rhs2 (stmt); + + /* Reduce number of cases to handle. */ + if (is_gimple_min_invariant (op1)) { - rhs_code = NE_EXPR; - op1 = build_int_cst (TREE_TYPE (op0), 1); + if (!integer_zerop (op1) + && !integer_onep (op1) + && !integer_all_onesp (op1)) + return false; + + /* Limit the number of cases we have to consider. */ + if (rhs_code == EQ_EXPR) + { + rhs_code = NE_EXPR; + /* OP1 is a constant. */ + op1 = fold_unary (TRUTH_NOT_EXPR, TREE_TYPE (op1), op1); + } } else { - op1 = gimple_assign_rhs2 (stmt); + /* Punt on A == B as there is no BIT_XNOR_EXPR. */ + if (rhs_code == EQ_EXPR) + return false; - /* Reduce number of cases to handle. */ - if (is_gimple_min_invariant (op1)) + if (TYPE_PRECISION (TREE_TYPE (op1)) != 1) { - /* Exclude anything that should have been already folded. */ - if (rhs_code != EQ_EXPR - && rhs_code != NE_EXPR) + vr = get_value_range (op1); + val = compare_range_with_value (GE_EXPR, vr, integer_zero_node, &sop); + if (!val || !integer_onep (val)) return false; - if (!integer_zerop (op1) - && !integer_onep (op1) - && !integer_all_onesp (op1)) + val = compare_range_with_value (LE_EXPR, vr, integer_one_node, &sop); + if (!val || !integer_onep (val)) return false; - - /* Limit the number of cases we have to consider. */ - if (rhs_code == EQ_EXPR) - { - rhs_code = NE_EXPR; - op1 = fold_unary (TRUTH_NOT_EXPR, TREE_TYPE (op1), op1); - } - } - else - { - /* Punt on A == B as there is no BIT_XNOR_EXPR. */ - if (rhs_code == EQ_EXPR) - return false; - - if (TYPE_PRECISION (TREE_TYPE (op1)) != 1) - { - vr = get_value_range (op1); - val = compare_range_with_value (GE_EXPR, vr, integer_zero_node, &sop); - if (!val || !integer_onep (val)) - return false; - - val = compare_range_with_value (LE_EXPR, vr, integer_one_node, &sop); - if (!val || !integer_onep (val)) - return false; - } } } @@ -7514,11 +7499,9 @@ simplify_stmt_using_ranges (gimple_stmt_iterator *gsi) { case EQ_EXPR: case NE_EXPR: - case TRUTH_NOT_EXPR: - /* Transform EQ_EXPR, NE_EXPR, TRUTH_NOT_EXPR into BIT_XOR_EXPR - or identity if the RHS is zero or one, and the LHS are known - to be boolean values. Transform all TRUTH_*_EXPR into - BIT_*_EXPR if both arguments are known to be boolean values. */ + /* Transform EQ_EXPR, NE_EXPR into BIT_XOR_EXPR or identity + if the RHS is zero or one, and the LHS are known to be boolean + values. */ if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1))) return simplify_truth_ops_using_ranges (gsi, stmt); break; |