2007-10-08 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Oct 2007 15:23:49 +0000 (15:23 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Oct 2007 15:23:49 +0000 (15:23 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129130 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr33693.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr33695.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr33697.c [new file with mode: 0644]

index a54a60c..b03f6d0 100644 (file)
@@ -1,5 +1,14 @@
 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
index 0313c0c..4a8153c 100644 (file)
@@ -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
index 9af8f71..f7fd6dd 100644 (file)
@@ -1,5 +1,14 @@
 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
diff --git a/gcc/testsuite/gcc.dg/pr33693.c b/gcc/testsuite/gcc.dg/pr33693.c
new file mode 100644 (file)
index 0000000..147c164
--- /dev/null
@@ -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 (file)
index 0000000..2d3ffbd
--- /dev/null
@@ -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 (file)
index 0000000..8c5edb6
--- /dev/null
@@ -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));
+}