OSDN Git Service

2006-06-19 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 19 Jun 2006 14:48:47 +0000 (14:48 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 19 Jun 2006 14:48:47 +0000 (14:48 +0000)
PR middle-end/28045
* fold-const.c (operand_equal_p): Check if the argument types
have the same precision before stripping NOPs.

* gcc.dg/torture/pr28045.c: New testcase.

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

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

index 34b7da6..be202bf 100644 (file)
@@ -1,3 +1,9 @@
+2006-06-19  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/28045
+       * fold-const.c (operand_equal_p): Check if the argument types
+       have the same precision before stripping NOPs.
+
 2006-06-19  Daniel Berlin  <dberlin@dberlin.org>
 
        Fix PR tree-optimization/27341
index 57a7248..5a65586 100644 (file)
@@ -2497,6 +2497,11 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags)
   if (TYPE_UNSIGNED (TREE_TYPE (arg0)) != TYPE_UNSIGNED (TREE_TYPE (arg1)))
     return 0;
 
+  /* If both types don't have the same precision, then it is not safe
+     to strip NOPs.  */
+  if (TYPE_PRECISION (TREE_TYPE (arg0)) != TYPE_PRECISION (TREE_TYPE (arg1)))
+    return 0;
+
   STRIP_NOPS (arg0);
   STRIP_NOPS (arg1);
 
index 985d645..ba44e8f 100644 (file)
@@ -1,3 +1,8 @@
+2006-06-19  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/28045
+       * gcc.dg/torture/pr28045.c: New testcase.
+
 2006-06-18  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
 
        PR fortran/26801
diff --git a/gcc/testsuite/gcc.dg/torture/pr28045.c b/gcc/testsuite/gcc.dg/torture/pr28045.c
new file mode 100644 (file)
index 0000000..f2d1664
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do run } */
+
+extern void abort(void);
+struct a
+{
+   unsigned int bits : 1;
+   signed long val : ((sizeof(long) * 8) - 1);
+};
+int Fnegate (struct a b)
+{
+  if ((-((long)b.val)) <= ((long) ((1UL << ((sizeof(long) * 8) - 2)) -1UL))
+      && (-((long)b.val)) >= (-(((long) ((1UL << ((sizeof(long) * 8) - 2)) -1UL))) - 1))
+     return 0 ;
+  abort ();
+}
+int main ()
+{
+  struct a b = {1, 1};
+  Fnegate (b);
+  return 0;
+}
+