diff options
author | Richard Guenther <rguenther@suse.de> | 2007-10-08 15:23:49 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2007-10-08 15:23:49 +0000 |
commit | bd113227bf7da8dfe45b9f5db511dadc9b22cb00 (patch) | |
tree | 68d927f3aff3877ad0962683ab193ec9859c84fb /gcc/fold-const.c | |
parent | 1904bef10a80e25e59105a084501097f67621c3f (diff) | |
download | gcc-bd113227bf7da8dfe45b9f5db511dadc9b22cb00.zip gcc-bd113227bf7da8dfe45b9f5db511dadc9b22cb00.tar.gz gcc-bd113227bf7da8dfe45b9f5db511dadc9b22cb00.tar.bz2 |
re PR middle-end/33693 (Type checking error with bitwise xor/and)
2007-10-08 Richard Guenther <rguenther@suse.de>
PR middle-end/33693
PR middle-end/33695
PR middle-end/33697
* fold-const.c (fold_binary): Use correct types in folding
of a * (1 << b) to (a << b). Likewise for ~A & ~B to ~(A | B)
and building of RROTATE_EXPR.
* gcc.dg/pr33693.c: New testcase.
* gcc.dg/pr33695.c: Likewise.
* gcc.dg/pr33697.c: Likewise.
From-SVN: r129130
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 0313c0c..4a8153c 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -10348,16 +10348,16 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) && (tem = negate_expr (arg1)) != arg1 && !TREE_OVERFLOW (tem)) return fold_build2 (MULT_EXPR, type, - negate_expr (arg0), tem); + fold_convert (type, negate_expr (arg0)), tem); /* (a * (1 << b)) is (a << b) */ if (TREE_CODE (arg1) == LSHIFT_EXPR && integer_onep (TREE_OPERAND (arg1, 0))) - return fold_build2 (LSHIFT_EXPR, type, arg0, + return fold_build2 (LSHIFT_EXPR, type, op0, TREE_OPERAND (arg1, 1)); if (TREE_CODE (arg0) == LSHIFT_EXPR && integer_onep (TREE_OPERAND (arg0, 0))) - return fold_build2 (LSHIFT_EXPR, type, arg1, + return fold_build2 (LSHIFT_EXPR, type, op1, TREE_OPERAND (arg0, 1)); strict_overflow_p = false; @@ -11012,8 +11012,10 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) { return fold_build1 (BIT_NOT_EXPR, type, build2 (BIT_IOR_EXPR, type, - TREE_OPERAND (arg0, 0), - TREE_OPERAND (arg1, 0))); + fold_convert (type, + TREE_OPERAND (arg0, 0)), + fold_convert (type, + TREE_OPERAND (arg1, 0)))); } /* If arg0 is derived from the address of an object or function, we may @@ -11549,7 +11551,7 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) tree tem = build_int_cst (TREE_TYPE (arg1), GET_MODE_BITSIZE (TYPE_MODE (type))); tem = const_binop (MINUS_EXPR, tem, arg1, 0); - return fold_build2 (RROTATE_EXPR, type, arg0, tem); + return fold_build2 (RROTATE_EXPR, type, op0, tem); } /* If we have a rotate of a bit operation with the rotate count and |