expmed.c (emit_store_flag): Don't test BITS_PER_WORD * 2 wide volatile memory by...
authorJakub Jelinek <jakub@redhat.com>
Tue, 5 Mar 2002 11:10:43 +0000 (12:10 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 5 Mar 2002 11:10:43 +0000 (12:10 +0100)
* expmed.c (emit_store_flag): Don't test BITS_PER_WORD * 2
wide volatile memory by parts.

* gcc.c-torture/compile/20020304-2.c: New test.

From-SVN: r50314

gcc/ChangeLog
gcc/expmed.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20020304-2.c [new file with mode: 0644]

index 1ea58afb6b6b15e2feb78d36abeaa523e4809e77..13fb80d7c1738cc17eb67c1969307478a76e03fe 100644 (file)
@@ -1,3 +1,8 @@
+2002-03-05  Jakub Jelinek  <jakub@redhat.com>
+
+       * expmed.c (emit_store_flag): Don't test BITS_PER_WORD * 2
+       wide volatile memory by parts.
+
 2002-03-05  Jakub Jelinek  <jakub@redhat.com>
 
        * ssa-ccp.c (ssa_ccp_substitute_constants): Don't crash if def
index 6f9a939ed0118d40022f7315d68ca127e745a364..6d58ea9957e03a7edf27b63f8017ecd9f582b689 100644 (file)
@@ -4278,7 +4278,8 @@ emit_store_flag (target, code, op0, op1, mode, unsignedp, normalizep)
      the comparison into one involving a single word.  */
   if (GET_MODE_BITSIZE (mode) == BITS_PER_WORD * 2
       && GET_MODE_CLASS (mode) == MODE_INT
-      && op1 == const0_rtx)
+      && op1 == const0_rtx
+      && (GET_CODE (op0) != MEM || ! MEM_VOLATILE_P (op0)))
     {
       if (code == EQ || code == NE)
        {
index 378dba70cbf4d0a2c53a195a51b1d4a9aa612dea..77623573f3d7dcf4b481e219e387e6329e246224 100644 (file)
@@ -2,6 +2,8 @@
 
        * gcc.dg/20020304-1.c: New test.
 
+       * gcc.c-torture/compile/20020304-2.c: New test.
+
 2002-03-04  Zack Weinberg  <zack@codesourcery.com>
 
        * gcc.c-torture/compile/20020304-1.c: New test case
diff --git a/gcc/testsuite/gcc.c-torture/compile/20020304-2.c b/gcc/testsuite/gcc.c-torture/compile/20020304-2.c
new file mode 100644 (file)
index 0000000..9a162d4
--- /dev/null
@@ -0,0 +1,10 @@
+/* This testcase ICEd because a SUBREG of MEM/v was never
+   simplified.  */
+volatile unsigned long long *a;
+
+unsigned char
+foo (void)
+{
+  unsigned char b = (*a != 0);
+  return b;
+}