]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/86314 (GCC 7.x and 8.x zero out "eax" before using "rax" in "lock bts")
authorJakub Jelinek <jakub@redhat.com>
Tue, 26 Jun 2018 11:54:29 +0000 (13:54 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 26 Jun 2018 11:54:29 +0000 (13:54 +0200)
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: r262144

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr86314.c [new file with mode: 0644]

index e6f90dae8190af80ad31a027d71bc3a239f54738..2156085dec632157f6f77b5c6bff0aad00437e99 100644 (file)
@@ -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-25  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        Back port from trunk
index 8469cf02510c20fa422083145ef3cf07f86ae986..c5dae5ffe7d2530d95092d94cc1d80a7a2bd68f3 100644 (file)
   "(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))
   "(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))
index 40ce62b0a7c936f6610778d241257cfb8a3258d1..33595511eb024e7b878a8061df32a1818e497ef7 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-26  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/86314
+       * gcc.dg/pr86314.c: New test.
+
 2018-06-25  Fritz Reese  <fritzoreese@gmail.com>
 
        PR fortran/82972
diff --git a/gcc/testsuite/gcc.dg/pr86314.c b/gcc/testsuite/gcc.dg/pr86314.c
new file mode 100644 (file)
index 0000000..8962a3c
--- /dev/null
@@ -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;
+}