re PR middle-end/36172 (ice for legal code with -O3)
authorRichard Guenther <rguenther@suse.de>
Thu, 8 May 2008 08:19:16 +0000 (08:19 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 8 May 2008 08:19:16 +0000 (08:19 +0000)
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.

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

From-SVN: r135070

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

index 681dbb48b6384a5a43d435f204fb816bbdf21996..bdc484612ddfcac3bcdb575c83cf7b18cf4b0c92 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 db7be875427d8908568ac4dd16714f54d5f5fb4d..1250d269502ac9a4b3f09ac2f824a17be96b3171 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 35eec51b66441ab77a286edebf0be689d0595f1d..68626fdf2f1a28eeac069f456f288b79ec12375e 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;
+}
+