2007-10-05 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Oct 2007 16:33:25 +0000 (16:33 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Oct 2007 16:33:25 +0000 (16:33 +0000)
PR middle-end/33666
* fold-const.c (fold_unary): Do not fold (long long)(int)ptr
to (long long)ptr.

* gcc.dg/pr33666.c: New testcase.

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

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

index 8c6c773..800e196 100644 (file)
@@ -1,3 +1,9 @@
+2007-10-05  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/33666
+       * fold-const.c (fold_unary): Do not fold (long long)(int)ptr
+       to (long long)ptr.
+
 2007-10-05  Michael Matz  <matz@suse.de>
 
        PR inline-asm/33600
index 62cbfd1..46e0e33 100644 (file)
@@ -8128,7 +8128,7 @@ fold_unary (enum tree_code code, tree type, tree op0)
             (for integers).  Avoid this if the final type is a pointer
             since then we sometimes need the inner conversion.  Likewise if
             the outer has a precision not equal to the size of its mode.  */
-         if ((((inter_int || inter_ptr) && (inside_int || inside_ptr))
+         if (((inter_int && inside_int)
               || (inter_float && inside_float)
               || (inter_vec && inside_vec))
              && inter_prec >= inside_prec
@@ -8158,7 +8158,6 @@ fold_unary (enum tree_code code, tree type, tree op0)
               intermediate and final types differ, or
             - the final type is a pointer type and the precisions of the
               initial and intermediate types differ.
-            - the final type is a pointer type and the initial type not
             - the initial type is a pointer to an array and the final type
               not.  */
          if (! inside_float && ! inter_float && ! final_float
@@ -8173,8 +8172,7 @@ fold_unary (enum tree_code code, tree type, tree op0)
              && ! (final_ptr && inside_prec != inter_prec)
              && ! (final_prec != GET_MODE_BITSIZE (TYPE_MODE (type))
                    && TYPE_MODE (type) == TYPE_MODE (inter_type))
-             && final_ptr == inside_ptr
-             && ! (inside_ptr
+             && ! (inside_ptr && final_ptr
                    && TREE_CODE (TREE_TYPE (inside_type)) == ARRAY_TYPE
                    && TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE))
            return fold_build1 (code, type, TREE_OPERAND (op0, 0));
index 6b06d14..d73bde3 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-05  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/33666
+       * gcc.dg/pr33666.c: New testcase.
+
 2007-10-05  Michael Matz  <matz@suse.de>
 
        PR inline-asm/33600
diff --git a/gcc/testsuite/gcc.dg/pr33666.c b/gcc/testsuite/gcc.dg/pr33666.c
new file mode 100644 (file)
index 0000000..1f27b13
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options { -std=c99 } } */
+
+/* This used to fail with type-checking enabled because we stripped
+   the inner conversion to unsigned int.  */
+
+void __lock_get_list(void *dp)
+{
+  if (((__SIZE_TYPE__)dp + 1) & ~1ULL)
+    ;
+}