From bd113227bf7da8dfe45b9f5db511dadc9b22cb00 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Mon, 8 Oct 2007 15:23:49 +0000 Subject: [PATCH] re PR middle-end/33693 (Type checking error with bitwise xor/and) 2007-10-08 Richard Guenther 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 --- gcc/ChangeLog | 9 +++++++++ gcc/fold-const.c | 14 ++++++++------ gcc/testsuite/ChangeLog | 9 +++++++++ gcc/testsuite/gcc.dg/pr33693.c | 8 ++++++++ gcc/testsuite/gcc.dg/pr33695.c | 8 ++++++++ gcc/testsuite/gcc.dg/pr33697.c | 10 ++++++++++ 6 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr33693.c create mode 100644 gcc/testsuite/gcc.dg/pr33695.c create mode 100644 gcc/testsuite/gcc.dg/pr33697.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a54a60c868e..b03f6d0f589 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2007-10-08 Richard Guenther + + 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 PR middle-end/33691 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 0313c0ca840..4a8153cb499 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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9af8f71c4b5..f7fd6dd35b0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2007-10-08 Richard Guenther + + 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 PR middle-end/33691 diff --git a/gcc/testsuite/gcc.dg/pr33693.c b/gcc/testsuite/gcc.dg/pr33693.c new file mode 100644 index 00000000000..147c164c4b4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr33693.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ + +/* This used to ICE with type-checking enabled. */ + +unsigned long modify_field (unsigned long mask, long fieldval) +{ + return (~fieldval & ~mask); +} diff --git a/gcc/testsuite/gcc.dg/pr33695.c b/gcc/testsuite/gcc.dg/pr33695.c new file mode 100644 index 00000000000..2d3ffbd6688 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr33695.c @@ -0,0 +1,8 @@ +/* { 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; +} diff --git a/gcc/testsuite/gcc.dg/pr33697.c b/gcc/testsuite/gcc.dg/pr33697.c new file mode 100644 index 00000000000..8c5edb65853 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr33697.c @@ -0,0 +1,10 @@ +/* { 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)); +} -- 2.30.2