aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-06-26 13:35:52 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2018-06-26 13:35:52 +0200
commitd37a91e5c57c518c91de2e570fdbf9d96f90dd41 (patch)
treec0bd05538b2868f34434c73cfba6ec1b50421d2b /gcc
parentf03915116bd2e15713cd20872f224b5ecd0a9b28 (diff)
downloadgcc-d37a91e5c57c518c91de2e570fdbf9d96f90dd41.zip
gcc-d37a91e5c57c518c91de2e570fdbf9d96f90dd41.tar.gz
gcc-d37a91e5c57c518c91de2e570fdbf9d96f90dd41.tar.bz2
re PR target/86314 (GCC 7.x and 8.x zero out "eax" before using "rax" in "lock bts")
PR target/86314 * config/i386/i386.md (setcc + movzbl to xor + setcc peephole2s): Check reg_overlap_mentioned_p in addition to reg_set_p with the same operands. * gcc.dg/pr86314.c: New test. From-SVN: r262141
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/i386.md4
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.dg/pr86314.c20
4 files changed, 34 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ec68212..13b648c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2018-06-26 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/86314
+ * config/i386/i386.md (setcc + movzbl to xor + setcc peephole2s):
+ Check reg_overlap_mentioned_p in addition to reg_set_p with the same
+ operands.
+
2018-06-26 Richard Biener <rguenther@suse.de>
PR tree-optimization/86287
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 6f23000..559ad93 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -12761,6 +12761,7 @@
"(peep2_reg_dead_p (3, operands[1])
|| operands_match_p (operands[1], operands[3]))
&& ! reg_overlap_mentioned_p (operands[3], operands[0])
+ && ! reg_overlap_mentioned_p (operands[3], operands[4])
&& ! reg_set_p (operands[3], operands[4])
&& peep2_regno_dead_p (0, FLAGS_REG)"
[(parallel [(set (match_dup 5) (match_dup 0))
@@ -12786,6 +12787,7 @@
|| operands_match_p (operands[2], operands[4]))
&& ! reg_overlap_mentioned_p (operands[4], operands[0])
&& ! reg_overlap_mentioned_p (operands[4], operands[1])
+ && ! reg_overlap_mentioned_p (operands[4], operands[5])
&& ! reg_set_p (operands[4], operands[5])
&& refers_to_regno_p (FLAGS_REG, operands[1], (rtx *)NULL)
&& peep2_regno_dead_p (0, FLAGS_REG)"
@@ -12835,6 +12837,7 @@
"(peep2_reg_dead_p (3, operands[1])
|| operands_match_p (operands[1], operands[3]))
&& ! reg_overlap_mentioned_p (operands[3], operands[0])
+ && ! reg_overlap_mentioned_p (operands[3], operands[4])
&& ! reg_set_p (operands[3], operands[4])
&& peep2_regno_dead_p (0, FLAGS_REG)"
[(parallel [(set (match_dup 5) (match_dup 0))
@@ -12861,6 +12864,7 @@
|| operands_match_p (operands[2], operands[4]))
&& ! reg_overlap_mentioned_p (operands[4], operands[0])
&& ! reg_overlap_mentioned_p (operands[4], operands[1])
+ && ! reg_overlap_mentioned_p (operands[4], operands[5])
&& ! reg_set_p (operands[4], operands[5])
&& refers_to_regno_p (FLAGS_REG, operands[1], (rtx *)NULL)
&& peep2_regno_dead_p (0, FLAGS_REG)"
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7aea7ef..3931bfe 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2018-06-26 Jakub Jelinek <jakub@redhat.com>
+ PR target/86314
+ * gcc.dg/pr86314.c: New test.
+
PR debug/86257
* gcc.target/i386/pr86257.c: Add -mtls-dialect=gnu to dg-options.
diff --git a/gcc/testsuite/gcc.dg/pr86314.c b/gcc/testsuite/gcc.dg/pr86314.c
new file mode 100644
index 0000000..8962a3c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr86314.c
@@ -0,0 +1,20 @@
+// PR target/86314
+// { dg-do run { target sync_int_long } }
+// { dg-options "-O2" }
+
+__attribute__((noinline, noclone)) unsigned long
+foo (unsigned long *p)
+{
+ unsigned long m = 1UL << ((*p & 1) ? 1 : 0);
+ unsigned long n = __atomic_fetch_or (p, m, __ATOMIC_SEQ_CST);
+ return (n & m) == 0;
+}
+
+int
+main ()
+{
+ unsigned long v = 1;
+ if (foo (&v) != 1)
+ __builtin_abort ();
+ return 0;
+}