Commit bd113227 by Richard Guenther Committed by Richard Biener

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
parent 1904bef1
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.
2007-10-08 Richard Guenther <rguenther@suse.de>
PR middle-end/33691
PR middle-end/33694
PR middle-end/33696
......@@ -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
......
2007-10-08 Richard Guenther <rguenther@suse.de>
PR middle-end/33693
PR middle-end/33695
PR middle-end/33697
* gcc.dg/pr33693.c: New testcase.
* gcc.dg/pr33695.c: Likewise.
* gcc.dg/pr33697.c: Likewise.
2007-10-08 Richard Guenther <rguenther@suse.de>
PR middle-end/33691
PR middle-end/33694
PR middle-end/33696
/* { dg-do compile } */
/* This used to ICE with type-checking enabled. */
unsigned long modify_field (unsigned long mask, long fieldval)
{
return (~fieldval & ~mask);
}
/* { dg-do compile } */
/* We used to ICE with type-checking enabled. */
unsigned int bfstages(int M, float *Utbl, int Ustride)
{
return ((unsigned int) 1 << M) * Ustride;
}
/* { dg-do compile } */
/* We used to ICE for this with type-checking enabled. */
typedef signed short gint16;
typedef unsigned short guint16;
gint16 dissect_old_pflog(gint16 rnr)
{
return (guint16) ((guint16) ((guint16)rnr >> 8) | (guint16) ((guint16)rnr << 8));
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment