aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorKazu Hirata <kazu@cs.umass.edu>2005-04-17 01:38:24 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2005-04-17 01:38:24 +0000
commit10dcf221829e724a85e850057a83f5784c8e341b (patch)
tree38e92bac3ceb99b5ed8ffd6a613872242269dbc4 /gcc/fold-const.c
parenteee0d85ef565deb74ed052899524bfef0b9d6fd6 (diff)
downloadgcc-10dcf221829e724a85e850057a83f5784c8e341b.zip
gcc-10dcf221829e724a85e850057a83f5784c8e341b.tar.gz
gcc-10dcf221829e724a85e850057a83f5784c8e341b.tar.bz2
re PR middle-end/21024 (fold generates a comparison of two operands whose types do not match)
PR middle-end/21024 * builtins.c (expand_builtin_strcat): Convert the result of strlen to the right type. * fold-const.c (fold_binary) <PLUS_EXPR>: Use fold_convert to avoid creating type mismatches. <GE_EXPR>: Pass op0 and op1 to fold_build2 to avoid creating type mismatches. From-SVN: r98244
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 203fbc5..3899fda 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -7250,11 +7250,15 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
case PLUS_EXPR:
/* A + (-B) -> A - B */
if (TREE_CODE (arg1) == NEGATE_EXPR)
- return fold_build2 (MINUS_EXPR, type, arg0, TREE_OPERAND (arg1, 0));
+ return fold_build2 (MINUS_EXPR, type,
+ fold_convert (type, arg0),
+ fold_convert (type, TREE_OPERAND (arg1, 0)));
/* (-A) + B -> B - A */
if (TREE_CODE (arg0) == NEGATE_EXPR
&& reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
- return fold_build2 (MINUS_EXPR, type, arg1, TREE_OPERAND (arg0, 0));
+ return fold_build2 (MINUS_EXPR, type,
+ fold_convert (type, arg1),
+ fold_convert (type, TREE_OPERAND (arg0, 0)));
/* Convert ~A + 1 to -A. */
if (INTEGRAL_TYPE_P (type)
&& TREE_CODE (arg0) == BIT_NOT_EXPR
@@ -7390,7 +7394,7 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
fold_build2 (PLUS_EXPR, type,
fold_convert (type, alt0),
fold_convert (type, alt1)),
- same);
+ fold_convert (type, same));
}
/* Try replacing &a[i1] + c * i2 with &a[i1 + i2], if c is step
@@ -8786,7 +8790,7 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
case GE_EXPR:
/* If one arg is a real or integer constant, put it last. */
if (tree_swap_operands_p (arg0, arg1, true))
- return fold_build2 (swap_tree_comparison (code), type, arg1, arg0);
+ return fold_build2 (swap_tree_comparison (code), type, op1, op0);
/* If this is an equality comparison of the address of a non-weak
object against zero, then we know the result. */