diff options
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fold-const.c | 7 | ||||
-rw-r--r-- | gcc/stmt.c | 10 |
3 files changed, 19 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2960314..28e537e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2005-06-01 Richard Guenther <rguenth@gcc.gnu.org> + * stmt.c (expand_case): Use build_int_cst. + (node_has_low_bound): Likewise, and correct type mismatch. + (node_has_high_bound): Likewise. + * fold-const.c (fold_binary): Ensure we build trees + with the correct types - undo what STRIP_NOPS possibly did. + +2005-06-01 Richard Guenther <rguenth@gcc.gnu.org> + * tree.h (fold_indirect_ref_1): Export from fold-const.c. * fold-const.c (fold_indirect_ref_1): No longer static. * tree-inline.c (copy_body_r): Use fold_indirect_ref_1 for diff --git a/gcc/fold-const.c b/gcc/fold-const.c index ad5039b..05e016a 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -7948,7 +7948,9 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) && (TREE_CODE (arg1) != REAL_CST || REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))) || (INTEGRAL_TYPE_P (type) && flag_wrapv && !flag_trapv))) - return fold_build2 (PLUS_EXPR, type, arg0, negate_expr (arg1)); + return fold_build2 (PLUS_EXPR, type, + fold_convert (type, arg0), + fold_convert (type, negate_expr (arg1))); /* Try folding difference of addresses. */ { @@ -8467,7 +8469,8 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r)) { tem = build_real (type, r); - return fold_build2 (MULT_EXPR, type, arg0, tem); + return fold_build2 (MULT_EXPR, type, + fold_convert (type, arg0), tem); } } } @@ -2437,7 +2437,7 @@ expand_case (tree exp) if (compare_tree_int (minval, 0) > 0 && compare_tree_int (maxval, GET_MODE_BITSIZE (word_mode)) < 0) { - minval = fold_convert (index_type, integer_zero_node); + minval = build_int_cst (index_type, 0); range = maxval; } emit_case_bit_tests (index_type, index_expr, minval, range, @@ -2523,7 +2523,7 @@ expand_case (tree exp) && compare_tree_int (minval, 0) > 0 && compare_tree_int (minval, 3) < 0) { - minval = fold_convert (index_type, integer_zero_node); + minval = build_int_cst (index_type, 0); range = maxval; } @@ -2830,7 +2830,8 @@ node_has_low_bound (case_node_ptr node, tree index_type) return 0; low_minus_one = fold_build2 (MINUS_EXPR, TREE_TYPE (node->low), - node->low, integer_one_node); + node->low, + build_int_cst (TREE_TYPE (node->low), 1)); /* If the subtraction above overflowed, we can't verify anything. Otherwise, look for a parent that tests our value - 1. */ @@ -2880,7 +2881,8 @@ node_has_high_bound (case_node_ptr node, tree index_type) return 0; high_plus_one = fold_build2 (PLUS_EXPR, TREE_TYPE (node->high), - node->high, integer_one_node); + node->high, + build_int_cst (TREE_TYPE (node->high), 1)); /* If the addition above overflowed, we can't verify anything. Otherwise, look for a parent that tests our value + 1. */ |