]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* simplify-rtx.c (simplify_binary_operation_1): Do not simplify
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Aug 2012 19:42:58 +0000 (19:42 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Aug 2012 19:42:58 +0000 (19:42 +0000)
IOR to a constant if one operand has side effects.

testsuite:
* gcc.c-torture/execute/20120808-1.c: New test.

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

gcc/ChangeLog
gcc/simplify-rtx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20120808-1.c [new file with mode: 0644]

index b8eb055a2029e8134b832579fe9a9223bc793008..e8554ecc1a228a14b1621e77987db209d71f7746 100644 (file)
@@ -1,3 +1,8 @@
+2012-08-08  Joseph Myers  <joseph@codesourcery.com>
+
+       * simplify-rtx.c (simplify_binary_operation_1): Do not simplify
+       IOR to a constant if one operand has side effects.
+
 2012-08-08  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
 
        * builtins.c (expand_builtin_atomic_compare_exchange): Pass old
index 0eed715ccfb053b197c22e1d6e934ac802b860e6..f56a5edef8f5f8d0322e39bf60a80f1739ca4b5e 100644 (file)
@@ -2420,7 +2420,9 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
     case IOR:
       if (trueop1 == CONST0_RTX (mode))
        return op0;
-      if (INTEGRAL_MODE_P (mode) && trueop1 == CONSTM1_RTX (mode))
+      if (INTEGRAL_MODE_P (mode)
+         && trueop1 == CONSTM1_RTX (mode)
+         && !side_effects_p (op0))
        return op1;
       if (rtx_equal_p (trueop0, trueop1) && ! side_effects_p (op0))
        return op0;
@@ -2434,7 +2436,8 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
       /* (ior A C) is C if all bits of A that might be nonzero are on in C.  */
       if (CONST_INT_P (op1)
          && HWI_COMPUTABLE_MODE_P (mode)
-         && (nonzero_bits (op0, mode) & ~UINTVAL (op1)) == 0)
+         && (nonzero_bits (op0, mode) & ~UINTVAL (op1)) == 0
+         && !side_effects_p (op0))
        return op1;
 
       /* Canonicalize (X & C1) | C2.  */
index bd2e3f37268c93e32c66e0f064b9ef63c5bd3ee8..2465d80ef5d869cb9a9441dca5c49f8325477d3f 100644 (file)
@@ -1,3 +1,7 @@
+2012-08-08  Joseph Myers  <joseph@codesourcery.com>
+
+       * gcc.c-torture/execute/20120808-1.c: New test.
+
 2012-08-08  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR rtl-optimization/54157
diff --git a/gcc/testsuite/gcc.c-torture/execute/20120808-1.c b/gcc/testsuite/gcc.c-torture/execute/20120808-1.c
new file mode 100644 (file)
index 0000000..3cbab2b
--- /dev/null
@@ -0,0 +1,37 @@
+extern void exit (int);
+extern void abort (void);
+
+volatile int i;
+unsigned char *volatile cp;
+unsigned char d[32] = { 0 };
+
+int
+main (void)
+{
+  unsigned char c[32] = { 0 };
+  unsigned char *p = d + i;
+  int j;
+  for (j = 0; j < 30; j++)
+    {
+      int x = 0xff;
+      int y = *++p;
+      switch (j)
+       {
+       case 1: x ^= 2; break;
+       case 2: x ^= 4; break;
+       case 25: x ^= 1; break;
+       default: break;
+       }
+      c[j] = y | x;
+      cp = p;
+    }
+  if (c[0] != 0xff
+      || c[1] != 0xfd
+      || c[2] != 0xfb
+      || c[3] != 0xff
+      || c[4] != 0xff
+      || c[25] != 0xfe
+      || cp != d + 30)
+    abort ();
+  exit (0);
+}