diff options
author | Joseph Myers <joseph@codesourcery.com> | 2012-08-08 20:42:58 +0100 |
---|---|---|
committer | Joseph Myers <jsm28@gcc.gnu.org> | 2012-08-08 20:42:58 +0100 |
commit | e7160b278e87d5ae5b270a790e8611554b9c3348 (patch) | |
tree | f82056df4dc04830c81662f47e83708d553a056f /gcc | |
parent | 215770ada8310953eb90e2369b796263dcf5f770 (diff) | |
download | gcc-e7160b278e87d5ae5b270a790e8611554b9c3348.zip gcc-e7160b278e87d5ae5b270a790e8611554b9c3348.tar.gz gcc-e7160b278e87d5ae5b270a790e8611554b9c3348.tar.bz2 |
simplify-rtx.c (simplify_binary_operation_1): Do not simplify IOR to a constant if one operand has side effects.
* simplify-rtx.c (simplify_binary_operation_1): Do not simplify
IOR to a constant if one operand has side effects.
testsuite:
* gcc.c-torture/execute/20120808-1.c: New test.
From-SVN: r190237
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/simplify-rtx.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/20120808-1.c | 37 |
4 files changed, 51 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b8eb055..e8554ec 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 0eed715..f56a5ed 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bd2e3f3..2465d80 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..3cbab2b --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20120808-1.c @@ -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); +} |