aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Ostanevich <sergos.gnu@gmail.com>2011-11-07 08:41:55 +0000
committerKirill Yukhin <kyukhin@gcc.gnu.org>2011-11-07 08:41:55 +0000
commitb3242a4c75342dc2a5260fd452b9ea5c9d604296 (patch)
tree7650728bd04ee3bd9438a80a18a47d5899ab0896
parentf7a57cdc352bda43281423b933e4d3cb0edc9ddc (diff)
downloadgcc-b3242a4c75342dc2a5260fd452b9ea5c9d604296.zip
gcc-b3242a4c75342dc2a5260fd452b9ea5c9d604296.tar.gz
gcc-b3242a4c75342dc2a5260fd452b9ea5c9d604296.tar.bz2
re PR rtl-optimization/47698 (CMOV accessing volatile memory with read side effect)
gcc/ PR rtl-optimization/47698 * ifconv.c (noce_operand_ok): prevent CMOV generation for volatile mem. gcc/testsuite/ PR rtl-optimization/47698 * gcc.target/i386/47698.c: New test. From-SVN: r181075
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ifcvt.c6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.target/i386/47698.c10
4 files changed, 25 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f8f33d9..95809a3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-11-07 Sergey Ostanevich <sergos.gnu@gmail.com>
+
+ PR rtl-optimization/47698
+ * ifconv.c (noce_operand_ok): prevent CMOV generation
+ for volatile mem.
+
2011-11-07 Tristan Gingold <gingold@adacore.com>
* common/config/alpha/alpha-common.c (alpha_option_init_struct):
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index 784e2e8..3b05c2a 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -2329,12 +2329,12 @@ noce_operand_ok (const_rtx op)
{
/* We special-case memories, so handle any of them with
no address side effects. */
- if (MEM_P (op))
- return ! side_effects_p (XEXP (op, 0));
-
if (side_effects_p (op))
return FALSE;
+ if (MEM_P (op))
+ return ! side_effects_p (XEXP (op, 0));
+
return ! may_trap_p (op);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1f9aa81..7e7209c1d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+
+2011-11-07 Sergey Ostanevich <sergos.gnu@gmail.com>
+
+ PR rtl-optimization/47698
+ * gcc.target/i386/47698.c: New test.
+
2011-11-06 Jason Merrill <jason@redhat.com>
PR c++/35688
diff --git a/gcc/testsuite/gcc.target/i386/47698.c b/gcc/testsuite/gcc.target/i386/47698.c
new file mode 100644
index 0000000..2c75109
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/47698.c
@@ -0,0 +1,10 @@
+/* { dg-options "-Os" } */
+/* { dg-final { scan-assembler-not "cmov" } } */
+
+extern volatile unsigned long mmio;
+unsigned long foo(int cond)
+{
+ if (cond)
+ return mmio;
+ return 0;
+}