2008-05-08 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 May 2008 08:19:16 +0000 (08:19 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 8 May 2008 08:19:16 +0000 (08:19 +0000)
PR middle-end/36172
* fold-const.c (operand_equal_p): Two objects which types
differ in pointerness are not equal.

* gcc.c-torture/compile/pr36172.c: New testcase.

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

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr36172.c [new file with mode: 0644]

index 681dbb4..bdc4846 100644 (file)
@@ -1,3 +1,9 @@
+2008-05-08  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/36172
+       * fold-const.c (operand_equal_p): Two objects which types
+       differ in pointerness are not equal.
+
 2008-05-08  Kai Tietz  <kai,tietz@onevision.com>
 
        * calls.c (compute_argument_block_size): Add argument tree fndecl.
index db7be87..1250d26 100644 (file)
@@ -3033,8 +3033,11 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
 
   /* If both types don't have the same signedness, then we can't consider
      them equal.  We must check this before the STRIP_NOPS calls
-     because they may change the signedness of the arguments.  */
-  if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1)))
+     because they may change the signedness of the arguments.  As pointers
+     strictly don't have a signedness, require either two pointers or
+     two non-pointers as well.  */
+  if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1))
+      || POINTER_TYPE_P (TREE_TYPE (arg0)) != POINTER_TYPE_P (TREE_TYPE (arg1)))
     return 0;
 
   /* If both types don't have the same precision, then it is not safe
index 35eec51..68626fd 100644 (file)
@@ -1,3 +1,8 @@
+2008-05-08  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/36172
+       * gcc.c-torture/compile/pr36172.c: New testcase.
+
 2008-05-08  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/35714
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr36172.c b/gcc/testsuite/gcc.c-torture/compile/pr36172.c
new file mode 100644 (file)
index 0000000..19f0950
--- /dev/null
@@ -0,0 +1,17 @@
+int f(float * );
+unsigned long FcCharSetFreeze (int *fcs, int b)
+{
+  int i;
+  int a = 0;
+  for (i = 0; i < *fcs; i++)
+  {
+    float *leaf = (float *)fcs;
+    int hash = f (leaf);
+    if (hash)
+      a = b;
+    if (!a)
+      return;
+  }
+  return (unsigned long) fcs;
+}
+